连接设备时,蓝牙可确保可靠的数据传输。需要进行连接才能进行安全的数据传输。本文介绍了蓝牙设备可以处于的各种状态以及如何在这些状态之间移动。
蓝牙状态在启动蓝牙协议栈时,设备将处于空闲状态,也就是说,它将是不可发现且不可连接的。通过调用两个API函数le_gap_set_mode()或le_gap_bt5_set_mode(),可以使设备可发现且不可连接或可发现并可连接。也可以将设备返回到空闲,不可发现和不可连接状态。
不可连接信标可发现但不可连接的设备称为信标。范围内的任何设备都可以看到广告数据,但无法建立连接。这意味着不能写入广告设备的数据。信标的示例是iBeacon和Eddystone标准。如果远程主服务器尝试连接到不可连接的从服务器,则从服务器的堆栈会以连接拒绝错误响应主服务器。用户应用程序不需要交互。
可连接的广告商可发现和可连接的设备会通告并接受范围内任何设备的连接。建立连接后,堆栈会将事件le_connec
tion_opened或le_connection_bt5_opened发送到应用程序。此事件包含远程设备的地址,地址的类型,连接句柄,设备在连接中的角色以及用于指示设备是否已绑定的绑定句柄。在蓝牙5连接的情况下,该事件还包括一个句柄,用于指示该连接与哪个广告集相关联。如果需要多个连接,则可以从此事件中重新启动广告。
关闭连接如果关闭连接,则将事件le_connection_closed发送到应用程序。此事件包括连接句柄和断开连接的原因。API指南的“蓝牙错误”部分记录了断开连接的原因。
连接–安全和不安全收到连接事件时(evt_le_connection_opened或evt_le_connection_bt5_opened),应用程序可以通过检查bond_handle参数来确定与远程设备是否存在绑定。值0xFF表示没有绑定,其他任何值表示有效的绑定。如果未绑定本地和远程设备,则它们之间的
通信将不会被加密,并且对范围内的任何蓝牙设备都是可见的。强烈建议保护所有敏感数据。
连接事件之后,将至少有一个连接参数事件(gecko_evt_le_connection_parameters_id)。当连接打开且任何时候更新连接参数时,都会发送此事件。连接参数事件包括有关连接参数(连接间隔,等待时间,超时)以及安全模式和最大PDU大小的信息。安全模式是以下之一
堆栈或用户应用程序都可以请求安全连接。如果远程设备尝试访问受保护的特征,则堆栈将请求安全连接。用户应用程序可以通过调用cmd_sm_increase_security()来请求安全连接。无论哪种情况,堆栈都会向用户应用程序发送一个事件,以指示绑定/配对是成功(evt_sm_bonded)还是失败(evt_bonding_failed)。
绑定与配对安全管理器包含事件和命令,用于控制蓝牙堆栈中包含的安全功能。这些功能之一是形成新键的能力(可键合模式)。如下图所示,固定连接后,它将被绑定并分配一个长期密钥(LTK),该密钥可以在后续连接中使用;或者配对并分配一个短期密钥(STK),该密钥在连接时将被丢弃终止。成功绑定/配对后,堆栈将bond_handle作为参数将事件evt_sm_bonded发送到应用程序。与将bond_handle传递给evt_le_connection_opened一样,除0xFF以外的任何值都表示已绑定设备,而在这种情况下,值0xFF表示已为当前连接配对了设备。
最大传输单位(MTU)除了连接打开事件和连接参数事件外,每个连接始终会有一个GATT MTU交换事件。此事件告诉您最大传输单位(MTU)的大小。这是客户端和服务器之间可以发送的任何数据包的最大大小。此事件可能需要的唯一特殊处理是使用MTU来确定是否可以在单个读/写中发送整个特性,或者是否需要多次写。单个读/写可以为MTU –长度为3个字节。
蓝牙5连接无论连接是否安全,Bluetooth 5都允许在每个连接的基础上选择1 Mbps或2 Mbps PHY。可以通过调用le_connection_set_phy()来选择PHY。对该API的调用会导致堆栈发送事件evt_le_connection_phy_status,以指示该连接实际使用了哪个PHY。下图显示了连接状态的流程类似于Bluetooth 4.x的流程,并增加了选择2M Phy的可能性。
多个连接和双模式拓扑最多可以允许8个同时连接。如果需要,可以使用蓝牙配置结构中的max_connections参数将连接数限制为少于8个。为了允许多个连接,必须在建立连接后重新启动广告。这可以通过连接打开事件来完成。
蓝牙4.2中的新增功能之一就是所谓的双模式拓扑,该拓扑允许设备同时成为主设备和从设备。以前,必须断开连接才能在主服务器和客户端之间切换角色。
(上述文章阐述归伦茨科技公司所有,转载请注明出处,更多相关信息欢迎关注微信公众号:lenze_tech或微信号:lenzetech,点击http://www.lenzetech.com/)