




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、精选优质文档-倾情为你奉上第一部分 BTM02E-08蓝牙模块一、 模块的基本参数1、 特性支持蓝牙协议1.1、1.2输出功率等级为class2支持USB1.1和UART串口低电压供电2.7V3.6V标准供电电压3.3V内置8MbitFLASH存储器尺寸:mm2、 描述采用CSR公司的蓝牙芯片作为核心芯片,并配以8MbitFLASH存储器,SPI接口,UART接口,USB接口,PCM音频接口,16MHz晶振,带通滤波器,天线匹配电路等。并不是所有的应用都适合嵌入式应用,因为应用程序和固件栈必需共享片上RAM,以RFCOMM为基础的应用可用的RAM大概为几百字节。应用代码必需控制在32K字以内。
2、二、 BlueCore2-External蓝牙芯片工作原理1、 关键特性片外8Mbit的存储器可以灵活的用于系统解决方案。片上32Kbit的RAM用来实现蓝牙无线传输中数据交换的缓冲4M波特率的异步串行接口片上可运行多种协议栈:标准HCI协议栈,全部内嵌的RFCOMM协议栈等96Ball-VFBGA封装2、管脚使用USB接口不用时应接地所有IO管脚被配置成输入时,复位后将变成弱下拉不用的AIO(可编程模拟IO)管脚不使用时应该悬空3、 内部功能模块USB:用来与其他数字设备的通用接口,BlueCore02扮演外围设备角色,来回应主机的请求SPI(异步串行接口):用来与其它数字设备的接口,SPI
3、口可以用来调试软件和烧写外部FLASH存储器UART:与其他设备通信的通用同步串口可编程IO:共有15个可编程管脚(12个数字的和3个模拟的),有运行在片上的固件来控制4、 CSR 软件栈CSR为BlueCore2提供了片上运行的固件(Firmware),片上运行的协议栈仍需HCI的支持1)HCI Stack该Firmware提供了一组特性及支持相应特性的HCI在标准蓝牙协议上做了扩展:l 支持蓝牙串口协议BCSP,一种以UART为物理层,可靠的特有协议(可选)l 提供了额外的50个系列HCI指令l 可以访问可编程IO端口l 访问蓝牙时钟l 访问固件上的随机数产生器l 动态配置UART(波特率
4、,校验,数据位)l 无线传输使能:一个简单的命令,与一个专门的物理开关有关,确定radio是否可以传输数据l 可以读取芯片外部管脚上的电压,可以运行在VM或主机上来电池的监测l 提供一组BCCMD命令,来访问片上的“persist store”,该数据库存储了器件的蓝牙地址,器件class,radio配置,USB/DFU常数等(Device Firmware Upgrade)l UART上break命令的应用:用于重启,开机进入低功耗,唤醒主机l 提供一组“radio test”或者BIST 指令,直接控制片上的radiol 虚拟机。固件提供虚拟机环境,来运行应用代码。虚拟机需要BlueLab
5、和内嵌协议RFCOMM(或者L2CAP,SDP),运行在VM上的协议可以完成通过可编程IO点亮LED的简单工作2)BlueCore RFCOMM Stack软件栈(将以Firmware的形式转载到片上)直到RFCOMM层的协议都运行在片上l 与主机接口:RS232,RFCOMM协议(如何建立无线串口连接?)l 服务发现协议3)虚拟机栈l 所有代码都在片上运行,代码在固件旁边运行(代码与固件并行运行)l 用户可以呼叫固件完成各种操作l 用户的应用代码与堆栈是分开的,防止对堆栈造成影响,可以随时修改应用代码4) 面向应用的应用软件的编写当更高层的蓝牙协议栈像固件一样在片上运行时,底层将会通过片上运
6、行的一个UART的驱动程序提供L2CAP,RFCOMM,SDP的API给高层5、片外存储器提供了8M位的存储空间,字长为16位。用来存储代码和配置数据6、UART接口l 信号机制。UART接口为与其他串口器件提供了一种简单的机制。采用RS232协议电平为0VVDD_PADS(IO电路的电压),要求额外的电平转换芯片。四种信号中,RX和TX用来传输数据,RTS和CTS可以用来做流控(低电平有效),采用CMOS工艺。UART的波特率等参数设置有软件来完成。l 复位。UART接口可以发送一BREAK信号复位BlueCore芯片,即RX信号线被置低的时间超过在PS 中的Key:PSKEY_HOST_I
7、O_UART_RESET_TIMEOUT设定的值,可以用来主机复位系统。同样道理,芯片也可以发送一BREAK信号来唤醒主机。l 波特率。可以通过公式计算结果设置任意波特率,也可以设置标准波特率。PSKEY_UART_BAUD_RATE(0X204)7、SPI(串行外围设备接口)BlueCore使用有16位数据位和16位地址位的SPI,当处理器运行时或被终止时将会通过SPI交换数据l 指令周期。芯片为从设备,从SPI_MOSI接受命令,从SPI_MISO发送数据SPI复位后,CSB必需置低。写入时,MOSI上的数据在时钟的上升沿写入BlueCore。读出时,在CLK的下降沿读出。CSB变高时结束
8、。l 写入过程。线串行写入8位的命令字(写指令为),接着是16位地址,然后16位的数据写入该地址中。芯片内地址自动加1,接下来的数据将连续的存储于FLASH中。l 读出过程。同上,先写入读命令字C15:0(),然后写入读地址A15:0,在MISO上将输出16位的校验字T15:0,跟着输出16位数据D15:0。校验字包括写入的命令字7:0,和读出数据对应的地址15:8,可以有效克服读出错误地址的内容。读过程地址自动加1.8、PIO可由片上运行的应用程序或者HCI来访问。l PIO0/RXEN。复用端。由PS KEY 的PSKEY_TX/RX_PIO_CONTROL(0x209)来决定,可以用来作
9、为radio前端的传输开关。l PIO2/USB_PULL_UP(1)。复用端。UART中,可用来做PIO。USB中,用来做上拉。外部RAM应用中,用来做片选。l PIO3/USB_WAKE_UP。USB中,由PS KEY 中的PSKEY_USB_PIO_WAKEUP(0x2cf)l PIO4/USB_ON(1)。l PIO5/USB_DETACH(1)l PIO6/CLK_REQ。由PS Key中的 PSKEY_CLOCK_REQUEST_ENABLE(0x246)决定。芯片处于深度睡眠时,管脚可以接低,当有一个时钟请求时接高,时钟必须有4ms的上升沿。9、USB芯片包括一全速的USB接口(
10、12Mbits/s),能够直接驱动USB电缆而无需USB收发芯片。USB的数据线D+和D-连接到USB内部的USB 缓冲器中,因此输出阻抗较低。为了与电缆的特性阻抗相匹配,在和上必须串联电阻。l 协议规定数据线输出的最小高电平为.,为满足此要求,VDD_USB供电端至少为.l 自供电模式。电路将由自己的供电系统供电,而不是来自于电缆的(),这种模式只会提供很小的电流(小于.)。要求要经过一电阻网络分压,以便于当变高时(连接到了)可以检测到。USB_ON端可以由任一PIO来充当,但是必需在PSKEY_USB_PIO_VBUS中注明所选的PIO号l Detach和Wake_up信号BlueCore
11、可以提供两个额外的信号给主机:USB_DETACH和USBWAKE_UP。这两个而外的信号在USB电缆和协议中是不存在的,但是在嵌入式系统应用中却非常有用,因为嵌入式应用中实际的USB电缆是不可见的(直接用PCB布线相连),所以不知道什么时候USB电缆应该建立连接。Usb_detach:置高时将会使USB_D+和USB_D-变为高组态,相当于断开总线连接。置低时将恢复连接,并等待主机恢复。USB_WAKE_UP:用来唤醒主机。只有USB_DETACH有效时才有意义,置为高电平时用来唤醒主机,以重新开始传输数据。它是用来替换软件中USB WAKE_UP消息的,当断开连接时不能使用。三、 外部Fl
12、ash存储器蓝牙的配置参数被存储到Flash的PS区,可以通过程序包里的PSTool工具来对其进行操作。四、 RS232电平转换芯片为主机与BlueCore的3.3V逻辑电平提供接口五、 复位电路高电平复位。上电时,复位管脚将置高。可以确保电压稳定在3.3V之前芯片处于复位状态。否则,当电压从1.8V降至1.6V时,芯片将尝试着从外部存储器获得指令,而此时Flash(针对3.3V供电的Flash)的供电可能没有准备好,Flash将返回错误的指令给BlueCore,这将会导致固件的配置失败。(电压升至1.6V以上时芯片开始工作,而3.3V还未达到,Flash还不能正常工作)当使用1.8V Fla
13、sh时,复位电路可以取消,把复位管脚直接接地,因为Flash和BlueCore将同时达到1.8V 电平(3.3V和1.8V 可能不会同时达到)(根据CSR公司提供的模块资料,在复位管脚处模块已经通过一10K的下拉电阻接地。根据复位要求,应尽量延长复位时间,以确保电源供电稳定。应接一大点电容)平时可以直接接地也可以通过一个1K电阻,要保证接地可靠。六、 开关开关的反跳在软件中实现。七、 PIO不用的IO管脚可以悬空,因为在IC内部有弱下拉电阻。在模块中,未用的AIO通过一100nF电容接地。八、 LED可以由芯片的管脚直接驱动九、 PCBSPI应留出相应的监测点,以便在卡过程中编程,校准,和查询
14、芯片。十、 数据速率最大数据传输速率受到rs232电平转换速率限制,比特率的设置在PS KEY中。要根据所使用的 RS232转换器的实际速率来设置PS_KEY中的速率值。十一、低功耗节点应用。电缆替代例子的底层固件层中不能应用深度睡眠模式。MAX3243和MAX3228当没有有效的RS232信号时会自动进入低功耗模式关闭器件。将FORCEON(232转换芯片的引脚)与3.3V相连可以关闭低功耗特性(此处加入跳线使该引脚可以接到0V提供选择)。当将引脚FORCEOFF接3.3V时,将会使能自动低功耗模式。在RS232芯片输入端没有有效数据输入时232芯片将会被关闭进入低功耗模式。(将FORCE_
15、OFF接3.3VCC使能自动低功耗模式,而通过控制FORCEON的高低来最终确定是否真正的使用低功耗模式)。232芯片输出的信号INVALID像BlueCore指明是否有有效信号,从而可以唤醒BlueCore。INVALID为高电平时表明输入端输入了有效数据。INVALID连接到了IO7,向BlueCore提供一个高电平来唤醒BlueCore。如果一个PIO被设置为输入,输入的低电平必须是一个有效地低电平,RS232芯片输出的INVALID信号有可能不是一个有效地低电平,所以当没有有效信号输入时,RS232芯片的输出端变为高组态,需要加入下拉电阻,以确保PIO7输入为低电平,是芯片进入睡眠状态
16、(PIO中有弱下拉)。为能使PIO能产生中断,需将其设置为输入并合理设置PSKEY_DEEP_SLEEP_PIO_WEEK,如果使用VM可以使用VmDeepSleepEnable(1)来设置(VM应支持对PS的修改)。十二、软件栈LM(Link Manager),LC(Link Controller),L2CAP,SDP和RFCOMM将以二进制文件的形式提供(是固件),Connection manager library 和串口应用以C代码的形式提供,在BlueLab中编译通过后,在VM中运行(VM基于的是解释机制,编译一条执行一条?)。1、 将要下载的固件编译成二进制文件并下载到Flash中
17、,通过SPI下载。2、 设置PS,通过PSTool十三、配对过程1、 RS232上电2、 如果已经配对,它将自动尝试建立连接,应用里存储了配对的设备地址。3、 如果上述过程失败,或者没有地址入口,从设备将会被动地等待连接请求,而主设备将会寻找从设备。一旦连接成功的建立,另一方的地址将会存入PS。第二部分 BlueLab软件编程从功能上可以把文件库大致分为:操作系统、驱动程序、用户接口API、蓝牙协议栈、连接管理库和一些具体的应用程序。l 理解Tasks,Timers,Schedulers在一个蓝牙系统中,有很多工作需要维护,连接管理的消息需要处理,输入数据必须处理,输出的数据必需发送到基带管理
18、器上,如果要通过主机控制器与主机交互还必须编址等,所以处理器要分出不同的时间来处理不同的任务(即多线程)。每一个任务有他自己的调用堆栈,自己的IO队列,都可以从处理器得到回应。有一个任务用来协调其他任务,叫做核心任务(kenel),也被看成调度(Schedulers)。BlueCore系统采取轮询的运行方式,处理器轮流运行任务(而非抢占式)。当任务阻塞时,调度停止运行该任务(当一个任务调用一个用于等待事件发生的系统调用时,任务将进入阻塞状态)。所以当一个任务永远不被阻塞时,其他的任务将永远不会有机会运行。遇到上面的情况,如果你的应用程序不能够被阻塞,就需要关掉整个蓝牙功能,但是在蓝牙堆栈里有很
19、多实时性的操作要求运行,所以不能够这样做。为了解决这个问题,BlueCore提供了一种环境叫做VM,来保护堆栈的正常运行,而不会受到占用大量时间的应用程序的影响。调度并不是直接调用应用程序,而是调用虚拟机,然后通过虚拟机解释器的解释,虚拟机可以执行很多操作。这样应用代码如果是一个无限循环虚拟机仍旧可以运行应用程序中预置的指令,所以无限循环不会无限运行下去。l 虚拟机调度片上的调度器在给其他待处理过程分配处理时间之前仅允许处理有限的虚拟机命令。这意味着不能够指望运行在虚拟机上的应用程序能快速的作出反应。一个无限的while循环会阻止芯片进入休眠状态而增加功耗。而且虚拟机并不会一直运行该循环,而是
20、会在运行一段时间以后转而去处理蓝牙协议栈和应用程序的其他任务。(虚拟机调度是由scheduler实现的,调度程序的代码可见,虚拟机则只提供了接口函数) for(;) uint16 del = sched1() ;/有事件发生处理事件,没有事件发生返回 VmWait(del) ;/应用程序运行在虚拟机上,调用此函数时,虚拟机进入等待状态,上面运行的所用程序都将被阻塞/从而使蓝牙堆栈上的实时性较强的操作的以进行,而不受应用程序的影响 l 使用bluelab库Bluelab提供了各种库,库里提供了支持basic C的函数。当连接时,所有目标文件都会被用到,而且缺少的符号将从库中导入。每一个符号都是从
21、最开始的库(按照命令指定的顺序)获得的。也就是说应用程序的makefile必需位于库前重写。Scheduler依赖于message和timer库。一些应用程序要求scheduler,但是并不一定这两个库东需要。这种情况可以用这两个库的简化版来代替,将会占用更少的代码和数据空间。应用程序框架、连接管理器、调度器、Timer、BlueStack、I2C、消息库和服务发现库需要被解释执行,而剩余的库将按原有模式运行,不必经过VM的解释器。库分为三种:1) 基本库。提供支持运行和调试C代码的功能。2) CSR库。3) 应用程序库。提供对运行在BlueCore上的应用程序的支持。这些库的源代码在src/
22、lib中。可以通过在当前目录下输入make install命令来重建和安装。这就可以使库代码的调试可以像应用程序代码调试那样进行源码级的调试。BlueCore上运行的程序为了在片上运行最终的应用程序,必须将它和一个完整的蓝牙协议栈合并在一起。开发工具包预带了固件映像,它允许芯片运行底层的蓝牙协议栈。图中显示了一个应用程序映像与缺省的Casira映像的不同。应用程序映像有额外的协议栈层:L2CAP,RFCOMM和SDP。这些是支持串行端口规范所需的协议栈层,也用于支持基于串行端口规范的简单规范。这些协议栈层是由Mwzoe编写的,统称为BlueStack。在BlueLab层之上,用一个连接管理器来
23、处理RFCOMM连接的管理。BlueLab中带有连接管理器程序库,使连接管理更加方便,但也不是非用他不可,可以自己别写连接管理器程序。在应用程序顶层是VM。VM使得连接管理器、库和应用程序软件运行在受保护的内存空间中,应用程序软件被编译成虚拟机执行代码。当代码运行时,虚拟机检查每条指令是否有非法的内存管访问行为。通过这种方式,VM确保了应用程序软件不会干扰蓝牙协议栈的正常运行。在调试器下运行程序时,必须将RFCOMM载入到芯片中,芯片才能驱动无线电。可是此时的应用程序是运行在PC机上的调试器下,所以也就不可能将应用程序的映像加载到芯片中。解决办法是向芯片中下载一个空的映像这是一个包含虚拟机的固
24、件映像,但是不包含有效的应用程序。主蓝牙协议栈的运行总是优先进行并连续不可间断,直到有多余的处理带宽VM才被调用。BlueStack协议栈基于消息驱动,层与层之间使用消息传递方法,应用程序调度执行消息不为空的任务。事件驱动中的事件包括BlueStack事件、PIO事件、RFCOMM源端及目的端事件等。所有事件的处理以及消息队列中的消息处理均由调度程序来执行。调度程序由高层应用程序启动,而个事件及消息处理分布在各软件层中。在2.1版本以后,可以向片上加载应用程序,当连接到调试器时,片上应用程序将自动关闭。应用程序库为运行在BlueCore上的应用程序提供了支持。这些库的源码位于src/lib目录
25、下连接管理器连接管理器处理蓝牙协议栈中RFCOMM层以下所有的层。如果没有连接管理器,则需要建立ACL链路,为RFCOMM配置链路,建立并配置L2CAP链路,最后才能建立RFCOMM链路。使用连接管理器,只需一个调用就可以让所需的所有层完成配置。大多数发送数据的应用程序都愿意使用RFCOMM连接,但是对于那些需要从更底层级别进入的程序,BlueLab连接管理器除了允许他们发送RFCOMM包以外,还允许他们发送L2CAP包。L2CAP是蓝牙协议栈中应用程序可以将数据送往的最低级别,因为蓝牙链路中所有的用户数据都必须作为L2CAP包发送。数据包是通过连接来发送的么让每个连接必需指向某个对等的设备,
26、所以很自然,在发送任何数据包之前,连接管理器必须与对等设备配对。在mssage.h中,任务/消息标识符0视为连接管理器保留的,而标识符1是为应用程序框架保留的。其实际效果是,无论程序何时向连接管理器发送消息,他都是向消息队列0发送,而从消息管理器返回的消息总是返回到消息队列1。不管消息的内容是控制信息还是数据包,这个关于消息队列数字的规则不变。连接管理器的消息都在cm_rfcomm.h中声明。连接管理器本身在CM_RFCOMM库libcm_rfcom.a中实现。l 初始化并打开连接管理器组成BlueStack和应用蓝牙协议的库必需包含进系统中。所以这些库将自动启动以确保协议栈的正常运行。而连接
27、管理器不是蓝牙协议栈的组成部分,是可选的独立库,所以他不会自动启动。如果想使用连接管理器,必需通过一些调用初始化并打开连接管理器。首先,通过发送CM_INIT_REQ消息来初始化连接管理器。如果连接管理器成功注册了BlueStack,它将返回CM_INIT_CFM消息。这些消息仅仅是启动连接管理器的运行,所以两个消息都没有任何参数。连接管理器运行以后,需要将应用程序的相关信息告诉连接管理器。BlueCore经常将设备等级(class of device CoD)设置成混杂型。这可能并不适用于当前应用。例如耳机应用程序,要把CoD中Major Device Class设置为Audio,并使耳机规
28、范适应次要设备。这样正确的设置就很重要,因为CoD作为查询的回复被发送出去,然后被其他发现设备的应用程序利用,这时包含CoD的查询回复很有可能被该查询设备所屏蔽。所以,如果CoD不能很好的反应应用程序所具有的功能,其他的应用程序很可能甚至不会向使用者报告这个设备的存在。还需要让连接管理器知道要用到的服务列表,来描述应用程序中所提供的服务。这项工作处理完以后,连接管理器将会专注于处理关于这些服务的询问,而不用应用程序进行额外的干预。应用程序在CM_OPEN_CFM(这个消息已经不推荐使用,详见/docs/cm_rfcomm)中向连接管理器传递CoD和服务记录信息。typedef struct u
29、int8 * serviceRecord; /* pointer to service record */ uint16 sizeServiceRecord; uint32 classOfDevice; CM_SERVICE_REGISTER_REQ_T;serviceRecord参数是指向一个动态分配的内存的指针,这个内存用于描述应用程序服务的服务记录。服务记录必须包含一个RFCOMM信道(channell)的空入口,供应用程序的服务使用。换句话说,UUID(universal unique identifier)是由后面的三个UNIT型数来确定的。信道会由连接管理器进行填写。sizeSer
30、viceRecord参数是serviceRecord完整的大小,classOfDevice参数指明了设备的种类,用来回复别的设备针对本设备的查询操作。在BlueLab28中classOfDevice参数已不适用,仅赋给值0,取而代之的是由CM_WRITE_COD_REQ消息来注册CoD信息。这种变化是由于当用户放送多个CM_SERVICE_REGISTER_REQ消息来注册多个服务时,如果提供了不同的CoD信息,当其他设备查询时本地连接管理器将不知道回复哪个CoD信息,所以有一个单独的消息注册CoD信息。在打开连接管理器以后,可以把应用程序提到这种状态,但是也可以继续进行操作使用安全管理等特性
31、(Security Manager)。可以告诉安全管理器信任的设备,安全管理器将会把关于这些设备的信息存放在新人设备数据库中(Trusted Device database)。在数据库中登记的信任设备将可以不经过应用程序的授权与本地设备进行连接并执行操作(已经授权无需再授权了,但是否还需授权并不是自动完成,而是有应用程序来实现的)。要使用安全管理器(SM),应用程序可以发送CM_ADD_SM_DEVICE_REQ消息,消息中要包含将往SM中添加的可信任设备的详细信息。typedef struct BD_ADDR_T addr; uint8 link_keySIZE_LINK_KEY; bool
32、_t trust; CM_ADD_SM_DEVICE_REQ_T;Addr参数是将要添加进SM中的设备的地址。Link_key参数同时给出了设备的连接关键字(link key),trust参数如果为TRUE这名设备被信任,FALSE为不信任。如果这一阶段没有连接关键字,将不得不跳过这一步骤。稍后可以通过配对来获得连接关键字,然后调用SM。除处理消息之外,还需要启动timer系统和scheduler。这些调用应该在配对的两方都要进行。要知道收到CM_INIT_CFM消息后才能发送CM_OPEN_REQ消息,所以要等待消息的到来。这样也就需要一个消息管理者来检查消息队列并处理事件。l 查询在初始化
33、一个连接之前,可能会需要周围的蓝牙设备。在用户端一般叫做发现设备,而在蓝牙核心协议中叫做查询。查询由CM_INQUIRY_REQ来完成。应用程序中应该指明查询的全部长度(超时)和要求回复的最大数量。在超时(timeout)的范围内连接管理器可能会发起不止一个查询操作。如果达到了设定的最大回复数,查询将被中止,然后向应用程序发送消息,消息中的某些位表明了查询的完成。查询操作可以得到像蓝牙设备地址和设备类型(CoD)等信息,但是如果想在设备上为用户显示这些信息,就得了解一些关于它们的知识。(对于电缆替代,没有什么CoD信息能够很好地适合这种应用,所以CoD值用一个无符号的低字节的值是0的数值来表示
34、)为了让蓝牙芯片发起查询操作,要使用:typedef struct uint8 max_responses; Delay inq_timeout; uint32 class_of_device; uint16 remote_name_request_enabled; CM_INQUIRY_REQ_T;max_responses参数给出了可以接受的最大查询回复数。inq_timeout参数以秒计算的查询过程超时。class_of_device参数作为一个过滤器:连接管理器把仅有具有此CoD的查询回复返回给应用程序。remote_name_request_enabled参数是一个标志,指明对于没有
35、见过的查询结果是否对该未知设备进行设备名查询。应用程序可以等待CM_INQUIRY_RESULT_IND或CM_INQUIRY_COMPLETE_CFM。在等待事件发生的过程中,应用程序可以允许调度器分配所有时间给其他的任务知道查询制式事件发生。typedef struct HCI_INQ_RESULT_T inq_result; uint8 *handlesHCI_LOCAL_NAME_BYTE_PACKET_PTRS; CM_INQUIRY_RESULT_IND_T;Handles参数是一个句柄数组与通过远端名字查询操作得到的远端设备名的指针有关。typedef struct BD_ADD
36、R_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; uint24_t dev_class; /* Lower 3 bytes only used */ bt_clock_offset_t clock_offset; HCI_INQ_RESULT_T;这些参数直接来源于蓝牙核心协议(在bulelab中核心协议位于D:BlueLab28mntincludeapp bluestack中)用于HCI查询结果事件。当所有的
37、查询结果到达后,应用程可以得到CM_INQUIRY_COMPLETE_CFM_T消息typedef struct inquiry_status_t status; CM_INQUIRY_COMPLETE_CFM_T;typedef enum CmInquiryComplete, CmInquiryCancelled, CmInquiryMaxResponsesReached inquiry_status_t;从Sutatus参数中可以得知为什么查询完成。如果该参数被设置成CmInquiryComplete,表明查询超过超时(timeout)设定。如果被设置成CmInquiryCancelled
38、表明查询是被中途取消。如果被设置成CmInquiryMaxResponsesReached表明达到了指定的最大回复数。在这里,由于资源的限制不得不对超时和最大回复数进行设定。第一,设定超时是避免永久的查询耗费电能。第二,设定最大回复数避免过多的回复和处理对有限的系统内存的占用。l 配对在查询过程之后,应用程序会找到可供连接的设备,在建立实际连接之前,还要经过一个过程:配对。配对过程建立了一个连接关键字(link key),又来加密蓝牙连接上交流的数据。连接关键字也可以用来授权其他的设备,也就是保证连接到想要的设备。首先,要用CM_PAIR_REQ消息让连接管理器与一个设备配对。typedef
39、struct role_t role; /* are we going to be master or slave? */ Delay timeout; bool_t authentication; BD_ADDR_T bd_addr; CM_PAIR_REQ_T;typedef enum CmMaster, CmSlave role_t;Role参数被设置成CmMaster或者CmSlave,以确定本地设备扮演的是什么角色。Timeout参数给出取消配对给出的时间限制。Authentication参数是一个布尔型标志,TRUE表明在连接中将要使用授权功能。bd_addr参数是欲与之配对的远端
40、蓝牙设备地址,仅在初始配对以尝试建立连接时应用。共享的连接关键字用一个PIN码来建立,PIN码必须由连接的两端分别单独输入。对于没有用户交互接口的设备,PIN码可以通过编程设置,这种PIN码将是固定的。带有固定PIN码的设备交给用户使用时必需附带还有PIN码的文档,以便与其他设备互联时可以输入同样的PIN码。连接管理器需要从应用程序中得到PIN码,为了实现这一点,连接管理器将会向应用程序发送PIN码请求CM_OIN_CODE_REQ消息:typedef struct BD_ADDR_T addr; CM_PIN_CODE_REQ_T;在该消息中,包含有一个蓝牙设备地址,当应用程序中含有多种设备
41、的不同PIN码时,应用程序可以根据这个地址来查询的到相应的PIN码。这个地址还可以用来让用户知道是那个设备在要求与之连接。应用程序要发送CM_PIN_CODE_RES作为上面消息的回应。typedef struct BD_ADDR_T addr; 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,所以这个非
42、法的字符可以用来表明本地设备不愿意提供PIN码。如果成功配对,连接管理器将会存储配对设备的地址和连接关键字,并会向应用程序发送配对操作的确认信息CM_PAIR_CFM。typedef struct pair_status_t status; BD_ADDR_T bd_addr; uint8 link_keySIZE_LINK_KEY; CM_PAIR_CFM_T;typedef enum CmPairingComplete, CmPairingTimeout, CmPairingCancelled, CmPairingFail, CmPairingNotFinished pair_status
43、_t;如果配对成功Status参数被设置成为CmPairingComplete,不成功被设置为CmPairingTimeout。bd_addr参数被设置为配对蓝牙设备的地址。link_key参数是和对方设备将会用到的连接关键字。连接关键字将会在授权和编码中应用。可以将连接关键字存储在应用程序中,但是用CM_ADD_SM_DEVICE_REQ消息将连接关键字和设备的相关细节信息传给SM(安全管理器)将会更加有效。也可以跳过配对过程而直接建立连接。但是,这样就不会创建一个连接关键字,也就不能够使用编码和授权功能,所以这种连接并不安全,传输的数据很容易被其他设备截取。l 连接最后,应用程序请求建立一
44、个数据连接。如果应用程序是以主设备的身份建立的连接,需要发送一个CM_CONNECT_AS_MASTER_REQ消息。typedef struct uint16 max_framesize ; cm_auth_config_t use; BD_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参数配置授
45、权和编码。Addr参数提供了将要连接的蓝牙设备的地址。Target参数提供了应用程序想使用的服务的UUID,这个信息将被SDP服务所使用(UUID对应服务列表中的一个值,如果UUID的只存在说明提供此项服务)。Timeout参数给出了在放弃连接尝试前的超时。Park参数配置了用于连接的park参数。Sniff参数配置了用于连接的sniff参数。CM_CONNECT_AS_SLAVE_REQ用来配置蓝牙芯片接收连接作为从设备。这将开启页扫描(page scanning)。在上面两个消息中都用到了用于配置授权的结构参数,park和sniff。Park和sniff是两种蓝牙工作模式,sniff呼吸模
46、式,park等待模式。typedef struct uint16 authentication : 1; /1连接授权,0未授权 uint16 encryption : 1; /1使能加密,0关闭加密 cm_auth_config_t;typedef 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参数设置
47、成了要求授权和加密,哪么连接关键字是必要的。如果应用程序已经调用CM_ADD_SM_DEVICE_REQ消息注册了连接的另一端设备,这样安全管理器(SM)就已经有了连接关键字,不需要应用程序的额外参与就可以处理授权和加密。上图中显示了需要连接关键字的一种情况,但是应用程序并没有通过CM_ADD_SM_ DEVICE_REQ来传送连接关键字和设备细节给安全管理器()。在这种情况下,连接管理器不得不从应用程序的到连接关键字,向应用程序发送CM_LINK_KEY_REQ消息:typedef struct BD_ADDR_T addr; CM_LINK_KEY_REQ_T;Addr参数是准备给其授权的
48、蓝牙设备地址。而应用程序有这个设备的连接关键字,所以应用程序应该向连接管理器发送CM_LINK_KEY_RES消息,将link key传给CM。typedef struct bool_t accept; BD_ADDR_T addr; uint8 key_valSIZE_LINK_KEY; CM_LINK_KEY_RES_T;在配对完成以后,就可以开始建立连接。若果使能了授权和加密功能,而且远端设备没有在SM中注册本地设备,本地设备就会收到一个CM_LINK_KEY_REQ 消息,这样就需要用CM_LINK_KEY_RES 消息来向远端设备发送连接关键字。(同理,如果在本地设备中注册了某远端设
49、备(包含其地址和连接关键字),若远端设备发起连接将本地设备就不会向原端设备发送CM_LINK_KEY_REQ 消息)。Accept参数是布尔型标志,确定是接受还是拒绝连接关键字的请求。Addr参数将要被授权的蓝牙设备的地址,key_val参数是对方设备的连接关键字。如果没有连接关键字,可以启动配对过程产生连接关键字,也可以把accept参数设为FALSE,拒绝建立连接。连接成功建立或者失败后,CM将发送CM_CONNECT_CFM消息用来通知应用程序连接建立的状态。typedef struct connect_status_t status; BD_ADDR_T addr; uint16 rf
50、c_frame_size; Source source ; Sink sink ; uint16 conn_server_chan; CM_CONNECT_CFM_T;typedef enum CmConnectComplete, CmConnectTimeout, CmConnectCancelled,/有错误发生 CmConnectDisconnect,/连接后又断开连接 CmConnectDisconnectAbnormal, CmConnectRemoteRefusal, CmConnectServiceNotSupported, CmConnectFailed connect_sta
51、tus_t;Addr参数是目标蓝牙设备的地址。在成功建立基本的ACL连接后,应用程序可以用CM_SCO_CONNECT_REQ消息来添加一个SCO连接。CM_DISCONNECT_REQ消息用来断开一个连接。如果断开的是SCO连接,则底层的ACL连接仍就存在(在建立SCO连接之前应先建立ACL连接)。typedef struct link_type_t link_type; BD_ADDR_T addr; CM_DISCONNECT_REQ_T;link_type参数是将要断开的连接类型,可以是ScoConnection或者RfcommConnection。Addr参数连接另一端设备的地址。l
52、 发送数据连接建立以后就可以发送和接收数据。在CM_CONNECT_CFM中返回的数据源和接受端可以由stream library库中的函数利用,来收发数据。当数据已经到达源端或者离开接收端将产生VM_EVENT_SOURCE和VM_EVENT_SINK事件,调度器将会调用handleSourceEvent和handleSinkEven t予以处理。l 其他消息和事件的使用连接管理器支持三种指示消息,这三种消息用来异步指示连接状态的变化,或者错误的发生。连接管理器用CM_CONNECT_STATUS_IND消息通知用户RFCOMM连接状态的变化。typedef struct connect_s
53、tatus_t status; BD_ADDR_T addr; CM_CONNECT_STATUS_IND_T;typedef enum CmConnectComplete, CmConnectTimeout, CmConnectCancelled, CmConnectDisconnect, CmConnectDisconnectAbnormal, CmConnectRemoteRefusal, CmConnectServiceNotSupported, CmConnectFailed connect_status_t;status参数可被设置为各种状态。addr参数是当前指示的连接状态的设备
54、的地址。typedef struct cm_error_t error;BD_ADDR_T addr; CM_ERROR_IND_T;error参数是与addr地址对应设备操作过程中发生的错误。错误可能会发生在以下几种情况:1) 连接管理器繁忙时提出连接请求。2) 连接管理器繁忙时提出配对请求3) 连接建立前发送数据连接管理器提供了一个“取消”请求。用来取消任何配对或者有效连接,所以也不需要任何参数。这个请求消息没有回复消息。但是对配对或连接的回复消息中会包含状态CM_cancelled。CM_CANCEL_REQ();Message LibraryMessage库是消息管理模块,负责消息的动
55、态分配、消息的动态管理、消息的提取和动态处理,对应的实现函数为Mssagesched()。所有的消息都可以划分为多个消息队列,每个消息队列成为一个任务。对每个任务的处理在DECLARE_TASK()中说明。任务的标志符中0和1是保留值,分别代表CM和框架任务(framework)。任何任务可以用sendMsg()向framewok(task 1)发送数据。Timertimer库允许应用程序在将来的一段时间里可以自动的调用一系列排队的函数。这些回调可以发生在从函数进入排队起的四个小时内,并且可以周期执行或者执行一次。一次最多可以同时应用30个timer。l 指定延时D_SEC(n)创建了一个以秒为单位的延时。这个延时可以达到四个小时,但是计时是非常粗糙的。D_mSEC(n)创建了以毫秒为单位的延时。这个延时最大长度为30秒,但是精度高。D_NEVER制定了一个非常长的延时并且不
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年心理健康教育课程考试试题
- 幼儿园指南试题及答案
- 管工进场考试题及答案
- 保险储备面试题及答案
- 书法教师试题及答案
- 电子电路设计考试题目及解析
- 网络工程师综合能力试题及答案
- 常见网络设备的性能对比与试题及答案
- 网络工程师技术难题试题及答案
- 软件设计的重要性与考试试题及答案
- 医疗器械监督管理条例培训2024
- 咨询类合同合同范例
- 2024年全国黄金行业职业技能竞赛(矿山救护工)理论考试题库(含答案)
- 铣床主轴箱设计
- 刑法总论:刑事法治的中国特色智慧树知到答案2024年湘潭大学
- 钢琴调律服务合同
- 爱国英雄霍去病历史人物介绍
- 冠心病合并房颤患者PCI术后抗栓治疗策略
- 2024年燕舞集团限公司公开招聘高频考题难、易错点模拟试题(共500题)附带答案详解
- 2024年中考道德与法治时事政治试题库附答案(综合题)
- 从自在、自觉到自为:中华民族发展的历史逻辑
评论
0/150
提交评论