3.改变广告参数

介绍修改DA14585/86或DA14531设备的发布参数。操作步骤它涵盖了所有与广告相关的关键要素,特别是广告数据和广告间隔,以及广告渠道图和广告模式。

3.1.改变广告数据

_images / Picture4.jpg

图8默认广告数据

  1. user_config.h,改变现有的内容USER_ADVERTISE_DATA宏到所需的广告数据。

    图9显示如何更改广告数据。由于广告字符串应该具有特定的格式,因此可以使用ADV_TYPE_MANUFACTURER_SPECIFIC_DATA宏将您希望的任何自定义数据添加到广告包中,如第2步所述。

_images / Picture5.jpg

图9更改制造商特定的数据

下面的示例代码演示如何设置一些自定义广告数据。它将设备的完整名称设置为THIS-IS-DIALOG

代码片段:

///广告数据#定义USER_ADVERTISE_DATA "\x11ADV_TYPE_MANUFACTURER_SPECIFIC_DATA \ADV_DIALOG_MANUFACTURER_CODE \“THIS-IS-DIALOG”

2.通常,广告数据包括一些特定于制造商的数据。这些数据在头文件中完全可定制user_barebone.h,如下图所示:

代码片段:

/*制造商指定的数据常量*/定义APP_AD_MSD_COMPAN亚博全网Y_ID (0xFEDE)#定义APP_AD_MSD_COMPA亚博全网NY_ID_LEN (2)定义APP_AD_MSD_DATA_LEN (uint16_t)

我们可以把公司数据改成亚博全网忠贞图10(屏幕截图来自BLE扫描仪)。

代码片段:

/*制造商指定的数据常量*/定义APP_AD_MSD_COMPAN亚博全网Y_ID (0xFEDE)
_images / Picture6.jpg

图10制造商特定的数据常数

当设备准备好开始广告时,它就会呼叫mnf_data_init ()user_app_init ().此功能设置一些标准参数,以便设备公开广播其广告数据。要发布的数据是从结构中复制的mnf_specific_data_ad_structure.最后,根据此配置要求设备开始发布广告。

代码片段:

无效user_app_init无效app_param_update_request_timer_usedEASY_TIMER_INVALID_TIMER//初始化制造商特定数据mnf_data_init();//初始化广告和扫描响应数据memcpystored_adv_dataUSER_ADVERTISE_DATAUSER_ADVERTISE_DATA_LEN);stored_adv_data_lenUSER_ADVERTISE_DATA_LENmemcpystored_scan_rsp_dataUSER_ADVERTISE_SCAN_RESPONSE_DATAUSER_ADVERTISE_SCAN_RESPONSE_DATA_LEN);stored_scan_rsp_data_lenUSER_ADVERTISE_SCAN_RESPONSE_DATA_LENdefault_app_on_init();

代码片段:

/******************************************************************************************初始化制造商特定数据* @返回void***************************************************************************************** /静态无效mnf_data_init()mnf_dataad_structure_size运算符结构体mnf_specific_data_ad_structure-运算符uint8_t);//减去ad_structure_size字段的大小mnf_dataad_structure_typeGAP_AD_TYPE_MANU_SPECIFIC_DATAmnf_data亚博全网company_id0APP_AD_MSD_亚博全网COMPANY_ID0 xff/ / LSBmnf_data亚博全网company_id1APP_AD_MSD_亚博全网COMPANY_ID>>80 xff/ /最高有效位mnf_dataproprietary_data00mnf_dataproprietary_data10

请注意

当设备准备好发布广告时,我们可能希望它调用一个自定义函数来处理广告数据。基本示例定期更新广告数据,并演示如何使用用户定义的函数处理广告内容。在这种情况下,我们必须修改相应的回调函数user_callback_config.h,如下面的代码示例中使用了该函数user_app_adv_start

user_app_adv_start ()是用户应用程序层中的用户定义函数,执行以下操作:

  • 在超时时启动应用程序计时器APP_ADV_DATA_UPDATE_TO

  • 更新广告数据中包含的制造商数据,请参见改变广告数据

  • 开始做广告。

代码片段:

//默认处理程序操作静态常量结构体default_app_operationsuser_default_app_operationsdefault_operation_advuser_app_adv_start};

另请参阅

DA14585/586和DA14531设备可以接收来自中央设备的扫描请求,以便通过扫描响应的方式传输额外的用户数据。扫描响应通常拥有比广告数据包更多的数据,长度从8字节到39字节不等,因为广告数据通常选择非常短的数据来最小化功耗。有关更多信息,我们建议阅读SIG核心规范

3.2.改变广告间隔

广告间隔是蓝牙低功耗外设连续两次广告之间的间隔时间。

这个间隔可以在文件中自定义user_config.h.默认值为687.5毫秒

代码片段:

静态常量结构体advertise_configurationuser_adv_confaddr_srcAPP_CFG_ADDR_SRCUSER_CFG_ADDRESS_MODE),///最小广告间隔intv_minMS_TO_BLESLOTS687.5),// 687.5毫秒///最大广告间隔intv_maxMS_TO_BLESLOTS687.5),// 687.5毫秒....

下面的示例将更新计时器更改为1500ms。

代码片段:

///最小广告间隔intv_minMS_TO_BLESLOTS1500),// 1500 ms///最大广告间隔intv_maxMS_TO_BLESLOTS1500),// 1500 ms

请注意

来自蓝牙规范(第6卷,B部分,第4.4.2.2.1节广告间隔advInterval应为整数倍数0.625ms在…范围内20毫秒到10.24秒

3.3.改变广告渠道图

定义的带蓝牙核心规格包括37个数据通信渠道和3个设备发现广告渠道。后者被分配在频谱的非连续部分,以防止来自同步活动的干扰ISM波段.具体来说,蓝牙低能耗设备可以在分别对应于2.402 MHz、2.2426 MHz和2.480 MHz频率的频道37、38和39上发布广告。SmartBond™设备依次在所有已启用的频道上发布广告。

默认情况下,所有通道都通过分配启用.channel_mapADV_ALL_CHNLS_EN.若要强制蓝牙低能耗设备仅使用一个通道,例如通道37,请使用分配.channel_mapADV_CHNL_37_EN

代码片段:

静态常量结构体advertise_configurationuser_adv_conf/***广告渠道图:* - ADV_CHNL_37_EN: 37频道的广告频道地图。* - ADV_CHNL_38_EN: 38频道的广告频道地图。* - ADV_CHNL_39_EN: 39频道的广告频道地图。* - ADV_ALL_CHNLS_EN:通道37、38和39的广告通道映射。* /channel_mapADV_CHNL_37_EN
表4 广告渠道

枚举名称

价值

描述

ADV_CHNL_37_EN

0 x01

选择37频道投放广告

ADV_CHNL_38_EN

0 x02

选择38频道投放广告

ADV_CHNL_39_EN

0 x04

选择39频道投放广告

ADV_ALL_CHNLS_EN

0 x07

选择用于广告的所有频道(37、38和39)

3.4.改变广告模式

广告模式可以通过调用其中一个API函数来定制sdk / app_modules / src / app_common / app.c

  • 无效app_easy_gap_undirected_advertise_start ()

  • 无效app_easy_gap_directed_advertise_start (uint8_tldc_enable)

  • 无效app_easy_gap_non_connectable_advertise_start(空白)

开始广告,使用GAPM_START_ADVERTISE_CMD定义并将其发送到GAP管理层(GAPM)。方法分配消息KE_MSG_ALLOC宏。

/******************************************************************************************* @brief创建开始广告消息。* @return指向已创建消息的指针。***************************************************************************************** /__INLINE结构体gapm_start_advertise_cmdapp_advertise_start_msg_create无效结构体gapm_start_advertise_cmdcmdKE_MSG_ALLOCGAPM_START_ADVERTISE_CMDTASK_GAPMTASK_APPgapm_start_advertise_cmd);返回cmd

开始一个无向GAPM_ADV_UNDIRECT广告操作,用必要的数据填充信息:cmdapp_easy_gap_undirected_advertise_start_create_msg ();

无效app_easy_gap_undirected_advertise_start无效结构体gapm_start_advertise_cmdcmdcmdapp_easy_gap_undirected_advertise_start_create_msg();//发送信息app_advertise_start_msg_sendcmd);adv_cmd//我们现在是可连接的ke_state_setTASK_APPAPP_CONNECTABLE);/******************************************************************************************为可连接的无向事件(ADV_IND)创建广告消息。* @return gapm_start_advertise_cmd广告消息的指针***************************************************************************************** /静态结构体gapm_start_advertise_cmdapp_easy_gap_undirected_advertise_start_create_msg无效结构体gapm_start_advertise_cmdcmdcmdapp_advertise_start_msg_create();adv_cmdcmdcmd->人事处代码GAPM_ADV_UNDIRECTcmd->人事处addr_srcuser_adv_confaddr_srccmd->intv_minuser_adv_confintv_mincmd->intv_maxuser_adv_confintv_max

然后将其发送到GAPM任务user_barebone.c.方法通知应用层app_easy_gap_undirected_advertise_start ()user_app_adv_start.中描述了其他广告模式表5

表5 广告模式

枚举名称

描述

GAPM_ADV_NON_CONN

蓝牙低能耗设备发布时不允许连接到另一个中心设备。

GAPM_ADV_UNDIRECT

蓝牙低能耗设备向所有设备发布广告,而不管它们的BD地址

GAPM_ADV_DIRECT

蓝牙低能耗设备向具有特定BD地址的设备发送广告。

GAPM_ADV_DIRECT_LDC

蓝牙低能耗设备使用低占空比向具有特定BD地址的设备发送广告。

3.5.动态更改广告数据

基本示例在设备运行时更新广告数据,更具体地说,更新特定于制造商的数据。更新制造商特定数据的函数如下所示:

/******************************************************************************************* @简要更新制造商特定数据* @返回void***************************************************************************************** /静态无效mnf_data_update()uint16_t数据数据mnf_dataproprietary_data0|mnf_dataproprietary_data1<<8);数据+ =1mnf_dataproprietary_data0数据0 xffmnf_dataproprietary_data1数据>>80 xff如果数据= =0 xffffmnf_dataproprietary_data00mnf_dataproprietary_data10

每次定时计时器触发时调用此函数。这个函数读取并增加计数器的值,当计数器达到0xFFFF值时自动换行。更新发生在adv_data_update_timer_cb ()回调函数。

/******************************************************************************************* @brief广告数据更新定时器回调函数。* @返回void***************************************************************************************** /静态无效adv_data_update_timer_cb()//如果mnd_data_index设置了MSB,则在扫描响应中存储制造商数据uint8_tmnf_data_storagemnf_data_index0 x80?stored_scan_rsp_datastored_adv_data//更新制造商数据mnf_data_update();//更新广告数据的选定字段(厂商数据)memcpymnf_data_storage+mnf_data_index0 x7f),mnf_data运算符结构体mnf_specific_data_ad_structure));//动态更新广告数据app_easy_gap_update_adv_datastored_adv_datastored_adv_data_lenstored_scan_rsp_datastored_scan_rsp_data_len);//重新启动下一次广告更新的定时器app_adv_data_update_timer_usedapp_easy_timerAPP_ADV_DATA_UPDATE_TOadv_data_update_timer_cb);

当我们更新了数据时,我们必须调用app_easy_gap_update_adv_data ()函数。这段代码通知BLE层有更新的广告数据,并在下一个可用的机会排队更新。