• <tr id='RaJLa6'><strong id='RaJLa6'></strong><small id='RaJLa6'></small><button id='RaJLa6'></button><li id='RaJLa6'><noscript id='RaJLa6'><big id='RaJLa6'></big><dt id='RaJLa6'></dt></noscript></li></tr><ol id='RaJLa6'><option id='RaJLa6'><table id='RaJLa6'><blockquote id='RaJLa6'><tbody id='RaJLa6'></tbody></blockquote></table></option></ol><u id='RaJLa6'></u><kbd id='RaJLa6'><kbd id='RaJLa6'></kbd></kbd>

    <code id='RaJLa6'><strong id='RaJLa6'></strong></code>

    <fieldset id='RaJLa6'></fieldset>
          <span id='RaJLa6'></span>

              <ins id='RaJLa6'></ins>
              <acronym id='RaJLa6'><em id='RaJLa6'></em><td id='RaJLa6'><div id='RaJLa6'></div></td></acronym><address id='RaJLa6'><big id='RaJLa6'><big id='RaJLa6'></big><legend id='RaJLa6'></legend></big></address>

              <i id='RaJLa6'><div id='RaJLa6'><ins id='RaJLa6'></ins></div></i>
              <i id='RaJLa6'></i>
            1. <dl id='RaJLa6'></dl>
              1. <blockquote id='RaJLa6'><q id='RaJLa6'><noscript id='RaJLa6'></noscript><dt id='RaJLa6'></dt></q></blockquote><noframes id='RaJLa6'><i id='RaJLa6'></i>

                【技术分享】在Apollo2_ble 中添加一个service

                日期:2019-06-27 作者:润欣科技创研社 返回列表

                导语


                Apollo2_ble模块硬件由Apollo2(ble host)+ em9304(ble controller)组成。软件上,使用ARM的Cordio Stack and Profiles协议栈,这个协议栈又是基这可是无价之宝于WSF(Wireless Software Foundation)实现的。


                Apollo2_ble协议栈采用▓的是蓝牙4.2标准。


                什么是profile和service?


                profile,可以有多种翻∞译,在蓝牙技术联↘盟规定的蓝牙4.2标准中,定义Bluetooth profiles是用来实现蓝牙系统衣衫一阵鼓荡中应用的互操作性的。[1]这个profile的定义就比较广,本文不做具体描述。本文中的profile和service,都指的是图1中GATT-Based Profile/Services层的概念,也就是application层的概念。


                要谈我基本天天闭关这两者,首先说╲一下GATT。


                1.png


                图1 简易BLE层次划分图


                图1是简易的BLE层次划分,GATT(Generic Attribute Profile)是蓝牙中一种¤基于ATT协议(Attribute Protocol)的profile框架(framework)。ATT协议的初衷,可以说是为物联网服务的。在物联网时代,需要传感器采集各种信息,例如,温度,湿度,位置,电量等,ATT协议就将这些信息以属性(attribute)的形式传输到上层,以供读取或修蓝狐改。它规定了这些属性的格式,权限,读取方挥手道式等。而GATT就是将抽象的ATT协心里却揣测不已议具体化,规定了一个通用的关于这些属性如何读取修改的框架(framework)。到了具体的应用场景,我们小起angle就可以根据GATT规定好↓的框架,来编写对应的▓GATT-Based Profile。而每一个profile,其实是各就问了句种services的集合。


                举个例子,假他失声大叫如我们的应用场景是一个可以测心率的手环,该手环除了测心率的功能,我们还需要它有测电量的功能。这些不同的功能,其实就是不同的services。蓝牙技术联盟已经通过了各种不同的GATT services,详细列表可以∑参看文献[2]。这么多的services,并不是每究竟是你拥有一个秘密一个我们都需要,所以,我们可琅琊1985以自己写GATT-Based Profile,将我们需要的services包含进来。如上面手环的例子,这个profile,就只包含了Heart Rate service和Battery Service。


                开始添加service


                现在可以开始在Apollo2_ble的SDK中添加全员折服我们想要的居然就这么风轻云淡service了。


                本文以fit工程为例。


                打开我来解决工程后,整个工程的main函数入口单手一提在白祈少狂src目录下。(本文的编译环境用的是keil)图2是打开没有移植freertos系统的工程目录,假如移这才其中一个少年眼珠一转植了freertos,也是同样在src目录下,只是freertos系统的main函数入口在freertos_fit.c文件中,但具体的线程对应的◆代码在radio_task.c中,直接到对应线程的C文件武宗突破时逼出中查看即可。



                222.png   

                图2


                333.png

                图3


                在main函数或者对应线程中找到函数FitStart()


                44.png


                图4


                进入该函数,找到Initialize attribute server database代码段如图5:


                55.png


                图5


                由图5可知,该profile已经添加了4个services。(注意,4个中不包括GAP和GATT,这两个services是每个GATT-Based Profile都必须□添加的,代码手里竟然还拿了砍刀中由函数◢SvcCoreAddGroup进行添加)分别是,测心率的(Heart Rate),读取设备信◣息的(device information),测电量的(battery service)和测速率看着的(running speed and cadence)。


                现在假设我们要新添加一个HID的service。则首先就要在start函数里面注册这个service,增加的代码如下:


                6.png


                图6


                并且将对应的头文件都▲包含进来:


                7.png


                图7


                svc_hid.h里逼面声明了SvcHidRegister和SvcHidAddGroup,而hid_api.h里面声明了函数HidAttsWriteCback。


                并不是所有的service都需要注册读写回调函数,只有当Attribute list中的Attribute settings项出现ATTS_SET_WRITE_CBACK或者ATTS_SET_READ_CBACK时才需要。以fit工程为例,heart rate的Attribute list如下:



                8.png

                图8


                最后一个attribute需要用到写回调,因此在fitstart函数中才需要注册写回调函数的入口。


                看我们的service有没有添加成功,我们可以用手机打开蓝牙调试助手:


                1561598847391133.png


                图9


                下图10是未添加HID service时打开调试工具看到▆的服务列表,可以看见本来除了▽GAP(generic access profile)和GATT(generic attribute profile)外,有4个services,与我们◣在图5代码中所见一致,图11是我末流们添加代码后再打开测试工具看到的服务列表,可以看见HID service已经添加进去了。


                1561598872268969.png

                图10


                1561598891360173.png

                图11


                参考文献:

                [1] BLUETOOTH SPECIFICATION Version 4.2 [Vol 1, Part A] page 97

                [2] https://www.bluetooth.com/specifications/gatt/services/

                返回列表