https://blog.csdn.net/qiank10/article/details/38050717
这周的主要工作是使用已有的BLE USB Dongle和iphone跑通基本的ibeacon原理,进一步分析IBeacon协议,以便于接下来编写生成IBeacon信号的Matlab代码。
2.1 前人工作及声明
许多研究者已经对IBeacon的Packet的格式进行了细致的分析,并尝试自己搭建IBeacon协议栈,如电子工程世界论坛的southwolf1813进行了协议分析和基站搭建,stackoverflow的davidyoung也给出了包格式分析(不过后者提供的实例数据中的CRC貌似是错的)。
作为一个电子方面的小白,这里要特别感谢southwolf1813,他帮助我解决了BLE USB Dongle烧录固件的问题,此外还向我介绍了许多IBeacon方面的知识,令我受益匪浅。同时要感谢帮我联系southwolf1813的两位导师,以及无偿帮我焊电路板的电子工艺实习基地的老师。
2.2 设备准备
2.2.1 IBeacon发射机
所有支持Bluetooth4.0协议的苹果设备都可以成为IBeacon,具体而言,iphone是4s及以上,ipad是3及以上。我们使用iphone作为发射端的IBeacon,在AppStore中下载安装应用AirBeacon,我们就可以用iphone发送IBeacon数据包:
在接收端,我们使用BLE USB Dongle抓取IBeacon数据包:
上图中右侧设备是BLE USB Dongle,左侧是购买时赠送的仿真器转接板,该转接板可用于连接USB Dongle和CC Debugger,从而为前者烧录制定的固件。在本实验中,我们烧录了Packet Sniffer的固件,不过还是推荐让店家帮忙烧录,这样比较省事。
2.3 抓包过程
抓包过程如下:
1. 将BLE USB Dongle插入PC USB接口,打开Packet Sniffer软件,开始监听。
2. 打开AirBeacon软件,新建一个Beacon Profile,示例见下图:
3. 点击应用中的Advertise Beacon按键,AirBeacon开始广播数据包,同时PC端的Packet Sniffer软件会显示抓取的数据包。
2.4 结果分析
在设置为上图中Beacon Profile的情况下,Packet Sniffer抓到的数据包如下图所示:
从该示例中,我们可以清楚的看到IBeacon Packet的各层信息。
1. BLE Link Layer Packet从4byte的Access Address开始,对于Advertising类型的数据包而言,其Access Address均为0x8E89BED6。
2. Access Address之后就是PDU了,BLE协议规定PDU的长度为2~39字节,其中前两个字节是PDU的Header,剩余字节为PDU的Payload。
2.1 首先看Header,IBeacon使用的Adv PDU的类型是固定的,即ADV_IND,其对应于Header中的Type域值为0,TxAdd指示了IBeacon Mac Address的类型,1表示Random Address,0表示Public Address。RxAdd与TxAdd相似,指示了接收设备的地址类型,但是在IBeacon的Payload中并没有接收端的地址数据,因此这一位是不用的,根据协议应将其设为0,与其它RFU位相同。PDU-Length域长6bit,指示了Payload的字节数,由图可知IBeacon的Payload有36个字节。
2.2 其次看Payload,IBeacon使用的ADV_IND类型的PDU的Payload由两部分组成,一部分是IBeacon的Mac地址,即AdvA,其长度为6byte;另一部分即IBeacon的数据域AdvData,其长度为30byte,下文会对AdvData中的各个域进行详细的分析。
3. PDU之后就是Packet的最后一个域——CRC,CRC根据PDU的内容计算得到,个人感觉Packet Sniffer把CRC的大小端搞反了,因此显示的是将正确的CRC颠倒过来的值。
4. 我们就进一步看AdvData部分的结构。第二周的报告提到AdvData是由多个AD Structure组成的,IBeacon的AdvData也不例外,它包含了两个AD Structure。第一个为02 01 1A,第二个为1A FF 4C 00 02 15 ... 00 02 C5。对于第一个AD Structure,其第一个字节02表示了其剩余部分的长度,第二个字节01表示了该Structure的类型为Flag,而1A就是相应的flags的值了。对于第二个AD Structure,其第一个字节1A表示了其剩余部分的长度,第二个字节FF表示了该Structure的类型为Manufacturer Specific Data,即由制造商规定的数据,BLE协议规定该类型的Structure的开始两个byte为制造商标识,这里是4C 00,即苹果公司标识。到这里,BLE协议的约束范围才真正结束,第二个Structure中剩余的部分则是由IBeacon协议定义的数据。
5. 对照AirBeacon的发射数据,我们可以知道IBeacon协议定义的数据结构。首先,02 15是IBeacon Header,02应该是flags,15是payload的长度。剩余的21个byte是IBeacon的Payload,其中开始的16byte(83 27 85 0F 2F A2 46 19 BA 4A 7E 33 9C DF 9E 55)是UUID,之后的2byte(00 01)是Major,之后的2byte(00 02)是Minor,最后的1byte(C5)是RSSI,RSSI是用补码表示的,这里的值是-59。
知道了IBeacon Packet的具体结构,我们就可以用Matlab生成IBeacon信号,并通过SDR平台向外发射自己的IBeacon信号了。
----------------------------------------------------
iBeacons(1) —— 协议分析
iBeacons 是苹果iOS 7.0 中新推出的一项"隐藏功能",虽然目前还没有公开全部的API详细资料,但它的潜力不容小视。 iBeacons 想要通过蓝牙4.0一站解决之前手机端遇到的一大批问题,包括认证、支付、室内定位、广告推送等,避免了NFC、二维码等没有广泛原生支持的尴尬局面。有关iBeacons的应用场景,在这里不多说,感兴趣的朋友们可以自行搜索。Apple和PayPal等公司已经开始全面部署iBeacons 抱这条大腿,没错的! iBeacons 的硬件并不难实现,只是一个广播特定内容的蓝牙基站,已经有很多人通过抓包 分析出了 iBeacons协议的基本内容 引用来自http://ibeacons.yeelink.net/index.php?title=IBeacon%E5%8D%8F%E8%AE%AE%E5%88%86%E6%9E%90 的资料: IBeacon协议分析所以我们很容易就可以实现一个简单的iBeacons基站。 参考资料:http://developer.radiusnetworks.com/2013/10/01/reverse-engineering-the-ibeacon-profile.html http://developer.radiusnetworks.com/2013/10/09/how-to-make-an-ibeacon-out-of-a-raspberry-pi.html http://stackoverflow.com/questions/18906988/what-is-the-ibeacon-bluetooth-profile http://ibeacons.yeelink.net/index.php?title=IBeacon%E5%8D%8F%E8%AE%AE%E5%88%86%E6%9E%90 http://see.sl088.com/wiki/IBeacons |
----------------------------------------------------
iBeacons(2) —— 用SensorTag 制作 iBeacons 基站
上一次(http://bbs.eeworld.com.cn/thread-427811-1-1.html) 我们分析了iBeacons的协议内容,貌似对这个话题感兴趣的朋友不多,搞得我也没有动力了{:soso_e101:}
但还是继续来说说吧。
CC254x的协议栈BLE-Stack中带有很多示例程序,我们可以利用这些示例程序 方便地实现一些基本的蓝牙应用,如防丢器、蓝牙广播等等。
今天我们就用蓝牙广播的例子,稍加改动,就可以实现一个 iBeacons 基站。
蓝牙广播的例子在C:\Texas Instruments\BLE-CC254x-1.4.0\Projects\ble\SimpleBLEBroadcaster 根据我们上一次提到的,iBeacons 基站只是一个广播特定内容的蓝牙设备,我们只需要把广播内容写入 SimpleBLEBroadcaster 即可。
大家可以简单阅读以下SimpleBLEBroadcaster 的源代码,可以发现TI BLE-Stack 已经封装了完善的接口,包括硬件抽象层(HAL), 操作系统抽象层(OSAL)等,方便我们进行蓝牙应用的开发。
蓝牙广播的内容主要位于 simpleBLEBroadcaster.c 中,需要修改的内容主要是 scanRspData[] 和 advertData[]. 其中 scanRspData[] 是蓝牙设备用于回复主机扫描请求的信息,或者简单理解为蓝牙设备名;而 advertData[] 就是广播内容。
比如 我们想给 iBeacons 设备取名叫"Microduino iBeacons"
就需要这样改写
复制代码
而 iBeacons 广播内容,根据上一篇文章的分析 需要写成
复制代码
然后编译运行,在iOS设备上打开AirLocate之类的iBeacons测试工具,就可以搜到我们的 iBeacons 基站啦!
有人要问了 为什么我要把它起名为 Microduino iBeacons 呢?
答案就是, iBeacons 模块现已加入 Microduino 豪华午餐~~ 当当当当~~ (测试版 没有洗板子 求轻拍……)
----------------------------------------------------