第三周工作总结——IBeacon协议分析

1. 总述

这周的主要工作是使用已有的BLE USB Dongle和iphone跑通基本的ibeacon原理,进一步分析IBeacon协议,以便于接下来编写生成IBeacon信号的Matlab代码。

2. IBeacon协议分析

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数据包:
第三周工作总结——IBeacon协议分析_第1张图片

在接收端,我们使用BLE USB Dongle抓取IBeacon数据包:
第三周工作总结——IBeacon协议分析_第2张图片
上图中右侧设备是BLE USB Dongle,左侧是购买时赠送的仿真器转接板,该转接板可用于连接USB Dongle和CC Debugger,从而为前者烧录制定的固件。在本实验中,我们烧录了Packet Sniffer的固件,不过还是推荐让店家帮忙烧录,这样比较省事。

2.3 抓包过程

抓包过程如下:
1. 将BLE USB Dongle插入PC USB接口,打开Packet Sniffer软件,开始监听。
2. 打开AirBeacon软件,新建一个Beacon Profile,示例见下图:
第三周工作总结——IBeacon协议分析_第3张图片
3. 点击应用中的Advertise Beacon按键,AirBeacon开始广播数据包,同时PC端的Packet Sniffer软件会显示抓取的数据包。

2.4 结果分析

在设置为上图中Beacon Profile的情况下,Packet Sniffer抓到的数据包如下图所示:
第三周工作总结——IBeacon协议分析_第4张图片
从该示例中,我们可以清楚的看到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信号了。

你可能感兴趣的:(开源夏令营)