BLE低功耗蓝牙的广播内容

BLE广播的原理

BLE的设备可以发出广播信号,其信号占用的通道是37,38,39通道


image.png

设备可以选择广播在其中的任何一个,两个或全部三个通道


image.png

其广播包的格式为
image.png

BLE4.0-BLE4.2支持的最大广播payload包长是31字节;BLE5.0增加了扩展模式,以数据通道发送额外的数据,使得广播支持的最大payload包长是254字节。

广播内容和扫描内容

除了广播的31字节以外,还支持在扫描回复内容中包含最多31字节的数据。
这两者的区别是:广播的内容会持续定期发送,不管有没有接收者;而扫描回复内容只有在主机发送扫描命令后,设备才会在扫描回复中携带此内容
以下是一个典型的广播-扫描-回复过程。

image.png

一般来讲,在上层软件中,会将广播内容和扫描回复内容统一处理成设备的广播信息,并从中提取出相关字段。

广播字段的定义

广播内容和扫描回复内容的格式定义是通用的。都是长度+数据的方式,其中数据又分成类型+实际数据,如下图

image.png

蓝牙官方协议中定义了各种类型的含义。
常用的有:格式定义字段(Flags), UUID字段,设备名称字段,厂商自定义字段等
这些字段中,除了格式定义字段是必须存在,且需要放在广播内容中,其他字段都是可选的,并且位置并不重要,放在广播内容或扫描回复内容中都可以,效果基本相同。

格式定义字段

格式定义字段(Flags)是一个字节的配置字段,是唯一一个必须包含的字段,用于指示设备是否可以被搜到、是否支持传统蓝牙,是否支持可被连接等。

UUID字段

UUID是一种唯一代号,一般每个service会对应一个UUID,一个设备可以有多个UUID。


image.png

一个完整的UUID是128bit,也可以以32bit或16bit缩写的方式表示。
通过此字段,可以选择将全部或部分UUID广播出来。

名称字段

名称字段(Local Name)决定了设备在手机中搜索出来的名字

注意,虽然安卓使用上述字段,iPhone可能不使用此字段,而使用ATT协议中的名称字段作为设备名称显示出来

厂商自定义字段

厂商自定义字段(Manufacturer Specific Data)是我们可以自己定义其内容的字段。其中也预定义了一些厂商,在Bluetooth官方网站可以查到,这些都是交了会员费的成员。
如果我们自己用,也可以完全自定义內容

一些第三方软件,例如微信,并不支持获取所有字段的内容,但是一般都会支持显示厂商自定义信息。所以需要传输一些自定义信息时,使用厂商自定义字段是比较合适的。

其他字段

其他字段可以参考蓝牙标准,或者其他网站说明。

长度限制

注意:广播和扫描字段内容均不能超过31字节,并且要特别注意每个字段中的Length要与Data匹配,否则可能会造成某些手机能搜到广播某些搜不到的奇怪现象。

CC264x中设置和修改蓝牙广播内容

初始化设置

CC264x中,广播内容和扫描回复内容要分别设置。
定义两个数组缓冲

// Advertisement data, 最多31字节
uint8_t advData[] =
{
  0x02
  ,GAP_ADTYPE_FLAGS
  ,GAP_ADTYPE_FLAGS_BREDR_NOT_SUPPORTED | GAP_ADTYPE_FLAGS_GENERAL
...
}
uint8_t scanResData[] =
{
...
}

使用GapAdv_loadByHandle()函数加载缓冲内容

GapAdv_loadByHandle(advHandle, GAP_ADV_DATA_TYPE_ADV, sizeof(advData), advData);
GapAdv_loadByHandle(advHandle, GAP_ADV_DATA_TYPE_ADV, sizeof(scanResData), scanResData);

之后调用GapAdv_enable()打开广播即可

修改内容

如果在广播已经开启后,要修改广播内容,有两种方法
方法一:使用GapAdv_prepareLoadByHandle()和GapAdv_loadByHandle()方法

// 更改前的准备,GAP_ADV_FREE_OPTION_DONT_FREE指示不释放原内容。对广播和扫描同时生效。
GapAdv_prepareLoadByHandle(advHandle, GAP_ADV_FREE_OPTION_DONT_FREE)
// 修改缓冲内容
advData[..] = ...
scanResData[..] = ...
...
// 重新装载缓冲
GapAdv_loadByHandle(advHandle, GAP_ADV_DATA_TYPE_ADV, sizeof(advData), advData);
GapAdv_loadByHandle(advHandle, GAP_ADV_DATA_TYPE_ADV, sizeof(scanResData), scanResData);

方法二:使用GapAdv_prepareLoadByBuffer() 和 GapAdv_LoadByBuffer()方法

// 更改前的准备,FALSE指示不释放原内容。对指定缓冲生效。
GapAdv_prepareLoadByBuffer(advData, FALSE)
// 修改缓冲内容
advData[..] = ...
...
// 重新装载缓冲
GapAdv_loadByBuffer(sizeof(advData), advData);

注意:对于某些SDK(例如CC13x2_26x2 SDK 3.20.00.68, 3.40.00.02),有已知BUG,方法二只能用于更新广播,而不能用于更新扫描数据。

参考文章

https://blog.csdn.net/slimmm/article/details/100583655
https://blog.csdn.net/zzfenglin/article/details/56064808
https://www.novelbits.io/bluetooth-low-energy-advertisements-part-1/
https://www.novelbits.io/bluetooth-low-energy-advertisements-part-2/
https://stackoverflow.com/questions/40250621/does-the-ble-spec-allow-for-manufacturer-ad-type-in-both-advertising-data-and-sc
https://stackoverflow.com/questions/33535404/whats-the-maximum-length-of-a-ble-manufacturer-specific-data-ad
https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/845470/cc2642r-updating-scan-response-data-via-gapadv_loadbybuffer

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,636评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,890评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,680评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,766评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,665评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,045评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,515评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,182评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,334评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,274评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,319评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,002评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,599评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,675评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,917评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,309评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,885评论 2 341

推荐阅读更多精彩内容