蓝牙(BLE)应用框架接口设计和应用开发——以TI CC2541为例
本文从功能需求的角度分析一般蓝牙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为例的更多相关文章
- 【Yom框架】漫谈个人框架的设计之三:业务接口+UI层的设计(基于Castle实现的Repository)
Repository层设计的文章见:[http://www.cnblogs.com/yomho/p/3297042.html] 一.概要设计 上面Reposity 应该为 Repository 特 ...
- 【Yom框架】漫谈个人框架的设计之二:新的IRepository接口+搜索和排序解耦(+基于Castle实现)
经过了上篇IRepository和IRepository<T>的讨论[文章地址为:http://www.cnblogs.com/yomho/p/3296759.html] 我选择了IRep ...
- [自制操作系统] BMP格式文件读取&图形界面系统框架/应用接口设计
本文将介绍在本人JOS中实现的简单图形界面应用程序接口,应用程序启动器,以及一些利用了图形界面的示例应用程序. 本文主要涉及以下部分: 内核/用户RW/RW调色板framebuffer共享区域 8bi ...
- 蓝牙 BLE 协议学习: 001-BLE协议栈整体架构
背景 在深入BLE协议帧之前,我们先看一下BLE协议栈整体架构. 转载自:<深入浅出低功耗蓝牙(BLE)协议栈> 架构 如上图所述,要实现一个BLE应用,首先需要一个支持BLE射频的芯片, ...
- 蓝牙 BLE 协议学习: 000-有关概念介绍
背景 在学校内就用过蓝牙技术参加过比赛(并拿了奖):而蓝牙作为物联网中比较常见的协议,有必要进行深入的学习.此后的文章会以 ble(v4.0) 进行学习. 介绍 蓝牙技术最初由电信巨头爱立信公司于 1 ...
- 微信蓝牙BLE接入调试指引 硬件篇
1 平台框架简介 微信蓝牙BLE由三个模块组成,分别是蓝牙设备.微信和第三方服务器,如下图: 蓝牙设备与微信之间的通信是通过蓝牙GATT协议进行. 微信与第三方服器之间的通信是通过网络http 接口进 ...
- 深入浅出低功耗蓝牙(BLE)协议栈
深入浅出低功耗蓝牙(BLE)协议栈 BLE协议栈为什么要分层?怎么理解蓝牙"连接"?如果蓝牙协议只有ATT没有GATT会发生什么? 协议栈框架 一般而言,我们把某个协议的实现代码称 ...
- android4.3 蓝牙BLE编程
一.蓝牙4.0简介 蓝牙4.0标准包含两个蓝牙标准,准确的说,是一个双模的标准,它包含传统蓝牙部分(也有称之为经典蓝牙Classic Bluetooth)和低功耗蓝牙部分(Bluetooth Low ...
- 深入浅出讲解低功耗蓝牙(BLE)协议栈
详解BLE连接建立过程https://www.cnblogs.com/iini/p/8972635.html 详解BLE 空中包格式—兼BLE Link layer协议解析https://www.cn ...
随机推荐
- Sublime Text 皮肤插件安装
安装皮肤, 举例sodahttps://github.com/buymeasoda/soda-themectrl+shift+p => Package Control: Install Pack ...
- select控件变成可输入状态
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- php基础知识【函数】(8)xml和变量函数
一.XML函数 参数类型 data --string,需要解析的数据集. parser --resource,一个指向要取得字节索引的 XML 解析器的引用. 1.创建和释放XMl解析器 ...
- Problem:To Connect with MySQL in Virtual PC Environment
I'm trying to build a 1:n dev environment,with the help of Vsever(just like VMware worked on sever) ...
- nodebb在阿里云主机部署过程
1.在centos上安装nodejswget http://nodejs.org/dist/v0.8.9/node-v0.8.9.tar.gztar zxvf node-v0.8.9.tar.gzcd ...
- [BC Round#26] Card 【各种水】
题目链接:HDOJ - 5159 这道题的做法太多了..BC的第二题也是可以非常水的.. 算法一 我在比赛的时候写的算法是这样的.. 预处理出所有的答案,然后对于每个询问直接输出. 询问 (a, b) ...
- [BZOJ 1070] [SCOI2007] 修车 【费用流】
题目链接:BZOJ - 1070 题目分析 首先想到拆点,把每个技术人员拆成 n 个点,从某个技术人员拆出的第 i 个点,向某辆车连边,表示这是这个技术人员修的倒数第 i 辆车.那么这一次修车对整个答 ...
- HDU1106
为了给学弟学妹讲课,我又水了一题-- 1: import java.util.*; 2: import java.io.*; 3: 4: public class HDU1106 5: { 6: pu ...
- AVL树的算法思路整理
http://www.cnblogs.com/heqile/archive/2011/11/28/2265713.html 看完了<数据结构与算法分析(C++描述)>的4.4节AVL树,做 ...
- Hotel
poj3667:http://poj.org/problem?id=3667 题目大意:Hotel有N(1 ≤ N ≤ 50,000)间rooms,并且所有的rooms都是连续排列在同一边,group ...