被玩坏了的 Android Bluetooth

2016-06-13  本文已影响1087人  大大世界

这里的一切都是站在一个上层应用开发者的角度去理解蓝牙,做一些形象的比喻,帮助理解整个蓝牙通信流程。(PS:初稿需要修改)

比划下协议栈

协议栈这个东西按照字面意思解:
协议表示事先已经约定好了
表示分层的意识
协议栈表示 已经约定好的分层通信模型

stack.png

一个简单的例子:
应用层 这里定义里通俗的通信语言(假设应用层发送 Hello
逻辑链路层这里表示已经经过事先约定好的模型处理过的上传数据(Hello已经处理为0x48,0x65,0x6C,0x6C,0x6F
物理层这里表示传输的物理媒介,例如电缆,无线电等(这里已经变成了带有高低电平的无线波信号)

蓝牙通信模型

蓝牙通信的模型其实可以看成一个标准的B\S架构。
即存在蓝牙服务端和蓝牙客户端。

HeadSet Profile

蓝牙耳机协议:
服务端: 带有蓝牙功能的手机
客户端: 蓝牙耳机

打电话时手机通过蓝牙发送音频信号给蓝牙耳机。

Synchronization Profile

这个协议可以传输文件。
服务端: 蓝牙手机A
客户端: 蓝牙手机B

手机A通过蓝牙分享一个文件到手机B。

总结:

Bluetooth定义了9种应用(usage)Profile。
CTP Profile: Cordless Telephone Profile,无绳电话。
IP Profile: Intercom Profile,这是在两个设备之间建立语音连接,换句话说,把两个昂贵的蓝牙设备变成廉价的对讲机。
HS Profile: HeadSet Profile,用于连接耳机。
DNP Profile: Dial-up Networking Profile,用于为PC提供拨号网络功能。
FP Profile: Fax Profile,传真功能。
LAP Profile: LAN Access Profile,使用PPP协议建立局域网。
OPP Profile: Object Push Profile,用于设备之间传输数据对象。
FTP Profile: File Transfer Profile,用于文件传输。
SP Profile: Synchronization Profile,用于不同的Bluetooth设备同步,保持数据的一致性。
Bluetooth定义了4种是基本的Profile,这些Profile会被其它的Profile使用。
GAP Profile: Generic Access Profile,该Profile保证不同的Bluetooth产品可以互相发现对方并建立连接。
SDAP Profile: Service Discovery Application Profile,通过该Profile,一个Bluetooth设备可以找到其它Bluetooth设备提供的服务,以及查询相关的信息。
SPP Profile: Serial Port Profile,模拟串口通讯
GOEP Profile: Generic Object Exchange Profile,通用对象交换。这个Profile的名字有些费解,它定义的是数据的传输,包括同步,文件传输,或者推送其它的数据。你可以把它理解为内容无关的传输层协议,可以被任何应用用来传输自己定义的数据对象
。

蓝牙的Profile都可以看成B\S架构。 GAP可能不太好用B\S解释。

说说蓝牙协议栈如何实现的

有了上面的知识, 再去理解下协议栈是来干什么的。

服务端

启动一个监听,监听的话肯定需要一个内容, 蓝牙标准化了这个内容, 使用UUID表示。
HCRPrintServiceClass_UUID = '{00001126-0000-1000-8000-00805F9B34FB}'

客户端

发起一个请求, 请求总需要一个目标, 这个目标就是UUID.

协议栈

就是起到一个封装解析并传递数据的作用。

举个例子:(服务端【B】 客户端【C】)
1:C发给B: 01
2:B收到, 协议栈去解析01(假设是询问服务端是否准备就绪)
3:B返回C:01
4:C收到, 协议栈去解析01(假设是表示服务端准备就绪)
5:C认为B已经OK, 继续发送数据

Android Bluedroid

Bluedroid是Android上的蓝牙协议栈, 这个协议栈, 默认已经实现了很多的基础的Profile。
OPP, PBAP 这两个协议是纯上层 Bluetooth.apk 实现的。
原理也很简单, APP启动一个 BluetoothServerSocket 监听相应的UUID, 假设请求到来的话, 直接把数据转到上传APP层处理。

蓝牙玩个新花样

有了上面的知识后, 自己就可以实现一个手机上未实现的Profile。
我这里实现了一个

#蓝牙串口服务
SerialPortServiceClass_UUID = '{00001101-0000-1000-8000-00805F9B34FB}'

这个东西实现之后, 就可以把手机当成一个蓝牙打印机使用了, 已经成功的连接了各大外卖平台, 可以让它们把数据直接发送到手机上。

上一篇 下一篇

猜你喜欢

热点阅读