linux下bluetooth程式設計(五)bluetooth與socket

Vincent_Song發表於2011-09-17
  

一:理解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() 網路到主機。

相關文章