QN9022的广播包数据有两种:
1、广播包 adv_data,最大长度31字节
2、反馈包 scanrsp_data,最大长度31字节
以上两种广播包都可以包含多组数据,第一组数据的格式为:
长度+数据类型代码+数据
一、广播包 adv_data,在函数app_set_adv_data里:
// Advertising data, BLE only, general discovery mode and short device name
app_env.adv_data[0] = 0x02;
app_env.adv_data[1] = GAP_AD_TYPE_FLAGS;
if (GAP_GEN_DISCOVERABLE == (disc_mode & GAP_GEN_DISCOVERABLE))
{
/// Mode in general discoverable
app_env.adv_data[2] = 0x06;
}
else if (GAP_LIM_DISCOVERABLE == (disc_mode & GAP_LIM_DISCOVERABLE))
{
/// Mode in limited discoverable
app_env.adv_data[2] = 0x05;
}
else
{
/// Mode in non-discoverable
app_env.adv_data[2] = 0x04;
}
以上的app_env.adv_data[0]=2,为长度。
app_env.adv_data[1]=GAP_AD_TYPE_FLAGS; 为数据格式,广播包
app_env.adv_data[2] = 0x06; /// Mode in general discoverable 该字节为数据
以上三个字节是说明了该广播包的类型,总长度为3个字节,app_env.adv_data[0]=2是不包含本身这1个字节的。
函数的最后几行是重点:
nvds_tag_len_t name_length = 31 - 5; // The maximum length of Advertising data is 31 Octets
if (NVDS_OK != nvds_get(NVDS_TAG_DEVICE_NAME, &name_length, &app_env.adv_data[5]))
{
// NVDS is empty, use default name
name_length = strlen(QN_LOCAL_NAME);
strcpy((char *)&app_env.adv_data[5], QN_LOCAL_NAME);
}
else
{
name_length--; // Discard '\0'
}
app_env.adv_data[3] = name_length + 1;
app_env.adv_data[4] = GAP_AD_TYPE_SHORTENED_NAME;
len = 5 + name_length;
#endif
return len;
}
app_env.adv_data[3]是本组广播包的长度,即 把设备的蓝牙名字的长度 + 1个字节的数据类型。
app_env.adv_data[4] = GAP_AD_TYPE_SHORTENED_NAME; 就是蓝牙名字类型
以上的广播包包含了两组信息,总长度就是 5 + name_length,把这个长度返回。
所以,如需要加自定义信息在这个包的话,注意总长度,如果还不到31字节的话,可以再加,注意不能超过31个字节。
如果蓝牙名字太长,或自定义信息有点多的话,可以考虑放在response包里:
在函数:app_set_scan_rsp_data里:
#if BLE_QPP_SERVER
if (srv_flag & BLE_QPPS_SERVER_BIT)
{
app_env.scanrsp_data[0] = ATT_UUID_128_LEN + 1;
app_env.scanrsp_data[1] = GAP_AD_TYPE_MORE_128_BIT_UUID;
memcpy(app_env.scanrsp_data + 2, QPP_SVC_PRIVATE_UUID, ATT_UUID_128_LEN);
return (ATT_UUID_128_LEN + 2);
}
#endif
格式与第一种包相同,可以在此基础上再加个自定义的包,总长度也不能大于31字节。
加的包的第二个字节是数据类型,要写成:GAP_AD_TYPE_MANU_SPECIFIC_DATA // Manufacturer specific data