蓝牙广播协议(二)

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值