目前看spec是没有中文版的,都是英文
经典蓝牙和BLE你可以把它们区分成为两个不同的设备,但是使用同一条天线,物理地址也不同,手机扫描的话也是两个设备
看spec可以看两部分charts,就是连接的图表,这个两部分charts,可以代表core spec了
主要分成两部分,其一是经典蓝牙,其二是BLE
第一是经典蓝牙的
Vol2 part F Message Sequence charts
可以很清楚看到经典蓝牙的连接过程,通过这些过程在去看其他部分,经典蓝牙主要是LMP控制比较多,连起来就看L2CAP数据格式了。
经典蓝牙概要流程:
主端发paging req(发送ID packet ID上放对端的物理地址LAP)->对端发paging rsp(回ID packet)->主端发FHS(主要是同步CLK)->对端回ID->然后主端各种LMP控制req->对端发LMP控制rsp(也可以做role switch)->主端发L2CAP参数req->对端发L2CAP参数rsp->主端发L2CAP连接(带上CID编号包括avdtp rfcomm avctp hfp 各种协议) req->对端发L2CAP连接rsp->然后是各种上层协议数据交互,这个就比较容易看了
第二部分是低功耗蓝牙的就是BLE
Vol6 part D Message sequence charts
也可以看到BLE的链接方式,然后再对着看其他部分,主要是LinkLayer层控制比较多,连起来也是L2CAP,不过基本上都是ATT的数据。
BLE的场景可以使用nrf connect app或者ios light blue app玩一下,
我们一般的开发的传感器设备,会做一个advertister salve 服务器, app对应的手机蓝牙会做一个scanner master client
BLE的概要流程
advertister广播(广播自己的蓝牙地址和UUID)->scanner 收到之后发一个scan req(同时带上自己的蓝牙地址)->
advertister 发一个scan rsp(带上自己的蓝牙名称)->【然后你手动点一下app上面的要连接的设备】scanner 就会发一个
connection indication packet(这个时候会带上transmit window的参数还有offset interval 表示多久之后会给你发包来连接advertister) ->scanner 发送L2CAP 参数update的req(主要是internal 和 Timeout) ->advertister回包是否接受->advertister 发LLCP connection update indication(这个东西非常重要,就是我们经常在设备上面调试的连接间隔或者丢包次数之类的参数,
影响BLE功耗,每次update都由我们设备发出)->接下来就是scanner(Master)exchange MTU(询问一次传输多少个字节,一般蓝牙4.2之前是一次只能传输27个字节的,4.2之后是255) ->scanner(Master)ATT read by group type(主要是找到attribute的标签组)->scanner(Master)ATT read by type(直接读对应的标签)->scanner(Master)ATT write(写对应标签的disable indication and enable notificition 打开notificition) ->最后就是手机的app每隔一个interval发空包给我们设备,然后我们设备给对应标签的数据。
说到标签为就有一种灵感,包括经典蓝牙的L2CAP的CID标签, ATT的标签,还有WIFI MQTT的TOPIC 标签,还有WIFI HTTP的域
我的感觉就是,标签其实就是IOT中,就是一个标志性的和C语言底层HANDLE一样存在的一个核心