在蓝牙协议中,为了更加灵活以及容易实现多种特性,使用了多协议,多层级的设计,LMP即link manager protocol(链路管理器协议)就是蓝牙协议中的一个重要组成部分,本文将对经典蓝牙的LMP进行解析,带大家一起了解LMP的工作原理。
1
什么是LMP?
LMP是 controller中的一层,用于控制和协商两个设备之间蓝牙连接的所有操作,这包括了逻辑传输和逻辑链路的建立和控制,以及物理链路的控制,比如蓝牙连接中进行断开、设置输出功率、获取features等操作。LMP用于两个设备上的链路管理器(LM)之间的通信,为它们提供了链路配置、安全管理、服务质量管理、错误控制与恢复、电源管理、信息交换等功能。
图1. 蓝牙核心系统架构
2
LMP的特点
所有LMP消息只能作用于发送和接收设备之间的物理链路以及相关的逻辑链路和逻辑传输,如当前有两个连接A和B,那么A上的LMP消息不应当作用于B。LMP消息用于建立链路、加密和控制,由两个设备之间的ACL-C或ASB-C逻辑链路传输,只由LM解释和执行,不会传到更高的协议层。
图2. LMP层级
LMP的每个PDU(protocol data unit,协议数据单元,数据传送的基本单元)都被分配一个7位或15位的操作码(opcode),用于唯一标识不同类型的PDU。操作码的前7位和1位transaction ID位于有效负载主体的第一个字节中,如果操作码的前7位是124到127的话,则操作码的附加字节位于有效负载的第二个字节中,包报头的FLOW位始终为1,并且在接收时应该被忽略。如果PDU包含一个或多个参数,这些参数将被放置在操作码之后紧接着的有效负载中,即如果PDU具有7位操作码,则在字节2处,如果有15位操作码,则在字节3处,使用的字节数取决于参数的长度,所有参数都使用小端格式,即先传输最低有效字节。
图3. LMP PDU结构
3
LMP的工作原理
3.1
事务
LMP根据事务(transaction)进行操作,事务是实现特定目的的一组连续的消息交换。构成同一事物的一部分的所有PDU的事务ID应该具有相同的值,如果事务是由central发起的,那么事务ID为0,如果是peripheral发起的,那么事务ID为1。
3.2
响应超时
ACL-C逻辑链路上传输的LMP PDU从被接收到回复之间的时间应该小于LMP响应超时时间(30秒),而在ASB-C逻辑链路上发送的LMP消息则不受LMP响应超时的约束。
3.3
错误处理
如果LM接收到一个操作码未知的PDU,它会以包含错误码Unknown LMP PDU(0x19)的LMP_NOT_ACCEPTED或LMP_NOT_ACCEPTED_EXT来响应,如果接收到的是参数无效的PDU则应以包含错误码Invalid LMP Parameters(0x1E)的LMP_NOT_ACCEPTED或LMP_NOT_ACCEPTED_EXT来响应。如果超过了最大响应时间或者检测到链路丢失,等待响应的一方应当断定链路连接失败,及时做出处理。如果收到错误消息的数量超过了阈值,则应该断开连接。
3.4
冲突解决
由于LMP PDU不是及时传递的,因此可能会出现冲突的情况,即两端都启动了相同的程序,并且都无法完成。在这种情况下,central应该通过发送带有错误代码LMP Error Transaction Collision/LL Procedure Collision(0x23)的LMP_NOT_ACCEPTED或LMP_NOT_ACCEPTED_EXT来拒绝peripheral程序的启动,从而完成central启动的程序。
两个LM启动了不同的程序并且都无法完成的情况下也会产生冲突,这种情况下central应该通过发送带有错误码Different Transaction Collision(0x2A)的LMP_NOT_ACCEPTED或LMP_NOT_ACCEPTED_EXT来拒绝peripheral启动的程序,从而完成central的程序。
3.5
设备特性
设备特性(device features)定义了很多的设备的特性,这些特性是可以用特定的LMP message来获取的,为了表示和传输这些特性,定义了一些bit位来代表它们,当这些bit被置为1时说明该设备支持这个特性,如图是一些常见的特征。
图4. 部分设备特征
每个LMP PDU都是强制性或者可选的,一些LMP PDU需要某些特征的支持,LM不得发送或接收与其对等设备的特征不兼容的任何PDU,LM可以获取并缓存对等设备的特征掩码,在连接期间,支持的特征集不应当被修改。
4
常用的LMP流程
LMP有很多基本流程,主要有Connection control、Information Requests、Role Switch、Modes of Operation、Logical Transports。每个流程都包含很多子流程,我们这里只简单列举几个常用的进行讲解,并使用泰凌微B91开发板配合抓包器对LMP流程进行深入了解。
图5. B91开发板
5
连接建立
在page结束之后,我们使用该流程来建立Host之间的连接,在这个流程中,我们首先可以请求时钟偏移、LMP版本、支持的特性、名称以及可能的detach行为。之后如果要建立连接的话,Paging设备就会发送LMP_HOST_CONNECTION_REQ,对端如果同意建立连接就可以回复LMP_ACCEPTED PDU否则可以回复LMP_NOT_ACCEPTED PDU,如果peripheral需要进行角色切换的话,它会在收到LMP_HOST_CONNECTION_REQ之后发送LMP_SLOT_OFFSET和LMP_SWITCH_REQ,如果角色切换失败,LM将继续创建连接,除非由于资源有限无法支持,那么应以带有错误码Remote Device Terminated Connection due to Low Resources(0x14)的 LMP_DETACH PDU来中止连接。当切换成功时,旧的peripheral将回复LMP_ACCEPTED或LMP_NOT_ACCEPTED并且事务ID将会被设为0。
当连接被接收后,设备就可以调用LMP安全程序(paring,authentication和encryption),当设备在连接期间不会再启动任何安全程序时它会发送LMP_SETUP_COMPLETE PDU。当两个设备都发送LMP_SETUP_COMPLETE PDU时表示连接流程完成,数据流可以在BR/EDR ACL逻辑传输上传输。
图6. 连接建立流程图
图7. 抓包器抓到的LMP Connection establishment流程
6
连接断开
central和peripheral随时都可以使用LMP_DETACH断开两者之间的连接,并在消息中包含错误码,以通知对方断开原因。而在收到LMP_DETACH后是不会用LMP进行回复的,只会回复一个ack并通知Host连接断开。
图8. Detach流程图
图9. 抓包器抓到的LMP Detach流程
总结
LMP是蓝牙协议中重要的一环,用来管理所有的连接,目前泰凌微电子的TLSR951x和TLSR952x系列芯片均基于自研蓝牙协议栈,支持标准LMP所有过程,且支持BR/EDR和LE双模共存,多链路共存等方案,适合用于需求复杂的产品开发。
审核编辑:彭菁
全部0条评论
快来发表一下你的评论吧 !