实战Linux Bluetooth编程(四) L2CAP层编程
来源:互联网 发布:led彩屏控制软件 编辑:程序博客网 时间:2024/05/21 07:53
(L2CAP协议简介,L2CAP在BlueZ中的实现以及L2CAP编程接口)
一:L2CAP协议简介:
Logical Link Control and AdaptationProtocol(L2CAP)
逻辑连接控制和适配协议 (L2CAP)为上层协议提供面向连接和无连接的数据服务,并提供多协议功能和分割重组操作。L2CAP充许上层协议和应用软件传输和接收最大长度为64K 的L2CAP数据包。
L2CAP基于通道(channel)的概念。通道 (Channel)是位于基带(baseband)连接之上的逻辑连接。每个通道以多对一的方式绑定一个单一协议(singleprotocol)。多个通道可以绑定同一个协议,但一个通道不可以绑定多个协议。每个在通道里接收到的L2CAP 数据包被传到相应的上层协议。多个通道可共享同一个基带连接。
L2CAP处于Bluetooth协议栈的位置如下:
也就是说,所有L2CAP数据均通过HCI传输到Remote Device。且上层协议的数据,大都也通过L2CAP来传送。
L2CAP可以发送Command。例如连接,断连等等。
下面看Command例子:Connection Request:
其中PSM比较需要注意,L2CAP 使用L2CAP连接请求(Connection Request)命令中的PSM字段实现协议复用。L2CAP可以复用发给上层协议的连接请求,这些上层协议包括服务发现协议SDP(PSM =0x0001)、RFCOMM(PSM = 0x0003)和电话控制(PSM = 0x0005)等。
二:L2CAP编程方法:
L2CAP编程非常重要,它和HCI基本就是LinuxBluetooth编程的基础了。几乎所有协议的连接,断连,读写都是用L2CAP连接来做的。
1.创建L2CAP Socket:
socket(PF_BLUETOOTH, SOCK_RAW, BTPROTO_L2CAP);
domain=PF_BLUETOOTH, type可以是多种类型。protocol=BTPROTO_L2CAP.
2.绑定:
// Bind to local address
3.连接
memset(&addr, 0, sizeof(addr));
addr.l2_family = AF_BLUETOOTH;
bacpy(addr.l2_bdaddr, src);
addr.l2_psm = xxx;
注意:
struct sockaddr_l2 {
};
4. 发送数据到Remote Device:
send()或write()都可以。
5. 接收数据:
revc() 或read()
以下为实例:
注:在Bluetooth下,主动去连接的一端作为主机端。被动等别人连接的作为Client端。
背景知识1:Bluetooth设备的状态
之前HCI编程时,是用
其中,UP,Down状态表示此Device是否启动起来。可以使用ioctl(HCIDEVUP)等修改这些状态。
另外:就是Inquiry Scan, PAGEScan这些状态:
Sam在刚开始自己做L2CAP层连接时,使用另一台Linux机器插USB Bluetooth Dongle作RemoteDevice。怎么也没法使用inquiry扫描到remote设备,也没法连接remote设备,甚至无法使用l2pingping到remote设备。觉得非常奇怪,后来才发现Remote Device状态设置有问题。没有设置PSCAN和ISCAN。
Inquiry Scan状态表示设备可被inquiry. PageScan状态表示设备可被连接。
#hciconfig hci0 iscan
#hciconfig hci0 pscan
或者:#hciconfig hci0 piscan
就可以设置为PSCAN或者iSCAN状态了。
编程则可以使用ioctl(HCISETSCAN) . dev_opt =SCAN_INQUIRY;dr.dev_opt = SCAN_PAGE;dr.dev_opt = SCAN_PAGE |SCAN_INQUIRY;
则可以inquiry或者connect了。
- 实战Linux Bluetooth编程(四) L2CAP层编程
- 实战Linux Bluetooth编程(四) L2CAP层编程
- 实战Linux Bluetooth编程(四) L2CAP层编程
- 实战Linux Bluetooth编程(四) L2CAP层编程
- 实战Linux Bluetooth编程(四) L2CAP层编程
- 实战Linux Bluetooth编程(四) L2CAP层编程
- 实战Linux Bluetooth编程(四) L2CAP层编程
- 实战Linux Bluetooth编程(四) L2CAP层编程
- 实战Linux Bluetooth编程(四) L2CAP层编程
- 实战Linux Bluetooth编程(四) L2CAP层编程
- 实战Linux Bluetooth编程(四) L2CAP层编程
- linux下bluetooth编程(四)L2CAP层编程
- Linux Bluetooth编程(四) L2CAP层编程
- linux下bluetooth编程(四)L2CAP层编程
- linux下bluetooth编程(四)L2CAP层编程
- linux下bluetooth编程(六)L2CAP层编程实例
- linux下bluetooth编程(六)L2CAP层编程实例
- linux下bluetooth编程(六)L2CAP层编程实例
- 网络媒体中的信息热度实时变化模式
- Eclipse svn提交代码的一般步骤(对比、解决冲突、更新、提交)
- 实战Linux Bluetooth编程(三) HCI层编程
- angualr.js+ionic踩坑记录
- 线程?对象锁?这个面试题有点意思。
- 实战Linux Bluetooth编程(四) L2CAP层编程
- 智能安防项目模型
- python调用C程序
- XSS过滤速查表
- 水仙花数
- Garnger+ITMTF
- ibatis.binding.BindingException: Parameter 'xxx' not found
- 二级联动
- 【51nod】1046 A^B Mod C