蓝牙设备节点协议栈基础知识
一:TTY(虚拟控制台,串口以及伪终端设备组成的终端设备)
Android/Linux 几乎所有的外设都以”设备节点”的形式存在
例如PC插入串口,会识别成COM1/COM2…在linux下面则以/dev/ttyXXX的形式存在,如/dev/ttyS1
同时,协议栈还可以生成虚拟串口,例如/dev/bw_serial, 操作方式同物理串口/dev/ttyS1一样
在飞易通AT指令版本协议栈中,实际的通讯流程如下,以BT825B为例:
BT825B <–物理节点/dev/ttyS1–> 协议栈blueware <– 虚拟节点/dev/bw_serial –> 客户蓝牙应用
当客户需要拨打电话10086时:
客户蓝牙应用=>发送AT+HFPDIAL=10086\r\n 至 /dev/bw_serial
blueware监听/dev/bw_serial,收到拨号请求
将拨号请求通过HFP协议解析成指定格式HCI数据
将HCI数据通过 /dev/ttyS1 发送至BT825B
注意:
1:虚拟串口的名字可以自定义,如别的蓝牙厂商名字为/dev/goc_serial
2:连接模块的物理串口(如/dev/ttyS1),需要和客户确认,并添加到协议栈的配置文件中
二:GPIO(通用输入输出端口的简称)
协议栈对GPIO的操作一般只会用到BT使能脚(BT_EN)
GPIO的也是以”节点”的形式存在于系统中
例gpio123的路径一般为: /sys/class/gpio/gpio123/value
同物理串口一样,需要和客户确认该gpio并添加到协议栈的配置文件中
注意:
1:特殊的,蓝牙一般用节点rfkill来控制BT_EN,路径为/sys/class/rfkill/rfkill0/state
2:若使用rfkill,需要客户在驱动层,将对该节点的控制映射层对实际GPIO的控制
3:部分客户该节点的路径为非标准路径,如:/sys/bus/platform/drivers/mtc-car/bt_power
三:SOCKET(用来描述IP地址和端口,Socket是支持TCP/IP协议的网络通信的基本操作单元,是对网络通信过程中端点的抽象表示,包含了进行网络通信所必须的五种信息:连接所使用的协议;本地主机的IP地址;本地远程的协议端口;远地主机的IP地址以及远地进程的协议端口)
当出现协议栈和上层应用“大量数据交互”的场景时,一般可以考虑使用socket通讯
socket通讯机制类似于tty,区别是socket有client和server之分
server:负责创建socket节点(如/dev/socket/bw_gatt),并开启监听(listen)
client:连接已经存在的节点,连接成功后则可以互相通讯
协议栈接可以作为socket server,也可以作为client
例:
蓝牙上层应用作为client
协议栈blueware为server
总结:这些只是协议栈的很小一部分设置逻辑,想了解更多,可以下面留言,一起学习!