当前位置:首页 > 芯闻号 > 充电吧
[导读]作者:Sam (甄峰) sam_code@hotmail.com (L2CAP协议简介,L2CAP在BlueZ中的实现以及L2CAP编程接口)   一:L2CAP协议简介: Logical Link

作者:Sam (甄峰) sam_code@hotmail.com

(L2CAP协议简介,L2CAP在BlueZ中的实现以及L2CAP编程接口)

 

一:L2CAP协议简介:

Logical Link Control and AdaptationProtocol(L2CAP)

 

逻辑连接控制和适配协议 (L2CAP)为上层协议提供面向连接和无连接的数据服务,并提供多协议功能和分割重组操作。L2CAP充许上层协议和应用软件传输和接收最大长度为 64K 的L2CAP数据包。

  L2CAP 基于通道(channel) 的概念。通道 (Channel) 是位于基带(baseband)连接之上的逻辑连接。每个通道以多对一的方式绑定一个单一协议 (singleprotocol)。多个通道可以绑定同一个协议,但一个通道不可以绑定多个协议。每个在通道里接收到的 L2CAP 数据包被传到相应的上层协议。多个通道可共享同一个基带连接。

 

L2CAP处于Bluetooth协议栈的位置如下:

Bluetooth编程(四) L2CAP层编程" title="实战Linux Bluetooth编程(四) L2CAP层编程" />

也就是说,所有L2CAP数据均通过HCI传输到Remote Device。且上层协议的数据,大都也通过L2CAP来传送。

 

 

L2CAP可以发送Command。例如连接,断连等等。

Bluetooth编程(四) L2CAP层编程" title="实战Linux Bluetooth编程(四) L2CAP层编程" />

 

下面看Command例子:Connection Request:

Bluetooth编程(四) L2CAP层编程" title="实战Linux Bluetooth编程(四) L2CAP层编程" />

 

其中PSM比较需要注意,L2CAP 使用L2CAP连接请求(Connection Request)命令中的PSM字段实现协议复用。L2CAP可以复用发给上层协议的连接请求,这些上层协议包括服务发现协议SDP(PSM =0x0001)、RFCOMM(PSM = 0x0003)和电话控制(PSM = 0x0005)等。

 

 

Protocol PSM Reference SDP 0x0001 See Bluetooth Service Discovery Protocol (SDP), BluetoothSIG. RFCOMM 0x0003 See RFCOMM with TS 07.10, Bluetooth SIG. TCS-BIN 0x0005 See Bluetooth Telephony Control Specification / TCSBinary, Bluetooth SIG. TCS-BIN-CORDLESS 0x0007 See Bluetooth Telephony Control Specification / TCSBinary, Bluetooth SIG. BNEP 0x000F See Bluetooth Network Encapsulation Protocal, BluetoothSIG. HID_Control 0x0011 See Human Interface Device , Bluetooth SIG. HID_Interrupt 0x0013 See Human Interface Device, Bluetooth SIG. UPnP 0x0015 See [ESDP] , Bluetooth SIG. AVCTP 0x0017 See Audio/Video Control Transport Protocol , BluetoothSIG. AVDTP 0x0019 See Audio/Video Distribution Transport Protocol , BluetoothSIG. AVCTP_Browsing 0x001B See Audio/Video Remote Control Profile, Bluetooth SIG UDI_C-Plane 0x001D See the Unrestricted Digital Information Profile [UDI], BluetoothSIG

 

 

 

 

二: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
 memset(&addr, 0,sizeof(addr));
 addr.l2_family = AF_BLUETOOTH;
 bacpy(&addr.l2_bdaddr,&bdaddr); //bdaddr为本地Dongle BDAddr

 if (bind(sk, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
  perror("Can't bindsocket");
  goto error;
 }

 

3.连接

memset(&addr, 0, sizeof(addr));
addr.l2_family = AF_BLUETOOTH;
bacpy(addr.l2_bdaddr, src);

addr.l2_psm = xxx; 

 if (connect(sk, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
  perror("Can't connect");
  goto error;
 }

 

注意:

struct sockaddr_l2 {
 sa_family_t l2_family; //必须为 AF_BLUETOOTH
 unsignedshort l2_psm; //与前面PSM对应,这一项很重要
 bdaddr_t l2_bdaddr;     //RemoteDevice BDADDR
 unsignedshort l2_cid; 
};

 

4. 发送数据到Remote Device:

send()或write()都可以。

 

5. 接收数据:

revc() 或read()

 

 

以下为实例:

注:在Bluetooth下,主动去连接的一端作为主机端。被动等别人连接的作为Client端。

 

 

 

 

 

 

背景知识1:Bluetooth设备的状态

之前HCI编程时,是用 ioctl(HCIGETDEVINFO)得到某个DeviceInfo(hci_dev_info).其中flags当时解释的很简单。其实它存放着Bluetooth Device(例如:USBBluetooth Dongle)的当前状态:

其中,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了。

 


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭