当前位置:首页 > > 充电吧
[导读]作者: Sam (甄峰) sam_code@hotmail.com   Linux下Bluetooth编程,借用了Socket体制。也就是说,BlueZKernel部分将Bluetooth协议栈以网络

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

 

Linux下Bluetooth编程,借用了Socket体制。也就是说,BlueZKernel部分将Bluetooth协议栈以网络协议的形式添加进网络协议栈,这样极大的方便了用户编程。下面Sam就结合Socket概念将LinuxBluetooth做个研究。

 

1957年10月4日,星期五,苏联发射了人类历史上第一颗人造地球卫星--Sputnik.这标志着人类外太空时代的开始。这颗卫星篮球大小,在发射98分钟后到达运转轨道,可以通过短波40.002MHz收听到它的声音。这也标志着苏联在航天科技领域超过美国。但当时谁能想到,Sputnik的升空竟然促进了TCP/IP和Internel的出现。(Sam:不知道朝鲜那个轨道高度几百米的卫星会促成什么出现,嘿嘿)。被Sputnik所刺激的美国总统艾森豪威尔五星上将积极推动ARPA。又因为美国政府为了公平起见,每次采购计算机时都从不同设备制造商处购买。大家很快发现,各个计算机无法兼容。1962年,Licklider提出:各个计算机高度自治,但他们也应该能够相互通讯。这就是ARPA网,它成为Internel的前身。

 

 

一:理解Socket:

在使用手机与女朋友联系时,必须用手机拨她的号码,然后心情坎坷的等待她的应答。当双方通话时,就建立了一个具有两个端点的通信线路。

Linux中的Socket与电话非常相似。具体问题,稍后再分析。

 

二:Socket域(domain),类型(type),协议(protoclo)以及Bluetooth中的具体使用:

Berkeley小组在构思BSDSocket时,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; //地址族

  charsa_data[14];   //地址数据

};

sa_family长度2字节,用来存放地址族。

sa_data长度14字节,用来存放具体的协议的地址数据。

 

如果是用AF_INET(IPV4),则它的地址类型sockaddr_in如下,刚好与struct sockaddr对应

struct sockaddr_in

{

  sa_family_tsin_family;   //地址族

  uint16_tsip_port;        //端口

  struct in_addrsin_addr;   //Internel 地址

  unsigned char sin_zero[8]; //占位字节

};

 

如果是用Bluetooth协议族(PF_BLUETOOTH)中的协议l2cap(BTPROTO_L2CAP),则地址格式如下:

struct sockaddr_l2

{
 sa_family_t l2_family; //地址族
 unsignedshort l2_psm;  //PSM
 bdaddr_t l2_bdaddr;    //Bluetooth 地址
 unsigned short l2_cid;
};

 

 

四:BluetoothSocket的建立和地址绑定:

int socket(int domain, int type, int protocol);

domain:使用 PF_BLUETOOTH。

protocol:使用想要建立的Socket的protocol.如果想建立HCISocket:BTPROTO_HCI。L2cap:BTPROTO_L2CAP

type:SOCK_SEQPACKET,以Packet为单位读取。SOCK_SAW:原始Socket。

 

int bind(int sockfd, const struct sockaddr *my_addr, socklen_taddrlen);

将socket与某个地址绑定。

嘿嘿,接着前面Socket与手机的话题,建立一个Socket。就相当于是一个手机,地址,则相当于手机号码。

一个手机想要别人打进来,就需要让别人知道电话号码。 而一个Bluetooth设备想要别人能够连接,也需要将Socket与Bluetooth地址绑定。

山寨机让我们知道了双卡双待,Bluetooth也可以实现这一点。建立一个Socket,只是一个手机,它可以与多个bdaddr绑定。这就是hci0,hci1等等。

 

五:理解网络字序:

对于多字节数据,不同的CPU有不同的组织方式,最基本的字节序位:

小端(little-endian): 将低序字节存储在起始位置。

大端(big-endian):将高序字节存储在其实位置。

 

Intel CPU使用小端。Motorola等CPU使用大端,网络上传输数据的标准顺序为大端。

 

他们之间的转化:

htobs(), htonl() 主机到网络

ntohl() , ntohs() 网络到主机。


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭