1.概述
对于BLE的开发,大部分的BLE开发者都是在BLE芯片原厂的SDK基础上进行BLE的应用开发,而对于BLE的协议、框架知之甚少. 另外芯片原厂也不会暴露过多底层的接口给到开发者,开发者想要深入理解也无法下手,然而Linux平台提供了一个开源的蓝牙协议栈BlueZ(传统蓝牙+BLE), 给了BLE开发者一个深入理解的入口,无论你是Linux还是RTOS的开发人员,只要希望能够对BLE有更深入的理解,都希望能开始接触到Linux下的BLE Over Bluez的开发、学习。
本篇文章主要是基于Bluez提供的bluetoothctl工具进行操作,完成基于Bluez的BLE广播包注册、BLE服务添加、BLE服务下的特征添加, 带大家先从工具的方式开始上手BLE Over Bluez的开发.
2. 准备工作
在进行bluetoothctl工具 操作蓝牙时,需要确保Linux系统已经安装了该工具。如果没有改命令请自行安装。
下面是我使用的相关版本:
- bluez-5.69
- dbus-1.13.18
- glib-2.45.3
- rtl8822cs - 蓝牙/Wi-Fi模组
因为项目上主控使用的是国科微GK7202V330在此以它进行演示,也可以使用PC机安装ubuntu或VM进行测试,效果都是一样的。
3. 蓝牙广播包
3.1 通过BlueZ工具进行设置广播包
# 输入bluetoothctl进入交互
/usr/lib # bluetoothctl
# 进入advertise子菜单
[bluetooth]# menu advertise
# 设置自定义广播字段, manufacturer 是指厂商可以自定义
[bluetooth]# manufacturer 0xfff1 0x12 0x35
# 返回上一级菜单
[bluetooth]# back
# 开启广播
[bluetooth]# advertise on
[bluetooth]# hci0 advertising_added: instance 1
[bluetooth]# [CHG] Controller BC:FD:0C:0F:03:B3 SupportedInstances: 0x04 (4)
[bluetooth]# [CHG] Controller BC:FD:0C:0F:03:B3 ActiveInstances: 0x01 (1)
[bluetooth]# Advertising object registered
[bluetooth]# Manufacturer: 65521
[bluetooth]# 12 35 .5
[bluetooth]# Tx Power: off
[bluetooth]# Name: off
[bluetooth]# Appearance: off
[bluetooth]# Discoverable: on
[bluetooth]# RSI: on
[bluetooth]#
通过BLE调试宝就可以看见刚自定义的广播数据:

特别注意有些广播类型是不允许设置的,需要通过专门的指令进行设置。
如以下这些都拒绝通过data进行设置:
static uint8_t type_reject_list[] = {
BT_AD_FLAGS,
BT_AD_UUID16_SOME,
BT_AD_UUID16_ALL,
BT_AD_UUID32_SOME,
BT_AD_UUID32_ALL,
BT_AD_UUID128_SOME,
BT_AD_UUID128_ALL,
BT_AD_NAME_SHORT,
BT_AD_NAME_COMPLETE,
BT_AD_TX_POWER,
BT_AD_CLASS_OF_DEV,
BT_AD_SSP_HASH,
BT_AD_SSP_RANDOMIZER,
BT_AD_DEVICE_ID,
BT_AD_SMP_TK,
BT_AD_SMP_OOB_FLAGS,
BT_AD_PERIPHERAL_CONN_INTERVAL,
BT_AD_SOLICIT16,
BT_AD_SOLICIT128,
BT_AD_SERVICE_DATA16,
BT_AD_PUBLIC_ADDRESS,
BT_AD_RANDOM_ADDRESS,
BT_AD_GAP_APPEARANCE,
BT_AD_ADVERTISING_INTERVAL,
BT_AD_LE_DEVICE_ADDRESS,
BT_AD_LE_ROLE,
BT_AD_SSP_HASH_P256,
BT_AD_SSP_RANDOMIZER_P256,
BT_AD_SOLICIT32,
BT_AD_SERVICE_DATA32,
BT_AD_SERVICE_DATA128,
BT_AD_LE_SC_CONFIRM_VALUE,
BT_AD_LE_SC_RANDOM_VALUE,
BT_AD_LE_SUPPORTED_FEATURES,
BT_AD_CHANNEL_MAP_UPDATE_IND,
BT_AD_MESH_PROV,
BT_AD_MESH_DATA,
BT_AD_MESH_BEACON,
BT_AD_3D_INFO_DATA,
BT_AD_MANUFACTURER_DATA,
};
bool bt_ad_add_data(struct bt_ad *ad, uint8_t type, void *data, size_t len)
{
size_t i;
if (!ad)
return false;
if (len > (size_t)(ad->max_len - 2))
return false;
for (i = 0; i < sizeof(type_reject_list); i++) {
if (type == type_reject_list[i])
return false;
}
return ad_replace_data(ad, type, data, len);
}
它们都需要通过专门的指令去设置:

3.2 通过hcitool设置广播包
hciconfig hci0 leadv 3
hcitool -i hci0 cmd 0x08 0x0008 1E 02 01 1A 1A FF 4C 00 02 15 63 6F 3F 8F 64 91 4B EE 95 F7 D8 CC 64 A8 63 B5 00 01 00 02 C5
922

被折叠的 条评论
为什么被折叠?



