linux下bluetooth编程(五)bluetooth与socket

简介:    一:理解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() 网络到主机。

目录
相关文章
|
4月前
|
Shell Linux
Linux shell编程学习笔记30:打造彩色的选项菜单
Linux shell编程学习笔记30:打造彩色的选项菜单
|
1月前
|
存储 监控 Linux
嵌入式Linux系统编程 — 5.3 times、clock函数获取进程时间
在嵌入式Linux系统编程中,`times`和 `clock`函数是获取进程时间的两个重要工具。`times`函数提供了更详细的进程和子进程时间信息,而 `clock`函数则提供了更简单的处理器时间获取方法。根据具体需求选择合适的函数,可以更有效地进行性能分析和资源管理。通过本文的介绍,希望能帮助您更好地理解和使用这两个函数,提高嵌入式系统编程的效率和效果。
105 13
|
2月前
|
运维 监控 Shell
深入理解Linux系统下的Shell脚本编程
【10月更文挑战第24天】本文将深入浅出地介绍Linux系统中Shell脚本的基础知识和实用技巧,帮助读者从零开始学习编写Shell脚本。通过本文的学习,你将能够掌握Shell脚本的基本语法、变量使用、流程控制以及函数定义等核心概念,并学会如何将这些知识应用于实际问题解决中。文章还将展示几个实用的Shell脚本例子,以加深对知识点的理解和应用。无论你是运维人员还是软件开发者,这篇文章都将为你提供强大的Linux自动化工具。
|
3月前
|
网络协议 Linux 网络性能优化
Linux基础-socket详解、TCP/UDP
综上所述,Linux下的Socket编程是网络通信的重要组成部分,通过灵活运用TCP和UDP协议,开发者能够构建出满足不同需求的网络应用程序。掌握这些基础知识,是进行更复杂网络编程任务的基石。
208 1
|
4月前
|
Shell Linux
Linux shell编程学习笔记82:w命令——一览无余
Linux shell编程学习笔记82:w命令——一览无余
|
4月前
|
Linux Shell
Linux系统编程:掌握popen函数的使用
记得在使用完 `popen`打开的流后,总是使用 `pclose`来正确关闭它,并回收资源。这种做法符合良好的编程习惯,有助于保持程序的健壮性和稳定性。
202 6
|
4月前
|
Linux Shell
Linux系统编程:掌握popen函数的使用
记得在使用完 `popen`打开的流后,总是使用 `pclose`来正确关闭它,并回收资源。这种做法符合良好的编程习惯,有助于保持程序的健壮性和稳定性。
211 3
|
3月前
|
网络协议 测试技术 网络安全
Python编程-Socket网络编程
Python编程-Socket网络编程
36 0
|
5月前
|
项目管理 敏捷开发 开发框架
敏捷与瀑布的对决:解析Xamarin项目管理中如何运用敏捷方法提升开发效率并应对市场变化
【8月更文挑战第31天】在数字化时代,项目管理对软件开发至关重要,尤其是在跨平台框架 Xamarin 中。本文《Xamarin 项目管理:敏捷方法的应用》通过对比传统瀑布方法与敏捷方法,揭示敏捷在 Xamarin 项目中的优势。瀑布方法按线性顺序推进,适用于需求固定的小型项目;而敏捷方法如 Scrum 则强调迭代和增量开发,更适合需求多变、竞争激烈的环境。通过详细分析两种方法在 Xamarin 项目中的实际应用,本文展示了敏捷方法如何提高灵活性、适应性和开发效率,使其成为 Xamarin 项目成功的利器。
62 1
|
5月前
|
安全 Linux 开发工具
探索Linux操作系统:从命令行到脚本编程
【8月更文挑战第31天】在这篇文章中,我们将一起潜入Linux操作系统的海洋,从最基础的命令行操作开始,逐步深入到编写实用的脚本。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供新的视角和实用技能。我们将通过实际代码示例,展示如何在日常工作中利用Linux的强大功能来简化任务和提高效率。准备好了吗?让我们一起开启这段旅程,探索Linux的奥秘吧!