PersonalCorpus 版 (精华区)
发信人: lofe (一场秋雨Θ一场凉), 信区: Network
标 题: 连接蓝牙设备
发信站: 哈工大紫丁香 (2001年09月01日17:17:09 星期六), 站内信件
连接蓝牙设备
(廖铮 2001年06月18日 16:21)
故障定义和假设
我们这里举例说明的故障实例处于典型的蓝牙微微网中。假设你想通过输入“沃尔
马特超市”一词来查找一下“橘子”摆放的位置。于是拿出自己的手机检索“沃尔
马特超市”微微网所提供的地图服务。假设该服务位于“沃尔马特超市”微微网的
主单元上。出于简单起见,还假设微微网就只有这一个。以后我们还会讨论一下复
杂通信的情况,比如多个微微网连接形成分布网、服务位于你进入的微微网之外的
节点上等。此外也为了避免出现查询故障,我们认定你的手机可以通过近期经常访
问的微微网本地数据库(手机号码薄)进行简单的NSLOOKUP而获得“沃尔马特超市
”主单元的蓝牙地址(BD_ADDR)。
当你输入“橘子”一词并按下浏览器窗口的搜索键后,蓝牙设备(在我们的示例中
就是你的手机)的L2CAP就会收到以L2CA_ConnectReq 事件表示的请求。这里我们
认为L2CAP维护着一个最近连接的连接句柄缓冲。缓冲中每个条目都有一个标志位
表示对应特定连接的连接句柄(CH)是否有效。当LMP向L2CAP报告某CH对应的连接
断开或者终止(这是单独实现的)时该标志位即被设置。
客户端的连接建立
L2CAP对“沃尔马特超市”进行简单的NSLOOKUP检索并得到主单元的地址(
BD_ADDR)。L2CAP 随后检查缓冲查看该地址的CH是否存在。如果存在CH(本例中
是不可能的,因为你才进入微微网嘛)而且没有设置标志位,那么L2CAP就进一步
和“沃尔马特超市”主单元的L2CAP建立逻辑连接,方式是向低层的HCI 发出
L2CAP_Connect_Req 事件。如果没有链路连接,则L2CAP通过触发LP_Connect_Req
事件而要求HCI创建一个。HCI即可发送HCI_Create_Connection 命令数据包给LMP
。LMP接着触发命令状态事件Command Status 。命令状态事件表示命令已经收到,
LMP正在执行HCI_Create_Connection 命令指派的任务。该事件对主机的异步操作
是必需的,这样主机才可以同时做其他事情而无须等待命令完成。
接收连接请求的LMP会查看该连接的对应CH是否存在(以防缓冲溢出或者因为某些
原因L2CAP没有在缓冲中找到)。如果CH存在,LMP即向HCI触发带CH的
Connection Complete 事件。如果没有远程设备(沃尔马特超市主单元)的CH,
LMP则首先创建两设备之间的LMP信道,方法是发送LMP_host_connection_req PDU
(协议数据单元)给远程设备。但在该LMP信道建立之前,两台设备之间将在基带
级建立物理连接信道。
物理级连接
基带级的连接有点复杂。原因在于蓝牙规范只允许主单元寻呼从单元反过来则不被
允许。所以你的手机只好创建自己的本地微微网(临时的)并把“沃尔马特超市”
主单元当作从单元寻呼。“沃尔马特超市”主单元在处于寻呼扫描模式的时候会发
现这个寻呼消息(也就是一个简单的ID数据包,其中包含了从单元的设备访问码
DAC——它是你的手机以寻呼跳频发送的,而寻呼跳频则是从单元的BD_ADDR也就是
“沃尔马特超市”地址所决定的)。于是主单元向从单元发送响应。该响应消息只
能由从单元的设备访问码“沃尔马特超市”组成。从单元即可在收到寻呼消息开始
后625微秒发出响应,响应跳频则对应收到寻呼消息的跳频。
主单元——也就是你的手机——在收到ID数据包后即发出FHS响应数据包,其中包
含了主单元的实时蓝牙时钟,主单元的48位长BD_ADDR、BCH奇偶位和设备类型。该
数据包发送的频率也是寻呼跳频序列。从单元“沃尔马特超市”则发回响应(其中
只有从单元的设备访问码)确认FHS 数据包。这样两台设备都进入了连接(
CONNECTION )状态,也就可以在其物理层之上建立更高级信道。主单元(你的手
机)发送的第1个数据包是一个POLL数据包,这个包只是再确认连接。从单元可以
用任何类型的数据包响应。这里要注意的是,一旦连接建立,连接所采用的跳频序
列也就是主单元(你的手机)确定的信道跳频。所以该POLL数据包将按照以上的信
道跳频被发送。
服务器端连接
建立了物理信道之后,基带就会创建一个ACL数据包(DM1、DM3或者DM5),其中数
据部分头部的L_CH 字段设置为11(LM 数据包)。数据包头内的AM_ADDR也由你的
手机设置(注意你发送的FHS数据包具有一个AM_ADDR字段,从单元将其用作该连接
的活动成员地址)。一个字节长的LMP_host_connection_req PDU即形成了该数据
包的数据部分。
当其他各方收到该数据包,该数据包即会被转发给LMP——因为它是一个LM消息。
“沃尔马特超市”的LMP识别出从你手机发来的LMP_host_connection_req PDU并为
HCI触发一个Connection Request 事件。HCI一收到该事件就会通过
LP_ConnectInd事件把这个请求告诉L2CAP。 L2CAP就通过L2CA_ConnectInd事件再
次上传给更高层让应用程序决定是否接受或者拒绝。低层作出决策也是有可能的,
不过本文不再赘述。上层可以分别采用L2CA_ConnectRsp 或者
L2CA_ConnectRspNeg接受或者拒绝连接请求。同样的,L2CAP也可以采用
LP_ConnectRsp 或者 LP_ConnectRspNeg事件通知HCI。“沃尔马特超市”的HCI随
后就向LMP发送HCI_Accept_Connection_Request 或者
HCI_Reject_Connection_Request 命令。LMP也以LMP_accepted 或者
LMP_not_accepted PDU响应——具体取决于是否接受或者拒绝连接。这个PDU 通过
“沃尔马特超市”的基带被发回给你的手机。
LM信道的建立
你的手机接收基带数据包并把该PDU传送给LMP ——因为这个PDU是LM 信道发送的
(L_CH = 11)。如果连接被拒绝,LMP就会向HCI触发一个Connection Complete
事件,其中包含一个错误码。HCI则采用LP_ConnectCfmNeg告诉L2CAP,再由L2CAP
通过L2CA_ConnectCfmNeg告诉更高层。如果连接被接受,LMP就发送一个
LMP_setup_complete PDU给远端设备的LMP(本示例中就是“沃尔马特超市”)。
远端设备也发送一个LMP_setup_complete PDU给你的手机,于是建立LM信道。这以
后两台设备的LMP就可以发送连接完成(Connection Complete)事件,事件标志中
的状态标志可以设置为00表示连接成功。HCI则使用LP_ConnectCfm告诉L2CAP,再
由L2CAP使用L2CA_ConnectCfm告诉更高层。其结果就是初始化了L2CAP信道。在
Connection Complete 事件数据包内,LMP 会发送该连接的对应CH。L2CAP现在可
以为连接分配一个CID(连接标识符)并使用以上的CH建立一个L2CAP信道。
L2CAP信道的建立
L2CAP 基本上采用信令命令建立L2CAP信道。它采用信令L2CAP_ConnectReq 和
L2CAP_ConnectRsp 建立L2CAP信道。上层就使用L2CAP信道发送数据以及其他信息
。
参考以下的附录可以了解更详细信息。
附录:
基带数据包
不同命令的一般映射
L2CAP 信令(Signalling)命令
代码
说明
0x00
保留
0x01
命令拒绝
0x02
连接请求
0x03
连接响应
0x04
配置请求
0x05
配置响应
0x06
不连接请求
0x07
不连接响应
0x08
回送请求
0x09
回送响应
0x0A
信息请求
0x0B
信息响应
HCI 事件和命令
命令
OCF
命令参数
返回参数
HCI_Create_Connection
0x0005
BD_ADDR,
Packet_Type,
Page_Scan_Repetition_Rate,
Page_Scan_Mode,
Clock_Offset,
Allow_Role_Switch
-
HCI_Accept_Connection_Request
0x0009
BD_ADDR,
Role
-
HCI_Reject_Connection_Request
0x000a
BD_ADDR,
Reason
-
Event
Event Code
Event Parameters
Connection Complete
0x03
Status,
Connection_Handle,
BD_ADDR,
Link_Type,
Encryption_Mode
Connection Request Event
0x04
BD_ADDR,
Class_of_Device,
Link_Type
责任编辑:小李(lisz@staff.cidnet.com)
--
═══════════════════﹃
过 而 结 要 情 有 结 而 过 要 情 有
程 不 果 的 , 些 果 不 程 的 , 些
。 是 , 是 重 事 ; 是 , 是 重 事
﹄═══════════════════
※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: DnC.hit.edu.cn]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:4.608毫秒