Linux蓝牙协议栈OpenBT及其应用程序开发
- 格式:pdf
- 大小:99.10 KB
- 文档页数:3
在Linux系统中使用蓝牙功能的基本方法首先确定硬件上有支持蓝牙的设备,然后运行如下命令,就可以开到我们的蓝牙设备了:代码如下:lsusb运行hciconfig可以看到:从上图可以看出,我们的蓝牙设备是hci0运行hcitooldev可以看到我们的蓝牙设备的硬件地址运行hcitoo --help 可以查看更多相关命令然后我们激活它:代码如下:sudohciconfig hci0 up要注意的是,激活前蓝牙必须是打开的,否则会出现如下错误:然后我们开始扫描了:代码如下:hcitool scan可以看到,发现了我手机的蓝牙了~~然后我们要开始连接了,连接阶段使用的主要命令是rfcomm:运行rfcomm --help 可以查看用法首先需要绑定目的蓝牙设备:代码如下:sudorfcomm bind /dev/rfcomm0 E0:A6:70:8C:A3:02注意:上面的这个地址是目的蓝牙设备的硬件地址接着我们连接它:代码如下:sudo cat >/dev/rfcomm0这是目的蓝牙主机就会弹出一个对话框要求输入pin码,随便输入一个,然后主机就会弹出一个对话框,只要输入的和刚才一致就可以通过验证。
之后我们发现我的手机已经显示了成功配对的标记了。
在配对完成之后我们需要删除绑定(否则在下次使用时会提示设备正忙),命令如下:代码如下:sudorfcomm release /dev/rfcomm0在 Linux 下使用 rfkill 软开关蓝牙及无线功能很多计算机系统包含无线电传输,其中包括Wi-Fi、蓝牙和3G设备。
这些设备消耗电源,在不使用这些设备时是一种能源浪费。
RFKill 是Linux内核中的一个子系统,它可提供一个接口,在此接口中可查询、激活并取消激活计算机系统中的无线电传输。
当取消激活传输时,可使其处于可被软件重新激活的状态(软锁定)或软件无法重新激活的位置(硬锁定)。
RFKill 为内核子系统提供应用程序编程界面(API)。
蓝牙协议栈开发流程1. 硬件平台选择在进行蓝牙协议栈开发之前,首先需要选择一个合适的硬件平台。
一般而言,蓝牙协议栈开发需要依托于一个蓝牙芯片或模块,这个芯片或模块需要支持蓝牙标准,并且提供相应的开发工具和文档。
在选择硬件平台时,需要考虑到项目的需求以及硬件的成本和可用性等因素。
2. 硬件平台驱动开发一般而言,蓝牙协议栈开发需要依赖于底层的硬件平台驱动,这需要涉及到对硬件的了解和驱动程序的开发。
这包括对芯片或模块的寄存器映射、时序要求、接口协议等方面的了解,并且需要编写相应的驱动程序来与硬件进行交互。
在驱动开发过程中,需要考虑到硬件的特性和限制,同时也需要保证驱动程序的效率和稳定性。
3. 协议栈架构设计蓝牙协议栈是蓝牙通信的核心部分,它负责处理蓝牙连接、数据传输、设备发现、配对等功能。
协议栈一般包括多个层次,包括物理层、链路层、L2CAP层、RFCOMM层、SDP 层等。
在进行协议栈的开发时,需要对整个协议栈的架构进行设计,包括各个层次的功能和接口等。
同时也需要考虑到协议栈的效率、可扩展性、可移植性等方面的要求。
4. 协议栈的实现在协议栈的实现过程中,需要根据协议规范和硬件平台的要求,编写相应的代码来实现蓝牙协议栈的各个功能。
这需要对蓝牙规范有较深的了解,并且需要在编写代码的过程中充分考虑到硬件平台的特性和限制。
在进行协议栈的实现时,需要进行模块化设计,确保各个功能模块之间的接口清晰,同时也需要进行充分的测试和调试,确保实现的功能正确和稳定。
5. 协议栈的优化在进行协议栈的开发过程中,需要进行各个方面的优化,包括代码的优化、内存的优化、功耗的优化等。
这需要根据具体的硬件平台和应用场景来进行优化的选择,以确保协议栈在实际应用中能够满足相应的要求。
6. 测试和验证在协议栈的开发完成后,需要进行相应的测试和验证工作。
这包括功能测试、性能测试、兼容性测试、安全性测试等。
这需要根据蓝牙标准和相关的测试要求,编写测试用例,并且对协议栈进行全面的测试。
三种蓝⽛架构实现⽅案(蓝⽛协议栈⽅案)蓝⽛架构实现⽅案有哪⼏种?我们⼀般把整个蓝⽛实现⽅案叫做蓝⽛协议栈,因此这个问题也可以这么阐述:蓝⽛协议栈有哪些具体的架构⽅案?在蓝⽛协议栈中,host是什么?controller是什么?HCI⼜是什么?⼤家都知道,不同的应⽤场景有不同的需求,因此不同的应⽤场景对蓝⽛实现⽅案的要求也不⼀样,从⽽催⽣不同的蓝⽛架构实现⽅案,或者说蓝⽛协议栈⽅案。
架构1:host+controller双芯⽚标准架构蓝⽛是跟随⼿机⽽诞⽣的,如何在⼿机中实现蓝⽛应⽤,是蓝⽛规格⾸先要考虑的问题。
如果你仔细阅读蓝⽛核⼼规格,你会发现规格书更多地是站在⼿机⾓度来阐述的,然后“顺带”描述⼀下⼿机周边蓝⽛设备的实现原理。
如⼤家所熟知,⼿机⾥⾯包含很多SoC或者模块,每颗SoC或者模块都有⾃⼰独有的功能,⽐如⼿机应⽤跑在AP芯⽚上(⼀般⽽⾔,Android或者iOS开发者只需跟AP芯⽚打交道),显⽰屏,3G/4G通信,WiFi/蓝⽛等都有⾃⼰专门的SoC或者模块,这些模块在物理上都会通过某种接⼝与AP相连。
如果应⽤需要⽤到某个模块的时候,⽐如蓝⽛通信,AP会⾃动跟蓝⽛模块交互,从⽽完成蓝⽛通信功能。
市场上有很多种AP芯⽚,同时也有很多种蓝⽛模块,如何保证两者的兼容性,以减轻⼿机的开发⼯作量,增加⼿机⼚商蓝⽛⽅案选型的灵活性,是蓝⽛规格要考虑的事情。
为此,蓝⽛规格定义了⼀套标准,使得⼿机⼚商,⽐如苹果,⽤⼀颗新AP替换⽼AP,蓝⽛模块不需要做任何更改;同样⽤⼀颗新蓝⽛模块换掉⽼蓝⽛模块,AP端也不需要做任何更改。
这个标准把蓝⽛协议栈分成host和controller两部分,其中host跑在AP上,controller跑在蓝⽛模块上,两者之间通过HCI协议进⾏通信,⽽且host具体包含协议栈那些部分,controller具体包含协议栈那些部分,两者之间通信的HCI协议如何定义,这些在蓝⽛核⼼规格中都有详细定义,因此我把它称为双芯⽚标准⽅案。
蓝牙协议栈详解蓝牙协议栈是指蓝牙通信中的软件协议,它定义了蓝牙设备之间的通信规则和数据传输方式。
蓝牙协议栈由多个层次组成,每个层次负责不同的功能和任务。
本文将对蓝牙协议栈的各个层次进行详细解析,以便读者更好地理解蓝牙通信原理。
1. 物理层(Physical Layer)物理层是蓝牙协议栈中最底层的层次,它定义了蓝牙设备的无线通信方式和频率。
蓝牙使用2.4GHz的ISM频段进行通信,采用频率跳变技术来避免干扰。
物理层还定义了蓝牙设备的功率等级和传输速率,以及通信距离的限制。
2. 链路层(Link Layer)链路层是蓝牙协议栈中的第二层,它负责建立和管理蓝牙设备之间的连接。
链路层主要包括两个子层:广告子层和连接子层。
广告子层负责设备的广告和发现,用于建立连接;连接子层负责连接的建立、维护和关闭。
链路层还定义了蓝牙设备之间的数据传输方式,如数据包的格式、错误检测和纠错等。
3. 主机控制器接口(Host Controller Interface,HCI)主机控制器接口是蓝牙协议栈中的第三层,它定义了主机和主机控制器之间的通信方式。
主机控制器接口可以通过串口、USB等方式与主机连接,主要负责传输命令和数据,以及处理主机和主机控制器之间的事件和状态。
4. L2CAP层(Logical Link Control and Adaptation Protocol)L2CAP层是蓝牙协议栈中的第四层,它提供了面向连接和面向无连接的数据传输服务。
L2CAP层可以将较大的数据包分割成多个小的数据包进行传输,并提供可靠的数据传输机制。
L2CAP层还支持多个逻辑信道的复用和分离,以满足不同应用的需求。
5. RFCOMM层(Radio Frequency Communication)RFCOMM层是蓝牙协议栈中的第五层,它通过虚拟串口的方式提供串行数据传输服务。
RFCOMM层允许应用程序通过串口接口与蓝牙设备进行通信,实现数据的传输和控制。
蓝牙技术协议栈蓝牙技术是一种短距离无线通信技术,它允许电子设备之间进行数据交换。
这种技术的核心是其协议栈,它是一套定义了设备如何相互通信的规则和程序。
本文将介绍蓝牙技术协议栈的基本结构和主要组成部分。
蓝牙协议栈概述蓝牙协议栈是一个分层的结构,每一层都有特定的功能和责任。
从底层的物理传输到高层的应用层,每一层都为上一层提供服务,同时依赖于下一层的支持。
整个协议栈可以分为以下几个主要部分:1. 物理层:负责无线电信号的发送和接收。
2. 链路层:控制设备的物理连接,包括频率跳变和信道管理。
3. 适配层:提供不同设备之间的适配功能,确保数据的正确传输。
4. 协议层:包括逻辑链路控制和适配协议(L2CAP)、服务发现协议(SDP)、串行端口协议(SPP)等,它们为上层应用提供必要的服务。
5. 应用层:包括各种基于蓝牙的应用协议,如音频/视频传输、文件传输等。
主要协议介绍物理层物理层是蓝牙协议栈的基础,它定义了蓝牙设备之间的无线电通信方式。
这一层负责频率选择、功率控制和信号调制解调等功能。
蓝牙技术支持多种频段操作,但最常见的是在2.4 GHz ISM频段内工作。
链路层链路层也称为基带层,它管理蓝牙设备之间的物理连接。
这一层负责处理设备的地址分配、信道选择、连接建立和释放等任务。
链路层还实现了一种称为“微微网”的概念,即一个主设备与多个从设备形成的网络。
适配层适配层的主要作用是为不同类型的蓝牙设备提供互操作性。
这一层通过适配协议来转换不同设备之间的数据格式,确保信息能够正确传输。
例如,L2CAP协议就是适配层中的一个重要协议,它提供了更高级别的服务,如分段和重组、服务质量(QoS)信息传递等。
协议层协议层包含了多个重要的协议,它们为应用层提供了必要的支持。
例如,SDP协议使得设备能够发现并利用其他设备提供的服务;而SPP协议则提供了一个模拟传统串行端口的方法,使得蓝牙设备能够像使用有线连接一样进行数据传输。
应用层应用层是蓝牙协议栈的最高层,它直接面向最终用户。
蓝牙协议栈详解1.概述:蓝牙协议规范遵循开放系统互连参考模型(OSI/RM),从低到高地定义了蓝牙协议堆栈的各个层次。
SIG所定义的蓝牙技术规范的目的是使符合该规范的各种应用之间能够实现互操作。
互操作的远端设备需要使用相同的协议栈,不同的应用需要不同的协议栈。
但是,所有的应用都要使用蓝牙技术规范中的数据链路层和物理层。
2.完整的蓝牙协议栈完整的蓝牙协议栈如图1所示,不是任何应用都必须使用全部协议,而是可以只使用其中的一列或多列。
图1显示了所有协议之间的相互关系,但这种关系在某些应用中是有变化的。
蓝牙协议体系中的协议蓝牙协议体系中的协议按SIG的关注程度分为四层:核心协议:BaseBand、LMP、L2CAP、SDP;电缆替代协议:RFCOMM;电话传送控制协议:TCS-Binary、AT命令集;选用协议:PPP、UDP/TCP/IP、OBEX、WAP、vCard、vCal、IrMC、WAE。
除上述协议层外,规范还定义了主机控制器接口(HCI),它为基带控制器、连接管理器、硬件状态和控制寄存器提供命令接口。
在图1中,HCI位于L2CAP 的下层,但HCI也可位于L2CAP上层。
蓝牙核心协议由SIG制定的蓝牙专用协议组成。
绝大部分蓝牙设备都需要核心协议(加上无线部分),而其他协议则根据应用的需要而定。
总之,电缆替代协议、电话控制协议和被采用的协议在核心协议基础上构成了面向应用的协议。
3.蓝牙核心协议介绍1)基带协议基带和链路控制层确保微微网内各蓝牙设备单元之间由射频构成的物理连接。
蓝牙的射频系统是一个跳频系统,其任一分组在指定时隙、指定频率上发送。
它使用查询和分页进程同步不同设备间的发送频率和时钟,为基带数据分组提供了两种物理连接方式,即面向连接(SCO)和无连接(ACL),而且,在同一射频上可实现多路数据传送。
ACL适用于数据分组,SCO适用于话音以及话音与数据的组合,所有的话音和数据分组都附有不同级别的前向纠错(FEC)或循环冗余校验(CRC),而且可进行加密。
开源蓝牙协议栈开源蓝牙协议栈是基于蓝牙技术的一种软件实现,它提供蓝牙协议的各个层次的功能。
开源蓝牙协议栈的主要目标是为开发者提供一个简单灵活、自由定制的平台,以便于他们可以根据自己的需求进行定制和扩展。
开源蓝牙协议栈通常由以下几个核心模块组成:1.物理层(PHY):物理层是蓝牙通信的最底层,主要负责处理无线信号的传输和接收。
开源蓝牙协议栈通过PHY模块与硬件进行交互,以确保无线通信的可靠性和稳定性。
2.链路层(Link Layer):链路层是蓝牙协议栈中的核心模块,主要负责建立和管理蓝牙的连接。
它提供了数据传输,设备认证,数据加密等功能,确保数据的安全性和完整性。
3.主机(Host):主机模块是蓝牙协议栈中的上层模块,负责处理与连接设备的交互。
它可以处理与其他设备的配对、连接、数据传输等操作,并提供相应的API供上层应用程序使用。
4.应用层(Application Layer):应用层是蓝牙协议栈中的最高层,它提供了各种高级功能和服务,如音频传输、文件传输、远程控制等。
开源蓝牙协议栈通常提供了一些预定义的应用层协议,同时也允许开发者根据需要自定义和扩展。
开源蓝牙协议栈的优势在于其开放性和灵活性。
开源代码可以使开发者更好地理解和掌握蓝牙协议的工作原理,更容易进行定制和扩展。
此外,开源蓝牙协议栈通常由开发者社区维护和更新,存在众多的开发者和用户,可以共同贡献并改进代码,使协议栈更加稳定和可靠。
开源蓝牙协议栈在物联网领域有广泛的应用。
它可以作为物联网设备的基础软件平台,为设备之间的无线通信提供支持。
开发者通过使用开源蓝牙协议栈,可以快速构建自己的物联网解决方案,并根据实际需求进行定制和扩展。
总之,开源蓝牙协议栈是一种非常有用的软件工具,它不仅提供了蓝牙协议的各个层次的功能,也保证了灵活性和定制性。
随着物联网的发展,开源蓝牙协议栈将会有广泛的应用和推广。
蓝牙协议栈开发流程一、概述蓝牙技术作为一种短距离无线通信技术,广泛应用于各种设备之间的数据传输和通信。
在蓝牙设备间进行通信时,需要遵循一定的蓝牙协议规范,即蓝牙协议栈。
蓝牙协议栈是蓝牙设备上的软件实现,主要功用是处理不同层次的蓝牙规范,并提供API供应用程序调用。
蓝牙协议栈包含了多个不同的协议层,对于蓝牙设备来说,能够支持的蓝牙协议栈是非常重要的。
而蓝牙协议栈的开发流程,即在一个蓝牙设备上开发软件实现这些协议层的流程,也是开发一个蓝牙设备的关键步骤。
下面将详细介绍蓝牙协议栈的开发流程。
二、蓝牙协议栈开发流程1. 确定需求蓝牙协议栈的开发流程开始于明确定义需求。
这一阶段需要明确蓝牙设备的功能需求,包括支持的蓝牙协议版本、蓝牙协议栈的架构等。
确定需求是整个开发流程的基础,也是保证后续开发方向正确和产品质量的重要环节。
2. 协议规范研究在确定需求之后,开发团队需要深入研究蓝牙协议规范,理解蓝牙协议栈所需实现的各个协议层的功能和规范要求。
这一阶段需要对蓝牙规范文档进行详细的研究和理解,为后续的开发工作奠定基础。
3. 确定协议栈架构在研究协议规范的基础上,开发团队需要确定蓝牙协议栈的架构。
蓝牙协议栈通常包含物理层、链路层、基带层、逻辑链路控制和适配器层等多个不同的层次,确定协议栈架构可以使开发工作有组织、有条不紊地进行。
4. 实现协议栈在确定了协议栈的架构之后,开发团队开始实现各个协议层。
在实现过程中,需要严格按照蓝牙协议规范的要求进行开发,确保蓝牙设备的兼容性和性能。
通常在实现过程中需要使用C语言或者其他编程语言,配合开发工具进行开发和调试。
5. 测试验收在完成协议栈的开发之后,需要对蓝牙设备进行全面的测试验收。
测试包括功能测试、性能测试、兼容性测试等多个方面。
只有通过测试验收,蓝牙设备才能够正式投入使用。
6. 优化调整在测试验收过程中,可能会发现一些问题或者性能不佳的地方,此时需要对蓝牙协议栈进行优化调整,以提高蓝牙设备的性能和稳定性。
开源蓝牙协议栈概述开源蓝牙协议栈(Open Source Bluetooth Stack)是一种用于无线通信的协议栈,它实现了蓝牙协议的各个层次,包括物理层、链路层、逻辑链路控制层以及上层的协议和配置管理。
开源蓝牙协议栈的出现为蓝牙技术的应用提供了更加灵活和自由的选择。
蓝牙协议栈的基本结构开源蓝牙协议栈通常由以下几个主要模块组成:1.物理层(Physical Layer):负责将数据从逻辑链路控制层传输到物理介质上,通常使用无线电波进行传输。
2.链路层(Link Layer):负责管理蓝牙设备之间的连接和断开,提供数据包的可靠传输。
3.逻辑链路控制层(Logical Link Control Layer):负责管理逻辑链路的建立和维护,控制数据的流动。
4.上层协议和配置管理(Upper Layer Protocols and ConfigurationManagement):包括各种蓝牙协议和配置管理的功能,如SDP(ServiceDiscovery Protocol)、RFCOMM(Radio Frequency Communication)等。
开源蓝牙协议栈的优势相比于闭源的蓝牙协议栈,开源蓝牙协议栈具有以下几个优势:1.自由定制:开源蓝牙协议栈可以根据具体应用的需求进行定制和修改,不受厂商的限制。
用户可以根据自己的需求,添加、删除或修改协议栈中的某些功能,以适应不同的应用场景。
2.开放性:开源蓝牙协议栈的源代码是公开的,任何人都可以查看和修改。
这使得开发人员能够更深入地理解协议栈的工作原理,并且能够根据自己的需求进行二次开发。
3.社区支持:开源蓝牙协议栈通常有庞大的开发者社区,用户可以在社区中获取技术支持、交流经验和分享成果。
这使得开发过程更加高效和便捷。
开源蓝牙协议栈的应用开源蓝牙协议栈广泛应用于各种蓝牙设备和应用中,包括但不限于以下领域:1.智能家居:通过开源蓝牙协议栈,各种智能家居设备可以实现互联互通,实现智能家居的自动化和智能化。
开源蓝牙协议栈开源蓝牙协议栈是指基于开源许可协议发布的蓝牙协议栈软件。
它的出现,使得开发者可以更加方便地进行蓝牙相关应用的开发和定制。
相比于闭源的蓝牙协议栈,开源蓝牙协议栈具有更高的灵活性和可定制性,能够更好地满足不同场景下的需求。
开源蓝牙协议栈的核心功能包括蓝牙协议栈的实现、蓝牙协议栈的协议栈管理、蓝牙协议栈的协议栈接口等。
通过这些功能,开发者可以在不同的硬件平台上实现蓝牙功能,并且可以根据自己的需求进行定制和扩展。
在开源蓝牙协议栈的选择上,目前市面上有一些比较知名的开源蓝牙协议栈,比如BlueZ、Zephyr、Mynewt等。
这些开源蓝牙协议栈都有着不同的特点和适用场景,开发者可以根据自己的需求进行选择。
在实际的开发过程中,开发者需要了解蓝牙协议栈的基本原理和工作流程,掌握蓝牙协议栈的相关接口和调用方法。
同时,还需要根据自己的硬件平台和应用场景进行相应的定制和优化,以确保蓝牙功能能够正常运行并且满足性能要求。
除了基本的功能实现之外,开源蓝牙协议栈还需要考虑到蓝牙连接的稳定性、功耗的优化、安全性等方面的问题。
这些都是开发者在进行蓝牙应用开发时需要重点关注的方面,也是开源蓝牙协议栈需要不断优化和改进的地方。
总的来说,开源蓝牙协议栈在当今的物联网领域中具有着重要的作用,它为蓝牙应用的开发和定制提供了更多的可能性。
通过对开源蓝牙协议栈的深入了解和应用,开发者可以更加高效地进行蓝牙应用开发,并且可以更好地满足不同场景下的需求。
希望本文对开源蓝牙协议栈有所帮助,也希望开发者们能够在实际的开发过程中充分发挥开源蓝牙协议栈的优势,为物联网领域的发展贡献自己的一份力量。
2003.10 电子设计应用 www.eaw.com.cn引言Linux蓝牙协议栈主要有三个:OpenBT、BlueDrekar、BlueZ,其中OpenBT被认为在性价比上超过BlueDrekar和BlueZ,可运行于X86、ARM、MIPS、PowerPC等硬件平台,与任何2.x版本的Linux内核兼容,支持JAVA。
本文介绍了OpenBT的体系结构及其对互操作性的影响,并以客户机/服务器(C/S)实例说明如何在OpenBT上开发蓝牙应用程序。
OpenBT的体系结构使用不同蓝牙协议栈的设备在通信时往往会遇到互操作性问题。
开发者需要了解各种协议栈的体系结构并考虑其差异。
通过分析源码,本文给出了如图1所示的OpenBT的体系结构。
OpenBT包括HCI、L2CAP、SDP、SP、Networking、OpenBT Utility、后台程序、内核接口8个模块,分别解释如下:* HCI模块由Driver、Transport子模块构成。
Driver负责HCI命令、HCI事件和HCI数据接口;Transport提供USB、RS-232、UART的驱动。
* L2CAP模块由State Handle、Security子模块构成。
State Handle负责运行L2CAP的状态机和数据的分段组装;Security负责L2CAP级别安全管理。
* SP模块由RFCOMM、串口仿真子模块组成。
RFCOMM负责完成蓝牙RFCOMM协议中所描述的内容,核心是一个RFCOMM状态机;串口仿真负责提供接口。
* SDP模块负责完成蓝牙SDP协议中所描述的内容,在功能上分为XML文件管理、SDP查询处理和SDP响应处理三部分。
* Networking模块由PPP、Modem Emulation、TCS子模块构Linux蓝牙协议栈OpenBT及其应用程序开发■ 西安交通大学电信学院 马毅华 冯恩信摘 要:本文分析了OpenBT软件体系结构,根据客户机/服务器模型的实例,介绍了OpenBT应用程序的开发,并提出了一种实用的开发模式。
关键词:蓝牙技术;Linux;OpenBTwww.eaw.com.cn 电子设计应用 2003.1053成。
PPP利用Linux提供的功能来完成PPP驱动;Modem Emulation负责接口;TCS负责完成蓝牙TCS协议中所描述的内容。
* 后台程序作为协议栈的控制机构,集中对协议栈进行控制。
* OpenBT Utility负责各层的内存管理、L2CAP和RFCOMM层次的安全管理和SDP数据库的管理。
*内核接口模块对应于bluetooth.c文件中的内核集成代码。
开发OpenBT蓝牙应用程序OpenBT本质上是一个LinuxTTY驱动程序。
使用OpenBT,首先需要在运行Linux 2.x内核的机器上安装OpenBT。
按照下列步骤安装:* 将下载的openbt_20011021.tar.gz解压缩。
tar xvfz openbt_20011021.tar.gz* 进入openbt目录,初始化设备文件。
cd openbt. init_env* 通过su命令切换到根用户,安装程序并建立蓝牙设备节点。
make installmake devs* 把蓝牙内核驱动程序加载到linux内核。
insmod src/bt.o这时通过cat /proc/devices将看到名字为bt的字符驱动条目及其主设备号和次设备号,通过cat /proc/tty/drivers和cat /proc/tty/ldisc可以看到OpenBT在内核中注册的TTY驱动和链路规程。
/dev目录下的ttyBTC控制设备文件用于控制本地蓝牙设备驱动程序的初始化、连接和关闭。
同一目录下的ttyBT0到ttyBT6等7个数据设备文件就是RFCOMM TTY的实例,可以象操纵串口一样打开并进行连接。
RFCOMM TTY的从设备号就是HCI链路号,对应的蓝牙主机可以连接的7个从机。
安装完成后,在OpenBT上建立应用有两种方法。
第一种方法是直接使用在apps/bluetooth目录下附带的btd、bluetoothPN、sdp_Server这三个应用程序。
第二种方法需要自己编写代码。
从实现蓝牙功能的角度而言,编写OpenBT应用程序可以遵循以下的模式:* 环境相关部分,对硬件和操作系统进行设置和初始化。
* 协议相关部分,实现蓝牙协议所描述的一系列功能。
* 应用相关部分,决定如何使用协议相关部分所提供的功能。
本文通过一个C/S应用实例说明如何编写这三部分内容,所用的配置如下:OpenBT0.0.8版本,RedHat 9(2.4.20内核),EricssonROK101007(UART连接)。
环境相关部分需要完成以下三项任务。
* 配置串口驱动int fd;struct termios t;fd=open(“/dev/ttys0”,O_RDWR,0); //打开串行口ioctl(fd,TCGETS,&t);cfmakeraw(&t); //raw模式设置t.c_cflag &=  ̄CBAUD;//根据ROK101007模块要求设置t.c_cflag |= B57600|CS8t.c_cflag |= CLOCAL;t.c_oflag = t.c_lflag =0;t.c_cflag &=  ̄CRTSCTS;ioctl(fd,TCSETS,&t);* 配置蓝牙驱动图2(a)显示了用户装载了bt.o后的TTY驱动程序配置。
应用程序需要通过ioctl调用把串行驱动程序的链路规程配置成bt_ldisc。
通过以下ioctl调用后,TTY驱动程序配置将如图2(b)所示。
int bt_ldisc=N_BT;//N_BT常量在btcommon.h中定义ioctl(fd,TIOCSETD,& bt_ldisc);//连接串口驱动和蓝牙链路规程* 初始化OpenBTbt_cfd=open(“/dev/ttyBTC”,O_RDWR,0); //控制蓝牙设备图2(b) ioctl调用后的TTY驱动程序配置图2(a) 装载bt.o后的TTY驱动程序配置2003.10 电子设计应用 www.eaw.com.cnioctl(bt_cfd,BTINITSTACK);//初始化协议栈协议相关部分协议相关部分所实现的功能需要根据应用相关部分的要求确定。
服务器的一般功能有:* 注册自己的服务OpenBT的SDP数据库是一个XML文件集,可以直接编辑位于/etc/sdp.xml的XML文件来注册服务。
* 寻呼扫描和查询扫描int wrsan=(PAGE_SCAN_ENBLE|INQUIRY_SCAN_ENBLE);ioctl(bt_cfd,HCIWRITESCANENBLE,&wrscan);//启动寻呼和查询扫描* 响应服务搜索if (sdp_req.responseLength==0){printf(“没有响应\n”);}if (sdp_req.responseResponse[0]==0x01){printf(“错误响应\n”);}if (!sdp_req.responseResponse[8]==0){printf(“没有匹配的服务\n”);}server_hdl=sdp_req.responseResponse[9]<<24| sdp_req.responseResponse[10]<<16|sdp_req.responseResponse[11]<<8|sdp_req.responseResponse[12];//获得服务的连接句柄* 响应服务连接ioctl(bt_cfd,HCIWRITESCANENBLE,&autoaccept);char readbuf[MAX_read],writebuf[MAX_write];//接收缓存和发送缓存while((n=read(data_fd,readbuf,sizeof(readbuf)))>0) //服务器监听{ ProcessDate(readbuf,&writebuf);Write(data_fd,writebuf,n); }客户机的一般功能有:* 查询typedef struct result{inquiry_results hdr;//inquiry_results结构在btcommon.h中定义unsigned char buf[6*RESPONSE_NUMBLE];}my_inq; //构造查询块my_inq inq;inq.hdr.inq_time=1;//查询持续期inq.hdr.nbr_of_units=RESPONSE_NUMBLE;ioctl(bt_cfd,HCIINQUIRY,&inq);* 寻呼bt_connection con;//bt_connection结构在btcommon.h中定义memcpy(con.bd,inq.hdr.bd_addr,6);con.id=CREATE_SDP_ID(SDP_LINE,0);sdp_con_id=ioctl(bt_fd,BTCONNECT,&con); //从SDP层接入* 搜索服务bt_sdp_request sdp_req;//bt_sdp_request结构在btcommon.h中定义memcpy(&sdp_req,0,sizeof(sdp_req));sdp_req.conID=CREATE_SDP_ID(0,0);sdp_req.Command=0x02;sdp_req.pduPayload[]={0x35,0x03,0x19,0x18,0x00,0x00,0x01,0x00};sdp_req.pduLength=8;//构造PDU查询有特定UUID属性的服务ioctl(bt_fd,BT_SDP_REQUEST,&sdp_req);* 连接服务fd=open(“/dev/ttyBT0”,O_RDWR,0);//打开RFCOMM连接实例bt_connect con;//bt_connection结构在btcommon.h中定义memcpy(con.bd,inq.hdr.bd_addr,6);con.id=CREATE_RFCOMM_ID(line,server_channel);//特定服务的channelsdp_con_id=ioctl(fd,BTCONNECT,&con);应用相关部分通常需要对以下问题做出决策:设备采用什么查询策略;主机如何连接从机,从机如何决定是否接受连接;服务要求者如何查询、连接服务,服务提供者如何决定是否提供服务;是否需要在应用中进行主从切换,数据包类型变换;是否需要实现鉴权加密,低功耗模式和QoS;通信采用点对点还是点对多点方式;实现的蓝牙数据流模型是突发的、周期的、还是连续的;应用模型采用C/S,还是其他模型。