使用树莓派进行近场识别——蓝牙篇

作者: 小吵闹123 | 来源:发表于2017-12-04 23:15 被阅读1344次

    背景

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

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

    参考文献

    相关文章

      网友评论

        本文标题:使用树莓派进行近场识别——蓝牙篇

        本文链接:https://www.haomeiwen.com/subject/vfnfixtx.html