一、LINUX下blueZ的编程

 

LinuxBluez的编程实现



1、 蓝牙的各个协议栈的简介....................................................................................... 2



1.1、蓝牙技术.......................................................................................................... 2



1.1、蓝牙协议栈...................................................................................................... 2



1.2、蓝牙技术的特点.............................................................................................. 4



1.2.1、蓝牙协议栈体系结构............................................................................. 4



1.2.2、蓝牙协议栈低层模块............................................................................. 4



1.2.3、软件模块................................................................................................ 5



1.3、蓝牙的一些Profile........................................................................................... 6



2、Bluez和D-Bus............................................................................................................ 7



2.1、Bluez和D-Bus体系结构.................................................................................. 7



2.2、D-Bus介绍....................................................................................................... 9



2.3、Bluez的安全接口........................................................................................... 13



2.4、Bluez适配器接口........................................................................................... 15



2.5、Bluez配对...................................................................................................... 16



2.6、Bluez绑定...................................................................................................... 17



3、Bluez编程实现......................................................................................................... 18



3.1、蓝牙开发关键技术剖析................................................................................. 18



3.1.1、连接机制分析....................................................................................... 18



3.1.2、自动连接.............................................................................................. 18



3.1.3、时钟设计.............................................................................................. 19



3.1.4、配对列表管理....................................................................................... 20



3.1.5、蓝牙文件传输模式............................................................................... 20



3.2、hci层介绍...................................................................................................... 20



3.2.1、hci层介绍............................................................................................. 20



3.2.2、hci层编程............................................................................................. 21



3.3、L2CAP层编程................................................................................................ 25



3.3.1、L2CAP协议简介.................................................................................. 25



3.3.2、L2CAP编程方法.................................................................................. 26



3.4、SDP协议简介................................................................................................. 27



4、Openobex................................................................................................................. 28



4.1、Openobex简介............................................................................................... 28



4.2、Openobex与bluez编程实现........................................................................... 29



5、 Obexftp.................................................................................................................. 32



5.1、obexftp简介................................................................................................... 32



5.2、基于Obexftp的应用程序开发....................................................................... 32



6、参考资料.................................................................................................................. 32



 

1、蓝牙的各个协议栈的简介

1.1、蓝牙技术

         蓝牙(Bluetooth)技术是由Ericsson、IBM、Intel、Nokia和Toshiba公司于1998年5月共同提出开发的,并联合成立了蓝牙特殊利益小组(SIG),负责开发无线协议规范并设定交互操作的需求。其本质是设备间的无线链接,意在于代替有线电缆。

1.1、蓝牙协议栈

协议栈是指一组协议的集合,举个例子,把大象装到冰箱里,总共要3步。每步就是一个协议,3步组成一个协议栈。把应用层数据包发出去,也要好几步,TCP/UDP头,IP头,ether头,每步也是一个协议。另外每层都有一些特殊的协议。所有这些统称协议栈。蓝牙协议栈就是SIG定义的一组协议的规范,目标是允许遵循规范的蓝牙应用能够进行相互间操作,如图1.1蓝牙协议栈

在蓝牙协议体系中,底层、中间层、应用层按序排列构成了蓝牙协议栈,如左图所示。底层(硬件层)和中间协议层(软件层)之间  的接口使用主机控制器接口(HCI)。HCI是软硬件之间必不可少的接口,其功能是解释并传递两层之间的消息和数据。软件通过HCI调用底层LMP/BB和RF等硬件。HCI以下的功能由蓝牙设备实施;HCI以上的功能由软件运行,在主机上实现。HCI对于上、下两层数据的传输都是透明的。

在蓝牙协议栈中,最主要的是蓝牙核心协议,包括基带协议(BP)、链路管理协议(LMP)、链接控制和适配协议(L2CAP)、服务发现协议(SDP)等。蓝牙设备基本上都需要核心协议,其他协议则按蓝牙设备的需要而选定。

1.2、蓝牙技术的特点

1.2.1、蓝牙协议栈体系结构

整个蓝牙协议体系结构可分为底层硬件模块、中间协议层和高端应用层三大部分。链路管理层(LMP)、基带层(BBP)和蓝牙无线电信道构成蓝牙的底层模块。BBP层负责跳频和蓝牙数据及信息帧的传输。

LMP层:负责连接的建立和拆除以及链路的安全和控制,它们为上层软件模块提供了不同的访问人口,但是两个模块接口之间的消息和数据传递必须通过蓝牙主机控制器接口的解释才能进行。也就是说,中间协议层包括逻辑链路控制与适配协议(L2CAP)、服务发现协议(SDP)、串口仿真协议(RFCOMM)和电话控制协议规范(TCS)。

L2CAP:完成数据拆装、服务质量控制、协议复用和组提取等功能,是其他上层协议实现的基础,因此也是蓝牙协议栈的核心部分。

SDP:为上层应用程序提供一种机制来发现网络中可用的服务及其特性。在蓝牙协议栈的最上部是高端应用层,它对应于各种应用模型的剖面,是剖面的一部分。目前定义了13种剖面。

1.2.2、蓝牙协议栈低层模块

蓝牙的低层模块是蓝牙技术的核心,是任何蓝牙设备都必须包括的部分。

  蓝牙工作在2.4GHZ的ISM频段。采用了蓝牙结束的设备讲能够提供高达720kbit/s 的数据交换速率。

  蓝牙支持电路交换和分组交换两种技术,分别定义了两种链路类型,即面向连接的同步链路(SCO)和面向无连接的异步链路(ACL)。

  为了在很低的功率状态下也能使蓝牙设备处于连接状态,蓝牙规定了三种节能状态,即停等(Park)状态、保持(Hold)状态和呼吸(Sniff)状态。这几种工作模式按照节能效率以升序排依次是:Sniff模式、Hold模式、Park模式。

  蓝牙采用三种纠错方案:1/3前向纠错(FEC)、2/3前向纠错和自动重发(ARQ)。前向纠错的目的是减少重发的可能性,但同时也增加了额外开销。然而在一个合理的无错误率环境中,多余的投标会减少输出,故分组定义的本身也保持灵活的方式,因此,在软件中可定义是否采用FEC。一般而言,在信道的噪声干扰比较大时蓝牙系统会使用前向纠错方案,以保证通信质量:对于SCO链路,使用1/3前向纠错;对于ACL链路,使用2/3前向纠错。在无编号的自动请求重发方案中,一个时隙传送的数据必须在下一个时隙得到收到的确认。只有数据在收端通过了报头错误检测和循环冗余校验(CRC)后认为无错时,才向发端发回确认消息,否则返回一个错误消息。

蓝牙系统的移动性和开放性使得安全问题变得及其重要。虽然蓝牙系统所采用的调频技术就已经提供了一定的安全保障,但是蓝牙系统仍然需要链路层和应用层的安全管理。在链路层中,蓝牙系统提供了认证、加密和密钥管理等功能。每个用户都有一个个人标识码(PIN),它会被译成128bit的链路密钥 (Link Key)来进行单双向认证。一旦认证完毕,链路就会以不同长度的密码(Encryphon Key)来加密(此密码以shit为单位增减,最大的长度为128bit)链路层安全机制提供了大量的认证方案和一个灵活的加密方案(即允许协商密码的长度)。当来自不同国家的设备互相通信时,这种机制是极其重要的,因为某些国家会指定最大密码长度。蓝牙系统会选取微微网中各个设备的最小的最大允许密码长度。例如,美国允许128bit的密码长度,而西班牙仅允许48bit,这样当两国的设备互通时,将选择48bit来加密。蓝牙系统也支持高层协议栈的不同应用体内的特殊的安全机制。例如两台计算机在进行商业卡信息交流时,一台计算机就只能访问另一台计算机的该项业务,而无权访问其他业务。蓝牙安全机制依赖PIN在设备间建立信任关系,一旦这种关系建立起来了,这些PIN就可以存储在设备中以便将来更快捷地连接。

1.2.3、软件模块

L2CAP是数据链路层的一部分,位于基带协议之上。L2CAP向上层提供面向连接的和无连接的数据服务,它的功能包括:协议的复用能力、分组的分割和重新组装(Segmentation And Reaassembly)以及提取(Group Abstraction)。L2CAP允许高层协议和应用发送和接受高达64K Byte的数据分组。

  SDP为应用提供了一个发现可用协议和决定这些可用协议的特性的方法。蓝牙环境下的服务发现与传统的网络环境下的服务发现有很大的不同,在蓝牙环境下,移动的RF环境变化很大,因此业务的参数也是不断变换的。SDP将强调蓝牙环境的独特的特性。蓝牙使用基于客户/服务器机制定义了根据蓝牙服务类型和属性发现服务的方法,还提供了服务浏览的方法。

  RFCOMM是射频通信协议,它可以仿真串行电缆接口协议,符合ETSI0710串口仿真协议。通过RFCOMM,蓝牙可以在无线环境下实现对高层协议,如PPP、TCP/IP、WAP等的支持。另外,RFCOMM可以支持AT命令集,从而可以实现移动电话机和传真机及调制解调器之间的无线连接。

  蓝牙对语音的支持是它与WLAN相区别的一个重要的标志。蓝牙电话控制规范是一个基于ITU-T建议Q.931的采用面向比特的洗衣,它定义了用于蓝牙设备间建立语音和数据呼叫的呼叫控制信令以及用于处理蓝牙TCS设备的移动性管理过程。

1.3、蓝牙的一些Profile

蓝牙里面profile的定义,profile既是配置文件,配置文件定义了可能的应用,蓝牙配置文件表达了一般行为,蓝牙设备可以通过这些行为与其它设备进行通信。蓝牙技术定义了广泛的配置文件,描述了许多不同类型的使用案例。按照蓝牙规格中提供的指导,开发商可以创建应用程序以与其它符合蓝牙规格的设备协同工作。 到目前为止,蓝牙一共有22个profile,在www.bluetooth.com上有详细的文档说明。



已经实现了的协议栈:



Widcomm: 第一个windows上的协议栈,由Widcomm公司开发,也就是现在的Broadcom .

Microsoft Windows stack: Windows XP SP2中包括了这个内建的协议栈,开发者也可以调用其API开发第三方软件。

Toshiba stack: 它也是基于Windows的,不支持第三方开发,但它把协议栈授权给一些laptop商)。它支持的Profile有: SPP, DUN, FAX, LAP, OPP, FTP, HID, HCRP, PAN, BIP, HSP, HFP , A2DP, AVRCP, GAVDP)

BlueSoleil: 著名的IVT公司的产品,这个应该是个中国公司。该产品可以用于桌面和嵌入式,他也支持第三方开发,DUN, FAX, HFP, HSP, LAP, OBEX, OPP, PAN SPP, AV, BIP, FTP, GAP, HID, SDAP, and SYNC。

Bluez: Linux官方协议栈,该协议栈的上层用Socket封装,便于开发者使用,通过DBUS与其它应用程序通信。

Affix: NOKIA公司的协议栈,在Symbian系统上运行。

BlueDragon:东软公司产品,支持的Profile:SDP、Serial-DevB、AVCTP、AVRCP-Controller、AVRCP-Target、Headset-AG、Headset-HS、OPP-Client、OPP-Server、CT-GW、CT-Term、Intercom、FT-Server、FT-Client、GAP、SDAP、Serial-DevA、AVDTP、GAVDP、A2DP-Source、A2DP-Sink。

BlueMagic:美国Open Interface 公司for portable embedded divce的协议栈,iphone(apple),nav-u(sony)等很多电子产品都用该商业的协议栈,BlueMagic 3.0是第一个通过bluetooth 协议栈1.1认证的协议栈,那么我现在就在用它,那么该栈用起来简单,API清晰明了。实现了的profile有:HCI,L2CAP,RFCOMM,A/V,Remote,Control,A/V,Streaming,BIP,BPP,DUN,FAX,FTP,GAP,Hands-Free,and,Headset,HCRP,HID,OBEX,OPP,PAN,BNEP,PBAP,SAP,SPP,Synchronization,SyncML,Telephony,XML.

BCHS-Bluecore Host Software: 蓝牙芯片CSR的协议栈,同时他也提供了一些上层应用的Profile的库。

Windows CE:微软给Windows CE开发的协议栈,但是windows ce本身也支持其它的协议栈。

时间: 2024-11-08 19:54:16

一、LINUX下blueZ的编程的相关文章

linux网络编程-LINUX下模拟DNS编程,写报文时关于DOMAIN NAME 的格式转换程序

问题描述 LINUX下模拟DNS编程,写报文时关于DOMAIN NAME 的格式转换程序 这段程序要求是转换格式,如www.baidu.com换成3www5baidu3com0 网上有代码 void ChangetoDnsNameFormat(unsigned char* dns,unsigned char* host) { int lock = 0 , i; strcat((char*)host,"."); for(i = 0 ; i < strlen((char*)host)

《Linux设备驱动开发详解 A》一一3.5 Linux下的C编程特点

3.5 Linux下的C编程特点 3.5.1 Linux编码风格 Linux有独特的编码风格,在内核源代码下存在一个文件Documentation/CodingStyle,进行了比较详细的描述. Linux程序的命名习惯和Windows程序的命名习惯及著名的匈牙利命名法有很大的 不同. 在Windows程序中,习惯以如下方式命名宏.变量和函数: #def?ine PI 3.1415926 / 用大写字母代表宏 / int minValue, maxValue; / 变量:第一个单词全小写,其后单

gtk+-linux 下图形界面编程gtk_layout_new()参数的设置是怎么发挥效用的呢?

问题描述 linux 下图形界面编程gtk_layout_new()参数的设置是怎么发挥效用的呢? GtkWidget*gtk_layout_new(GtkAdjustment*hadjustment,GtkAdjustment*vhadjustment); 参数hadjustment,vadjustment设置怎么发挥影响? 下面的列子(layout里放置一个按钮)怎么没有影响 1 #include<gtk/gtk.h> 2 int main(int argc,char**argv) 3 {

Linux下的多线程编程(三)_Linux

   下面先来一个实例.我们通过创建两个线程来实现对一个数的递加. 或许这个实例没有实际运用的价值,但是稍微改动一下,我们就可以用到其他地方去拉. 下面是我们的代码: /*thread_example.c : c multiple thread programming in linux *author : falcon *E-mail : tunzhj03@st.lzu.edu.cn */ #include <pthread.h> #include <stdio.h> #inclu

Linux下多进程/多线程编程

linux下多进程.多线程编程 linux下进程   (一) 理解Linux下进程的结构  Linux下一个进程在内存里有三部份的数据,就是"数据段","堆栈段"和"代码段",其实学过汇编语言的人一定知道,一般的CPU象I386,都有上述三种段寄存器,以方便操作系统的运行."代码段",顾名思义,就是存放了程序代码的数据,假如机器中有数个进程运行相同的一个程序,那么它们就可以使用同一个代码段.  堆栈段存放的就是子程序的返回地址

【寻善良有空心情好的达人】转战linux下的爬虫编程,请教达人拨我头上乌云

问题描述 背景:从事.net方向开发数年,现在项目需要要往linux下发展,主要从事爬虫(当前为nutch)以及数据挖掘类方向.乌云:linux几乎零基础,经常在做基础配置时遭遇困难,严重影响情绪.需求:1.推荐些linux方向学习的资源,或者参考资料(最好是书本)2.心地特别善良,而且又刚刚好有时间,然后心情又特别的好的兄弟能给些更深入的建议,小弟也不客气拜谢全收了~ 解决方案 有一本<鸟哥的linux私房菜很不错>,对于你入门到深入应该够了!解决方案二:ls 说的很对.....

Linux下的串口编程:struct termios结构体

termios结构体说明 termios结构体中,该结构体一般包括如下的成员: tcflag_t c_iflag; tcflag_t c_oflag; tcflag_t c_cflag; tcflag_t c_lflag; cc_t     c_cc[NCCS]; 其具体意义如下 c_iflag:输入模式标志,控制终端输入方式,具体参数如下所示. c_iflag参数表 键值说明 IGNBRK 忽略BREAK键输入 BRKINT 如果设置了IGNBRK,BREAK键的输入将被忽略,如果设置了BRK

Linux下的多线程编程

1 引言 线程(thread)技术早在60年代就被提出,但真正应用多线程到操作系统中去,是在80年代中期,solaris是这方面的佼佼者.传统的Unix也支持线程的概念,但是在一个进程(process)中只允许有一个线程,这样多线程就意味着多进程.现在,多线程技术已经被许多操作系统所支持,包括Windows/NT,当然,也包括Linux. 为什么有了进程的概念后,还要再引入线程呢?使用多线程到底有哪些好处?什么的系统应该选用多线程?我们首先必须回答这些问题. 使用多线程的理由之一是和进程相比,它

简介Linux下的多播编程

下面就开始我们的多播编程了: 一.多播的概念 多播,也称为"组播",将网络中同一业务类型主机进行了逻辑上的分组,进行数据收发的时候其数据仅仅在同一分组中进行,其他的主机没有加入此分组不能收发对应的        数据. 在 广域网上广播的时候,其中的交换机和路由器只向需要获取数据的主机复制并转发数据.主机可以向路由器请求加入或退出某个组,网络中的路由器和交换机有选择 地复制并传输数据,将数据仅仅传输给组内的主机.多播的这种功能,可以一次将数据发送到多个主机,又能保证不影响其他不需要(未