蓝牙通讯详细原理Word文档格式.docx
《蓝牙通讯详细原理Word文档格式.docx》由会员分享,可在线阅读,更多相关《蓝牙通讯详细原理Word文档格式.docx(15页珍藏版)》请在冰点文库上搜索。
![蓝牙通讯详细原理Word文档格式.docx](https://file1.bingdoc.com/fileroot1/2023-5/3/119223f0-1d75-45fd-8335-2286026da822/119223f0-1d75-45fd-8335-2286026da8221.gif)
*状态命令;
*测试命令。
事件包也可分为三种类型:
*通用事件,包括命令完成包(CommandComplete)和命令状态包(CommandStatus);
*测试事件;
*出错时发生的事件,如产生丢失(FlushOccured)和数据缓冲区溢出(DataBufferOverflow)。
数据包则可分为ACL和SCO的数据包。
包的格式如图4所示。
2.包的参数分析研究
命令包:
命令包中的OCF(OpcodeCommandField)和OGF(OpcodeGroupField)是用于区分命令种的。
ParameterLength表示所带参数的长度,以字节数为单位,随后就是所带的参数列表。
下面以Inquiry命令为例对HCI的命令包做具体说明。
在Inquiry命令中,OGF=0x01表示此命令属于链路控制命令,同时OCF=0x0001则表示此命令为链路控制命令中的Inquiry命令。
OCF与OGF共占2字节,又由于底位字节在前,则它们在命令包为0x0104。
在Inquiry命令中,参数ParameterLength为5。
Inquiry命令带3个参数,第一个参数为LAP(lowaddresspart),它将用来产生Baseband中查询命令包的包头中的AccessCode。
第二个参数为Inquiry_Length,它时表示在Inquiry命令停止前所定义的最大时间,超过此时间,Inquiry命令将终止。
第三个参数为NUM_Response,它的值为0X00表示设备响应数不受限制,只为0x00-0xff则表示在Inquiry命令终止前最大的设备响应数。
因此,若LAP=0x9e8b00,Inquiry_Length=0x05,NUM_Response=0x05,则协议上层调用Inquiry命令是HCI向基带发的明令包将为:
0x010405008b9e0505。
事件包:
事件包的EventCode用来区分不同的事件包,ParameterLength表示所带参数的长度,以字节数为单位,随后就是所带的参数列表。
以CommandStatusEvent事件包为例对HCI的事件包进行具体说明。
当主机控制器收到主机发来的如上面所提到的Inquiry命令包并开始处理时,它就会向主机发送CommandStatusEvent事件包,此事件包为:
0x0f04000a0104。
0xOf表示此事件包为CommandStatusEvent事件包,0x04表示此事件包带4字节长度的参数,0x00为此事件包的第一个参数即Status,表示命令包正在处理。
0x0a为事件包的第二个参数NUM_HCI_Command_Packets,表示主机最多可在向主机控制器发10个命令包。
0x0104为第三个参数Command_Opcode,表示此事件包是对Inquiry命令包的响应。
数据包:
ACL和SCO数据包中的ConnectionHandle即连接句柄是一个12比特的标志符,用于唯一确认两台蓝牙设备间的数据或语音连接,可以看作是两台蓝牙设备间唯一的数据通道的标识。
两台设备间只能有一条ACL连接,也就是只有一个ACL的连接句柄,相应L2CAP的信道都是建立在这个连接句柄表示的数据通道上;
两台设备间可以有多个SCO的连接,则一对设备间会有多个SCO的连接句柄。
连接句柄在两设备连接期间一直存在,不管设备处于什么状态。
在ACL数据包中,Flags分为PBFlag和BCFlag,PBFlag为包的界限标志,PBFlag=0x00表示此数据包为上层协议包(如L2CAP包)的起始部分;
PBFlag=0x01表示此数据包为上层协议包(如L2CAP包)的后续部分。
BCFlag为广播发送的标志,BCFlag=0x00表示无广播发送,只是点对点的发送;
BCFlag=0x01表示对所有处于激活状态的从设备进行广播发送,BCFlag=0x02表示对所有的从设备包括处于休眠状态的从设备进行广播发送。
ACL和SCO数据包中的DataTotalLength都表示所载荷的数据的长度,以字节位单位。
3.通信过程的研究与分析
当主机与基带之间用命令的方式进行通信时,主机向主机控制器发送命令包。
主机控制器完成一个命令,大多数情况下,它会向主机发出一个命令完成事件包(CommandCompletePacket),包中携带命令完成的信息。
有些命令不会收到命令完成事件,而会收到命令状态事件包(CommandStatusPacket),当收到该事件则表示主机发出的命令已经被主机控制器接收并开始处理,过一段时间该命令被执行完毕时,主机控制器会向主机发出相应的事件包来通知主机。
如果命令参数有误,则会在命令状态事件中给出相应错误码。
假如错误出现在一个返回CommandComplete事件包的命令中,则此CommandComplete事件包不一定含有此命令所定义的所有参数。
状态参数作为解释错误原因同时也是第一个返回的参数,总是要返回的。
假如紧随状态参数之后是连接句柄或蓝牙的设备地址,则此参数也总是要返回,这样可判别出此CommandComplete事件包属于那个实例的一个命令。
在这种情况下,事件包中连接句柄或蓝牙的设备地址应与命令包种的相应参数一致。
假如错误出现在一个不返回CommandComplete事件包的命令中,则事件包包含的所有参数都不一定是有效的。
主机必须根据于此命令相联系的事件包中的状态参数来决定它们的有效性。
4.HCI流量控制(FlowControl)的分析研究
HCI的流量控制是为了管理主机和主机控制器中有限的资源并控制数据流量而设计的,由主机管理主机控制器的数据缓存区,主机可动态地调整每个连接句柄的流量。
对于命令包的流量控制,主机在每发一个命令之前都要确定当前能发命令包的数目,当然,在开机和重启动时发命令包可以不用考虑接收情况,直到收到命令完成事件包或命令状态事件包为止。
因为在每个命令完成事件包和命令状态事件包中都有Num_HCI_Command_Packets选项表明当时主机能向主机控制器发送的命令包的数目,而对于每个命令必然会有相应的命令完成事件包和命令状态事件包,主机就能控制命令包不会溢出。
对于数据包的流量控制,一开始,主机调用Read_Buffer_Size命令,该命令返回的两个参数决定了主机能发往主机控制器的ACL和SCO两种数据包的大小的最大值,同时两个附加参数则说明了主机控制器能接收的ACL和SCO数据包总的数目。
而每隔一段时间,主机控制器会向主机发Number_Of_Complete_Packets事件,该事件的参数值表明了对每个连接句柄已经处理的数据包的数目(包括正确传输和被丢弃的)。
主机根据一开始就知道的总数,减去已经处理的包的数目,则可计算出还能发多少数据包,从而控制数据包的流量。
如有必要,HCI的流量控制也可由主机控制器来实现对主机的控制,可以通过Set_Host_Controller_To_Host_Flow_Control命令来设置,其控制过程基本与主机控制过程类似,只是命令稍有不同。
当主机收到断链确认的事件后,就认为所有传往主机控制器的数据包已经全部被丢弃了,同时主机控制器中的数据缓冲区也被释放了。
三、HCI协议层软件开发
我们在对HCI层进行全面的分析研究之后,提出了HCI协议层软件开发的方案,定出了HCI层提供给协议上层的接口。
这些接口给蓝牙协议栈的上层提供了进入BaseBand的统一入口。
整个接口按协议站的要求分为八大部分。
下面介绍每部分的接口。
整个软件层采用传递消息加函数调用相结合的机制来实现,即上层对HCI层接口的调用采用函数调用的机制,HCI对上层的通信采用传递消息的方式。
1.接口分类及举例说明
(1)开始命令
此命令接口是主机向HCI注册及并启动HCI。
如启动HCI的函数接口为HCI_ReqStart(),HCI在启动后发向上层的消息接口为HCI_START_CNF()。
命令执行过程如图5所示。
(2)链路控制命令
链路控制命令是允许主机控制器控制与其他蓝牙设备的连接。
在链路控制命令运行时,LM控制蓝牙微微网与分布网的建立与维持。
这些命令指示LM创建及修改与远端蓝牙设备的连接链路,查询范围内的其他蓝牙设备,及其他链路管理协议命令。
以查找并发现周围设备为例,HCI层为上层提供了函数接口HCI_ReqInquiry,消息接口为HCI_INQUIRY_RESULT_EVT和HCI_INQUIRY_CNF。
命令执行过程如图6所示。
主机首先调用HCI的HCI_ReqInquiry函数开始查询过程,在此过程中,如有蓝牙响应此查询,则会产生一HCI_INQUIRY_RESULT_EVT事件通知主机。
在此次查询过程结束时,会产生HCI_INQUIRY_CNF这条消息通知主机,参数NrofResponse表示在此次查询过程所响应的蓝牙设备数。
(3)链路政策命令
链路政策命令提供了一种影响LM怎样管理微微网的方法。
当链路政策命令运行时,LM仍然以可调整的参数控制微微网及分布网的建立和维持。
这些链路政策命令调整LM的行为,从尔导致与远端蓝牙设备的链路层连接的改变。
已建立服务质量为例,HCI层为上层提供了函数接口HCI_ReqQoSSetup,消息接口为HCI_QOS_SETUP_EVT和HCI_QOS_SETUP_CNF,HCI_QOS_SETUP_CNF_NEG。
命令执行过程如图7所示。
主机首先调用HCI_ReqQosSetup请求建立Qos。
当Qos建立成HCI_QOS_SETUP_CNF消息被送往发起端,同时一个事件消息送往远端设备。
当Qos建立失败时,HCI_QOS_SETUP_CNF_NEG被送往发起端。
(4)主机控制器及基带命令
主机控制器及基带命令被用来改变与建立诸如声音设置,认证模式,加密模式的连接相联系的LM的操作方式。
已读取主机控制器所存储的LinkKey为例,HCI层为上层提供了函数接口HCI_ReqReadLinkKey,消息接口为HCI_READ_LINK_KEY_RRESULT_EVT和HCI_READ_LINK_KEY_CNF。
命令执行过程如图8所示。
(5)信息命令
这些信息命令的参数是由蓝牙硬件制造商确定的。
它们提供了关于蓝牙设备及设备的主机控制器,链路管理器及基带的信息。
主机设备不能更改这些参数。
HCI层为上层提供了函数接口为:
HCI_ReqCountryCodeHCI_ReqLocalAddress
HCI_ReqReadLocalFeaturesHCI_ReqReadLocalVersion
HCI_ReqReadBD_ADDR
HCI层提供的消息接口为:
HCI_COUNTRY_CODE_CNFHCI_COUNTRY_CODE_CNF_NEG
HCI_LOCAL_ADDRESS_CNFHCI_LOCAL_ADDRESS_CNF_NEG
HCI_READ_LOCAL_FEATURES_CNFHCI_READ_LOCAL_FEATURES_CNF_NEG
HCI_READ_LOCAL_VERSION_CNFHCI_READ_LOCAL_VERSION_CNF_NEG
HCI_READ_BD_ADDR_CNFHCI_READ_BD_ADDR_CNF_NEG
(6)状态命令
状态命令提供了目前HCI,LM,及BB的状态消息。
这些状态参数不能被主机改变,除了一些参数可以被重置。
HCI_ReqGetLinkQualityHCI_ReqReadFailedCounter
HCI_ReqResetFailedCounterHCI_ReqRssi
HCI_GET_LINK_QUALITY_CNFHCI_GET_LINK_QUALITY_CNF_NEGHCI_READ_FAILED_COUNTER_CNFHCI_READ_FAILED_COUNTER_CNF_NEG
HCI_RESET_FAILED_COUNTER_CNFHCI_RESET_FAILED_COUNTER_CNF_NEG
HCI_RSSI_CNFHCI_RSSI_CNF_NEG
(7)测试命令
测试命令能够测试蓝牙硬件各种功能,并蔚蓝牙设备的测试提供不同的测试条件。
HCI_ReqEnableDutModeHCI_ReqReadLoopbackMode
HCI_ReqWriteLoopbackMode
HCI_ENABLE_DUT_MODE_CNFHCI_ENABLE_DUT_MODE_CNF_NEG
HCI_READ_LOOPBACK_MODE_CNFHCI_READ_LOOPBACK_MODE_CNF_NEG
HCI_WRITE_LOOPBACK_MODE_CNFHCI_WRITE_LOOPBACK_MODE_CNF_NEG
(8)数据传输命令:
这些命令为蓝牙设备之间传输数据提供了所需要的接口。
如分配所需内存的接口HCI_DataAlloc,传输数据的接口HCI_DataSend,提取数据的接口HCI_DataExtract。
图9说明了在蓝牙系统中传输数据时对这些接口的使用。
四、结论
HCI为为蓝牙协议层的上层提供了进入基带的统一接口。
经过测试,所开发的接口能将上层的数据流匹配到基带,使基带能对之进行处理,并产生相应的事件。
表1HCI包格式
FirstByteLastByte
PacketTypeIndicator(1byte)HCIPacket(Variablelength)
表2HCI包类型
HCIPacketTypePacketTypeIndicator
HCICommandPacket0x01
HCIACLDataPacket0x02
HCISCODataPacket0x03
HCIEventPacket0x04
表3HCI命令包结构
FirstLast
OCFOGFLengthPara0Para1------
表4进入测试模式的HCI命令
命令操作码参数
HCI_Write_PageScan_Activity0x001c0x0800,0x0012
HCI_Write_InquireScan_Activity0x001e0x0800,0x0012
HCI_Write_Scan_Enable0x0c1a0x03
HCI_Write_Device_Under_Test_Mode0x1803无
系统的软件实现
测试软件在Labwindows/CVI软件开发平台下完成。
Labwindows/CVI是由NI公司开发的半图形化的编程工具,该工具以标准C语言为基础,具有强大的库函数,提供了灵活的开发手段和良好的用户界面。
该测试系统的软件从功能角度可以划分为四部分:
对综测仪的初始化、对蓝牙手机的初始化、建立连接和测试指标子程序。
第一部分:
对综测仪的初始化,步骤如下:
步骤1.查找听者。
函数原形为:
ibln(intBoard/Device,intPrimaryAddress,intSecondAddress,shortFoundListener);
查找听者的主要目的是为了确认听者的PrimaryAddress,由于一个总线上最多有30个听者,可以通过有限循环查找,如果确认只有一个听者,当找到一个听者时即可停止查找。
步骤2.打开设备。
ibdev(intBoard_Index,intPrimary_Address,intSecondary_Address,intTimeout_Value,intEND_Message,intEOS_Character);
函数返回值相当于一个操作句柄,当成功打开设备后,对仪器的读写操作均通过操作句柄完成。
对于有些仪器,通过以上两个步骤就可以得到一个有效的操作句柄,但有的仪器,如R&
S公司的CMU200,不但有PrimaryAddress,还有SecondaryAddress,这就需要在得到总的操作句柄后,通过ibwrt函数对各子项(这里指的是bluetoothsignalling和bluetoothnon-signalling)设置次地址,当次地址设置完成后,可以通过ibdev函数得到具体的针对子项的操作句柄。
第二部分:
对手机的初始化。
对手机的初始化是通过串行通信端口(RS-232)实现的,步骤如下:
步骤1.打开串口。
函数原形如下:
intOpenComConfig(intCOM_Port,charDevice_Name[],longBaud_Rate,intParity,intData_Bits,intInput_Queue_Size,intOutput_Queue_Size);
函数中的参数根据蓝牙模块所支持的方式进行设置。
步骤2.发送HCI命令,使手机进入测试模式。
通过函数ComWrtByte(intComPort,charByte)发送,发送时按照HCI命令标准包格式,选择相应的参数,从高字节向低字节,以16进制的形式,逐字节发送。
HCI包格式如表1所示。
其中PacketTypeIndicator按照表2确定。
而详细的HCI命令包组成见表3。
其中OCF,OGF为操作码,Length指的是参数长度,如果参数为一个,则Length值为1,参数为HCI命令自身所带的参数,因命令而异。
以HCI_Write_Scan_Enable命令为例,因为是命令包,故PacketTypeIndicator应为0x01;
又操作码为0x0c1a,打开扫描时参数为0x03,故参数长度为1,所以该命令的发送序列应为(16进制):
011a0c0103。
使手机进入测试模式,首先激活寻呼扫描和查询扫描,然后才能发送进入测试模式的指令。
主要通过发送表4中的HCI命令实现。
第三部分:
建立连接。
在讨论蓝牙建立连接的过程之前,首先要了解蓝牙设备的组网过程。
蓝牙根据网络的概念提出点对点和点对多点的无线连接,在任意一个有效通信范围内,所有设备的地位都是平等的。
首先提出通信要求的设备成为主设备(Master),被动进行通信的设备成为从设备(Slave),利用TDMA,一个Master可以最多和7个Slave进行通信。
在本测试系统中,考虑到生产线上一般采用屏蔽箱防止干扰,所以认为系统中只有1个Master和1个Slave,同时,由于测试的需要,并考虑到实际情况(现在很多蓝牙综测仪在测试过程中并不能作为Slave),一般将蓝牙综测仪作为Master,待测手机作为Slave。
本测试系统软件中,通过ibwrt函数控制蓝牙综测仪发出查询指令,查找当前有效范围内的待测手机。
当查找完成后,ibwrt函数继续控制蓝牙综测仪发出连接请求,当已经进入测试模式的待测手机收到连接请求后,将会返回接受或拒绝连接请求的信息,该信息通过发送HCI_Accept_Connection_Request指令完成,当蓝牙综测仪收到该信息后,即确认可以建立连接,这样,双方的连接就建立成功了。
第四部分:
测试指标子程序。
建立连接成功后,下一步就是测试手机的性能指标,这里测试的主要是蓝牙的发射机和接收机的性能指标。
由于在蓝牙规范中对于每个测试指标都有相应的测试条件及测试标准的详细规定,而每项测试指标的测试条件相差很大,特别是对蓝牙综测仪的设置方面。
因此,在本测试软件中,将每个测试指标封装成子函数,程序通过调用每个测试项的子函数来实现对指标的测试,这样也有利于程序的优化,使程序看起来一目了然,同时也利于在测试过程中根据需要选择测试项。
这里以测试蓝牙发射机的输出功率为例来说明测试子项的软件实现。
蓝牙规范中对蓝牙发射机的输出功率的测试条件和测试结果要求如下:
Hopping:
on;
TestType:
Loopback;
PayloadPattern:
PRBS9
PacketType:
DH5;
测试频点:
3个(本软件选择2402MHz,2441MHz,2480MHz)
测试标准:
平均功率:
在-6dBm至4dBm之间;
最大功率:
不大于23dBm
首先通过ibwrt函数设置蓝牙测试仪的各项配置,使之符合以上的测试条件,然后在3个测试频点上进行循环测试,用ibrd函数从蓝牙测试仪上读取相应的测试结果,根据规范要求的测试标准进行判断,得出最后的结果。
结语
通过对蓝牙规范的研究,已编写了一套以GPIB协议控制蓝牙测试仪,通过串口控制蓝牙芯片的自动测试程序,界面灵活,易于维护。
该测试系统软件也可作为子程序被嵌入GSM手机测试系统中,可以在生产测试中减少测试站的设置,降低成本。
■
完成一次数据传输过程主要由以下几个步骤组成:
1.多路控制信道的建立:
应用程序申请建立RFCOMM链路时首先由L2CAP层建立一条L2CAP信道,然后L2CAP中请建立一条RFCOMM链路,即建立一条控制信道DLCl0,L2CAP建立相应的链路并为其分配一个CID(ChannelID)。
这一过程由发起方在控制信道DLCl0上发送SABM帧,响应方在控制信道DLCl0上发送相应的UA响应帧来完成。
2.参数设定:
这一过程由PN命令和响应帧来完成。
根据通信的需要,进行参数协商,通常情况下可以使用参数的缺省值进行通信。
3.数据链路的建立:
RFCOMM根据应用程序需要的服务类型建立相应的DLCI链路,其完成过程与多路控制信道的建立基本相同,唯一的区别是在相应的DLCI上发送命令和响应帧,而不是在控制信道DLCIO。
4.用户数据的传输:
通过UIH帧来完成不同的DLCI链路上的用户数据传输。
5.断开链路:
用户数据传输完毕以后,发送方发送DISC帧请求拆除DLCI的连接。
收到响