QN9022自定义广播包数据

本文介绍了QN9022蓝牙模块的广播包数据结构,包括adv_data和scanrsp_data,重点讲解如何在app_set_adv_data函数中设置广播包,包含数据类型代码和数据长度的设定。同时,对于长名称或大量自定义信息,建议在app_set_scan_rsp_data函数中利用GAP_AD_TYPE_MANU_SPECIFIC_DATA添加制造商特定数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值