动态广告数据

我们刚刚探索了我们如何在运行时创建广告的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.//一秒钟的单次计时器}