背景
在当前的无线应用端,结合地理位置和近场识别场景越来越常见,下面就看看如何用树莓派进行进场识别。
树莓派(Raspberry)
为什么使用树莓派
- 可以安装完整的系统,如Rasphian,可以运行完整的Linux程序,Linux相关代码移植方便
- 可以使用Java或Python进行开发,方便上手
- 价格便宜,虽然相对arduion和单片机来说价格略贵,但是功能更丰富,集成度更高,能力更强大
- 可扩展,可以根据需求添加模块
蓝牙
蓝牙是当今移动设备最基础的硬件设施,已经广泛运用于各个领域,如智能穿戴设备、智能家居等。蓝牙的基本工作流程如下
- 广播/扫描:通信的一方向外发送广播,向其它设备发送自己的信息。另一方通过扫描知道周边有哪些蓝牙设备在广播,这些设备的地址是什么,以及是否可以连接。
- 连接:通信的一方向另一方发起连接请求。双方通过一系列的数据交换建立连接。
- 数据通信:建立连接后,就可以通过蓝牙协议进行数据通信
通过树莓派主动扫描蓝牙
BlueZ
Bluz是Linux中蓝牙协议栈的实现,可以用来分析蓝牙扫描和连接状况。可以通过以下命令查看Bluetooth的运行状态
systemctl status bluetooth
可以看到当前设备的蓝牙状态如下
bluetooth.service - Bluetooth service
Loaded: loaded (/lib/systemd/system/bluetooth.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2017-09-06 15:35:47 UTC; 2 months 28 days ago Docs: man:bluetoothd(8)
Main PID: 557 (bluetoothd)
Status: "Running"
CGroup: /system.slice/bluetooth.service
└─557 /usr/lib/bluetooth/bluetoothd
在Linux上,可以使用bluetoothctl命令操作蓝牙,运行
scan on
运行后可以立即开启蓝牙扫描服务。扫描完成后可以使用devices
命令查看扫描到的设备(隐藏部分细节)
Device 7A:0A:A6:52:xx:xx 7A-0A-A6-52-xx-xx
Device D4:F5:13:67:xx:xx xxxxx
Device 10:48:B1:90:xx:xx xxxxx
这个服务会定时扫描周围的蓝牙设备,当扫描到新设备时会添加[NEW]标签
[NEW] Device C0:EE:FB:E9:xx:xx OnePlus 3T
同时,通过扫描还可以显示扫描到的蓝牙设备的信号强度和设备商。其中RSSI(Received Signal Strength Indication,接收的信号强度指示)是信号强度,数值越接近0,信号强度越大。
Device 7A:0A:A6:52:xx:xx RSSI: -47
Device D4:F5:13:67:xx:xx RSSI: -54
Device 10:48:B1:90:xx:xx RSSI: -63
扫描完毕后可以通过scan off
关闭扫描服务
python实现
扫描到蓝牙设备的信息后,可以对需要的数据进行分析和上报,Rasphian支持Python,这里可以使用pybluez库进行实现,首先需要通过pip安装pybluez
pip install pybluez
如果编译的时候出现找不到bluetooth.h的话,需要先安装libbluetooth-dev
apt-get install libbluetooth-dev
之后就可以使用libbluetooth-dev进行开发了,下面提供一个简单的demo
#! /usr/bin/python
import bluetooth
devices = bluetooth.discover_devices(lookup_name = True)
print 'find ' + str(len(devices) + ' devices')
for name, addr in devices:
print name + ' ' + addr
输出结果如下
find 2 devices
xxxxxx 10:48:B1:90:xx:xx
OnePlus 3T C0:EE:FB:E9:xx:xx
小结
通过扫描蓝牙可以轻松的识别到蓝牙设备,还可以通过信号强度探测距离,进行粗略的位置判断。不过蓝牙的局限性比较大,后面会对WiFi的扫描方式进行分析。
网友评论