4. BLE连接建立过程

同一款手机,为什么跟某些设备可以连接成功,而跟另外一些设备又连接不成功?

同一个设备,为什么跟某些手机可以建立连接,而跟另外一些手机又无法建立连接?

同一个手机,同一个设备,为什么他们两者有时候连起来很快,有时候连起来又很慢?

Master是什么?slave又是什么?什么又是Connection event和slave latency?

希望这篇文章能帮助你回答上述问题。

BLE连接示例

      假设我们有一台手机A(以安卓手机为例),一个设备B(设备名称:HIS-0001),如下所示,通过nRF Connect,让两者连接起来。

       上述即为大家直观感受到的“连接”,那么手机要与设备建立连接,具体包含哪些流程?他们为什么可以连接成功?下面给大家一一道来。

1. 广播(advertising)

       手机A(Observer)跟设备B建立连接之前,设备B需要先进行广播,即设备B(Advertiser)不断发送如下广播信号,t为广播间隔。每发送一次广播包,我们称其为一次广播事件(advertising event),因此t也称为广播事件间隔。

       虽然图中广播事件是用一根线来表示的,但实际上广播事件是有一个持续时间的,蓝牙芯片只有在广播事件期间才打开射频模块,这个时候功耗比较高,其余时间蓝牙芯片都处于idle状态,因此平均功耗非常低,每1秒钟发一次广播,平均功耗不到11uA

        上面只是一个概略图,按照蓝牙spec,实际上每一个广播事件包含三个广播包,即分别在37/38/39三个射频通道上同时广播相同的信息,即真正的广播事件是下面这个样子的。

       设备B不断发送广播信号给手机(Observer),如果手机不开启扫描窗口,手机是收不到设备B的广播的,如下图所示,不仅手机要开启射频接收窗口,而且只有手机的射频接收窗口跟广播发送的发射窗口匹配成功,而且广播射频通道和手机扫描射频通道是同一个通道,手机才能收到设备B的广播信号。

        也就是说,如果设备B在37通道发送广播包,而手机在扫描38通道,那么即使他们俩的射频窗口匹配,两者也是无法进行通信的。由于这种匹配成功是一个概率事件,因此手机扫到设备B也是一个概率事件,也就是说,手机有时会很快扫到设备B,比如只需要一个广播事件,手机有时又会很慢才能扫到设备B,比如需要10个广播事件甚至更多。

2. 建立连接(connection establishment)

       根据蓝牙spec规定,advertiser发送完一个广播包之后150us(T_IFS),advertiser必须开启一段时间的射频Rx窗口,以接收来自observer的数据包。Observer就可以在这段时间里给advertiser发送连接请求。如下图所示,手机在第三个广播事件的时候扫到了设备B,并发出了连接请求CONN_REQ(CONN_REQ又称为CONNECT_IND)

上图的交互流程比较粗略,为此我们引入下图,以详细描述连接建立过程。

图5:连接建立过程

注:图中M代表手机,S代表设备B,M->S表示手机将数据包发给设备B,即手机开启Tx窗口,设备B开启Rx窗口;S->M正好相反,表示设备B将数据包发给手机,即设备B开启Tx窗口,手机开启Rx窗口。

       如图所示,手机在收到A1广播包ADV_IND后,以此为初始锚点(这个锚点不是连接的锚点),T_IFS时间后给Advertiser发送一个connection request命令,即A2数据包,告诉advertiser我将要过来连你,请做好准备。Advertiser根据connect_req命令信息做好接收准备,connect_req包含如下关键信息:

  • Transmit window offset,定义如图5所示
  • Transmit window size,定义如图5所示
  • connect_req 数据包完整定义如下所示  

        connect_req其实是在告诉advertiser,

1. 手机将在Transmit Window期间发送第一个同步包(P1)给你,请在这段时间里把你的射频接收窗口打开。

2. 设备B收到P1后,T_IFS时间后将给手机回复数据包P2(ACK包)。一旦手机收到数据包P2,连接即可认为建立成功。

3. 当然,实际情况会比较复杂,手机有可能收不到P2,这个时候手机将持续发送同步包直到超时时间(supervision timeout)到,在此期间只要设备B回过一次ACK包,连接即算成功。所以一旦P1包发出,主机(手机)即认为连接成功,而不管有没有收到设备的ACK包。这也是为什么在Android或者iOS系统中,应用经常收到连接成功的回调事件(该回调事件就是基于P1包有没有发出,只要P1包发出,手机即认为连接成功,而不管有没有收到设备的ACK包),但实际上手机和设备并没有成功建立连接。后续手机将以P1为锚点(原点),Connection Interval为周期,周期性地给设备B发送数据包(Packet),Packet除了充当数据传送功能,它还有如下两个非常重要的功能:

  1. 同步手机和设备的时钟,也就是说,设备每收到手机发来的一个包,都会把自己的时序原点重新设置,以跟手机同步。
  2. 告诉设备你现在可以传数据给我了。连接成功后,BLE通信将变成主从模式,因此把连接发起者(手机)称为Master或者Central,把被连接者(之前的Advertiser)称为Slave或者Peripheral。BLE通信之所以为主从模式,是因为Slave不能“随性”给Master发信息,它只有等到Master给它发了一个packet后,然后才能在规定的时间把自己的数据回传给Master。

3. 连接失败

有如下几种典型的连接失败情况:

  1. 如图5所示,如果slave在transmit window期间没有收到master发过来的P1,那么连接将会失败。此时应该排查master那边的问题,看看master为什么没有在约定的时间把P1发出来。
  2. 如果master在transmit window期间把P1发出来了,也就是说master按照connect_req约定的时序把P1发出来了,但slave没有把P2回过去或者没有在超时时间内把P2回过去,那么连接也会失败。此时应该排查slave这边的问题,看一看slave为什么没有把P2回过去
  3. 如果master把P1发出来了,slave也把P2回过去了,此时主机或者从机还是报连接失败,这种情况有可能是软件有问题,需要仔细排查master或者slave的软件。
  4. 还有一种比较常见的连接失败情况:空中射频干扰太大。此时应该找一个干净的环境,比如屏蔽室,排除干扰后再去测试连接是否正常。

4. Connection events

       连接成功后,master和slave在每一个connection interval开始的时候,都必须交互一次,即master给slave发一个包,slave再给master发一个包,整个交互过程称为一个connection event或者gap event

       蓝牙芯片只有在connection event期间才把射频模块打开,此时功耗比较高,其余时间蓝牙芯片都是处于idle状态的,因此蓝牙芯片平均功耗就非常低,以Nordic nRF52810为例,每1秒钟Master和Slave通信1次,平均功耗约为6微安左右。

        Master不可能时时刻刻都有数据发给slave,所以master大部分时候都是发的空包(empty packet)给slave。同样slave也不是时时刻刻都有数据给master,因此slave回复给master的包大部分时候也是空包。另外在一个connection event期间,master也可以发多个包给slave,以提高吞吐率。综上所述,连接成功后的通信时序图应该如下所示:

图7: 连接成功后的通信时序图(每个connection event只发一个包)

图9: 连接成功后的通信时序图( connection event可能发多个包)

图10:connection event细节图

5. Slave latency

图10中出现了slave latency(slave latency = 1),那么什么叫slave latency?

        如前所述,在每一个connection interval开始的时候,Master和Slave必须交互一次,哪怕两者之间交互的是empty packet(空包),但如果slave定义了slave latency,比如slave latency = 9,此时slave可以每9个connection interval才回复一次master,也就是说slave可以在前面8个connection interval期间一直睡眠,直到第9个connection interval到来之后,才回复一个packet给master,这样将大大节省slave的功耗,提高电池续航时间。当然如果slave有数据需要上报给master,它也可以不等到第9个connection interval才上报,直接像正常情况进行传输即可,这样既节省了功耗,又提高了数据传输的实时性。

6. GAP层角色总结

       对上面提到的手机和设备B,在BLE通信过程中,随着时间的推移,他们的状态在发生变化,两者的关系也在发生变化,为此蓝牙spec根据不同的时间段或者状态给手机和设备B取不同的名字,即GAP层定义了如下角色:

  • advertiser。 发出广播的设备
  • observer或者scanner。可以扫描广播的设备
  • initiator。能发起连接的设备
  • master或者central。连接成功后的主设备,即主动发起packet的设备
  • slave或者peripheral。连接成功后的从设备,即被动回传packet的设备

图11通过时间把observer,initiator和central串起来了,其实这三个角色是相互独立的,也就是说一个设备可以只支持observer角色,而不支持initiator和central角色。同样,图11也把advertiser和peripheral串起来了,其实advertiser和peripheral也是相互独立的,即一个设备可以只作为advertiser角色,而不支持peripheral角色。

图11:GAP层角色

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: .NET是一种开放源代码的编程框架,可扩展到多个操作系统,并且可以用于开发各种类型的应用程序。插件(Plugin)是.NET框架中一种常用的编程模式,用于将一些功能模块与应用程序分开,从而提高应用程序的可维护性和扩展性。 蓝牙(Bluetooth)是一种无线通信技术,可用于短距离的数据传输。BLE(Bluetooth Low Energy)是一种低功耗的蓝牙技术,常用于智能设备之间的互联和传输。 在.NET应用程序中使用插件和BLE蓝牙通信可以实现许多功能,例如将应用程序与智能设备连接,传输数据等等。为了实现这个功能,我们可以使用.NET框架提供的BluetoothLEAdvertisementWatcher类和BluetoothLEDevice类来识别设备并与之交互。同时,我们还需要编写插件来处理BLE设备与应用程序之间的通信和数据传输。 .NET插件和BLE蓝牙通信的实例有很多,例如可以开发一个智能家居管理系统,通过插件将应用程序连接到家里的智能设备,实现智能控制和管理。又如可以开发一款健康管理应用,通过BLE蓝牙通信将应用程序与健康设备连接,实现健康数据的收集和分析。 总之,在.NET应用程序中使用插件和BLE蓝牙通信可以实现许多有趣和实用的功能,开发者可以根据自己的需求和兴趣来尝试开发此类应用程序。 ### 回答2: .net plugin.ble 蓝牙通信实例是利用.net平台及其插件技术,实现蓝牙设备和计算机之间的通信的示例。该实例可以为开发人员提供参考和学习,帮助他们了解如何利用.net平台及其插件技术,与蓝牙设备进行通信。 在实现该实例时,我们需要使用一些相关的插件及库文件,例如.net framework、蓝牙通信插件等。在开发过程中,我们需要根据具体的需求,设计蓝牙通信协议,并实现相应的接口功能。 实现蓝牙通信的过程中,需要首先进行设备扫描,找到需要连接的蓝牙设备,并建立连接。接着,将需要传输的数据封装成相应的协议格式,进行数据交互。在数据交互的过程中,可以通过插件提供的相关函数,对数据进行加密解密等处理,以确保通信的安全性。 总之,.net plugin.ble 蓝牙通信实例是一个较为典型的应用示例,它集成了.net平台的优势和插件技术的便利性,可以帮助开发人员更轻松地实现与蓝牙设备之间的通信。 ### 回答3: .net framework是微软研发的一种框架,可以用在许多不同类型的应用程序中。Plugin.ble是一种基于商店系统和三星BLE SDK的蓝牙通信插件。当这两个技术结合在一起时,可以实现许多不同的用例,例如在店铺中展示物品并使用BLE连接进行支付、收集数据或启动应用程序。 使用Plugin.ble插件,可以轻松地在.net应用程序中实现蓝牙连接。在此之前,如果想要实现蓝牙连接,通常需要编写很多代码。而Plugin.ble提供了一种更加简单和快速的方法,使得开发人员可以专注于业务逻辑而不需要过多考虑技术层面的实现细节。 例如,可以使用Plugin.ble插件和三星BLE SDK实现将应用程序连接到周围的BLE设备。通过Plugin.ble,开发人员可以轻松设置设备以及查询设备的信号和服务列表。借助此插件,可以通过简单的代码即可实现BLE通信,而不需要操作三星BLE SDK。 总之,通过使用Plugin.ble插件,开发人员可以轻松地将蓝牙通信功能集成到其应用程序中,而不会影响程序的其他方面。这种简单并且快速的集成方法可以节省时间和开发成本,使得开发人员能够更加专注于业务逻辑的开发。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值