动态广告数据¶
我们刚刚探索了我们如何在运行时创建广告的BD名称。广告数据可以包含多种其他数据类型的多个段,其中一些可以携带动态应用数据 - 意味着随时间变化的数据。动态数据可以是传感器数据或广告有意义的数据。广告传感器数据的优点是我们可以在不需要进入BLE连接的情况下传输数据。通过对我们的数据进行广告,我们可以同时可用于无限数量的中央设备,例如智能手机。
通常,在以下广告数据类型之一中提供动态广告数据:
gap_ad_type_service_16_bit_data.
,16bit uuid服务数据,当数据与蓝牙SIG所采用的配置文件相关联时使用gap_ad_type_service_128_bit_data.
,用于自定义服务数据的128位UUDI服务数据,无需限制gap_ad_type_manu_specific_data.
,制造商特定数据需要使用Bluetooth®SIG注册的16位公司标识符亚博全网
我们将使用下面的未关闭的128bit UUID服务广告数据类型。只要您遵守其特定限制,所示的方法将与任何其他类型的任何其他类型相同地工作。
128位UUID服务数据段由4个部分组成:
不包括长度场本身的段的一个八位字节长度
广告数据类型,
gap_ad_type_service_128_bit_data.
128bit(16个八位字节)普遍唯一的标识符或UUID
我们要宣传的数据的价值。
在本教程的前一部分中,我们演示了如何在运行时设置BD名称。为了简化本教程的这一部分,我们将恢复为默认广告,让SDK构建完整的广告包。
在user_callback_config.h.,更改以下声明(突出显示部分)
静止的const塑造default_app_operations.user_default_app_operations.={。default_operation_adv.=user_advertise_operation.那};
为此:
静止的const塑造default_app_operations.user_default_app_operations.={。user_operation_adv.=default_advertise_operation.那};
笔记
在我们恢复默认的广告后,BD名称也将恢复到“带阴影的笑脸”表达。
如前所述,我们将使用gap_ad_type_service_128_bit_data.
宣传动态数据。我们的数据将是一个八位字节的一个简单的柜台,我们将使用计时器递增。我们将随机生成数据的UUID。我们现在可以计算长度字段,如下所示:
1个八位字节数据类型(
gap_ad_type_service_128_bit_data.
是定义的Gap.h.AS 0x21)16个八位字节UUID(我们将使用0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11)
1字节的数据(我们将从0x00的值开始)
因此,长度字段必须为18个八位字节或0x12,用于沉迷于十六进制符号的人。
格式化为字符串,数据将如下所示:
\ X12 \ X21 \ X11 \ X11 \ X11 \ X11 \ X11 \ X11 \ X11 \ X11 \ X11 \ X11 \ X11 \ X11 \ X11 \ X11 \ X11 \ X11 \ X00
在user_config.h.,将此字符串插入到
user_advertise_data.
定义:
#定义USER_ADVERTISE_DATA “\ X18 \ X21 \ X11 \ X11 \ X11 \ X11 \ X11 \ X11 \ X11 \ X11 \ X11 \ X11 \ X11 \ X11 \ X11 \ X11 \ X11 \ X11 \ X00”
我们需要在睡眠期间保留我们的柜台值。在user_empty_periphhral_template.c.,在Include语句下方,请添加以下内容:
uint8_t.my_counter.__section_zero.(“Retention_mem_area0”)=0.;// @retention内存
我们必须初始化我们的柜台。为此,我们将重新路由.app_on_init.
回调对用户空间。
在user_callback_config.,改变回调
default_app_on_init.
至user_app_on_init.
:
静止的const塑造ARCH_MAIN_LOOP_CALLBACKS.user_app_main_loop_callbacks.={。app_on_init.=user_app_on_init.那〜
现在,在底部向此功能添加原型user_peripheral_template.h.:
空白user_app_on_init.(空白);
这为我们提供了一种函数,我们可以用于初始化我们的全局变量以及启动数据更新计时器。在底部user_peripheral_template.c.,添加以下代码:
空白user_app_on_init.(){我的柜台=0.;app_easy_timer.(100.那update_add_data.)//一秒钟的单次计时器//我们初始化了我们的变量后,我们调用默认处理程序default_app_on_init.();}
然后,我们可以在此功能上实现我们的计时器处理程序:
空白update_add_data.(){my_counter.++;//将计数器值复制到广告数据中(忽略扫描响应数据)uint8_t.adv_data.[user_advertise_data_len.];梅检(&adv_data.那user_advertise_data_len.那user_advertise_data_len.);//将计数器值加载到广告数据的最后八位字节中adv_data.[user_advertise_len.-1]=my_counter.;//更新广告数据app_easy_gap_update_add_data.(adv_data.那user_advertise_data_len.那空值那空值);//重新启动计时器app_easy_timer.(100.那update_add_data.)//一秒钟的单次计时器}