3.改变广告参数
介绍修改DA14585/86或DA14531设备的发布参数。操作步骤它涵盖了所有与广告相关的关键要素,特别是广告数据和广告间隔,以及广告渠道图和广告模式。
3.1.改变广告数据
在
user_config.h
,改变现有的内容USER_ADVERTISE_DATA
宏到所需的广告数据。图9显示如何更改广告数据。由于广告字符串应该具有特定的格式,因此可以使用
ADV_TYPE_MANUFACTURER_SPECIFIC_DATA
宏将您希望的任何自定义数据添加到广告包中,如第2步所述。
下面的示例代码演示如何设置一些自定义广告数据。它将设备的完整名称设置为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)
当设备准备好开始广告时,它就会呼叫mnf_data_init ()
在user_app_init ()
.此功能设置一些标准参数,以便设备公开广播其广告数据。要发布的数据是从结构中复制的mnf_specific_data_ad_structure
.最后,根据此配置要求设备开始发布广告。
代码片段:
无效user_app_init(无效){app_param_update_request_timer_used=EASY_TIMER_INVALID_TIMER;//初始化制造商特定数据mnf_data_init();//初始化广告和扫描响应数据memcpy(stored_adv_data,USER_ADVERTISE_DATA,USER_ADVERTISE_DATA_LEN);stored_adv_data_len=USER_ADVERTISE_DATA_LEN;memcpy(stored_scan_rsp_data,USER_ADVERTISE_SCAN_RESPONSE_DATA,USER_ADVERTISE_SCAN_RESPONSE_DATA_LEN);stored_scan_rsp_data_len=USER_ADVERTISE_SCAN_RESPONSE_DATA_LEN;default_app_on_init();}
代码片段:
/******************************************************************************************初始化制造商特定数据* @返回void***************************************************************************************** /静态无效mnf_data_init(){mnf_data.ad_structure_size=运算符(结构体mnf_specific_data_ad_structure)-运算符(uint8_t);//减去ad_structure_size字段的大小mnf_data.ad_structure_type=GAP_AD_TYPE_MANU_SPECIFIC_DATA;mnf_data.亚博全网company_id[0]=APP_AD_MSD_亚博全网COMPANY_ID&0 xff;/ / LSBmnf_data.亚博全网company_id[1]=(APP_AD_MSD_亚博全网COMPANY_ID>>8)&0 xff;/ /最高有效位mnf_data.proprietary_data[0]=0;mnf_data.proprietary_data[1]=0;}
请注意
当设备准备好发布广告时,我们可能希望它调用一个自定义函数来处理广告数据。基本示例定期更新广告数据,并演示如何使用用户定义的函数处理广告内容。在这种情况下,我们必须修改相应的回调函数user_callback_config.h
,如下面的代码示例中使用了该函数user_app_adv_start
.
user_app_adv_start ()
是用户应用程序层中的用户定义函数,执行以下操作:
在超时时启动应用程序计时器
APP_ADV_DATA_UPDATE_TO
.更新广告数据中包含的制造商数据,请参见改变广告数据.
开始做广告。
代码片段:
//默认处理程序操作静态常量结构体default_app_operationsuser_default_app_operations={.default_operation_adv=user_app_adv_start,};
另请参阅
DA14585/586和DA14531设备可以接收来自中央设备的扫描请求,以便通过扫描响应的方式传输额外的用户数据。扫描响应通常拥有比广告数据包更多的数据,长度从8字节到39字节不等,因为广告数据通常选择非常短的数据来最小化功耗。有关更多信息,我们建议阅读SIG核心规范.
3.2.改变广告间隔
广告间隔是蓝牙低功耗外设连续两次广告之间的间隔时间。
这个间隔可以在文件中自定义user_config.h
.默认值为687.5毫秒
.
代码片段:
静态常量结构体advertise_configurationuser_adv_conf={.addr_src=APP_CFG_ADDR_SRC(USER_CFG_ADDRESS_MODE),///最小广告间隔.intv_min=MS_TO_BLESLOTS(687.5),// 687.5毫秒///最大广告间隔.intv_max=MS_TO_BLESLOTS(687.5),// 687.5毫秒....
下面的示例将更新计时器更改为1500ms。
代码片段:
///最小广告间隔.intv_min=MS_TO_BLESLOTS(1500),// 1500 ms///最大广告间隔.intv_max=MS_TO_BLESLOTS(1500),// 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_map=ADV_ALL_CHNLS_EN
.若要强制蓝牙低能耗设备仅使用一个通道,例如通道37,请使用分配.channel_map=ADV_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_map=ADV_CHNL_37_EN,
枚举名称 |
价值 |
描述 |
---|---|---|
|
0 x01 |
选择37频道投放广告 |
|
0 x02 |
选择38频道投放广告 |
|
0 x04 |
选择39频道投放广告 |
|
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_cmd*app_advertise_start_msg_create(无效){结构体gapm_start_advertise_cmd*cmd=KE_MSG_ALLOC(GAPM_START_ADVERTISE_CMD,TASK_GAPM,TASK_APP,gapm_start_advertise_cmd);返回cmd;}
开始一个无向GAPM_ADV_UNDIRECT
广告操作,用必要的数据填充信息:cmd=app_easy_gap_undirected_advertise_start_create_msg ();
无效app_easy_gap_undirected_advertise_start(无效){结构体gapm_start_advertise_cmd*cmd;cmd=app_easy_gap_undirected_advertise_start_create_msg();//发送信息app_advertise_start_msg_send(cmd);adv_cmd=零;//我们现在是可连接的ke_state_set(TASK_APP,APP_CONNECTABLE);}/******************************************************************************************为可连接的无向事件(ADV_IND)创建广告消息。* @return gapm_start_advertise_cmd广告消息的指针***************************************************************************************** /静态结构体gapm_start_advertise_cmd*app_easy_gap_undirected_advertise_start_create_msg(无效){…结构体gapm_start_advertise_cmd*cmd;cmd=app_advertise_start_msg_create();adv_cmd=cmd;cmd->人事处.代码=GAPM_ADV_UNDIRECT;cmd->人事处.addr_src=user_adv_conf.addr_src;cmd->intv_min=user_adv_conf.intv_min;cmd->intv_max=user_adv_conf.intv_max;…}
然后将其发送到GAPM任务user_barebone.c
.方法通知应用层app_easy_gap_undirected_advertise_start ()
在user_app_adv_start
.中描述了其他广告模式表5.
枚举名称 |
描述 |
---|---|
|
蓝牙低能耗设备发布时不允许连接到另一个中心设备。 |
|
蓝牙低能耗设备向所有设备发布广告,而不管它们的BD地址 |
|
蓝牙低能耗设备向具有特定BD地址的设备发送广告。 |
|
蓝牙低能耗设备使用低占空比向具有特定BD地址的设备发送广告。 |
3.5.动态更改广告数据
基本示例在设备运行时更新广告数据,更具体地说,更新特定于制造商的数据。更新制造商特定数据的函数如下所示:
/******************************************************************************************* @简要更新制造商特定数据* @返回void***************************************************************************************** /静态无效mnf_data_update(){uint16_t数据;数据=mnf_data.proprietary_data[0]|(mnf_data.proprietary_data[1]<<8);数据+ =1;mnf_data.proprietary_data[0]=数据&0 xff;mnf_data.proprietary_data[1]=(数据>>8)&0 xff;如果(数据= =0 xffff){mnf_data.proprietary_data[0]=0;mnf_data.proprietary_data[1]=0;}}
每次定时计时器触发时调用此函数。这个函数读取并增加计数器的值,当计数器达到0xFFFF值时自动换行。更新发生在adv_data_update_timer_cb ()
回调函数。
/******************************************************************************************* @brief广告数据更新定时器回调函数。* @返回void***************************************************************************************** /静态无效adv_data_update_timer_cb(){//如果mnd_data_index设置了MSB,则在扫描响应中存储制造商数据uint8_t*mnf_data_storage=(mnf_data_index&0 x80)?stored_scan_rsp_data:stored_adv_data;//更新制造商数据mnf_data_update();//更新广告数据的选定字段(厂商数据)memcpy(mnf_data_storage+(mnf_data_index&0 x7f),&mnf_data,运算符(结构体mnf_specific_data_ad_structure));//动态更新广告数据app_easy_gap_update_adv_data(stored_adv_data,stored_adv_data_len,stored_scan_rsp_data,stored_scan_rsp_data_len);//重新启动下一次广告更新的定时器app_adv_data_update_timer_used=app_easy_timer(APP_ADV_DATA_UPDATE_TO,adv_data_update_timer_cb);}
当我们更新了数据时,我们必须调用app_easy_gap_update_adv_data ()
函数。这段代码通知BLE层有更新的广告数据,并在下一个可用的机会排队更新。