1. 前言

在linux平台下,bluez是一个很不错的软件,提供了很多基于命令行的测试工具,如hciconfig、hcitool、hcidump、bluetoothctl等。利用这些工具,我们可以方便的测试、demo各种蓝牙功能。例如,在“玩转BLE(1)_Eddystone beacon”中,我们利用hcitool命令,演示了将手机变成一个Beacon设备的神奇效果。

Beacon的演示,从本质上看,是BLE Advertising(广播)功能的测试和验证。自然而然的,我们会好奇:怎么接收这些广播数据呢(其实就是BLE Scanning功能)?这就是本文要介绍的内容。

虽然hcitool(以及后来的bluetoothctl)可以进行简单的LE scan操作,但返回的结果仅包括简单的地址和名称,显然无法满足我们的需求(要知道,BLE的广播数据可能包含其它内容哦,如我们的Beacon演示)。怎么办呢?不着急,强大的python出马了。

2. bluepy[1]介绍

bluepy是linux平台中,用python脚本封装的BLE接口。为什么用python呢?说实话,在写这篇文章之前,我对python的印象是极其平淡的,但此时却好感大增。以蓝牙的测试为例:

在linux下,bluez提供的原生接口是一个C库(bluetooth lib),我们想利用这个接口,在命令行里面玩转一些功能,几乎不可能;

提供C库的同时,为了图形界面操作方便,bluez又封装出来了一层dbus API。虽然从理论上讲,使用dbus-send等命令,可以满足我们在命令行的测试需求。但是,我觉得没有人喜欢dbus-send后面带的那长长的一串参数……

在开源的世界里,有需求就有动力,因此就出现了很多有python封装的蓝牙API。以BLE为例,bluepy是一个比较好的一个。有了该接口之后,蓝牙功能的测试,真的是很爽!

3. bluepy安装

bluepy的安装非常简单,开始之前先交代一下我的测试环境:

硬件环境是树莓派2(大家随便用一个运行linux的PC、开发板应该都okay);

OS是raspbian(Ubuntu),版本应该不是很重要;

bluez的版本是5.23(比较新的一个版本了,不过旧版本应该也没有问题)。


安装bluepy只需要两个命令,如下:

#安装python的包管理工具—pip

sudo apt-get install python-pip libglib2.0-dev

#使用pip安装bluepy

sudo pip install bluepy


4. 使用bluepy

本章我们将使用bluepy的Scanner class,扫描正在广播的BLE设备。bluepy的文档中有sample code:
http://ianharvey.github.io/bluepy-doc/scanner.html

在本地新建一个python脚本(ble_scan.py),将sample code中的代码拷贝进去即可,如下:
from bluepy.btle import Scanner, DefaultDelegate

class ScanDelegate(DefaultDelegate): 
    def __init__(self): 
        DefaultDelegate.__init__(self)

def handleDiscovery(self, dev, isNewDev, isNewData): 
        if isNewDev: 
            print "Discovered device", dev.addr 
        elif isNewData: 
            print "Received new data from", dev.addr

scanner = Scanner().withDelegate(ScanDelegate()) 
devices = scanner.scan(10.0)

for dev in devices: 
    print "Device %s (%s), RSSI=%d dB" % (dev.addr, dev.addrType, dev.rssi) 
    for (adtype, desc, value) in dev.getScanData(): 
        print "  %s = %s" % (desc, value)

按照“玩转BLE(1)_Eddystone beacon”中的说明,将自己的手机变成一个Eddystone Beacon设备。然后执行python脚本,扫描:

sudo python ble_scan.py

结果如下:

pi@raspberrypi:~$ sudo python ble_scan.py 
Discovered device cb:07:c8:52:ce:d6 
Discovered device 18:dc:56:a6:25:6f 
Device 18:dc:56:a6:25:6f (public), RSSI=-59 dB 
  Flags = 06 
  Complete 16b Services = aafe 
  16b Service Data = aafe00f0000102030405060708090a0b0e0f000000 
Device cb:07:c8:52:ce:d6 (random), RSSI=-85 dB 
  Complete Local Name = My Mambo 
  Complete 16b Services = e7fe 
  Manufacturer = 0000cb07c852ced6 
  128b Service Solicitation = d0002d121e4b0fa4994eceb531f40579 
  Flags = 06

对比一下我们在“玩转BLE(1)_Eddystone beacon”中广播的数据(对应三个颜色):

1e 02 01 06 03 03 aa fe 17 16 aa fe 00 -10 00 01 02 03 04 05 06 07 08 09 0a 0b 0e 0f 00 00 00 00

成功了!

5. 总结

本文简单的介绍了利用bluepy功能,扫描BLE的广播包的过程。并没有对bluepy的软件逻辑,以及BLE Advertising的细节,做过多的说明,感兴趣的同学可以自行阅读,不理解的地方可以留言讨论。

另外,后续BLE Advertising & Scanning有关的分析文章中,会借助该工具,以帮助理解。

6. 参考文档

[1] bluepy github主页,https://github.com/IanHarvey/bluepy
 
原创文章,转发处蜗窝科技,www.wowotech.net。

玩转BLE(2)_使用bluepy扫描BLE的广播数据的更多相关文章

  1. 玩转BLE(3)_使用微信蓝牙精简协议伪造记步数据

    1. 前言 在物联网时代,有一个问题肯定会让人头疼(现在已经初露端倪了): 物联网中的IOT设备有两个主要特点: 1)简单小巧(不具备复杂的人机交互接口,需要手机等终端设备辅助完成配置.控制等功能). ...

  2. 杂记:解决Android扫描BLE设备名称不刷新问题

    背景 个人开发过一种BLE设备有这样一种需求:当设备处于状态A时,广播设备名称A:处于状态B时,广播设备名称B. 问题 我们发现,当Android在进行Ble扫描的时候,扫描回调函数onScanRes ...

  3. BLE 广播数据解析

    从上一篇GATT Profile 简介中提到过,BLE 设备工作的第一步就是向外广播数据.广播数据中带有设备相关的信息.本文主要说一下 BLE 的广播中的数据的规范以及广播包的解析. 广播模式 BLE ...

  4. Android BLE开发之Android手机与BLE终端通信

    本文来自http://blog.csdn.net/hellogv/ ,引用必须注明出处! 近期穿戴设备发展得非常火.把相关技术也带旺了,当中一项是BLE(Bluetooth Low Energy).B ...

  5. BLE广播数据的抓包解析

    前言: 报文由数据字节组成同时是按比特传输的,这就免不了牵涉到字节序的问题. 对于各个字节的传输,总是从最低位开始传输.如0x80是按00000001发送的,0x01是按10000000发送的. 同时 ...

  6. 蓝牙BLE: 蓝牙4.0 BLE广播数据解析(转)

    BLE 设备工作的第一步就是向外广播数据.广播数据中带有设备相关的信息.本文主要说一下 BLE 的广播中的数据的规范以及广播包的解析. 1. 广播模式 BLE 中有两种角色 Central 和 Per ...

  7. 快速上手Linux 玩转典型应用_慕课网笔记

    1.没有exe安装程序 2.区分大小写 3.一切皆文件 4.文件后缀不是那么重要,只是为了好识别 -------------------------------------------------- ...

  8. python学习_应用pickle模块封装和拆封数据对象

    学习文件数据处理的时候了解到有pickle模块,查找官方文档学习了一些需要用到的pickle内容. 封装是一个将Python数据对象转化为字节流的过程,拆封是封装的逆操作,将字节文件或字节对象中的字节 ...

  9. Java_Activiti5_菜鸟也来学Activiti5工作流_之初识常用服务类和数据表(二)

    /** * 代码清单中使用 ProcessEngines类加载默认的流程配置文件(activiti.cfg.xml),再获取各个服务组件的实例. * RepositoryService主要用于管理流程 ...

随机推荐

  1. 2 Class类

     在程序运行期间,Java运行时系统始终为所有的对象维护一个被称为运行时地类型标识.这个信息跟踪着每个对象所属地类.虚拟机 利用运行时类型信息选择相应地方法执行. 然而,可以通过专门地Java类访问这 ...

  2. BUAAOO-Second-Summary

    #目录 homework & class & trainning : 两次上机.三次作业.四周课堂 code analysis & review : 为什么我没有bug,为什么 ...

  3. 关于生物项目上的blast和viroblast

    最近要做一个跟生物有关的项目,隔行如隔山呀,好多工具以前都没听过,blast分到我头上啦,查查,查查 BLAST (Basic Local Alignment Search Tool)是一套在蛋白质数 ...

  4. 修改 input / textarea placeholder 属性的颜色和字体大小

    话不多说,直接上代码: input::-webkit-input-placeholder, textarea::-webkit-input-placeholder { color: #666; fon ...

  5. canal demo搭建全记录

    一.环境介绍 canal是阿里开源的中间件,主要用于同步mysql数据库变更.具体参见:https://github.com/alibaba/canal/releases 搭建环境: vmware c ...

  6. vs2015网站发布时,设置页面合并后程序集的文件版本

    如何将web网站的页面合并成一个新的程序集发布,并设定文件版本? 这个问题我也纠结了很久,问了很多大牛,也没有找到解决方案 曾开了一贴,https://bbs.csdn.net/topics/3910 ...

  7. 苹果手机的SB系列(2)为什么不能重命名?

    为什么没有重命名? 在手机端不能重命名,在WINOWS端文件是只读的,连他TM的只读属性都无法改,不能重命名,你让我怎么备份? 我怎么知道哪些照片上次备份过了?又重头来过?还是要用苹果的MAC?这种态 ...

  8. 小白的python之路10/30磁盘分区

    总结:fdisk   mkfs  mount 1.磁盘分区 硬盘分区有三种,主磁盘分区.扩展磁盘分区.逻辑分区. 一个硬盘主分区至少有1个,最多4个,扩展分区可以没有,最多1个.且主分区+扩展分区总共 ...

  9. 关于GitHub

    gitHub是一个面向开源及私有软件项目的托管平台,因为只支持git 作为唯一的版本库格式进行托管,故名gitHub 对于程序员来说就相当于一个仓库可以把自己写的东西放到网上 要想使用GitHub必须 ...

  10. 我只想要Linux的IP地址

    大家都知道ifconfig 可以查看centos的ip地址,但是我如果只要ip地址该怎么办呢?首先上ifconfig [root@centos ~]# ifconfig eth0 eth0 Link ...