• 蓝牙学习二(连接和通讯简述)


    1.简介

            蓝牙的通信是双向的,为了创建和维护一个BLE通信连接,在蓝牙中引入了“角色”这一概念,一个BLE设备不是主机(集中器)就是从机(外围设备)角色,这是根据是谁发起这个连接来确定的。主机(集中器)设备总是连接的发起者,而从机(外围设备)总是被连接者整个访问与连接过程都是在GAP(Generic Access Profile-通用访问规范进行实现的

    2.从机广播

            从机要被主机连接,那么它就必须先被主机发现。这个时候,从机设备把自身信息通过广播的形式发射出去

            比如设备A需要先进行广播,即设备A(Advertiser)不断发送广播信号,t 为广播间隔。每发送一次广播包,我们称为一次广播事件(advertising event),因此 t 也称为广播事件间隔广播事件时间是一段一段的,每次都会持续一段时间,蓝牙芯片也只有在广播事件期间才会打开射频模块发射广播,这个时间功耗比较高(几十毫安),其余时间蓝牙芯片都处于idle待机状态,因此平均功耗就非常低(几微安)。

            当广播发出的时候,每个广播事件包含了三个广播包分别在37/38/39三个广播信道上进行发送。广播的内容是相同的。下图observer为主机观察者,advertiser就是从机广播者。

     3.主机扫描

            设备A不断发送广播给主机(Observer),如果主机不开启扫描窗口是收不到设备A的广播的。主机不但要开启射频接收窗口,而且主机的射频接收窗口要跟从机的广播发送窗口匹配才行。由于这种配对成功时一个概率事件,所以手机扫到设备A也是一个概率事件。也就是说,从机(Advertiser)可能很快就被主机(Observer)发现,也有可能从机(Advertiser)要很久才能被主机(Observer)发现。

            下图表示了主机主动扫描广播的过程:

            主机设置自身的扫描参数,设置成功后,控制器根据设置参数开启扫描窗口。当控制器收到扫描数据包后,向主机发送给一个广播报告事件(adv_report),该事件同样包括了链路层数据包的广播类型。因此,主机能够判断对端设备是否可以连接或扫描,并且区分出广播数据包和扫描响应数据包。

     

    4.被动扫描

            既然有主动扫描,当然也就有被动扫描。在被动扫描中,扫描者设备应该仅仅去监听广播包,而不向广播者设备发送任何数据

            一旦上面的扫描参数设置完毕,主机就可以启动扫描。如果控制器接收到的符合过滤策略和其他规划的广播数据包,则发送一个Advertising Report事件给主机。除了广播者的设备地址外,报告事件还包括广播数据包中的数据,以及接收广播数据包时的信号接收强度。可以利用该信号强度以及位于广播数据包中的发射功率,共同确定信号的路径损失,从而给出大致的范围,这个应用就是防丢器和蓝牙定位。被动扫描不需要向主机发送任何数据。

            下图为被动扫描广播的过程:

    5.建立连接

            手机(主机)在收到A1广播包ADV_IND后,以此为初始点,T_IFS时间后,给Advertiser(从机)发送一个connection request命令,即A2数据包,告诉advertiser(从机)将要进行连接,做好准备。Advertiser(从机)根据connect_req命令信息做好接收准备connect_req其实就是告诉advertiser手机(主机)将在Transmit Window期间发送第一个同步包(P1),请advertiser(从机)在这段时间内打开接收窗口。设备B收到P1后,T_IFS时间后将给手机(主机)回复数据包P2。一旦手机(主机)收到数据包P2,连接即认为建立成功。后续手机(主机)将以P1为锚点(原点),Connection Interval为周期周期性地给设备B发送Packet

     6.发送与接收数据

            连接成功后,主机和从机在每一个connection interval开始的时候,都必须交互一次,即主机给从机发一个包,从机再给主机发一个包。整个交互过程被称为一个connection event。蓝牙芯片只有在connection event期间才把射频模块打开,此时功耗比较高,其余时间蓝牙芯片都处于idle状态,因此平均功耗非常低。

            主机不可能时时刻刻都有数据给从机,所以主机大部分时间都是发的空包(empty packet)给从机。同样从机也不是时时刻刻都有数据给主机。因此从机回复给主机的包,大部分也是空包。另外,一个connection event期间,主机可以发多个包给从机以提高吞吐率(IOS一个连接间隔最多交互4次,安卓一个连接间隔最多交互6次)。综上所述,连接成功后的通信时序图如下:

            图中,主从数据发送的数据包TX和RX表示方向性的数据通道,也就是蓝牙的空中属性,空中操作时间都是采用蓝牙操作句柄来进行的。因为句柄能够唯一表示各个属性。空中特性的性质包括:

    从机->主机方向:

    • 通知:从机端上报数据给主机,不需要主机回复一个响应
    • 指示:从机端上报数据给主机,需要主机端回复一个确认
    • 通知和指示之间不同之处在于指示有应用层上的确认,而通知没有

    主机->从机方向:

    • 没有回应的写
  • 相关阅读:
    SpringSecurity系列——持久认证(Persisting Authentication),会话管理day3-2(源于官网5.7.2版本)
    Python深度学习实践代码实现
    攻防世界-T1 Training-WWW-Robots
    算法提升:图的启发式搜索算法(A算法、A*算法)
    多个git提交,只推送其中一个到远程该如何处理
    第一百五十九回 SliverAppBar组件
    新型BI解决方案:SaaS BI,在浏览器上分析数据
    信号——信号处理函数和掩码
    Python判断多个文件夹的文件夹名是否包含“分公司”或“营销中心”怎么处理?(方法三)...
    Vue项目自动更换BaseUrl
  • 原文地址:https://blog.csdn.net/qq_26226375/article/details/127919515