Biu~老伙计们。
我们来说说BLE的使用吧,这部分可能会比别的功能难搞,因为有大量的封装和数据处理,还有很多协议参数和系统变量,更难的是没有文档参考。ε=(´ο`*)))唉~接下来几篇,带大家由浅入深去了解这部分功能。
首先我们先学习一个最简单的事情,在原有的ble广播上加入自己的数据。这数据可不是乱加的哈,ble的广播数据是有格式的,按照格式来加,这样即便你的数据没有意义,也可以被手机的调试软件(如nrf connect)识别出来,这样看起来也方便一点。不知道ble广播数据结构的,请自行百度学习
接下来就是要找到一个突破口去了解ble的数据是在哪里设置进去的。这里用一个简单的默认应用去了解,Tx power可以说是最简单ble数据了。 我们看到tx_power.c 这个文件,代码并不多,但是跟下去还是需要点时间的,这里直接说个结论。这个文件中主要有两个地方是添加数据的关键,一个是le_adv_data_callback_t的结构体类型,这个结构体有三个函数指针变量
GetNumberOfItems:获取数据块个数。在ble数据格式中,一个数据块是由多个字节组成。第一个字节表示该组数据长度,第二个字节表示数据类型,和后面N个字节表示数据内容。在自定义的数据中有多少个数据块,就返回多少。
GetItem:获取数据块的数据,根据数据块数量,一个个检索出数据
ReleaseItems:释放存储数据块数据的指针,有时候数据不是固定长度固定内容时,就会用到动态申请空间去保存,等使用完之后就需要释放。而当数据内容是固定差不多时,可以不用这样做,直接用个全局变量保存数据。
另外这三个函数都有共同的形参le_adv_data_params_t,这个变量是用来筛选数据的,也就是说,只有和传进来的参数一致或兼容才能被广播(下篇详讲这筛选的逻辑)
le_adv_data_set_t: 可以简单的理解为这个广播的用途
le_adv_data_set_handset_identifiable —— 配对状态的广播
le_adv_data_set_handset_unidentifiable —— 非配对状态的广播
le_adv_data_set_peer —— peer配对状态的广播
le_adv_data_completeness_t:表示这个数据块能不能简短或跳过,常用于UUID和名字这些能缩短的广播数据
le_adv_data_completeness_full —— 必须完整
le_adv_data_completeness_can_be_shortened —— 可以缩短
le_adv_data_completeness_can_be_skipped —— 可以不要
le_adv_data_placement_t:表示这个数据块要放在哪种广播包里面
le_adv_data_placement_advert —— 广播包
le_adv_data_placement_scan_response —— 响应包
le_adv_data_placement_dont_care —— 无所谓包
第二个重点就是了解完这些函数作用之后,就需要把这些API告诉系统,让他在广播时候会评估这些数据。
LeAdvertisingManager_Register就是把这些API注册到系统中
其中第一个参数task是用来接收广播状态变化的处理函数,如果不管这些状态的变化,可以直接写NULL;第二个参数就是前面提到的API结构体;而返回值就是这个API存在系统database的指针。完成以上两点的内容即可把自己的数据加到ble广播数据中了。
以上是本期博文的全部内容,如有疑问请在博文下方评论留言,或者有什么想了解的都可以留言,我会尽量安排上(o´ω`o)و。谢谢大家浏览,我们下期再见。
多看文档,多上官网
多看文档,多上官网
多看文档,多上官网
评论
方老板
2021年8月27日
我很菜
2021年8月3日
realhjt
2021年4月19日
tiger
2021年4月7日
Biu~
2020年12月29日
Biu~
2020年12月28日
Biu~
2020年12月18日
Biu~
2020年12月11日