查看: 3322|回复: 0

[原创] 【经验分享】KW36的beacon讲解

[复制链接]

该用户从未签到

656

主题

6312

帖子

0

超级版主

Rank: 8Rank: 8

积分
20027
最后登录
2024-4-26
发表于 2020-9-2 10:09:09 | 显示全部楼层 |阅读模式
本帖最后由 小恩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
1.jpg
添加之后NXP_T
2.jpg
但是直接在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实际位置,改一下也行。

回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /4 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2024-4-26 10:24 , Processed in 0.139690 second(s), 20 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表