Biu~笔记:高通蓝牙ADK(20)--自建gatt库

Biu~续上上上上回分解,小编带大家了解了BLE的广播功能,而那只是BLE的冰山一角。BLE最常用的功能还是各种服务,像状态读取,控制指令,参数设置这些都需要在BLE连上后的服务中体现。
鲁迅曾说过“没有服务的BLE就等于没有灵魂~”

所以小编会用两篇来带大家创建自己简单的读写BLE服务。这一篇就先带大家打基础,就是把gatt库建好,gatt库是BLE服务的重要组成部分。而且gatt库不止在ADK20.x可用,在ADK6.x和ADK4.x同样可用,很重要吧(`・ω・´)

       首先,Fake it until you make it. 找一个现成简单的gatt库抄作业。这里小编选中了gatt_imm_alert_server这个库进行copy。

路径:qcc514x-qcc304x-src-1-0_qtil_standard_oem_earbud\adk\src\libs

我们看到这么文件夹里有好多个文件,其中有几个文件是编译生成的,可以不用改。剩下的文件,文件夹,文件里面的函数名、变量名等都换个名字,不然编译会出错。

改完之后,就在工程把这个文件夹加入到工程中,并把对应的文件夹名字加到配置中的lib

完成以上操作,自建的gatt库就完成啦,抄作业是不是很简单\(^o^)/~  下一篇带大家在应用层用上这个gatt库,别关浏览器下期更精彩(o´ω`o)ノ


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

 

多看文档,多上官网

多看文档,多上官网

多看文档,多上官网

 


       能看到这里说明你可能不是个单纯想抄作业的人(≖ᴗ≖)✧ ,可能只是手滑滑多了一下。

       还是提一下几个注意的点,这些点会在使用中经常被修改到。

       第一点:.dbi文件

这个文件和之前说的xml文件很像,都是用来配置参数,然后用编译器生成对应的.h文件(gatt_XX_server_db.h)。打开这个.dbi文件,你就会发现,这就是服务的属性表,所有的属性定义从这里开始,这部分的描述在一个叫“80-CT311-1”编号的官方文档有详细介绍,这里就不展开了。但有一点要注意的是,这里的name会生成对应的handle,这个handle中各种消息处理中都会用到,你可以在gatt_XX_server_db.h找到生成的handle定义,就是HANDLE_(name)。

       第二点:gatt_XX_server.h\.c文件

这些文件是对接应用层的接口,里面必定会定义一个gatt库的初始化函数GattXXServiceServerInit,这个函数会用GattManagerRegisterServer使能整个gatt服务功能,其中第一个参数是库的task(简称一级处理),第二和第三参数是服务中可以操作的功能的handle头尾值。这个在.dbi文件生成的.h中可以找到。GattXXServiceServerInit还需要传进了应用层的task(简称二级处理),后续的处理会通过这个task发给应用层处理。另外还需要在.h中定义应用层接受的消息枚举和变量类型。这个消息枚举的起始值需要自己先在library.h里面申明,不然就会乱。


       第三点:gatt_XX_server_msg_handler.c

这个文件实现的是一级处理,当底层发来GATT_MANAGER_SERVER_ACCESS_IND消息,就表示远端要进行通信,消息数据里面带有的handle就是对应.dbi中名字生成的handle,每个handle对应每个服务(service)或特征(characteristic);如果有多个服务(service)或特征(characteristic),对应的处理就要增加。另外需要注意的是,大部分的指示都需要GattManagerServerAccessResponse回复处理结果(很多gatt库都基于GattManagerServerAccessResponse函数做了很多封装,根据自己习惯去做调整吧!)。例子:

小编做的是简单读写服务,所以在.dbi中定义一个读写service。其中包含只有一个读写的characteristic

其生成的handle:

用这些handle向底层注册一个gatt服务,其中的task就是一级处理库的处理函数:

注意了!!!注意了!!!注意了!!!

这里面的handle(同.dbi文件夹下的gatt_XX_server_db.h)不是最终的使用的handle,这里只是个参考,名字是一样的;而真正用到的handle是在gatt_handler_db.h中,这里面集合了所以服务的handle,每个handle都是唯一,使用的时候不要用错了。

一级处理函数收到GATT_MANAGER_SERVER_ACCESS_IND消息后的动作:

(读写操作都会在characteristic的handle中处理)

处理读写,并将数据传递到应用层二级处理,写操作和错误数据都会回复给远端,读操作会在应用层回复:

后面对服务功能的变更修改基本都会在小编展示的这几个地方做变动。

 

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

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

评论

访客

访客

2022年7月18日
请问有没有全一点的代码
我很菜

我很菜

2021年6月17日
怎么办会员呢