實戰Linux Bluetooth編程(四) L2CAP層編程

來源:互聯網
上載者:User

本文作者的部落格地址:http://blog.sina.com.cn/samzhen1977

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

(L2CAP協議簡介,L2CAP在BlueZ中的實現以及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
See Bluetooth
Service Discovery Protocol (SDP), Bluetooth
SIG.
RFCOMM 0x0003
See RFCOMM with TS 07.10, Bluetooth SIG.
TCS-BIN 0x0005
See Bluetooth
Telephony Control Specification / TCS
Binary, Bluetooth SIG.
TCS-BIN-CORDLESS 0x0007
See Bluetooth
Telephony Control Specification / TCS
Binary, Bluetooth SIG.
BNEP 0x000F
See Bluetooth
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了。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.