我们说蓝牙串口,一般是用于手机App 和嵌入式设备之间通信。有两种实现方式
BLE GATT 并没有定义标准的Profile用于串口通信。但是BLE相对嵌入式设备更常见,因此基于GATT的串口通信更常见。 https://developer.nordicsemi.com/nRF51_SDK/nRF51_SDK_v7.x.x/doc/7.2.0/s110/html/a00061.html 如上链接中是个nordic 的例子 例子中定了一个Nordic UART Service (UUID: 0x0001) service 改service有两个characteristics,
- TX Characteristic
使用“notify" 进行通信 - RX Characteristic
支持"write" request 或者command
另外一个方式是基于经典蓝牙的RFCOMM + SPP
- SPP(Serial Port Profile)定义了一系列协议和过程,蓝牙设备通过该协议实现RS232串行线缆的仿真。很多老式设备都工作在串行模块下面,使用SPP协议可以帮组连接这些老式设备。
- RFCOMM提供了基于L2CAP协议的串行(9针RS-232)模拟,支持在两个蓝牙设备间高达60路的通信连接。
下面是RFCOMM以及SPP的框图 注意图中除了transport 层的RFCOMM,session层的SPP,还有一个标红的SDP。RFCOMM是通过不同的频道(channel)来提供不同的Profile的,所以需要找到要用的服务在设备上的哪个频道上,这是通过SDP,服务发现协议,来完成的。
SPP按角色分为DevA和DevB,其中DevA是连接的发起者(initiator),DevB是等待连接的到来。从应用层角度看,SPP涉及到三个主要的过程:建立链路并设置虚拟串口连接、接收链路和建立虚拟串口连接、本地SDP数据库注册服务记录,其中第一项对DevA来说是强制实现的,后两项对DevB是强制实现的。 来看看典型的连接过程涉及到的消息交互流程图。DevA通过调用SppConnectRequest ()开启连接过程,DevB在接收到SPP_CONNECT_IND消息时决定是否接受该连接,并作出响应SppConnectResponse()。在DevA收到SPP_CLIENT_CONNECT_CFM,DevB收到SPP_SERVER_CONNECT_CFM后,表示SPP通信会话正式建立。 看下图中树莓派上wireshark对应的抓包。SPP 应用是网上找到的一个blueSPP工具,装在我一个快淘汰的小米平板上
- service search attribute request
- service search attribute response
接着是
- connection request
- connection response
在树莓派上通过python 发送字符串到平板上的蓝牙串口app, 树莓派上的wireshark log如下 L2CAP 报文如下,从树莓派本地发往remote的字符串“hello just test"
|