【BLE 5.3无线MCU CH582】10、ble广播者角色
[复制链接]
本帖最后由 freeelectron 于 2022-3-28 14:41 编辑
系列文章:
【BLE 5.3无线MCU CH582】1、初识CH582开发板(开箱)
【BLE 5.3无线MCU CH582】2、MounRiver IDE初体验
【BLE 5.3无线MCU CH582】3、非阻塞方式点灯
【BLE 5.3无线MCU CH582】4、串口不定长数据接收
【BLE 5.3无线MCU CH582】5、硬件I2C驱动0.96吋OLED
【BLE 5.3无线MCU CH582】6、pwm呼吸灯
【BLE 5.3无线MCU CH582】7、按键——GPIO外部中断
【BLE 5.3无线MCU CH582】8、adc采样(内部bat、内部温度,外部输入)
【BLE 5.3无线MCU CH582】9、硬件spi驱动lcd
0、前面的话
一般蓝牙的协议栈,都符合蓝牙核心规范,蓝牙核心规范可以从蓝牙联盟的官网上下载到,但是各个厂家的蓝牙协议栈都是不开源的,典型的协议栈有nimble,bluedroid,其中bluedroid也是安卓说是用的协议栈,本文使用的ch58x,协议栈是不开源的,官方以静态库(LIBCH58xBLE.a)的形式给出,因此只需要关心api即可,api相关文件是CH58xBLE_LIB.h。
1、GAP层四种角色
Broadcaster :广播者,广播数据,不支持连接;
Observer :观察者,接收广播数据,不支持连接;
Peripheral :外围设备,也叫从机,只支持单一链接;
Central :中心设备,也叫主机,支持多个连接。
2、广播数据格式
可以看出广播数据格式由多个AD Structure 组成,每个AD Structure 由3部分构成,Length 、AD Type 、AD Data 组成,Length为1字节,表示AD Type、AD Data的总长度,现有的AD Type也都是一字节的。
3、CH58x中关于广播数据类型的定义
// GAP_ADTYPE_DEFINES GAP Advertisement Data Types
#define GAP_ADTYPE_FLAGS 0x01 //!< Discovery Mode: @ref GAP_ADTYPE_FLAGS_MODES
#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: -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 //!< Security 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 - 16-bit UUID
#define GAP_ADTYPE_PUBLIC_TARGET_ADDR 0x17 //!< Public Target Address
#define GAP_ADTYPE_RANDOM_TARGET_ADDR 0x18 //!< Random Target Address
#define GAP_ADTYPE_APPEARANCE 0x19 //!< Appearance
#define GAP_ADTYPE_ADV_INTERVAL 0x1A //!< Advertising Interval
#define GAP_ADTYPE_LE_BD_ADDR 0x1B //!< LE Bluetooth Device Address
#define GAP_ADTYPE_LE_ROLE 0x1C //!< LE Role
#define GAP_ADTYPE_SIMPLE_PAIRING_HASHC_256 0x1D //!< Simple Pairing Hash C-256
#define GAP_ADTYPE_SIMPLE_PAIRING_RANDR_256 0x1E //!< Simple Pairing Randomizer R-256
#define GAP_ADTYPE_SERVICE_DATA_32BIT 0x20 //!< Service Data - 32-bit UUID
#define GAP_ADTYPE_SERVICE_DATA_128BIT 0x21 //!< Service Data - 128-bit UUID
#define GAP_ADTYPE_URI 0x24 //!< URI
#define GAP_ADTYPE_SUPPORTED_FEATURES 0x27 //!< LE Supported Features
#define GAP_ADTYPE_CHANNEL_MAP_UPDATE 0x28 //!< Channel Map Update Indication
#define GAP_ADTYPE_BIG_INFO 0x2C //!< BIGInfo
#define GAP_ADTYPE_BROADCAST_CODE 0x2D //!< Broadcast_Code
#define GAP_ADTYPE_3D_INFO_DATA 0x3D //!< 3D Information Data
#define GAP_ADTYPE_MANUFACTURER_SPECIFIC 0xFF //!< Manufacturer Specific Data: first 2 octets contain the Company Identifier Code followed by the additional manufacturer specific data
可以看出只规定了部分,剩余未定义的,其余可以自定义使用。
4、CH58x代码中关于广播数据的定义
static uint8 advertData[] = {
// Flags; this sets the device to use limited discoverable
// mode (advertises for 30 seconds at a time) instead of general
// discoverable mode (advertises indefinitely)
0x02,// length of this data
GAP_ADTYPE_FLAGS,
GAP_ADTYPE_FLAGS_BREDR_NOT_SUPPORTED,
// Broadcast of the data
0x04,// length of this data including the data type byte
GAP_ADTYPE_MANUFACTURER_SPECIFIC, // manufacturer specific advertisement data type
'b', 'l', 'e',
0x06,
GAP_ADTYPE_LOCAL_NAME_SHORT,
'm','y','b', 'l', 'e',
0x03,
GAP_ADTYPE_APPEARANCE,
(GAP_APPEARE_GENERIC_TAG>>0)&0xff,
(GAP_APPEARE_GENERIC_TAG>>8)&0xff,
0x07,
0xfe,
0x01,0x02,0x03,0x04,0x05,0x06,
};
其中GAP_ADTYPE_FLAGS是标志;
GAP_ADTYPE_MANUFACTURER_SPECIFIC:标识厂商,如果是蓝牙联盟的会员,会给分配一个固定值,用来表示某个具体的厂商;
GAP_ADTYPE_LOCAL_NAME_SHORT:蓝牙名称;
GAP_ADTYPE_APPEARANCE:外观,例如设备是一个蓝牙耳机,鼠标等,蓝牙核心规范里面都有对应的定义,本文测试显示为一个tag;
0xfe,是个人自定义的一个,可以通过这个传递一些私有数据。
5、app调试
本文使用“nRF Connect”进行测试
可以看出广播数据,刚好是我们代码中设定的,其中蓝牙联盟规定的一些,可以显示出具体的含义,个人自定义的是不能显示的。
|