一:理解Socket:
在使用手机与女朋友联系时,必须用手机拨她的号码,然后心情坎坷的等待她的应答。当双方通话时,就建立了一个具有两个端点的通信线路。
Linux中的Socket与电话非常相似。具体问题,稍后再分析。
<wbr></wbr>
二:Socket域(domain),类型(type),协议(protoclo)以及Bluetooth中的具体使用:
Berkeley小组在构思BSD Socket时,TCP/IP协议也还处在发展之中,其他一些很有竞争力的协议如X.25等也在发展,其它很多协议还在构思与研究阶段(Bluetooth还没出生)。为了使Socket可以应用于各种不同协议,domain的作用就在于此。
domain指出想要使用的协议族。
不得不佩服Berkeley小组的前瞻力。他们考虑在指定Socket时,可能还需要进一步的细分类目:
1.某个协议族(Domain)中的一个或多个协议。
2.某个协议中的一个或多个地址格式。
这个规则在TCP/IP等协议栈时并不明显,因为某个协议族只有同一种地址格式。但在Bluetooth中则非常有用。
<wbr></wbr>
protocol则用来指出在此协议族中的具体某个协议。
虽然在TCP/IP协议栈中,因为协议族中某个type的协议栈只有一种,所以此项为0,但Bluetooth中,这一项则非常有用。
<wbr></wbr>
type用来指出此协议族中的具体协议的Socket类型为何种:SOCK_STREAM,SOCK_DGRAM,SOCK_SEQPACKET,SOCK_RAW.
<wbr></wbr>
三:Socket地址:
每一种通信协议都对网络地址格式作了明确规定。协议族(Domain)+ 协议(protocol)的作用就是指明使用哪种地址类型。
<wbr></wbr>
BSD Socket是在ANSI C 标准被采纳之前开发的,所以没有使用(void*)数据类型来接收结构化的地址。BSD的解决方案是定义了一个通用的地址结构:
struct sockaddr
{
<wbr> sa_family_t sa_family;<wbr> //地址族</wbr></wbr>
<wbr> char sa_data[14];<wbr><wbr> //地址数据</wbr></wbr></wbr>
};
sa_family长度2字节,用来存放地址族。
sa_data长度14字节,用来存放具体的协议的地址数据。
<wbr></wbr>
如果是用AF_INET(IPV4),则它的地址类型sockaddr_in如下,刚好与struct sockaddr对应
struct sockaddr_in
{
<wbr> sa_family_t sin_family;<wbr><wbr><wbr> //地址族</wbr></wbr></wbr></wbr>
<wbr><wbr>uint16_t sip_port;<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> //端口</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr> struct in_addr sin_addr;<wbr><wbr> //Internel 地址</wbr></wbr></wbr>
<wbr> unsigned char sin_zero[8]; //占位字节</wbr>
};
<wbr></wbr>
如果是用Bluetooth协议族(PF_BLUETOOTH)中的协议l2cap(BTPROTO_L2CAP),则地址格式如下:
struct sockaddr_l2
{
<wbr>sa_family_t<wbr>l2_family;<wbr> //地址族<br><wbr>unsigned short<wbr>l2_psm;<wbr> //PSM<br><wbr>bdaddr_t<wbr>l2_bdaddr;<wbr><wbr><wbr><wbr> //Bluetooth 地址<br><wbr>unsigned short<wbr>l2_cid;<br> };</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr></wbr>
<wbr></wbr>
四: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。
<wbr></wbr>
int bind(int sockfd, const struct sockaddr *my_addr, socklen_t addrlen);
将socket与某个地址绑定。
嘿嘿,接着前面Socket与手机的话题,建立一个Socket。就相当于是一个手机,地址,则相当于手机号码。
一个手机想要别人打进来,就需要让别人知道电话号码。 而一个Bluetooth 设备想要别人能够连接,也需要将Socket与Bluetooth地址绑定。
山寨机让我们知道了双卡双待,Bluetooth也可以实现这一点。建立一个Socket,只是一个手机,它可以与多个bdaddr绑定。这就是hci0,hci1等等。
<wbr></wbr>
五:理解网络字序:
对于多字节数据,不同的CPU有不同的组织方式,最基本的字节序位:
小端(little-endian): 将低序字节存储在起始位置。
大端(big-endian):将高序字节存储在其实位置。
<wbr></wbr>
Intel CPU使用小端。Motorola等CPU使用大端,网络上传输数据的标准顺序为大端。
<wbr></wbr>
他们之间的转化:
htobs(), htonl() 主机到网络
ntohl() , ntohs() 网络到主机。
本文深入探讨了蓝牙Socket的基础概念,包括Socket域、类型、协议及其在Bluetooth中的具体应用。详细解析了Socket地址的构成与格式,并展示了如何通过socket()与bind()函数建立和绑定蓝牙Socket。同时,文章阐述了理解网络字序的重要性,为开发者提供了全面的蓝牙Socket构建指南。
bluetooth与socket&spm=1001.2101.3001.5002&articleId=82139024&d=1&t=3&u=273eccd9bec4492d9935aa3a2f54fd35)
940

被折叠的 条评论
为什么被折叠?



