linux下bluetooth程式設計(四)L2CAP層程式設計
一:L2CAP協議簡介:
Logical Link Control and Adaptation Protocol(L2CAP)
邏輯連線控制和適配協議(L2CAP) 為上層協議提供面向連線和無連線的資料服務,並提供多協議功能和分割重組操作。L2CAP充許上層協議和應用軟體傳輸和接收最大長度為 64K的 L2CAP資料包。
L2CAP基於 通道(channel)的概念。 通道 (Channel)是位於基帶 (baseband)連線之上的邏輯連線。每個通道以多對一的方式繫結一個單一協議 (single protocol)。多個通道可以繫結同一個協議,但一個通道不可以繫結多個協議。每個在通道里接收到的 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)等。
Protocol | PSM | Reference |
---|---|---|
SDP | 0x0001 | SeeBluetooth Service Discovery Protocol (SDP), Bluetooth SIG. |
RFCOMM | 0x0003 | See RFCOMM with TS 07.10, Bluetooth SIG. |
TCS-BIN | 0x0005 | SeeBluetooth Telephony Control Specification / TCS Binary, Bluetooth SIG. |
TCS-BIN-CORDLESS | 0x0007 | SeeBluetooth Telephony Control Specification / TCS Binary, Bluetooth SIG. |
BNEP | 0x000F | SeeBluetooth Network Encapsulation Protocal, Bluetooth SIG. |
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 , Bluetooth SIG. |
AVDTP | 0x0019 | See Audio/Video Distribution Transport Protocol , Bluetooth SIG. |
AVCTP_Browsing | 0x001B | See Audio/Video Remote Control Profile, Bluetooth SIG |
UDI_C-Plane | 0x001D | See the Unrestricted Digital Information Profile [UDI], Bluetooth SIG |
二:L2CAP程式設計方法:
L2CAP程式設計非常重要,它和HCI基本就是Linux Bluetooth程式設計的基礎了。幾乎所有協議的連線,斷連,讀寫都是用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 bind socket");
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
unsigned short l2_psm; //與前面PSM對應,這一項很重要
bdaddr_t l2_bdaddr; //Remote Device BDADDR
unsigned short l2_cid;
};
4. 傳送資料到Remote Device:
send()或write()都可以。
5. 接收資料:
revc() 或read()
以下為例項:
注:在Bluetooth下,主動去連線的一端作為主機端。被動等別人連線的作為Client端。
背景知識1:Bluetooth裝置的狀態
之前HCI程式設計時,是用 ioctl(HCIGETDEVINFO)得到某個Device Info(hci_dev_info).其中flags當時解釋的很簡單。其實它存放著Bluetooth Device(例如:USB Bluetooth Dongle)的當前狀態:
其中,UP,Down狀態表示此Device是否啟動起來。可以使用ioctl(HCIDEVUP)等修改這些狀態。
另外:就是Inquiry Scan, PAGE Scan這些狀態:
Sam在剛開始自己做L2CAP層連線時,使用另一臺Linux機器插USB Bluetooth Dongle作Remote Device。怎麼也沒法使用inquiry掃描到remote裝置,也沒法連線remote裝置,甚至無法使用l2ping ping到remote裝置。覺得非常奇怪,後來才發現Remote Device狀態設定有問題。沒有設定PSCAN和ISCAN。
Inquiry Scan狀態表示裝置可被inquiry. Page Scan狀態表示裝置可被連線。
#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程式設計
- linux下bluetooth程式設計(三)HCI層程式設計Linux程式設計
- linux下bluetooth程式設計(八)SDP層程式設計Linux程式設計
- linux下bluetooth程式設計(五)bluetooth與socketLinux程式設計
- linux下bluetooth程式設計(一)基礎概念Linux程式設計
- linux下bluetooth程式設計(七)SDP協議Linux程式設計協議
- linux下bluetooth程式設計(二)blueZ協議棧Linux程式設計協議
- 多核程式設計的四層境界薦程式設計
- 程式設計師程式設計能力層次模型程式設計師模型
- Linux程式設計之四(轉)Linux程式設計
- RDD程式設計 下(Spark自學四)程式設計Spark
- MFC程式設計(四)C程式程式設計
- Linux的shell程式設計(四)(轉)Linux程式設計
- 程式碼分層設計
- (整合)Linux下的多程式程式設計Linux程式設計
- linux下的SHELL程式設計Linux程式設計
- Linux 程式設計之Shell程式設計(轉)Linux程式設計
- cuda程式設計與gpu平行計算(四):cuda程式設計模型程式設計GPU模型
- 併發程式設計(四)程式設計
- linux下使用makefile方式程式設計主程式Linux程式設計
- Linux下的OpenGL程式設計(轉)Linux程式設計
- Linux程式設計Linux程式設計
- 併發程式設計基礎底層原理學習(四)程式設計
- 《Go 語言程式設計》讀書筆記(十一)底層程式設計Go程式設計筆記
- Linux Shell程式設計(1)——shell程式設計簡介Linux程式設計
- 四. 文字程式設計--Windows程式設計課程學習筆記程式設計Windows筆記
- MapReduce程式設計(四) 求均值程式設計
- shell程式設計(四)引號程式設計
- 程式設計修養(四) (轉)程式設計
- 程式碼分層的設計之道
- 程式設計師的十層樓程式設計師
- Linux下串列埠程式設計基礎Linux串列埠程式設計
- linux程式設計下signal()函式Linux程式設計函式
- Linux下TCP網路程式設計流程LinuxTCP程式設計
- Linux下C語言程式設計(轉)LinuxC語言程式設計
- linux下TCP socket程式設計初步(1)LinuxTCP程式設計
- Linux環境下的Socket程式設計Linux程式設計
- Linux程式控制程式設計Linux程式設計