ARM平台上蓝牙协议栈Bluez的移植使用和配置

本文详细介绍了如何在ARM平台上移植和配置蓝牙协议栈Bluez,包括配置内核支持Bluetooth,交叉编译移植相关库,如bluez-utils、expat、dbus等,以及连接蓝牙设备的步骤,如配置hcid.conf和rfcomm.conf文件,使用蓝牙命令进行设备搜索和文件传输。此外,还探讨了Bluez库的架构和配置文件的读取问题。
摘要由CSDN通过智能技术生成

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

                       
 

版权所有,转载请注明出处http://blog.csdn.net/gatieme/article/details/48751743
  参考
  http://blog.csdn.net/lizzywu/article/details/7662110
  http://blog.csdn.net/colorant/article/details/2590654

前言


blue简介

蓝牙(Bluetooth),或称为蓝芽,是一种新式的无线传送协议,最初由爱立信创制,后来由蓝牙特别兴趣组订定技术标准。据说因为此技术尚在萌芽的阶段,故将Bluetooth以“蓝牙”的中文译名在台湾地区进行商业的注册,不过根据英文本身的意义直译,还是“蓝牙”较为贴切。

蓝牙用于在不同的设备之间进行无线连接,例如连接计算机和外围设施,如:打印机、键盘等,又或让个人数字助理(PDA)与其它附近的PDA或计算机进行通信。目前市面上具备蓝牙技术的手机选择非常丰富,可以连接到计算机、PDA甚至连接到免提听筒。

蓝牙技术最初由爱立信创制。1999年5月20日,索尼爱立信、IBM、英特尔、诺基亚及东芝等业界龙头创立蓝牙特别兴趣组,制订蓝牙技术标准。“蓝牙”这名称来自10世纪的丹麦国王哈拉尔德(Harald Gormsson)的外号。出身海盗家庭的哈拉尔德统一了北欧四分五裂的国家,成为维京王国的国王。由于他喜欢吃蓝莓,牙齿常常被染成蓝色,而获得“蓝牙”的绰号,当时蓝莓因为颜色怪异的缘故被认为是不适合食用的东西,因此这位爱尝新的国王也成为创新与勇于尝试的象征。1998年,爱立信公司希望无线通信技术能统一标准而取名“蓝牙”。

Bluetooth用于连接个人周边的外围设备,比如无线耳机、打印机、扫描仪、手机、计算机等等,在这些设备之间交换文件和数据,替代低速串行线的工作,常用用途包括

* 文件共享、传输* 语音传输* 远程打印* RS-232串行口线替代
  
  
  
  • 1
  • 2
  • 3
  • 4

因为Bluetooth的功能十分实用、一经提出,立刻有一种一呼百应的感觉,随着成本的下降,蓝牙的用途也越来越广(当然了,这个过程也不是一帆风顺的了),大量的中低端手机也开始装备上了这项技术,以其更丰富、完善的协议栈,略高的传输速率,以及相对于红外线来说摆脱了必须毫无障碍的束缚,几乎完全取代了原来商务手机上普遍装备的红外接口。

蓝牙来到中国,把“牙”替换成了更有东方美感的“芽”字。

蓝牙实际上并不是一种简单的协议,相反,十分复杂

 

从网络结构和组网方式讲,蓝牙在10米区域内形成一个网络,其中可以有1个主设备,7个从设备,一共8个激活的设备,当然睡觉的设备还可以有很多,不打呼噜就行了。对于更多的设备,可以使用ad hoc的方式互联,学网络的同学们看到这个来精神了吧,不过我可不打算讲了。

   

从应用来看,BT支持语音通信和串行线模拟,并且通过Profile来支持各种周边智能设备的应用,比如耳机、打印机……并且定义了一套服务发现和调用机制,还是瞒有意思的。

蓝牙最有意思的模过于第2层互联和应用层的Profile了,至于底层的跳频什么的倒是新意不大。另外就是,虽然蓝牙使用的频率和微波炉烹饪的频率毫无二致,但发射功率还是很小的,基本不足以把我们这么大块的肉弄熟。

Linux下的蓝牙协议栈


Linux 下有若干个蓝牙协议栈,目前生存状况比较健康的是bluez和affix,后者大概是Nokia支持的吧,前者则是目前蓝牙的Linux官方版本,集成在 Linux内核之中,也就是说,如果你有一个比较新的2.6内核,那么,你多半已经支持蓝牙了,而如果还不支持的话,重新编译一下也就好了。

不要觉得Linux的协议栈比不上Windows里面的,事实是,这里风景独好,bluez协议栈支持的硬件设备远远多于windows系统支持的。如果你和我一样只用Linux,那么,买了蓝牙适配器之后,大概就可以把臃肿的驱动光盘丢进垃圾桶,然后心情愉快的使用蓝牙了,跟我来吧,

内核的协议栈支持主要包含这么几个部分:

 
  •  
  • HCI. 这个是最底层的了,称为 Host Control Interface. 之所以称为 HCI 是源于蓝牙的应用模型的。蓝牙是连接智能外设的无线接口,接口的一侧是设备,另一侧就是主机 (Host) 了,采用类似记法的还有 USB, IEEE1394,所以,从设计初衷来看,这几个东东都是针对差不多的市场的,当然,各有所长了。一个蓝牙适配器是否能被驱动起来,就看 HCI 的支持性了。最常见的蓝牙适配器就是笔者持有的这类 USB 接口的了,对于大部分标准的蓝牙设备,它的驱动模块是: hci-usb,对于我们的 2.6 内核,插入这个适配器,该模块就被自动加载了。

  •  
  • L2CAP之上有两个协议被较广地使用着:RFCOMM和BNEP,前者用于取代传统的串行口,包括串行口上的各种应用,比如,传真和拨号上网、打印机、文件图片等数据传输;后者则可以提供一个以太网接口,更适于计算机组网。自然地,对于手机和计算机之间,RFCOMM 总是更常被用到。

  •  

截止到这里就是内核提供的几乎所有蓝牙协议栈了,不过,仅有这些,蓝牙还不足以为我所用,只有有了用户态的协议栈和工具相配合,才有幸福的蓝牙生活 :)
用户空间中的蓝牙协议栈与相关工具

接着刚才的协议栈,这次势在用户空间实现的了:

 
  •  
  • 在最上层,蓝牙定义了很多的Profile,每个Profile对应着一种应用,比如打印、耳机(Headset)、文件传输、Fax/Modem拨号功能等。其中,文件交换对应着Obex协议,这是一个基于蓝牙、红外(IrDA)、串口等介质的文件(对象)交换协议,这几种介质被列到一起一点也不会让人感到意外,毕竟前两个都是用来在某种意义上取代串口的。当然,有些Profile,比如一些人机交互设备 (键盘鼠标之类的) 的profile 是在内核中实现的。

  •  
  • 实际上,我们还有一个重要的协议没有介绍,这就是SDP — 服务发现协议,这个协议可以认为和RFCOMM处于统一层次,因为它并不承载于RFCOMM之上,不过,这个协议却十分特殊而重要,通过它,我们才能识别出某一蓝牙设备提供了哪些服务(Profile),从而为我所用。

  •  

嗯,协议栈已经有了,那我们怎么使用蓝牙呢? 回忆一下怎么把大象放到冰箱里吧:

    * 打开冰箱门    * 把大象放进冰箱    * 关上冰箱门
  
  
  
  • 1
  • 2
  • 3

就是这么简单,一个蓝牙服务也是这么容易

 
  •  
  • 找到蓝牙设备,这是HCI层负责的,使用 bluez-utils 包提供的 hcitool 来找到蓝牙设备;
  •  
  • 找到服务,RFCOMM 是通过不同的频道 (channel) 来提供不同的Profile的,所以,我们需要找到我们要用的服务在设备上的哪个频道上,这是通过同一个软件包里的 sdptool 来完成的,没错,就是 SDP,服务发现协议。
  •  
  • 连接恰当的服务,使用
  •  

蓝牙的特点就是如上所属的那些了,而用户态的工具所要完成的任务就是:

    * 发现服务    * 使用服务
  
  
  
  • 1
  • 2

bluez简介


Bluez作为当前最成熟的开源蓝牙协议栈,它是一个基于GNU General Public License (GPL)发布的开源项目,已成为linux官方的蓝牙协议栈(从Linux2.4.6开始便成为Linux 内核的一部分),在Linux的各大发行版中已经得到了广泛的应用。在桌面环境下,使用Bluez应该已经没有太大的问题,但是arm上仍然需要我们移植以及配置bluez,本文的主要目的是介绍在嵌入式arm平台上,移植和配置Bluez的。

 

因为本人的能力和测试时间有限,可能下文中有些理解、分析不一定准确,欢迎联系指正。

BlueZ支持蓝牙核心层和协议,它灵活、高效,以模块化方式实现,具有以下特点:n        完整的模块化实现n        均衡的多处理安全n        支持多线程数据处理n        支持多个蓝牙设备n        硬件抽象n        向所有层提供标准socket接口n        提供设备和服务级安全保证BlueZ包含多个相互独立的模块:n        Linux内核蓝牙子系统核心n        L2CAP 和 SCO 音频内核层n        RFCOMM, BNEP, CMTP 和 HIDP内核实现n        HCI UART, USB, PCMCIA 和虚拟设备驱动n        通用蓝牙和SDP库和守候进程n        配置和测试小工具n        协议解码和分析工具BlueZ内核模块,程序开发库和小工具能在支持Linux的多种硬件架构系统上运行,既支持单核也支持多核处理器。BlueZ主要支持以下系统平台:n        Intel and AMD x86n        AMD64 and EM64T (x86-64)n        SUN SPARC 32/64bitn        PowerPC 32/64bitn        Intel StrongARM and XScalen        Hitachi/Renesas SH processorsn        Motorola DragonBall现在市面上的很多Linux发行版都支持BlueZ,基本上任何一个Linux系统都兼容BlueZ,如:n        Debian GNU/Linuxn        Ubuntu Linuxn        Fedora Core / Red Hat Linuxn        OpenSuSE / SuSE Linuxn        Mandrake Linux
  
  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

网络资源


Bluez的官方网址:http://www.bluez.org/ 这里提供最新的源码下载
BlueZ的源代码可以从http://www.bluez.org/download/下载

 

其中Linux 2.4 and 2.6 系列内核已经包含BlueZ内核模块源程序,因此要使用BlueZ只需下载最新稳定的Linux内核源码就行了。而从前面的网址可以下载一些库和工具程序的源代码,也可以通过源码仓库http://www.bluez.org/development/git/来下载源码。

Bluez的Wiki:http://wiki.bluez.org/wiki/ 这里提供Bluez相关的Howto等文档资源
相关邮件列表:
https://lists.sourceforge.net/lists/listinfo/bluez-users 关于如何使用和配置Bluez,多数是在讨论PC环境下的问题。。。。
https://lists.sourceforge.net/lists/listinfo/bluez-devel Bluez开发者活动的地方,有什么Bug之类的怀疑,还有编程接口之类的问题,就发到这里吧。
bluez官网

开发环境


硬件平台:realarm
蓝牙芯片:CSR BC4 ROM 版本芯片,不带eeprom
软件环境:linux 2.6.35.7 ,自制文件系统
Bluez版本:bluez-libs-3.36
交叉编译环境:Ubuntu14.04-LTS,arm-linux-gcc 4.4.3

蓝牙协议栈bluez移植


配置内核支持Bluetooth


相信多数人使用的都是2.6的内核了,在2.6的内核中要支持Bluez,只要你的内核版本不是太旧,无需打Patch,直接配置好就OK了,内核里面的代码相对比较稳定了。当然,Bluez对一些Bluetooth协议栈新特性的支持,还是需要更新kernel代码的。你应该确认你使用的kernel版本是否以及包含了对应的支持。

内核的配置,基本上把 networking下 — Bluetooth subsystem support 里的以下几项全部选上即可:
内核配置

make menuconfig[*] Networking support  --->                <*>   Bluetooth subsystem support  --->    //蓝牙子系统必须选择<*>   L2CAP protocol suppor       //逻辑链路控制和适配协议。<*>   SCO links support           //蓝牙语音和耳机支持<*>   RFCOMM protocol suppor      //面向流的传输协议,支持拨号网络等[*]   RFCOMM TTY support          //<*>   BNEP protocol support       //蓝牙网络封装协议,自组网支持[*]   Multicast filter support    //蓝牙多播,支持支持BNEP[*]   Protocol filter support //蓝牙多播,支持支持支持BNEP<*>   HIDP protocol support       //基本支持协议Bluetooth device drivers  ---><*> HCI USB driver              //USB蓝牙模块支持<M>HCI UART driver              //基于串口,CF卡或PCMCIA的蓝牙<*> HCI BlueFRITZ! USB driver<*> HCI VHCI (Virtual HCI device) driver
  
  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值