蓝牙协议知识总结
蓝牙设备 和 主机进行连接和数据通信的 流程如下:
1 外部设备发出广告 (带有UUID信息等其他信息);
2 主机(集中器设备)收到广告信息,进而发送扫描请求;表示我扫描到你的信息; 3 外部设备收到扫描请求后,返回扫描回应,表示我知道你扫描到我的信息; 4 主机进而发送连接请求信息,表示主机要跟设备建立无线连接; 5 设备收到连接请求后,发送相应请求回应;表示已经建立连接;
数据读写流程如下进一步(在建立连接的基础上):
6 主机发送主服务UUID(设备的广告UUID)给设备; 服务发现 7 设备收到后回应服务信息;
8 主机发送特性UUID; 特性发现 9 设备收到后回应特性值句柄;(类似于存储设备的地址)
10 主机发送特性值句柄; 读信息 11 设备收到后回应特性值;
12 主机发送特性值句柄和要写入值; 写信息 13 设备回应写入成功响应;
在睡眠状态,耗电只有1微安(uA),而在连接事件中最高的是10几个毫安
连接建立之后,再进行安全密钥的交换配对,进而进行数据的读写;
主机和从机绑定之后,断开连接后,可以快速的建立连接并进行加密读写,而不需要再次配对; 特点
1 低功耗蓝牙速度只有100bps ,传统蓝牙有3Mbps
2 低功耗蓝牙不需要IOS 的MFI 认证,传统蓝牙必须; 3 低功耗蓝牙能纽扣电池能用1年多,传统蓝牙不行;
频道:
2.4G – 2.48G 总共40个频段,每2M 一个频段;
其中 37(2.40G) ,38(2.426G) ,39(2.48G) 为 3个广播频道;这3个频道避开了wifi 常用的频道,与wifi可以共存; 其他37个为连接频道;
1、BLE中主从机建立连接,到配对和绑定的过程如下图。
正如上图所示,最简单一次蓝牙通信需要以上相关步骤,包括discovery device,connect,pairing,bond等4个主要部分。
1) 广播:广播包可以包含广播数据 ,广播包可以无指定或者对指定的设备发送。可以声明
该器件是可连接的还是不可连接的。在一次广播中,广播包可以在三个广播通道中同时发送。
广播类型 :1 未指定可连接 2 指定可连接 3 未指定 不可见 4 未指定不可连接 #define GAP_ADTYPE_ADV_IND 0x00 //!< Connectable undirected advertisement #define GAP_ADTYPE_ADV_DIRECT_IND 0x01 //!< Connectable directed advertisement
#define GAP_ADTYPE_ADV_DISCOVER_IND 0x02 //!< Discoverable undirected advertisement
#define GAP_ADTYPE_ADV_NONCONN_IND 0x03 //!< Non-Connectable undirected advertisement
#define GAP_ADTYPE_SCAN_RSP_IND 0x04 //!< Only used in gapDeviceInfoEvent_t
在peripheral.c中
GAPRole_Init( taskID++ ); 进行了初始化设置
还有有以下函数bStatus_t GAPRole_SetParameter( uint16 param, uint8 len, void *pValue )
GAPRole_GetParameter(…..)可以调用进行设置。 2) scanning
1) 被动扫描: 扫描者监听广播频道的广播包,收到后将其上传到host层
2) 主动扫描:扫描者监听广播频道的广播包,当收到广播包后扫描者发送一个scan
Request包,广播设备回应一个scan reponse包
3) Connection
在扫描设备扫描到一个可连接的广播消息后,扫描设备可以通过发送 connection reequst 包给广播设备从而成为连接的发起者
Connection resqust 包含从机链路层一系列的参数,这些参数声明连接时的通道
及时序要求。 建立连接
GAPCentralRole_EstablishLink( DEFAULT_LINK_HIGH_DUTY_CYCLE, DEFAULT_LINK_WHITE_LIST, addrType, peerAddr );
广播设备接收了连接请求,就进入了连接状态, 发起者成了主机,广播设备成了从机。 两个已连接的设备的所有通信发生在连接事件中,连接事件周期性的发生,周期由连接间隔参数决定。
连接间隔:使用调频的间隔;两个连接事件之间的时间间隔,蓝牙传数据是在一个频段发送
数据后,然后跳到另一个频段再传数据,从一个频道另一个频段的时间间隔就是连接间隔;即使没有数据发送,也要调频切换测试包是否连接断开;所以,连接间隔是定时的存在;可以认为是一个固定的时序;每隔一段时间就自动调到另一个频道的去建立连接;这个时间中,是很少功耗的,基本没有;
单位是1.25毫秒;范围是 6 ---- 3200个单位;也就是1.25ms到4s的范围 不同的应用 时间间隔不一样,
时间间隔长,功耗就低,传输数据慢; 时间间隔短,功耗就高,传输数据就快。
从机延时: 从机如果没有数据发送,可以跳过连接间隔,不用频繁的定时去建立连接,从
而过一段较长时间再去建立连接;这个时间就是从机延时时间;从而功耗降低很多;单位是和连接间隔一样;范围是 0---499
管理超时 超过这个时间,还没有建立连接,则认为是连接丢失,断开。回到未连接状态; 单位是10ms, 范围是 10(100ms)-----3200(32s)。超时值必须比有效连接间
隔大;有效连接间隔= 连接间隔×(1+从机延时)
如果从机不想使用当前的连接参数,可以向主机发送连接更新请求,从机设备可以在任何时
候发送连接更新请求,使得从机可以动态的调整连接参数。
GAPCentralRole_UpdateLink( simpleBLEConnHandle,
DEFAULT_UPDATE_MIN_CONN_INTERVAL, DEFAULT_UPDATE_MAX_CONN_INTERVAL, DEFAULT_UPDATE_SLAVE_LATENCY, DEFAULT_UPDATE_CONN_TIMEOUT );
无论主机还是从机,都可以无条件的终止当前连接,一方请求终止,另一方必须在断开连接状态之前响应。
连接还可以由超时而终止。超时时间小于32s ,大于有效连接间隔(连接间隔×(1+从机延时))
终止连接函数:
GAPCentralRole_TerminateLink( simpleBLEConnHandle );
主机和从机保存各自的超时计时器,每次收到数据包就清零,一旦达到超时数值,就认为连接已经丢失就会断开连接。
连接超时判断,终止连接在程序中还没找到。
2.BLE中的GAP和GATT
GAP个人认为就是监控上图中的交互状态,比如从广播变成连接,到配对等。
GATT通俗理解为用于主从机之间的客户端和服务器端的数据交互,以Attribute Table来体现。
GAP Role Profile:在GAP所处的4个角色:广播Advertise,主机central,从机Peripheral,观察者Observer。