Biu~笔记:高通蓝牙ADK(15)--BLE广播数据组建过程

       Biu~上一篇教了大家如何加入自己的BLE广播数据,这一篇就带大家了解一下上层是怎么筛选组建的BLE广播数据的。



       我们从上一篇的得知获取数据的API会放在一个系统database里,

static struct _le_adv_mgr_register database[MAX_NUMBER_OF_CLIENTS];

这一篇会从建立数据开始(leAdvertisingManager_BuildData)由上往下到这个database的讲解,同时这个过程会一直使用到le_adv_data_params_t这个类型变量做数据筛选,所以le_adv_data_params_t是本篇的重点部分。大致流程图如下:

       leAdvertisingManager_BuildData 这个函数在广播开始时被调用去生成ble广播数据包,其中形参是le_adv_data_params_t中的一个参数le_adv_data_set_t,用来指定这个广播的用途或可以了解为针对每个状态的广播,可以理解为有三个模式,peer配对、手机配对和一般状态。函数里会用到for_all_params_in_set(&params, set)这个语句去处理数据。从这个for循环里面可以看出le_adv_data_set_t是最重要的考虑条件,如果不是这个模式的数据,直接不考虑;第二重要的是le_adv_data_placement_t ——把数据放在哪里,是广播包还是响应包,而这两种包在格式上没有区别;第三个才考虑内容能不能缩短忽略 —— le_adv_data_completeness_t。因此,小伙伴们,现在知道在设置广播数据时怎么匹配这些参数了吧,不知道就继续往下看吧。

        接下来看看for_all_params_in_set这个语句,这是三层for循环语句的宏定义,为了就是让你看代码不被吓到。乍一看,随着身体的抖动,一切变得索然无味。可是不可以这样呀,生活还是要继续的呀,再难也要啃呀,再秃也不能哭啊,哭也要找个没人的地方放声大哭。例如在厕所撕心裂肺的哀嚎,你爸会跑过来拍拍你的肩膀“没事,我查过,我们没有拖平均水平的后腿”;你妈会抱着你“傻孩子,我们一直把你当男孩子养”;你弟笑着和你说“近年流行宽松的衣服”。所以不要哭,要坚定地相信等到变秃的时候,就是变强的时候。

其实把这个宏定义还原回来,也没那么难,就是三个for循环加一个if判断语句,只是变量名长了一点而已嘛

从这些语句可以得到的结论是,他在遍历所有符合le_adv_data_set_t这个模式的数据。
        Ok,回到函数里,我们看看他拿这些数据干嘛,首先看到leAdvertisingManager_ProcessAllClientsData是第一个数据实际处理的函数,里面有个函数leAdvertisingManager_HeadClient,这就是获取前面说的database的头指针,有了这个指针就可以获取上篇说的数据块数量和数据块内容了。再往底下看,从数据块获取到的数据会在leAdvertisingManager_ProcessDataItem里面处理,从内容看出这部分是处理数据中的uuid和名字。再往下看就会发现,他把这些数据块的uuid都收集起来,放在一个列表里面,这里面只使用le_adv_data_completeness_t这个参数做处理,根据for_all_params_in_set去理解,这个列表是先把一定要广播完整uuid的数据放在前头,可以缩短的放在中间(注:可以缩短的意思是当广播包的空间不够时,这些uuid会抛弃掉),可以抛弃的直接就不要了。因此这里收集整理的原因不难理解,在ble广播数据中的uuid应该要一起出现嘛,不会是这一个uuid那个一个uuid,这样就很浪费数据空间了。而在名字数据处理里面,他是规定只能有一个名字,并且这个名字在第一次设置之后,只能被相同字数的名字替换,否则会死机,(⊙o⊙)…所以没什么事不要乱改名字,要改也要在他的基础上修改,默认工程的ble名字是“LE-(传统蓝牙名字)”,LE-可以单独去掉。总的来说leAdvertisingManager_ProcessAllClientsData这个函数是将所有准备广播的数据做优先级处理,处理完之后放在一个存储空间里面,等组建广播数据包的时候用。

       完成上面的数据处理之后,就开始组建广播数据啦。


       还是用for_all_params_in_set遍历所有类型的数据,在第一个组建函数leAdvertisingManager_BuildAllClientsData里,也是用同样的方式去把database的数据提取出来,而这一次处理的数据是那些非uuid和名字的数据。这些数据在leAdvertisingManager_AddDataItem中做分配装载,简单来说就是有两辆车一个是叫广播包的车,应该是叫响应包的车,两个车是可以同时发车的。数据根据le_adv_data_placement_t的参数决定上哪辆车,根据le_adv_data_completeness_t参数决定要不要上。同样的道理leAdvertisingManager_BuildLocalNameData和leAdvertisingManager_BuildUuidData也是这样,只不过他们的数据就不上直接在database里面拿,而是那些被leAdvertisingManager_ProcessAllClientsData处理后的数据。通过以上装车步骤之后,两个广播的数据包就组建好了,接下来就等发车。



以上是本期博文的全部内容,如有疑问请在博文下方评论留言,或者有什么想了解的都可以留言,我会尽量安排上(o´ω`o)و。谢谢大家浏览,我们下期再见。

 

 

多看文档,多上官网

多看文档,多上官网

多看文档,多上官网

 

 

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★文明上网,请理性发言。内容一周内被举报5次,发文人进小黑屋喔~

评论

叉烧

叉烧

2020年12月1日
来不及秃了。。。。
Biu~

Biu~

2020年11月30日
?????
Carrie

Carrie

2020年11月27日
?? ?? ??