版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、CSR蓝牙开发指南作者:张占鹏电子科技大学email: zhanpengzhang编者语本文将从蓝牙协议,CSR蓝牙结构,bluelab使用,CSR蓝牙软件结构以及应用编程等多方阐述CSR蓝牙开发过程,在本文中重点讲述CSR蓝牙作为通信与IO控制的功能。目录第一章 蓝牙概述1.1 蓝牙简介蓝牙,是一种支持设备短距离通信(一般10m 内)的无线电技术。能在包括移动电话、PDA、无线耳机、笔记本电脑、相关外设等众多设备之间进行无线信息交换。利用“蓝牙”技术,能够有效地简化移动通信终端设备之间的通信,也能够成功地简化设备与因特网Internet 之间的通信,从而数据传输变得更加迅速高效,为无线通信拓
2、宽道路。蓝牙采用分散式网络结构以及快跳频和短包技术,支持点对点及点对多点通信,工作在全球通用的2.4GHz ISM(即工业、科学、医学)频段。其数据速率为1Mbps。采用时分双工传输方案实现全双工传输。蓝牙工作在全球通用的2.4GHz ISM(即工业、科学、医学)频段。蓝牙的数据速率为1Mb/s。时分双工传输方案被用来实现全双工传输。使用IEEE802.15 协议。蓝牙以时分方式进行全双工通信,其基带协议是电路交换和分组交换的组合。一个跳频频率发送一个同步分组,每个分组占用一个时隙,使用扩频技术也可扩展到5个时隙。同时,蓝牙技术支持1个异步数据通道或3 个并发的同步话音通道,或1 个同时传送异
3、步数据和同步话音的通道。每一个话音通道支持64kb/s 的同步话音;异步通道支持最大速率为721kb/s,反向应答速率为57. 6 kb/s的非对称连接,或者是432. 6 kb/s 对称连接。依据发射输出电平功率不同,蓝牙传输有3 种距离等级:Class1 为100m左右;Class2 约为10m;Class3 约为2-3m。一般情况下,其正常的工作范围是10m 半径之内。在此范围内,可进行多台设备间的互联。蓝牙技术的特点包括:1、采用跳频技术,数据包短,抗信号衰减能力强;2、采用快速跳频和前向纠错方案以保证链路稳定,减少同频干扰和远距离传输时的随机噪声影响;3、使用2.4GHzISM 频段
4、,无须申请许可证;4、可同时支持数据、音频、视频信号; 5、采用FM 调制方式,降低设备的复杂性。1.2 蓝牙连接简介蓝牙技术将设备分为两种:主设备和从设备。蓝牙主设备的特点:主设备一般具有输入端。在进行蓝牙匹配操作时,用户通过输入端可输入随机的匹配密码来将两个设备匹配。蓝牙手机、安装有蓝牙模块的PC 等都是主设备。(例如:蓝牙手机和蓝牙PC 进行匹配时,用户可在蓝牙手机上任意输入一组数字,然后在蓝牙PC 上输入相同的一组数字,来完成这两个设备之间的匹配。)蓝牙从设备特点:从设备一般不具备输入端。因此从设备在出厂时,在其蓝牙芯片中,固化有一个4 位或6 位数字的匹配密码。蓝牙耳机、优士通UD笔
5、等都是从设备。(例如:蓝牙PC 与UD 笔匹配时,用户将UD 笔上的蓝牙匹配密码正确的输入到蓝牙PC 上,完成UD 笔与蓝牙PC 之间的匹配。)蓝牙主端设备发起呼叫,首先是查找,找出周围处于可被查找的蓝牙设备,此时从端设备需要处于可被查找状态,如:蓝牙耳机需要按键操作才能进入可被查找状态,主端设备找到从端蓝牙设备后,与从端蓝牙设备进行配对,此时需要输入从端设备的PIN 码,一般蓝牙耳机默认为:1234 或0000,立体声蓝牙耳机默认为:8888,也有设备不需要输入PIN 码。配对完成后,从端蓝牙设备会记录主端设备的信任信息,此时主端即可向从端设备发起呼叫,根据应用不同,可能是ACL 数据链路呼
6、叫或SCO 语音链路呼叫,已配对的设备在下次呼叫时,不再需要重新配对。已配对的设备,做为从端的蓝牙耳机也可以发起建链请求,但做数据通讯的蓝牙模块一般不发起呼叫。链路建立成功后,主从两端之间即可进行双向的数据或语音通讯。在通信状态下,主端和从端设备都可以发起断链,断开蓝牙链路。第二章 CSR硬件结构2.1 BC417介绍本文以CSR BC417143B芯片介绍蓝牙的结构和基本功能,BC417提供下述功能Ø 全面兼容蓝牙2.0以及EDR规范Ø EDR 兼容2Mbps以及3Mbps调制模式的v2.0.E.2规范Ø 为支持Piconet提供全速蓝牙操作Ø 支持S
7、catternetØ 1.8V核心电压,1.8V-3.6V的核心电压Ø 1.8V 低功耗支持Ø 8X8mm 96引脚TFBGA封装, 以及6X6mm 96引脚VFBGAØ 需求最少的外围器件Ø 内置1.8V电源管理Ø USB 以及双UART接口Ø 支持802.11 Co-ExistenceØ 支持8Mbit 外接flash芯片Ø 兼容RoHSBC417的结构框图如图下所示,其内部包含48KBRAM, 不含ROM, 需要用户外接NOR flash.他采用BlueCore4-External 内核,他是一个射
8、频以及基带的单片芯片,包含高达3Mbps EDR的2.4GHz蓝牙系统.需要特别说明的是,并不是所有的应用都能运行CSR蓝牙之上,因为应用程序和固件栈必需共享片上RAM,以RFCOMM为基础的应用可用的RAM大概为几百字节。应用代码必需控制在32K字以内。BC417143B需要连接一个外部8Mbps的flash芯片,运行CSR蓝牙协议栈时,提供蓝牙2.0数据以及语音的全面支持。它广泛的应用于PC,PDA,存储卡,PCMCIA, USB dongles, SD卡接入点,数字照相机等设备。BC417143B的引脚图如下图所示,其含有12个PIO接口,可以用做GPIO使用,3个AIO接口,可以用做A
9、DC来使用。如下图所示。下图为BC417的系统方框图。射频的部分就不多介绍了,我们组要谈一下基带部分Ø Memory Management UnitMMU提供了提供了一组动态的环形缓冲区用来存储从主机到射频之间要传输的数据,动态分配内存保证了RAM的高效利用,硬件上的MMU模块减少了数据音频在传输时对处理器的过分占用。Ø Burst Mode Controller在数据的传输期间,BMC根据之前由软件创建已经装载内存映射寄存器的头信息和RAM中对应位置环形缓冲区中的数据音频净荷创建一个数据包,在射频接收数据时,BMC在内存映射寄存器中存储数据包头,并且在RAM中的环形缓冲区
10、中处处数据净荷,这种结构能够数据发送和接收时有效的减少CPU的干预。Ø RAM48Kbytes的片内RAM 用来支持RISC MCU, 除此之外他还被共享的用于在存储有效连接时的语音以及音频的环形缓冲区以及蓝牙协议栈的特殊的内存需求之间。Ø External Memory Driver该接口驱动用于连接外部flash,并且也可以被用于在需要大量内存时连接外部RAMØ USB该接口是一个用于连接其他兼容设备的全速USB接口,BlueCore4-External充当USB外围设备的角色,完成来自像PC一样的主设备的传输请求。Ø Synchronous Ser
11、ial InterfaceSPI接口用于和其他的数字设备互联,此外,CSR蓝牙SPI接口的一个非常重要的作用用于系统的调试,并且用于外部flash的烧写。Ø UART该接口是一个用于和其他串行设备通信的标准UART接口Ø MicrocontrollerMCU, 中断控制器,事件定时器运行蓝牙软件协议栈以及控制射频以及主机接口,16位的RISC CPU具有极低功耗并且能够有效的利用RAMØ Programmable IOBlueCore4-External 包含15个programmable I/O, 其中包含12个数字以及3个模拟IO口,这些I/O口被运行在芯片上
12、的固件控制下图为BC417应用时的一个原理图,其中包括外部flash芯片以及外围射频电路。2.2 蓝牙模块BC417是BGA封装的,自己画双层板恐怕难度有些大,好在网上蓝牙模块很多,在大中华淘宝店随处可见,下图是一个HC-06的蓝牙模块,其中包含了BC417蓝牙芯片以及一个外部flash芯片,该蓝牙模块提供了众多接口,其中最主要的就是提供了串口相关引脚,蓝牙模块固件的一个主要的作用就是提供串口数据的蓝牙透传,利用该模块开发者可以完全不用理会蓝牙协议相关内容,只要把这个模块作为一个串口设备就行了,但是本文重点简述该利用该模块为开发核心板,对BC417进行重新编程。下图为该蓝牙模块的引脚定义,更详
13、细的信息大家可以从网上下载HC-06的资料手册。2.3 蓝牙模块底板为了实现对HC-06模块重新编程,画了一个双层板,通过排针将蓝牙模块卡住,如图所示,安装排针很痛苦,为什么蓝牙模块的间距是1.5mm, 买得到2.0mm的,1.27MM的,2.54MM的,就是买不到1.5mm的,无奈只有一根从排针拔下来然后再插到板子上。底板的调试环境如下所示第三章 Bluelab使用3.1 BlueLab简介Bluelab 为CSR 提供的蓝牙开发集成环境,下图为 bluelab 4.1版本的集成开发环境。大家可以在CSDN上搜索软件版本。在软件安装目录BlueLab41appsexamples目录下CSR提
14、供了大量的蓝牙开发代码实例,我们可以通过project-àopen Workspace.打开实例工程的xiw文件。在软件的安装目录下提供了大量的帮助文档,具体目录为BlueLab41docBlueLab Support Documentationdocs3.2 工程的建立在project菜单中选择new, 弹出如下对话框。在弹出的对话框中选择Minimal VM project, 输入工程名称后,单击OK按钮单击C Files 然后单击main.c,该文件的内容将会显示到编辑器中4.单击Build菜单栏的bulid选项,编译文件,然后单击Debug菜单中的Run选项,运行应用程序,这
15、时候编译好的固件将会下载到CSR芯片中单击output窗口的Print Channel 0选项卡,可以看到应用程序输出Hello World3.3 固件的备份与恢复CSR 提供了固件的备份与恢复工具,位于安装软件的blueLabtoolsbinBlueFlash.exe,打开该程序界面如下备份固件备份步骤如下,点击stop Processor点击dump按钮在弹出的对话框中输入要备份的文件名,并点击save按钮,备份固件被存储为xpv,xdv文件编译与下载恢复固件的步骤如下点击Stop Processor单击Choose File按钮, 在弹出的对话框中选择xpv格式的备份文件,BlueFla
16、sh下载时会自动的包含xdv文件,单击open按钮下载路径会显示在BlueFlash上面单击Download按钮,固件开始下载,可能需要几分钟的时间下载完成后,单击Start Processor按钮,固件开始运行。3.4 编译运行BlueLab的编译很简单,直接在菜单栏选择build-à bulid,如下图所示,据说CSR的编译也要连接目标,但是似乎不需要。工程的运行需要连接目标,通过菜单栏选择Debug-àTransport,弹出如下图所示的调试器接口类型,不是USB类型的可以选择LPT13.5 调试工程编译连接库信息保存在xip文件中,如下图所示,其中包含了编译相关的资
17、源信息,编译运行时这个文件将会被加载。XIP文件的信息通过修改工程的属性实现,通过菜单栏的project-àproperties打开资源属性对话框。打开的资源属性对话框如下所示调试环境的窗口如下图所示。file navigation window在这个窗口中可以浏览工程中的文件结构,通过双击选择的文件可以在编辑器中打开该文件,右键单击会弹出一个菜单,单击的位置决定菜单的内容Text Editor Window编辑窗口主要有两个作用代码的编辑调试时断点的设置标签页中的*代表这个文件修改过,但是没有保存。Debug Monitor Windows开发者可以通过选择不同的标签页查看Blue
18、Core 芯片的以下状态内存:显示当前选定的内存地址的值寄存器:显示选择当前寄存器数值变量:显示当前程序变量值查看:允许用户查看程序中指定变量的数值Diagnostics Windows这个窗口可以显示编译与调试代码是的各种有用的信息,用户可以通过切换底部的标签页进行显示信息的切换。Build编译标签显示了程序编译的进程以及状态信息Debug显示程序的调试以及状态信息Find in Files显示Find in Files的查找结果Command Window这个窗口可以用来运行python脚本以对xIDE进行扩展,我们大多说的开发者用不上这个功能。Message显示在VM中任务之间传递带有时
19、间戳的消息列表BlueStack这个标签页显示从与底层射频接口相关的协议栈传入的消息,这在确定代码是否产生了希望从射频接口发送或从射频接口接收消息时特别有用。Print Channel 0这个标签页显示在芯片上运行程序的打印信息。3.6 PStool使用蓝牙的配置参数被存储到Flash的PS区,可以通过程序包里的PSTool工具来对其进行操作,从开始菜单中打开PSTool,如下图所示在传输类型设置对话框中选择调试线方式,如下图所示,单击确定如果目标芯片已经连接,单击确定后将会弹出PSTool主界面,如下图所示,在这里可以选择对某一个芯片属性进行修改。通过点击Describe按钮可以查看某一个属
20、性的描述。4. 通过File-à Merge可以选择默认的配置文件配置文件如下图所示,选择文件BlueLab41tools force_defaults.psr,单击open按钮。该文件将会被加载,芯片将会恢复到出场默认模式。第四章 CSR蓝牙协议栈CSR 提供BlueCore4-External 的兼容蓝牙2.0 EDR的固件。固件会运行于内部RISC微控制器上BlueCore4-External的软件结构允许蓝牙数据处理以及应用程序在内部的RISC微控制器和外部主机处理器之间以不同的方式被共享,蓝牙协议栈的上层协议既能够运行在片内也能够运行在外部主机处理器上4.1 HCI接口协议
21、栈从上图的如软件结构可以看出,片内运行蓝牙协议HCI接口部分,应用部分由HOST主机完成。4.2 BlueCore virtual Machine stack在下图中,这个版本的蓝牙协议栈不需要主机接口的处理,用户直接在BC417上开发应用程序,这也是本文主要讨论的开发方式。包含应用软件以及所有的软件层次运行在RISC MCU上被称作虚拟机的受保护的用户软件执行空间。开发者可以采用包含BlueLab Mutlimedia和Casira的开发套件的BlueLab SDK开发运行在BlueCore虚拟机上的应用程序,这些开发套件能够分别在CSR获取。开发者的应用程序将会和主要的BlueCore固件
22、一起执行。开发者可以为不同的应用调用BlueCore固件接口。由于运行环境的组织化,开发者应用不会主要的应用程序造成什么不好的影响,这保证了用户程序改变时不需要对蓝牙协议栈软件进行重新验证。说白了,CSR对蓝牙底层封装的特别厉害,应用程序可以在多个蓝牙版本上直接跑。通过使用VM以及BlueLab SDK,开发者可以开发出不需要HOST主机接口了类似无绳电话免提套件的应用程序,BlueLab提供了无绳免提电话开发的完整示例代码。通过使用BlueLab的SDK以及HOST主机的VM用户也可以对PIO完成控制。第五章 库与函数为了在片上运行最终的应用程序,必须将它和一个完整的蓝牙协议栈合并在一起。开
23、发工具包预带了固件映像,它允许芯片运行底层的蓝牙协议栈。图中显示了一个应用程序映像与缺省的Casira映像的不同。应用程序映像有额外的协议栈层:L2CAP,RFCOMM和SDP。这些是支持串行端口规范所需的协议栈层,也用于支持基于串行端口规范的简单规范。这些协议栈层是由Mwzoe编写的,统称为BlueStack。在BlueLab层之上,用一个连接管理器来处理RFCOMM连接的管理。BlueLab中带有连接管理器程序库,使连接管理更加方便,但也不是非用他不可,可以自己别写连接管理器程序。在应用程序顶层是VM。VM使得连接管理器、库和应用程序软件运行在受保护的内存空间中,应用程序软件被编译成虚拟机
24、执行代码。当代码运行时,虚拟机检查每条指令是否有非法的内存管访问行为。通过这种方式,VM确保了应用程序软件不会干扰蓝牙协议栈的正常运行。在调试器下运行程序时,必须将RFCOMM载入到芯片中,芯片才能驱动无线电。可是此时的应用程序是运行在PC机上的调试器下,所以也就不可能将应用程序的映像加载到芯片中。解决办法是向芯片中下载一个空的映像这是一个包含虚拟机的固件映像,但是不包含有效的应用程序。主蓝牙协议栈的运行总是优先进行并连续不可间断,直到有多余的处理带宽VM才被调用。BlueStack协议栈基于消息驱动,层与层之间使用消息传递方法,应用程序调度执行消息不为空的任务。事件驱动中的事件包括BlueS
25、tack事件、PIO事件、RFCOMM源端及目的端事件等。所有事件的处理以及消息队列中的消息处理均由调度程序来执行。调度程序由高层应用程序启动,而个事件及消息处理分布在各软件层中。在2.1版本以后,可以向片上加载应用程序,当连接到调试器时,片上应用程序将自动关闭。5.1 应用程序库为运行在BlueCore上的应用程序提供了支持。这些库的源码位于src/lib目录下5.2 连接管理器连接管理器处理蓝牙协议栈中RFCOMM层以下所有的层。如果没有连接管理器,则需要建立ACL链路,为RFCOMM配置链路,建立并配置L2CAP链路,最后才能建立RFCOMM链路。使用连接管理器,只需一个调用就可以让所需
26、的所有层完成配置。大多数发送数据的应用程序都愿意使用RFCOMM连接,但是对于那些需要从更底层级别进入的程序,BlueLab连接管理器除了允许他们发送RFCOMM包以外,还允许他们发送L2CAP包。L2CAP是蓝牙协议栈中应用程序可以将数据送往的最低级别,因为蓝牙链路中所有的用户数据都必须作为L2CAP包发送。数据包是通过连接来发送的么让每个连接必需指向某个对等的设备,所以很自然,在发送任何数据包之前,连接管理器必须与对等设备配对。在mssage.h中,任务/消息标识符0视为连接管理器保留的,而标识符1是为应用程序框架保留的。其实际效果是,无论程序何时向连接管理器发送消息,他都是向消息队列0发
27、送,而从消息管理器返回的消息总是返回到消息队列1。不管消息的内容是控制信息还是数据包,这个关于消息队列数字的规则不变。连接管理器的消息都在cm_rfcomm.h中声明。连接管理器本身在CM_RFCOMM库libcm_rfcom.a中实现。初始化并打开连接管理器组成BlueStack和应用蓝牙协议的库必需包含进系统中。所以这些库将自动启动以确保协议栈的正常运行。而连接管理器不是蓝牙协议栈的组成部分,是可选的独立库,所以他不会自动启动。如果想使用连接管理器,必需通过一些调用初始化并打开连接管理器。首先,通过发送CM_INIT_REQ消息来初始化连接管理器。如果连接管理器成功注册了BlueStack
28、,它将返回CM_INIT_CFM消息。这些消息仅仅是启动连接管理器的运行,所以两个消息都没有任何参数。连接管理器运行以后,需要将应用程序的相关信息告诉连接管理器。BlueCore经常将设备等级(class of device CoD)设置成混杂型。这可能并不适用于当前应用。例如耳机应用程序,要把CoD中Major Device Class设置为Audio,并使耳机规范适应次要设备。这样正确的设置就很重要,因为CoD作为查询的回复被发送出去,然后被其他发现设备的应用程序利用,这时包含CoD的查询回复很有可能被该查询设备所屏蔽。所以,如果CoD不能很好的反应应用程序所具有的功能,其他的应用程序很可
29、能甚至不会向使用者报告这个设备的存在。还需要让连接管理器知道要用到的服务列表,来描述应用程序中所提供的服务。这项工作处理完以后,连接管理器将会专注于处理关于这些服务的询问,而不用应用程序进行额外的干预。应用程序在CM_OPEN_CFM(这个消息已经不推荐使用,详见/docs/cm_rfcomm)中向连接管理器传递CoD和服务记录信息。typedef struct uint8 * serviceRecord; /* pointer to service record */ uint16 sizeServiceRecord; uint32 classOfDevice; CM_SERVICE_REG
30、ISTER_REQ_T;serviceRecord参数是指向一个动态分配的内存的指针,这个内存用于描述应用程序服务的服务记录。服务记录必须包含一个RFCOMM信道(channell)的空入口,供应用程序的服务使用。换句话说,UUID(universal unique identifier)是由后面的三个UNIT型数来确定的。信道会由连接管理器进行填写。sizeServiceRecord参数是serviceRecord完整的大小,classOfDevice参数指明了设备的种类,用来回复别的设备针对本设备的查询操作。在BlueLab28中classOfDevice参数已不适用,仅赋给值0,取而代之
31、的是由CM_WRITE_COD_REQ消息来注册CoD信息。这种变化是由于当用户放送多个CM_SERVICE_REGISTER_REQ消息来注册多个服务时,如果提供了不同的CoD信息,当其他设备查询时本地连接管理器将不知道回复哪个CoD信息,所以有一个单独的消息注册CoD信息。在打开连接管理器以后,可以把应用程序提到这种状态,但是也可以继续进行操作使用安全管理等特性(Security Manager)。可以告诉安全管理器信任的设备,安全管理器将会把关于这些设备的信息存放在新人设备数据库中(Trusted Device database)。在数据库中登记的信任设备将可以不经过应用程序的授权与本地
32、设备进行连接并执行操作(已经授权无需再授权了,但是否还需授权并不是自动完成,而是有应用程序来实现的)。要使用安全管理器(SM),应用程序可以发送CM_ADD_SM_DEVICE_REQ消息,消息中要包含将往SM中添加的可信任设备的详细信息。typedef struct BD_ADDR_T addr; uint8 link_keySIZE_LINK_KEY; bool_t trust; CM_ADD_SM_DEVICE_REQ_T;Addr参数是将要添加进SM中的设备的地址。Link_key参数同时给出了设备的连接关键字(link key),trust参数如果为TRUE这名设备被信任,FALSE
33、为不信任。如果这一阶段没有连接关键字,将不得不跳过这一步骤。稍后可以通过配对来获得连接关键字,然后调用SM。除处理消息之外,还需要启动timer系统和scheduler。这些调用应该在配对的两方都要进行。要知道收到CM_INIT_CFM消息后才能发送CM_OPEN_REQ消息,所以要等待消息的到来。这样也就需要一个消息管理者来检查消息队列并处理事件。查询在初始化一个连接之前,可能会需要周围的蓝牙设备。在用户端一般叫做发现设备,而在蓝牙核心协议中叫做查询。查询由CM_INQUIRY_REQ来完成。应用程序中应该指明查询的全部长度(超时)和要求回复的最大数量。在超时(timeout)的范围内连接管
34、理器可能会发起不止一个查询操作。如果达到了设定的最大回复数,查询将被中止,然后向应用程序发送消息,消息中的某些位表明了查询的完成。查询操作可以得到像蓝牙设备地址和设备类型(CoD)等信息,但是如果想在设备上为用户显示这些信息,就得了解一些关于它们的知识。(对于电缆替代,没有什么CoD信息能够很好地适合这种应用,所以CoD值用一个无符号的低字节的值是0的数值来表示)为了让蓝牙芯片发起查询操作,要使用:typedef struct uint8 max_responses; Delay inq_timeout; uint32 class_of_device; uint16 remote_name_r
35、equest_enabled; CM_INQUIRY_REQ_T;max_responses参数给出了可以接受的最大查询回复数。inq_timeout参数以秒计算的查询过程超时。class_of_device参数作为一个过滤器:连接管理器把仅有具有此CoD的查询回复返回给应用程序。remote_name_request_enabled参数是一个标志,指明对于没有见过的查询结果是否对该未知设备进行设备名查询。应用程序可以等待CM_INQUIRY_RESULT_IND或CM_INQUIRY_COMPLETE_CFM。在等待事件发生的过程中,应用程序可以允许调度器分配所有时间给其他的任务直到查询制式
36、事件发生。typedef struct HCI_INQ_RESULT_T inq_result; uint8 *handlesHCI_LOCAL_NAME_BYTE_PACKET_PTRS; CM_INQUIRY_RESULT_IND_T;Handles参数是一个句柄数组与通过远端名字查询操作得到的远端设备名的指针有关。typedef struct BD_ADDR_T bd_addr; page_scan_rep_mode_t page_scan_rep_mode; uint8_t page_scan_period_mode; page_scan_mode_t page_scan_mode;
37、uint24_t dev_class; /* Lower 3 bytes only used */ bt_clock_offset_t clock_offset; HCI_INQ_RESULT_T;这些参数直接来源于蓝牙核心协议(在bulelab中核心协议位于D:BlueLab28mntincludeapp bluestack中)用于HCI查询结果事件。当所有的查询结果到达后,应用程可以得到CM_INQUIRY_COMPLETE_CFM_T消息typedef struct inquiry_status_t status; CM_INQUIRY_COMPLETE_CFM_T;typedef en
38、um CmInquiryComplete, CmInquiryCancelled, CmInquiryMaxResponsesReached inquiry_status_t;从Sutatus参数中可以得知为什么查询完成。如果该参数被设置成CmInquiryComplete,表明查询超过超时(timeout)设定。如果被设置成CmInquiryCancelled表明查询是被中途取消。如果被设置成CmInquiryMaxResponsesReached表明达到了指定的最大回复数。在这里,由于资源的限制不得不对超时和最大回复数进行设定。第一,设定超时是避免永久的查询耗费电能。第二,设定最大回复数避
39、免过多的回复和处理对有限的系统内存的占用。配对在查询过程之后,应用程序会找到可供连接的设备,在建立实际连接之前,还要经过一个过程:配对。配对过程建立了一个连接关键字(link key),又来加密蓝牙连接上交流的数据。连接关键字也可以用来授权其他的设备,也就是保证连接到想要的设备。首先,要用CM_PAIR_REQ消息让连接管理器与一个设备配对。typedef struct role_t role; /* are we going to be master or slave? */ Delay timeout; bool_t authentication; BD_ADDR_T bd_addr; C
40、M_PAIR_REQ_T;typedef enum CmMaster, CmSlave role_t;Role参数被设置成CmMaster或者CmSlave,以确定本地设备扮演的是什么角色。Timeout参数给出取消配对给出的时间限制。Authentication参数是一个布尔型标志,TRUE表明在连接中将要使用授权功能。bd_addr参数是欲与之配对的远端蓝牙设备地址,仅在初始配对以尝试建立连接时应用。共享的连接关键字用一个PIN码来建立,PIN码必须由连接的两端分别单独输入。对于没有用户交互接口的设备,PIN码可以通过编程设置,这种PIN码将是固定的。带有固定PIN码的设备交给用户使用时必
41、需附带还有PIN码的文档,以便与其他设备互联时可以输入同样的PIN码。连接管理器需要从应用程序中得到PIN码,为了实现这一点,连接管理器将会向应用程序发送PIN码请求CM_OIN_CODE_REQ消息:typedef struct BD_ADDR_T addr; CM_PIN_CODE_REQ_T;在该消息中,包含有一个蓝牙设备地址,当应用程序中含有多种设备的不同PIN码时,应用程序可以根据这个地址来查询的到相应的PIN码。这个地址还可以用来让用户知道是那个设备在要求与之连接。应用程序要发送CM_PIN_CODE_RES作为上面消息的回应。typedef struct BD_ADDR_T ad
42、dr; uint8 pin_length; uint8 pinHCI_MAX_PIN_LENGTH; CM_PIN_CODE_RES_T;Addr参数是欲与之建立连接设备的地址,pin_length是PIN码按位的长度,pin是一个包含PIN码的数组。通过pin_length设置为0可以拒绝PIN码回复。这是因为蓝牙协议中不允许将PIN码长度为0,所以这个非法的字符可以用来表明本地设备不愿意提供PIN码。如果成功配对,连接管理器将会存储配对设备的地址和连接关键字,并会向应用程序发送配对操作的确认信息CM_PAIR_CFM。typedef struct pair_status_t status;
43、 BD_ADDR_T bd_addr; uint8 link_keySIZE_LINK_KEY; CM_PAIR_CFM_T;typedef enum CmPairingComplete, CmPairingTimeout, CmPairingCancelled, CmPairingFail, CmPairingNotFinished pair_status_t;如果配对成功Status参数被设置成为CmPairingComplete,不成功被设置为CmPairingTimeout。bd_addr参数被设置为配对蓝牙设备的地址。link_key参数是和对方设备将会用到的连接关键字。连接关键字将
44、会在授权和编码中应用。可以将连接关键字存储在应用程序中,但是用CM_ADD_SM_DEVICE_REQ消息将连接关键字和设备的相关细节信息传给SM(安全管理器)将会更加有效。也可以跳过配对过程而直接建立连接。但是,这样就不会创建一个连接关键字,也就不能够使用编码和授权功能,所以这种连接并不安全,传输的数据很容易被其他设备截取。连接最后,应用程序请求建立一个数据连接。如果应用程序是以主设备的身份建立的连接,需要发送一个CM_CONNECT_AS_MASTER_REQ消息。typedef struct uint16 max_framesize ; cm_auth_config_t use; BD_
45、ADDR_T bd_addr; uint16 target; /* for sdp search */ Delay timeout; cm_park_config_t park; cm_sniff_config_t sniff; uint16 profile_server_chan; CM_CONNECT_AS_MASTER_REQ_T;Use参数配置授权和编码。Addr参数提供了将要连接的蓝牙设备的地址。Target参数提供了应用程序想使用的服务的UUID,这个信息将被SDP服务所使用(UUID对应服务列表中的一个值,如果UUID的只存在说明提供此项服务)。Timeout参数给出了在放弃连接
46、尝试前的超时。Park参数配置了用于连接的park参数。Sniff参数配置了用于连接的sniff参数。CM_CONNECT_AS_SLAVE_REQ用来配置蓝牙芯片接收连接作为从设备。这将开启页扫描(page scanning)。在上面两个消息中都用到了用于配置授权的结构参数,park和sniff。Park和sniff是两种蓝牙工作模式,sniff呼吸模式,park等待模式。typedef struct uint16 authentication : 1; /1连接授权,0未授权 uint16 encryption : 1; /1使能加密,0关闭加密 cm_auth_config_t;type
47、def struct uint16 max_intval; uint16 min_intval; cm_park_config_t;typedef struct uint16 max_intval; uint16 min_intval; uint16 attempt; uint16 timeout; cm_sniff_config_t;如果use参数设置成了要求授权和加密,哪么连接关键字是必要的。如果应用程序已经调用CM_ADD_SM_DEVICE_REQ消息注册了连接的另一端设备,这样安全管理器(SM)就已经有了连接关键字,不需要应用程序的额外参与就可以处理授权和加密。上图中显示了需要连接关
48、键字的一种情况,但是应用程序并没有通过CM_ADD_SM_ DEVICE_REQ来传送连接关键字和设备细节给安全管理器()。在这种情况下,连接管理器不得不从应用程序的到连接关键字,向应用程序发送CM_LINK_KEY_REQ消息:typedef struct BD_ADDR_T addr; CM_LINK_KEY_REQ_T;Addr参数是准备给其授权的蓝牙设备地址。而应用程序有这个设备的连接关键字,所以应用程序应该向连接管理器发送CM_LINK_KEY_RES消息,将link key传给CM。typedef struct bool_t accept; BD_ADDR_T addr; uint
49、8 key_valSIZE_LINK_KEY; CM_LINK_KEY_RES_T;在配对完成以后,就可以开始建立连接。若果使能了授权和加密功能,而且远端设备没有在SM中注册本地设备,本地设备就会收到一个CM_LINK_KEY_REQ 消息,这样就需要用CM_LINK_KEY_RES 消息来向远端设备发送连接关键字。(同理,如果在本地设备中注册了某远端设备(包含其地址和连接关键字),若远端设备发起连接将本地设备就不会向原端设备发送CM_LINK_KEY_REQ 消息)。Accept参数是布尔型标志,确定是接受还是拒绝连接关键字的请求。Addr参数将要被授权的蓝牙设备的地址,key_val参数是
50、对方设备的连接关键字。如果没有连接关键字,可以启动配对过程产生连接关键字,也可以把accept参数设为FALSE,拒绝建立连接。连接成功建立或者失败后,CM将发送CM_CONNECT_CFM消息用来通知应用程序连接建立的状态。typedef struct connect_status_t status; BD_ADDR_T addr; uint16 rfc_frame_size; Source source ; Sink sink ; uint16 conn_server_chan; CM_CONNECT_CFM_T;typedef enum CmConnectComplete, CmConn
51、ectTimeout, CmConnectCancelled,/有错误发生 CmConnectDisconnect,/连接后又断开连接 CmConnectDisconnectAbnormal, CmConnectRemoteRefusal, CmConnectServiceNotSupported, CmConnectFailed connect_status_t;Addr参数是目标蓝牙设备的地址。在成功建立基本的ACL连接后,应用程序可以用CM_SCO_CONNECT_REQ消息来添加一个SCO连接。CM_DISCONNECT_REQ消息用来断开一个连接。如果断开的是SCO连接,则底层的AC
52、L连接仍就存在(在建立SCO连接之前应先建立ACL连接)。typedef struct link_type_t link_type; BD_ADDR_T addr; CM_DISCONNECT_REQ_T;link_type参数是将要断开的连接类型,可以是ScoConnection或者RfcommConnection。Addr参数连接另一端设备的地址。发送数据连接建立以后就可以发送和接收数据。在CM_CONNECT_CFM中返回的数据源和接受端可以由stream library库中的函数利用,来收发数据。当数据已经到达源端或者离开接收端将产生VM_EVENT_SOURCE和VM_EVENT_S
53、INK事件,调度器将会调用handleSourceEvent和handleSinkEven t予以处理。其他消息和事件的使用连接管理器支持三种指示消息,这三种消息用来异步指示连接状态的变化,或者错误的发生。连接管理器用CM_CONNECT_STATUS_IND消息通知用户RFCOMM连接状态的变化。typedef struct connect_status_t status; BD_ADDR_T addr; CM_CONNECT_STATUS_IND_T;typedef enum CmConnectComplete, CmConnectTimeout, CmConnectCancelled,
54、CmConnectDisconnect, CmConnectDisconnectAbnormal, CmConnectRemoteRefusal, CmConnectServiceNotSupported, CmConnectFailed connect_status_t;status参数可被设置为各种状态。addr参数是当前指示的连接状态的设备的地址。typedef struct cm_error_t error;BD_ADDR_T addr; CM_ERROR_IND_T;error参数是与addr地址对应设备操作过程中发生的错误。错误可能会发生在以下几种情况:连接管理器繁忙时提出连接请求
55、。连接管理器繁忙时提出配对请求连接建立前发送数据连接管理器提供了一个“取消”请求。用来取消任何配对或者有效连接,所以也不需要任何参数。这个请求消息没有回复消息。但是对配对或连接的回复消息中会包含状态CM_cancelled。CM_CANCEL_REQ();5.3 Message LibraryMessage库是消息管理模块,负责消息的动态分配、消息的动态管理、消息的提取和动态处理,对应的实现函数为Mssagesched()。所有的消息都可以划分为多个消息队列,每个消息队列成为一个任务。对每个任务的处理在DECLARE_TASK()中说明。任务的标志符中0和1是保留值,分别代表CM和框架任务(framework)。任何任务可以用sendMsg()向framewok(task 1)发送数据。5.4 Timertimer库允许应用程序在将来的一段时间里可以自动的调用一系列排队的函数。这些回调可以发生在从函数进入排队起的四个小时内,并且可以周期执行或者执行一次。一次最多可以同时应用30个timer。指定延时D_SEC(n)创建了一个以秒为单位的延时。这个延时可
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年方矩管项目立项申请报告模板
- 2024-2025学年延安市志丹县三年级数学第一学期期末调研模拟试题含解析
- 2024-2025学年咸宁市崇阳县数学三年级第一学期期末监测试题含解析
- 2024-2025学年西藏山南地区曲松县三年级数学第一学期期末质量跟踪监视试题含解析
- 毕业生个人自我鉴定400字10篇
- 股权无偿转让协议书七篇
- 大学专业实习日志【5篇】
- 员工个人辞职申请书三篇
- 第6课《阿西莫夫短文两篇:恐龙无处不有》教学实录 2023-2024学年统编版语文八年级下册
- 初中英语教研组工作计划(15篇)
- 重症患者的营养支持
- 防范非法金融宣传
- 咨询经理招聘面试题与参考回答(某大型国企)2025年
- 小学语文骨干教师专题讲座《自由阅读-开启快乐的读书之门》
- 南京审计大学金审学院《中级财务会计(上)》2022-2023学年第一学期期末试卷
- 2023年电信运营商液冷技术白皮书
- 瓷砖店销售薪酬方案
- 2022年湖南省公务员录用考试《申论》真题(县乡卷)及答案解析
- 2024年事业单位招聘考试计算机基础知识复习题库及答案(共600题)
- 西京学院《机械制造技术基础》2022-2023学年第一学期期末试卷
- 机场航班信息LED显示屏方案
评论
0/150
提交评论