本帖最后由 southwolf1813 于 2014-1-14 10:16 编辑
上一次(
https://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"
就需要这样改写
- static uint8 scanRspData[] =
- {
- // complete name
- 0x14, // length of this data
- GAP_ADTYPE_LOCAL_NAME_COMPLETE,
- // Microduino iBeacons
- 0x4D, // 'M'
- 0x69, // 'i'
- 0x63, // 'c'
- 0x72, // 'r'
- 0x6f, // 'o'
- 0x64, // 'd'
- 0x75, // 'u'
- 0x69, // 'i'
- 0x6e, // 'n'
- 0x6f, // 'o'
- 0x20, // ' '
- 0x69, // 'i'
- 0x42, // 'B '
- 0x65, // 'e'
- 0x61, // 'a'
- 0x63, // 'c'
- 0x6f, // 'o'
- 0x6e, // 'n'
- 0x73, // 's'
- // Tx power level
- 0x02, // length of this data
- GAP_ADTYPE_POWER_LEVEL,
- 0 // 0dBm
- };
复制代码
而 iBeacons 广播内容,根据上一篇文章的分析 需要写成
- static uint8 advertData[] =
- {
- // Part1 Apple's fixed iBeacon advertising prefix
- 0x02, //Length
- GAP_ADTYPE_FLAGS,
- 0x1a,
- // broadcast data
- 0x1a, // length of this data including the data type byte: 26
- GAP_ADTYPE_MANUFACTURER_SPECIFIC, // manufacturer specific advertisement data type
- 0x4c,
- 0x00,
- 0x02,
- 0x15,
-
- // Part2 iBeacon profile uuid
- 0xe2,
- 0xc5,
- 0x6d,
- 0xb5,
- 0xdf,
- 0xfb,
- 0x48,
- 0xd2,
- 0xb0,
- 0x60,
- 0xd0,
- 0xf5,
- 0xa7,
- 0x10,
- 0x96,
- 0xe0,
-
- // Part 3 major, minor & 2's complement of the calibrated Tx Power
- 0x00, 0x00, // major
- 0x00, 0x00, // minor
- 0xc5
- };
复制代码
然后编译运行,在iOS设备上打开AirLocate之类的iBeacons测试工具,就可以搜到我们的 iBeacons 基站啦!
有人要问了 为什么我要把它起名为 Microduino iBeacons 呢?
答案就是, iBeacons 模块现已加入 Microduino 豪华午餐~~ 当当当当~~ (测试版 没有洗板子 求轻拍……)
写完以后才发现 EEWorld也偷偷发了个iBeacons教程……只不过没敢吧Apple跟iBeacons说出来{:soso_e120:}
https://www.eeworld.com.cn/training/2014/TI_RFlimitless_0106/377.html