背景

在当前的无线应用端,结合地理位置和近场识别场景越来越常见,下面就看看如何用树莓派进行进场识别。

树莓派(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的扫描方式进行分析。