linux下bluetooth程式設計(五)bluetooth與socket
一:理解Socket:
在使用手機與女朋友聯絡時,必須用手機撥她的號碼,然後心情坎坷的等待她的應答。當雙方通話時,就建立了一個具有兩個端點的通訊線路。
Linux中的Socket與電話非常相似。具體問題,稍後再分析。
二:Socket域(domain),型別(type),協議(protoclo)以及Bluetooth中的具體使用:
Berkeley小組在構思BSD Socket時,TCP/IP協議也還處在發展之中,其他一些很有競爭力的協議如X.25等也在發展,其它很多協議還在構思與研究階段(Bluetooth還沒出生)。為了使Socket可以應用於各種不同協議,domain的作用就在於此。
domain指出想要使用的協議族。
不得不佩服Berkeley小組的前瞻力。他們考慮在指定Socket時,可能還需要進一步的細分類目:
1.某個協議族(Domain)中的一個或多個協議。
2.某個協議中的一個或多個地址格式。
這個規則在TCP/IP等協議棧時並不明顯,因為某個協議族只有同一種地址格式。但在Bluetooth中則非常有用。
protocol則用來指出在此協議族中的具體某個協議。
雖然在TCP/IP協議棧中,因為協議族中某個type的協議棧只有一種,所以此項為0,但Bluetooth中,這一項則非常有用。
type用來指出此協議族中的具體協議的Socket型別為何種:SOCK_STREAM,SOCK_DGRAM,SOCK_SEQPACKET,SOCK_RAW.
三:Socket地址:
每一種通訊協議都對網路地址格式作了明確規定。協議族(Domain)+ 協議(protocol)的作用就是指明使用哪種地址型別。
BSD Socket是在ANSI C 標準被採納之前開發的,所以沒有使用(void*)資料型別來接收結構化的地址。BSD的解決方案是定義了一個通用的地址結構:
struct sockaddr
{
sa_family_t sa_family; //地址族
char sa_data[14]; //地址資料
};
sa_family長度2位元組,用來存放地址族。
sa_data長度14位元組,用來存放具體的協議的地址資料。
如果是用AF_INET(IPV4),則它的地址型別sockaddr_in如下,剛好與struct sockaddr對應
struct sockaddr_in
{
sa_family_t sin_family; //地址族
uint16_t sip_port; //埠
struct in_addr sin_addr; //Internel 地址
unsigned char sin_zero[8]; //佔位位元組
};
如果是用Bluetooth協議族(PF_BLUETOOTH)中的協議l2cap(BTPROTO_L2CAP),則地址格式如下:
struct sockaddr_l2
{
sa_family_t l2_family; //地址族
unsigned short l2_psm; //PSM
bdaddr_t l2_bdaddr; //Bluetooth 地址
unsigned short l2_cid;
};
四:Bluetooth Socket的建立和地址繫結:
int socket(int domain, int type, int protocol);
domain:使用PF_BLUETOOTH。
protocol:使用想要建立的Socket的protocol.如果想建立HCI Socket:BTPROTO_HCI。 L2cap:BTPROTO_L2CAP
type:SOCK_SEQPACKET,以Packet為單位讀取。SOCK_SAW:原始Socket。
int bind(int sockfd, const struct sockaddr *my_addr, socklen_t addrlen);
將socket與某個地址繫結。
嘿嘿,接著前面Socket與手機的話題,建立一個Socket。就相當於是一個手機,地址,則相當於手機號碼。
一個手機想要別人打進來,就需要讓別人知道電話號碼。 而一個Bluetooth 裝置想要別人能夠連線,也需要將Socket與Bluetooth地址繫結。
山寨機讓我們知道了雙卡雙待,Bluetooth也可以實現這一點。建立一個Socket,只是一個手機,它可以與多個bdaddr繫結。這就是hci0,hci1等等。
五:理解網路字序:
對於多位元組資料,不同的CPU有不同的組織方式,最基本的位元組序位:
小端(little-endian): 將低序位元組儲存在起始位置。
大端(big-endian):將高序位元組儲存在其實位置。
Intel CPU使用小端。Motorola等CPU使用大端,網路上傳輸資料的標準順序為大端。
他們之間的轉化:
htobs(), htonl() 主機到網路
ntohl() , ntohs() 網路到主機。
相關文章
- linux下bluetooth程式設計(三)HCI層程式設計Linux程式設計
- linux下bluetooth程式設計(八)SDP層程式設計Linux程式設計
- linux下bluetooth程式設計(一)基礎概念Linux程式設計
- linux下bluetooth程式設計(七)SDP協議Linux程式設計協議
- linux下bluetooth程式設計(二)blueZ協議棧Linux程式設計協議
- linux下bluetooth程式設計(四)L2CAP層程式設計Linux程式設計
- linux下bluetooth程式設計(六)L2CAP層程式設計例項Linux程式設計
- Android Bluetooth 入門Android
- Bluetooth的profile總結
- 五十一、【Bluetooth藍芽模組】藍芽模組
- SciTech-EECS-Wireless-BLE(Bluetooth Low Energy)5.4- Nordic Semi. 的Bluetooth Low Energy SoCs
- linux下TCP socket程式設計初步(1)LinuxTCP程式設計
- Linux環境下的Socket程式設計Linux程式設計
- 在 iOS 11 中使用 Core BluetoothiOS
- Android Bluetooth HCI log 詳解Android
- 藍芽(Bluetooth)音訊協議藍芽音訊協議
- linux Socket 程式設計Linux程式設計
- 藍芽Bluetooth技術小知識藍芽
- Linux Socket 程式設計簡介Linux程式設計
- linux socket程式設計初步(2)Linux程式設計
- Socket原理與程式設計基礎程式設計
- android bluetooth——藍芽的開啟、搜尋、配對與連線Android藍芽
- Linux Socket C語言網路程式設計:TCP SocketLinuxC語言程式設計TCP
- Linux Socket C語言網路程式設計:UDP SocketLinuxC語言程式設計UDP
- SOCKET程式設計程式設計
- 深入瞭解Android藍芽Bluetooth——《基礎篇》Android藍芽
- BCM4330 BlueTooth 除錯記錄除錯
- PIC24FJ64GB002 with bluetooth USB dongle
- Linux Socket C語言網路程式設計:Select SocketLinuxC語言程式設計
- Android Bluetooth hciReason(HCI_ / HCI_ERR_)定義Android
- Linux系統程式設計(37)—— socket程式設計之原始套接字Linux程式設計
- socket程式設計(1)程式設計
- Java Socket程式設計Java程式設計
- Java Socket程式設計Java程式設計
- WCF、Socket程式設計程式設計
- Socket程式設計(九)程式設計
- Socket程式設計模型程式設計模型
- 【Linux網路程式設計】Socket Api函式Linux程式設計API函式