0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

在Apollo2_ble 中添加一个service

润欣科技Fortune 2019-07-02 09:55 次阅读

导语

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 简易BLE层次划分图

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

举个例子,假如我们的应用场景是一个可以测心率的手环,该手环除了测心率的功能,我们还需要它有测电量的功能。这些不同的功能,其实就是不同的services。蓝牙技术联盟已经通过了各种不同的GATT services,详细列表可以参看文献[2]。这么多的services,并不是每一个我们都需要,所以,我们可以自己写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文件中查看即可。

   

图2

图3

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

图4

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

图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

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

图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

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

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

图9

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

图10

图11

参考文献:

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

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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • ARM
    ARM
    +关注

    关注

    134

    文章

    9098

    浏览量

    367707
  • 嵌入式
    +关注

    关注

    5083

    文章

    19131

    浏览量

    305533
收藏 人收藏

    评论

    相关推荐

    esp32启用ble后用自己的iOS app能够发现service,但没有发现service里面的特征,为什么?

    esp32,启用ble后用自己的iOS app能够发现service,但没有发现service里面的特征,创建服务或特征的时候需要进行什么特别的设置吗?
    发表于 06-13 06:24

    ESP32-C3 BLE client如何连接同一个server的多个service

    最近在做一个项目需要ESP32-C3作为BLE client 连接同一个server的两service。 网上的例程都是连接多个serve
    发表于 06-13 08:29

    蓝牙开启自定义服务之后,添加子服务,怎么添加第二子服务啊?

    蓝牙开启自定义服务之后,添加子服务,怎么添加第二子服务啊 按照我的理解,创建第
    发表于 06-19 08:32

    例程 ”BLE_GATTS_SPP“,手机第次连接蓝牙服务时,怎么添加配对密码?

    例程 ”BLE_GATTS_SPP“,手机第次连接蓝牙服务时,怎么添加配对密码?
    发表于 07-19 08:28

    怎么更新CyPress PROC的BLE

    BooTo加载项目已经包含了BLE组件,那么:a.将其移动到BeloOthayFixEdtStKyBooToLoLe01项目。b.将Bootloader服务添加并配置到现有的
    发表于 12-17 16:22

    Glucose Sensor 下添加Service: Current Time(0x1805)问题

    Glucose Sensor 下添加Service: Current Time(0x1805).用来设置仪器时间。但是不知道怎么用。
    发表于 09-17 13:31

    apollo2 mcu开发的相关资料分享

    接口从外部打开调试访问允许访问所有的内存和外围设备的MCU。Apollo2 MCU 低功耗模式活动模式休眠模式深度模式关机二、中断事件有哪些呢?NVIC唤醒中断控制器退出休眠进入休眠,等待中断MCU
    发表于 11-01 07:23

    Apollo Heritage版音频接口附带的插件

     Universal Audio去年推出的Apollo Heritage版音频接口提供了5或10获奖的UAD插件,包括Teletronix®、Fairchild®、Pultec®
    发表于 01-24 08:59

    ESP32-C3 BLE client如何连接同一个server的多个service

    最近在做一个项目需要ESP32-C3作为BLE client 连接同一个server的两service。网上的例程都是连接多个server
    发表于 02-10 08:05

    蓝牙开启自定义服务之后,添加子服务,怎么添加第二子服务啊?

    蓝牙开启自定义服务之后,添加子服务,怎么添加第二子服务啊[img]https://www.esp32.com/[attachment
    发表于 02-16 08:59

    如何向BLE网状节点添加更多通告的GATT服务?

    我目前正在使用 Capacitor 框架编写移动应用程序,我需要该应用程序和 ESP-BLE 网格
    发表于 03-02 06:39

    如何实现ESP32-C3 BLE client连接同一个server的多个service呢?

    最近在做一个项目需要ESP32-C3作为BLE client 连接同一个server的两service。网上的例程都是连接多个server
    发表于 03-03 08:52

    Apollo添加新的控制算法步骤

    Apollo的控制算法由或多个控制器组成,可以轻松更改或替换为不同的算法。 每个控制器将
    的头像 发表于 10-02 11:11 5373次阅读

    apollo系列之apollo2 mcu开发(基础篇)之1.1-apollo2 mcu简介

    更多内容apollo系列汇总Apollo2 mcu的架构
    发表于 10-25 17:36 20次下载
    <b class='flag-5'>apollo</b>系列之<b class='flag-5'>apollo2</b> mcu开发(基础篇)之1.1-<b class='flag-5'>apollo2</b> mcu简介

    关于Apollo2(MCU)时钟问题引发的剖析

    最近和硬件同事块调使用Apollo2的MCU的板子,这种MCU号称全球超低功耗MCU之最。“咱也不知道,咱也不敢问,为什么敢用如此嚣张的称呼!!!哈哈,开个玩笑。”言归正传,在生
    发表于 10-28 20:36 8次下载
    <b class='flag-5'>一</b><b class='flag-5'>个</b>关于<b class='flag-5'>Apollo2</b>(MCU)时钟问题引发的剖析