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

转载自:

https://blog.csdn.net/qiank10/article/details/38050717

 

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数据包:

 

在接收端,我们使用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协议分析
对于一个UUID是E2C56DB5-DFFB-48D2-B060-D0F5A71096E0, major是0, minjor是0的iBeacon,此时的Tx的信号是-59 RSSI,他的BLE的广播包如下:
d6 be 89 8e 40 24 05 a2 17 6e 3d 71 02 01 1a 1a ff 4c 00 02 15 e2 c5 6d b5 df fb 48 d2 b0 60 d0 f5 a7 10 96 e0 00 00 00 00 c5 52 ab 8d 38 a5
以上协议包拆解内容如下:
d6 be 89 8e # Access address for advertising data (this is always the same fixed value)
40 # Advertising Channel PDU Header byte 0.  Contains: (type = 0), (tx add = 1), (rx add = 0)
24 # Advertising Channel PDU Header byte 1.  Contains:  (length = total bytes of the advertising payload + 6 bytes for the BLE mac address.)
05 a2 17 6e 3d 71 # Bluetooth Mac address (note this is a spoofed address)
02 01 1a 1a ff 4c 00 02 15 e2 c5 6d b5 df fb 48 d2 b0 60 d0 f5 a7 10 96 e0 00 00 00 00 c5 # Bluetooth advertisement
52 ab 8d 38 a5 # checksum
协议包中的关键部分就是蓝牙的广播部分,这些被分解为如下:
02 01 1a 1a ff 4c 00 02 15  # Apple's fixed iBeacon advertising prefix
e2 c5 6d b5 df fb 48 d2 b0 60 d0 f5 a7 10 96 e0 # iBeacon profile uuid
00 00 # major 
00 00 # minor 
c5 # The 2's complement of the calibrated Tx Power
所以我们很容易就可以实现一个简单的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"

就需要这样改写

  1. static uint8 scanRspData[] =
  2. {
  3.   // complete name
  4.   0x14,   // length of this data
  5.   GAP_ADTYPE_LOCAL_NAME_COMPLETE,
  6.   // Microduino iBeacons
  7.   0x4D,   // 'M'
  8.   0x69,   // 'i'
  9.   0x63,   // 'c'
  10.   0x72,   // 'r'
  11.   0x6f,   // 'o'
  12.   0x64,   // 'd'
  13.   0x75,   // 'u'
  14.   0x69,   // 'i'
  15.   0x6e,   // 'n'
  16.   0x6f,   // 'o'
  17.   0x20,   // ' '
  18.   0x69,   // 'i'
  19.   0x42,   // 'B '
  20.   0x65,   // 'e'
  21.   0x61,   // 'a'
  22.   0x63,   // 'c'
  23.   0x6f,   // 'o'
  24.   0x6e,   // 'n'
  25.   0x73,   // 's'
  26.  
  27.   // Tx power level
  28.   0x02,   // length of this data
  29.   GAP_ADTYPE_POWER_LEVEL,
  30.   0       // 0dBm  
  31. };

复制代码


而 iBeacons 广播内容,根据上一篇文章的分析 需要写成

  1. static uint8 advertData[] =
  2. {
  3.   // Part1 Apple's fixed iBeacon advertising prefix
  4.   0x02, //Length
  5.   GAP_ADTYPE_FLAGS,
  6.   0x1a,
  7.   // broadcast data
  8.   0x1a, // length of this data including the data type byte: 26
  9.   GAP_ADTYPE_MANUFACTURER_SPECIFIC,      // manufacturer specific advertisement data type
  10.   0x4c,
  11.   0x00,
  12.   0x02,
  13.   0x15,
  14.   
  15.   // Part2 iBeacon profile uuid
  16.   0xe2,
  17.   0xc5,
  18.   0x6d,
  19.   0xb5,
  20.   0xdf,
  21.   0xfb,
  22.   0x48,
  23.   0xd2,
  24.   0xb0,
  25.   0x60,
  26.   0xd0,
  27.   0xf5,
  28.   0xa7,
  29.   0x10,
  30.   0x96,
  31.   0xe0,
  32.   
  33.   // Part 3 major, minor & 2's complement of the calibrated Tx Power
  34.   0x00, 0x00, // major
  35.   0x00, 0x00, // minor
  36.   0xc5
  37. };

复制代码


然后编译运行,在iOS设备上打开AirLocate之类的iBeacons测试工具,就可以搜到我们的 iBeacons 基站啦!
第三周工作总结——IBeacon协议分析_第1张图片 

有人要问了 为什么我要把它起名为 Microduino iBeacons 呢?

答案就是, iBeacons 模块现已加入 Microduino 豪华午餐~~ 当当当当~~ (测试版 没有洗板子 求轻拍……)

第三周工作总结——IBeacon协议分析_第2张图片 

----------------------------------------------------

你可能感兴趣的:(BLE)