本文从功能需求的角度分析一般蓝牙BLE单芯片的应用框架(SDK Framework)的接口设计过程,并以TI CC2541为例说明BLE的应用开发方法。

一、应用框架(Framework)

我们熟知的Framework包括Android Framework、Linux QT、Windows MFC。应用框架抽象并封装实现了一般应用场景的需求,完成应用开发的80%,剩下的20%则以回调(callback)和接口的方式供应用开发人员调用以完成具体的需求。

一般Framework完成的工作包括:任务分发、消息通信和UI等。例如以上三种框架所属的IDE都能够实现所见即所得的UI可视化编程,框架完成了UI控件的大部分工作,而开发人员只需要完成UI控件的消息处理逻辑即可,如点击了这个button后如何进行响应等。

蓝牙BLE单芯片的系统架构包括操作系统、SOC硬件抽象接口和蓝牙应用框架等组成部分,操作系统和SOC硬件抽象接口的理解请理解《如何快速理解一个全新的嵌入式操作系统》(发送55获取)和《如何快速理解一个全新的嵌入式操作系统(续)》(发送56获取)。本文只讨论蓝牙应用方面框架接口设计和应用开发。

二、 蓝牙BLE的应用需求

我们都知道BLE是为了实现连接后的通信传输和控制。BLE设计的初衷是为了完成少数据量的通信,侧重于通信控制。所以我们可以理解BLE的协议栈包括两大组成部分:一个是蓝牙连接;另一个是通信控制。前者即对应GAP(General Access Profile),后者对应GATT(General Attribute Profile)。Profile在蓝牙术语里面相应于特定的应用场景协议。

三、 蓝牙BLE的应用需求分析

我们分别对连接和通信控制进行分析。这里以蓝牙设备Peripheral角色进行分析,简单理解即是从设备。手机APP所用的蓝牙一般充当central角色,即主设备。

1.   连接

连接部分,蓝牙外设要完成的功能包括:

1)  蓝牙外设要被发现,其必须要进行广播

2)  在主设备扫描时要给出扫描响应。这时蓝牙设备还是处于广播状态。

3)  主设备发起连接时,其可以要求密码配对,而也可以选择无需密码验证。

4)  主设备发起连接过程的握手,接受连接。

5)  蓝牙外设连接成功后才会开启通信服务。

2.   通信控制

1)  蓝牙外设在连接后通过GATT来提供服务发现(service discover),这样主设备能够从中获取蓝牙外设提供的各种服务profile。

2)  主设备在获取蓝牙外设服务后,会对GATT profile的各种特征字(characteristics)进行读写传输控制。

3)  特征字主要包含write、read、notify和indicate等主要通信方式。对于蓝牙外设的write特征字,主设备(如手机)可以进行写操作;对于read,主设备则可以从中读取信息;write和read对于蓝牙外设来说,其属于被动控制,即蓝牙外设被动接受主控制的通信控制。而notify和indicate则是蓝牙外设主动向主设备传输数据,前提是主设备要预先订阅对应的characteristics的信息更新。Notify数据后,主设备不需要应答响应,而indicate则需要应答响应。

四、  蓝牙BLE的应用框架(framework)设计

我们之前已经分析过,framework应该完成应用开发的80%工作,即基本完成了常见的应用需求。剩下20%则是由各个具体应用的具体场景需求来决定的。例如,蓝牙底层连接时怎么握手,咱们应用开发人员不需要关心吧;GATT的characteristics value值的通信过程,我们不要关心吧。当蓝牙外设有新的数据要传输给主设备时,只需要调用notify或者indicate接口就可以了,至于底层怎么实现,那是协议栈开发人员的工作。

OK,咱们根据第三部分的需求分析来找出应用开发人员所关心的20%工作任务。换句话来说,剩下的80%工作量即是蓝牙应用框架Framework所要完成的任务。一般蓝牙单芯片都会给用户提供SDK进行开发,其里面已经实现framework了。我们应用开发人员应当重点关注这20%的任务。

1.   连接

1)  对于广播来说,不同的应用需要广播的信息并不一样,如ibeacon和微信airsync协议的广播数据格式要求是不一样的。所以,framework应该提供给用户一个自定义广播数据的接口。

2)  同理,framework应该提供给用户一个自定义扫描响应数据的接口。

3)  对于密码配对过程,常见的做法是framework给应用开发提供一个回调接口,当收到主设备传送过来的密码后,对这个接口进行回调,并将这个密码以参数的形式传递给这个接口,以让用户自己判断密码是否跟预设的一致。

4)  Framework应该对连接的状态进行管理,分别提供用户回调接口,在连接成功时对接口进行回调,以让用户在连接成功时做一些特定的操作,如闪灯标识、开启GATT服务等;在断开连接时也应该回调用户接口,以让用户在断开连接时做一些特定的操作。

2.   通信控制

我们这里还是只分析蓝牙外设Peripheral角色的framework,不探讨主设备的framework,读者可以相应进行分析。

1)framework应该明确如何用最简单的方式定义并添加一个蓝牙GATT profile服务。蓝牙BLE有自己的协议标准,一个蓝牙服务service包括一个或者多个characteristics,而每个characteristics都包含对应UUID、属性描述(如可读、可写、长度等)、属性值value、属性配置(代表订阅信息)等等。

为了简化后续的数据处理,一般framework会设置一个handle来对应一个characteristics。

2)framework提供接口给用户来对各个characteristics的属性value进行设置和获取。

3)framework提供回调接口给用户,当主设备读characteristics回调读接口,以让用户进行特定操作后再进行传输;当主设备写characteristics时回调写接口,以让用户完成相应的操作。

4)framework提供用户接口,完成主动的notify和indicate操作。

OK,以上即是蓝牙BLE单芯片普遍的framework设计需求。我们在接触一款新的BLE单芯片时,只要能够重点把握好以上这20%的编程方法,就能快速进行应用开发。

五、Ti CC2541应用开发

TI CC2541 SDK有一个简单的示例工程SimpleBLEPeripheral,向开发人员展现如何进行蓝牙应用开发。我们通过这个工程来理解上述框架设计和编程。

1.   连接

1)定义广播数据

GAPRole_SetParameter(GAPROLE_ADVERT_DATA,…);

2)自定义扫描响应数据

GAPRole_SetParameter(GAPROLE_SCAN_RSP_DATA,…);

3)密码管理回调

ProcessPasscodeCB()

4)状态管理回调

peripheralStateNotificationCB()

2.通信控制

1)添加GATT服务

GATTServApp_RegisterService()

2)读回调

simpleProfile_ReadAttrCB()

3)写回调

simpleProfile_WriteAttrCB()

4 )属性值设置和获取

SimpleProfile_SetParameter()

SimpleProfile_GetParameter()

5)主动传输

GATT_Notification()

GATT_Indication()

参数可以对照具体的接口进行分析。我们在看具体的接口之前,可以思考一下,这些接口的参数应该包括什么东西,如果你能想到包括什么,恭喜你,你的应用框架设计能力已经大大提高了。

蓝牙(BLE)应用框架接口设计和应用开发——以TI CC2541为例相关推荐

  1. 一个通用的Json解析框架接口设计(一)-接口设计

    我们项目中可能会用到许多的json框架,Fastjson.jackson.Gson.orgjson.json-lib,其实现方式各不相同,接口Api就不一样,我们想换一个json框架改动的地方就会很多 ...

  2. 蓝牙BLE芯片PHY6222之I2C主从通信

    蓝牙BLE芯片PHY6222之I2C主从通信 开发环境 I2C主机 I2C从机 注意事项 开发环境 1.PHY6222开发板 2.SDK版本以及路径:SDK\release_bbb_sdk-PHY62 ...

  3. 【蓝牙Mesh笔记 ①】ESP32-C3 模组上实现天猫精灵蓝牙 BLE Mesh AliGenie 接入,无需WiFi 连接也可以实现天猫精灵语音控制。

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 系列一:ESP32系列模组基础学习系列笔记 1. 爬坑学习新旅程,虚 ...

  4. 蓝牙 BLE 协议学习: 有关概念介绍

    背景 在学校内就用过蓝牙技术参加过比赛(并拿了奖):而蓝牙作为物联网中比较常见的协议,有必要进行深入的学习.此后的文章会以 ble(v4.0) 进行学习. 介绍 蓝牙技术最初由电信巨头爱立信公司于 1 ...

  5. java 协议栈_深入浅出讲解低功耗蓝牙(BLE)协议栈

    详解BLE连接建立过程 https://www.cnblogs.com/iini/p/8972635.html 详解BLE 空中包格式-兼BLE Link layer协议解析 https://www. ...

  6. 蓝牙BLE(协议栈、OSAL、蓝牙APP工具)

    目录 蓝牙配对和绑定 蓝牙4.0 BLE 信道(RF Channel) BLE协议栈分层 PHY层(Physical layer 物理层) LL层(Link Layer 链路层) HCI层(Host ...

  7. 蓝牙:深入浅出低功耗蓝牙(BLE)协议栈

    深入浅出低功耗蓝牙(BLE)协议栈 BLE协议栈为什么要分层?怎么理解BLE"连接"?如果BLE协议只有ATT层没有GATT层会发生什么? 协议栈框架 一般而言,我们把某个协议的实 ...

  8. 转 主流蓝牙BLE控制芯片详解(5):Dialog DA14580

    [导读] Dialog推出的号称全球功率最低.体积最小的SmartBond DA14580蓝牙智能系统级芯片(SoC),与竞争方案相比,该产品可将搭载应用的智能型手机配件,或计算机周边商品的电池巡航时 ...

  9. 基于STM32F103C8T6与ESP8266的物联网智能温度采集与蓝牙OLED数字钟的设计与实现

    基于STM32F103C8T6与ESP8266的物联网智能温度采集与蓝牙OLED数字钟的设计与实现 作者: 颜孙炜 文章目录 基于STM32F103C8T6与ESP8266的物联网智能温度采集与蓝牙O ...

最新文章

  1. LeetCode简单题之数组异或操作
  2. MATLAB实现最优低通滤波器的函数
  3. free movie
  4. html列表无序嵌套,HTML/CSS - 如何正确定位这些嵌套的无序列表?
  5. 用Socket 打造跨语言跨操作系统的网络MORPG游戏(二)
  6. finfoopen需要什么扩展 php_php获取文件mime类型的四种方法
  7. count慢的问题解决
  8. 基于DispatchProxy打造自定义AOP组件
  9. java并发(二):初探syncronized
  10. python金融衍生品_《Python金融衍生品大数据分析:建模、模拟、校准与对冲(博文视点出品)》【摘要 书评 试读】- 京东图书...
  11. Maven项目添加ojdbc8
  12. scrapy Pipline保存到数据库
  13. 面试机试之序列前n项和
  14. Quartz 定时任务 cron 表达式详解
  15. 我心里优秀架构师是怎样的?
  16. smalltalk资源
  17. Verilog中parameter使用
  18. 公共基础知识题库 计算机考点,公共基础知识考点
  19. apfs扩容_向 APFS 文件系统转进:iOS 10.3 为 iPhone 变相扩容存储空间
  20. JAVA实训-连连看(二)

热门文章

  1. linux修改主机名+免密认证+关闭防火墙
  2. SpringBoot之事务管理Transactional
  3. 理解基本权限以及特殊权限:Suid 、Sgid、Sticky以及acl
  4. 《数字视频和高清:算法和接口》一第1章 光 栅 图 像
  5. PHP 权威代码风格规范
  6. 什么是shell,shell基础由浅入深,常用的shell命令、用法、技巧
  7. 11gR2RAC环境DBCA创建一个数据库错误ORA-15055 ORA-15001
  8. 〖Linux〗Ubuntu13.10中使用虚拟机对MTK手机进行线刷
  9. ylb:SQL 表的高级查询-多表连接和子查询
  10. WEB免费打印控件推荐