本帖最后由 小恩GG 于 2020-9-3 13:28 编辑
设备:KW36 例程:Beacon 使用的手机app:nRF connect 1、 Beacon是什么? 简单来说就是一种广播数据的规定。基于ble广播,则意味着我们不需要连接到ble设备就可以发现设备的消息。 Beacon又有ibeacon和普通beacon,ibeacon是用于苹果系统的,安卓一般使用普通beacon。 数据格式是怎样的呢。
普通beacon数据格式 2字节公司ID + 1字节Beacon符 + 18字节UUID +6字节数据 + 1字节发送功率 如果我们需要发送一些变化的数据,比如温度等等,就可以将数据放在6字节数据里。 例程中定义在app_config.c ,变量adData1[26]
2、 ble广播数据 ble广播数据首先就长度而言被限制为31字节。 这31字节里,可以发送不同类型的数据。每一种类型数据格式按照 length + AD type + AD Data. 你可以发N个,用以上方法组织的数据,但是总字节数必须小于等于31 广播数据也定义在app_config.c,变量advScanStruct 例程中广播数据有两种,一个adData0,用于设置广播的模式—例程中设置为可发现模式且不支持经典蓝牙,adData1则是beacon数据。 static const gapAdStrucature_tadvScanStruct[] = { { .length = NumberOfElements(adData0) + 1, .adType = gAdFlags_c, .aData = (uint8_t *)adData0 }, { .length = NumberOfElements(adData1) + 1, .adType = gAdManufacturerSpecificData_c, .aData = (uint8_t*)adData1 } } advScanStruct里的数据长度之和应当小于等于31,length长度的计算是,数据长度加上1字节,NumberOfElements(adData0) + 1 +NumberOfElements(adData1) + 1等于 29字节。所以这个广播报文只用了29字节?千万不要忘了还有adType也占用一个字节,但是这个字节是没有被计算在length里的。所以29还要加2字节的adType,这样就是31字节。
这样的广播是没有设备名的。设备名也可以是广播中的一个adType。如果添加这种type,那么app就可以发现设备名。
不添加时候 N/A 添加之后NXP_T 但是直接在advScanStruct结构体里添加一个名字结构体是行不通的。比如这样添加名字 static const gapAdStrucature_t advScanStruct[]= { { .length = NumberOfElements(adData0) + 1, .adType = gAdFlags_c, .aData = (uint8_t *)adData0 }, { .length = NumberOfElements(adData1) + 1, .adType = gAdManufacturerSpecificData_c, .aData = (uint8_t*)adData1 }, { .adType = gAdShortenedLocalName_c, .length = 6, .aData = (uint8_t*)"NXP_T" } }
刚才说过广播数据要小于等于31,直接在后面加是没有用的,超出了广播数据长度,所以如果非要显示设备名的话,只能削减beacon的数据,如果名字部分占用了7字节,那么beacon数据就要少7字节,但这样来说,beacon数据最后的几个用于实际动态数据被牺牲了。但是你可以自己定义数据结构,而不是非要遵循beacon。剩下的字节也足够自己做其他的文章。 那么beacon数据和local name在数组advScanStruct,相互换位置吗?不能,因为BleApp_Init有FLib_MemCpy(&gAppAdvertisingData.aAdStructures[1].aData[3],ctx.hash, 16); 他把uuid的hash值拷贝的地址是scan结构体的第二个数据,所以数组第二个数据必须是beacon数据。但是你也可以把这段代码注释掉,这样就可以随意换顺序,或者当你换顺序了把,aAdStructures[] 里的标号,根据beacon数据在advScanStruct实际位置,改一下也行。
|