1 bluetooth 蓝牙协议
什么是蓝牙呢?蓝牙是频率为2.4GHz的特高频无线通讯标准;按协议制定的时间将其分为两种类型;
1.1 经典蓝牙BT:以点对点方式创建一对一通信;使用蓝牙3.0标准协议;
1.2 低功耗蓝牙BLE :以广播(一对多)和网格(多对多)等通信; 使用蓝牙4.0标准协议,兼容3.0;
2 ( C/S client server )架构
c/s架构通信的双方总是由client客户端的主机发起,server服务端的从机响应;gatt协议使用c/s架构;
2.1 client客户端: 使用数据服务的设备,即主机设备;
2.2 server服务端:提供数据服务的设备,即从机设备; 数据服务:即service服务;
2.3 gatt协议传输
attribute指令在发送出去之后,会一直等待直到收到回复的ack包,直到超时或断开ble;杜绝了空中丢包的可能性;
attribute指令可以选择request/ack的模式,也可以选择request/respond的模式;
3 蓝牙协议栈架构
蓝牙协议栈主要分为三层;
其中GAP协议后文介绍了其广播包部分,其中GATT协议后文介绍了其attribute table部分;application层等价于profile协议部分;
3.1 controller层
由芯片厂编写的硬件层,包括射频电路,将HCI数据按空中包的格式调制解调的链路层,以及规范通信的hci接口;
3.2 host层
由各公司配置的驱动层,用于连接硬件与应用层的通信,需要配置的主要是配置gatt和gap;
3.2.1 GAP generic access profile 通用连接协议
当从机还未建立连接的时候,通过GAP协议单向向外广播数据,该协议通常由芯片产商写好;
从机广播间隔约20ms-10s,主机扫描间隔约2.5ms-10s;广播间隔越长越省电,同时也不容易被扫描到;
3.2.2 GATT generic attribute profile 通用属性协议
当从机和主机建立一对一连接,通过GATT协议进行通信,该协议结构即后文的attribute profile;
GATT连接属于一对一连接,从机和主机建立连接之后,就会停止向外广播使得对其他设备不可见;当设备断开后设备又开始广播;
3.3 application层
由各公司编写的的应用层,每个代码功能都可视为profile;蓝牙联盟也定义了相关功能的标准profiles,看情况使用;
4 广播数据
4.1 广播包 adv_data[ ]
广播包的主要作用是用来广播蓝牙设备名称,以及广播部分需要广播的类型数据;
广播包的数据单元可以切分为[ length、type、data ]的格式进行广播,广播包的数据长度最大31bytes;
4.1.1 type类型
//gap_le_types.h 广播包type类型
#define GAP_ADTYPE_FLAGS 0x01 //!< The Flags data type contains one bit Boolean flags. Please reference @ref ADV_TYPE_FLAGS for details.
#define GAP_ADTYPE_16BIT_MORE 0x02 //!< Service: More 16-bit UUIDs available
#define GAP_ADTYPE_16BIT_COMPLETE 0x03 //!< Service: Complete list of 16-bit UUIDs
#define GAP_ADTYPE_32BIT_MORE 0x04 //!< Service: More 32-bit UUIDs available
#define GAP_ADTYPE_32BIT_COMPLETE 0x05 //!< Service: Complete list of 32-bit UUIDs
#define GAP_ADTYPE_128BIT_MORE 0x06 //!< Service: More 128-bit UUIDs available
#define GAP_ADTYPE_128BIT_COMPLETE 0x07 //!< Service: Complete list of 128-bit UUIDs
#define GAP_ADTYPE_LOCAL_NAME_SHORT 0x08 //!< Shortened local name
#define GAP_ADTYPE_LOCAL_NAME_COMPLETE 0x09 //!< Complete local name
#define GAP_ADTYPE_POWER_LEVEL 0x0A //!< TX Power Level: 0xXX: -127 to +127 dBm
#define GAP_ADTYPE_OOB_CLASS_OF_DEVICE 0x0D //!< Simple Pairing OOB Tag: Class of device (3 octets)
#define GAP_ADTYPE_OOB_SIMPLE_PAIRING_HASHC 0x0E //!< Simple Pairing OOB Tag: Simple Pairing Hash C (16 octets)
#define GAP_ADTYPE_OOB_SIMPLE_PAIRING_RANDR 0x0F //!< Simple Pairing OOB Tag: Simple Pairing Randomizer R (16 octets)
#define GAP_ADTYPE_SM_TK 0x10 //!< Security Manager TK Value
#define GAP_ADTYPE_SM_OOB_FLAG 0x11 //!< Secutiry Manager OOB Flags
#define GAP_ADTYPE_SLAVE_CONN_INTERVAL_RANGE 0x12 //!< Min and Max values of the connection interval (2 octets Min, 2 octets Max)
// (0xFFFF indicates no conn interval min or max)
#define GAP_ADTYPE_SIGNED_DATA 0x13 //!< Signed Data field
#define GAP_ADTYPE_SERVICES_LIST_16BIT 0x14 //!< Service Solicitation: list of 16-bit Service UUIDs
#define GAP_ADTYPE_SERVICES_LIST_128BIT 0x15 //!< Service Solicitation: list of 128-bit Service UUIDs
#define GAP_ADTYPE_SERVICE_DATA 0x16 //!< Service Data
#define GAP_ADTYPE_PUBLIC_TGT_ADDR 0x17 //!< Public Target Address
#define GAP_ADTYPE_RANDOM_TGT_ADDR 0x18 //!< Random Target Address
#define GAP_ADTYPE_APPEARANCE 0x19 //!< Appearance
#define GAP_ADTYPE_ADV_INTERVAL 0x1A //!< Advertising Interval
#define GAP_ADTYPE_LE_BT_ADDR 0x1B //!< LE Bluetooth Device Address
#define GAP_ADTYPE_LE_ROLE