本文从功能需求的角度分析一般蓝牙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的应用需求

我们都知道BLE是为了实现连接后的通信传输和控制。

BLE设计的初衷是为了完毕少数据量的通信,側重于通信控制。所以我们能够理解BLE的协议栈包含两大组成部分:一个是蓝牙连接;还有一个是通信控制。前者即相应GAP(General Access Profile)。后者相应GATT(General Attribute Profile)。Profile在蓝牙术语里面相应于特定的应用场景协议。

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

我们分别对连接和通信控制进行分析。这里以蓝牙设备Peripheral角色进行分析,简单理解即是从设备。

手机APP所用的蓝牙一般充当central角色,即主设备。

1.   连接

连接部分。蓝牙外设要完毕的功能包含:

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

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

3)  主设备发起连接时,其能够要求password配对,而也能够选择无需password验证。

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)  对于password配对过程,常见的做法是framework给应用开发提供一个回调接口,当收到主设备传送过来的password后。对这个接口进行回调,并将这个password以參数的形式传递给这个接口,以让用户自己推断password是否跟预设的一致。

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有一个简单的演示样例projectSimpleBLEPeripheral,向开发者展现怎样进行蓝牙应用开发。我们通过这个project来理解上述框架设计和编程。


1.   连接

1)定义广播数据

GAPRole_SetParameter(GAPROLE_ADVERT_DATA,…);

2)自己定义扫描响应数据

GAPRole_SetParameter(GAPROLE_SCAN_RSP_DATA,…);

3)password管理回调

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单芯片的应用框架(SDK Framework)的接口设计过程,并以TI CC2541为例说明BLE的应用开发方法。

一、应用框架(Framework)

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

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

 

我们都知道BLE是为了实现连接后的通信传输和控制。

BLE设计的初衷是为了完毕少数据量的通信,側重于通信控制。所以我们能够理解BLE的协议栈包含两大组成部分:一个是蓝牙连接;还有一个是通信控制。前者即相应GAP(General Access Profile)。后者相应GATT(General Attribute Profile)。Profile在蓝牙术语里面相应于特定的应用场景协议。

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

我们分别对连接和通信控制进行分析。这里以蓝牙设备Peripheral角色进行分析,简单理解即是从设备。

手机APP所用的蓝牙一般充当central角色,即主设备。

1.   连接

连接部分。蓝牙外设要完毕的功能包含:

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

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

3)  主设备发起连接时,其能够要求password配对,而也能够选择无需password验证。

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)  对于password配对过程,常见的做法是framework给应用开发提供一个回调接口,当收到主设备传送过来的password后。对这个接口进行回调,并将这个password以參数的形式传递给这个接口,以让用户自己推断password是否跟预设的一致。

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有一个简单的演示样例projectSimpleBLEPeripheral,向开发者展现怎样进行蓝牙应用开发。我们通过这个project来理解上述框架设计和编程。


1.   连接

1)定义广播数据

GAPRole_SetParameter(GAPROLE_ADVERT_DATA,…);

2)自己定义扫描响应数据

GAPRole_SetParameter(GAPROLE_SCAN_RSP_DATA,…);

3)password管理回调

ProcessPasscodeCB()

4)状态管理回调

peripheralStateNotificationCB()


2.通信控制

      1)加入GATT服务

GATTServApp_RegisterService()

      2)读回调

           simpleProfile_ReadAttrCB()

      3)写回调

                 simpleProfile_WriteAttrCB()

     4 )属性值设置和获取    

                 SimpleProfile_SetParameter()

                 SimpleProfile_GetParameter()

    5)主动传输

                 GATT_Notification()

                 GATT_Indication()

參数能够对比详细的接口进行分析。我们在看详细的接口之前,能够思考一下,这些接口的參数应该包含什么东西。假设你能想到包含什么,恭喜你,你的应用框架设计能力已经大大提高了。