BLE中的蓝牙连接
博主刚刚接触蓝牙,通过参考网上一些深度好文,做了一些整理,有理解错误的地方欢迎大佬指正!!
参考文档:
https://www.cnblogs.com/dirt2/p/6250410.html
https://blog.csdn.net/T_haiya/article/details/84579480
https://www.cnblogs.com/iini/p/8972635.html
建立连接过程
-
处于connectable状态设备(Advertiser),按照一定的周期广播ADV_IND或者ADV_DIRECT_IND包
-
主动连接的设备(Initiator),收到广播包,回应一个CONNECT_REQ请求,该数据包带有连接参数
-
Initiator在发出CONNECT_REQ数据包之后,直接转化为Connection状态,成为Master角色(注意:这是“自动”的,不需要等待另一方的回应)。同样,Advertiser在收到CONNECT_REQ请求之后,也自动转变为Connection状态,成为Slave角色。
Initiator发出CONNECT_REQ,变为Connection态,但是收到Advertiser发回的ack,才算连接成功。
在这里有时会出现bug,即程序中收到了连接成功的回调函数,但实际上并没有收到ack,没有连接成功
- 此后,双方按照CONNECT_REQ参数所给出的约定,定时到切换到某一个Physical Channel上,按照Master->Slave然后Slave->Master的顺序,收发数据,直至连接断开。
连接参数
CONNECT_REQ PDU的payload中,定义和连接有关的参数。格式如下
InitA (6 octets)蓝牙地址 | AdvA (6 octets)Slave蓝牙地址 | LL Data (22 octets) |
---|
LL data则包含了所有的连接参数,包括: