你好
我正在使用外部处理器以控制DA14580(基于SPS设备代码),外部处理器程序编程DA14580,然后需要在运行时修改广告字符串。
在我通过UART端口收集数据后,我正在尝试使用“app_adv_stop()”取消广告,然后调用“app_adv_start()”并将数据修改为* cmd指针。问题是广告不是再次开始。
如果我在数据接收开始时调用app_adv_stop()而不是最后,则广告确实再次停止并重新开始,但数据保持不变(传输的数据 - 在cmd->数据中,我看到数据确实如此改变了)。
我的问题如果需要修改其他东西,或者还有另一种方式来改变广告字符串。
顺便说一句:我已经改变了“cmd-> info.host.adv_data_len”的长度到我的数据长度并在评论中设置了这个过程,所以长度将很好:
if(device_name_avail_space> 0)
{
//获取设备名称以添加在广告数据中(默认为1或nvds)
#if(nvds_support)
device_name_length = nvds_len_device_name;
if(nvds_get(nvds_tag_device_name,&device_name_length,&device_name_temp_buf [0])!= nvds_ok)
#endif //(nvds_support)
{
//获取默认的设备名称(如果没有足够的空间,则无名称)
device_name_length = strlen(app_dflt_device_name);
memcpy(&device_name_temp_buf [0],app_dflt_device_name,device_name_length);
}
if(device_name_length> 0)
{
//检查可用空间
device_name_length = co_min(device_name_length,device_name_avail_space);
//填充长度
cmd-> info.host.adv_data [cmd-> info.host.adv_data_len] = device_name_length + 1;
//填充设备名称标志
cmd-> info.host.adv_data [cmd-> info.host.adv_data_len + 1] ='\ x09';
//复制设备名称
memcpy(&cmd-> info.host.addata [cmd-> info.host.add_data_len + 2],device_name_temp_buf,device_name_length);
//更新广告数据长度
cmd-> info.host.adv_data_len + =(device_name_length + 2);
}
}
嗨Asalhuv,
没有其他功能来修改广告。您可以调试功能以检查Device_name_temp_buf中的值是什么。我无法在代码中看到任何内容,都会更改device_name_temp_buf数组的值。如果使用NVDS,则将从NVDS中加载名称,否则它将加载默认名称。
谢谢mt_dialog.
嗨,谢谢,也许我没有解释我的问题,所以我试着用不同的方式问:
当我调用函数“app_adv_stop()”时,我需要等多长时间,直到内核消耗邮件。
“app_adv_start()”相同的问题。我要问的原因是因为我需要在MCU消息后的广告字符串中进行快速更改,但如果调用函数“app_adv_stop()”然后立即调用“app_adv_start()”它不会再次启动广告。只有我在早期的过程中调用app_adv_stop()。(在UART端口上获取字符串的最后一个字节时)。此外,如果我在使用“app_add_start()”函数中使用“uart_txdata_setf()”函数后,请不会更新广告字符串(我调用广告start函数并更新“&cmd-> info.host.addata [6]“。
谢谢
嗨Asalhuv,
它难以知道内核将执行停止通告命令的时间有多大时间,这取决于操作系统在此刻做了什么。您可以做的是发出停止advertise命令,然后捕获停止宣传请求的完整处理程序。在完整的请求中,您可以更改广告字符串并重新启动通告。请查看app_add_undirect_complete_function()中的灯塔ref设计。
谢谢mt_dialog.
嗨,谢谢你的回复,你的意思是“app_adv_undirect_complete(uint8_t status)”对吗?
标志指示是(status == gap_err_canceled)?这表明广告已经停止了?
我必须说很难了解操作系统的流程,似乎是,如果尝试修改状态机它有很多问题。您是否有一个描述操作系统状态机的文档的建议?
谢谢
嗨Asalhuv,
那是对的,处理程序是在停止广告时执行的。你是什么意思与OS状态机?您指的代码是什么?
谢谢mt_dialog.
嗨,谢谢你的回复,我的意思是内核任务。我不知道如何遵循系统的流程。例如:连接后,调用哪个句柄?什么是内核的例程。
关于SPS项目的另外两个问题:
1. SPS Android / IOS应用程序有一个SDK,我将在一个新的应用程序中实施类似的东西。
2.如何在广告模式下修改本地设备名称,我看到如果我设置信标字符串,则没有剩余的设备名称剩余空间,可以以某种方式添加它吗?
谢谢
嗨Asalhuv,
连接后调用的处理程序依赖于从主机获得的消息,并最终从BLE堆栈中获取,例如,如果您收到来自主站的连接请求,则应调用GapC_Connection_Req_ind_Handler()回调。您可以通过查看RW_BLE_GAP_IS来了解在连接过程中交换的消息。内核只是安排它从堆栈和应用程序任务接收的消息。
1)我不确定我不确定您的问题,但没有SDK为DSP开发特别是Android或iOS应用程序,但如果您有兴趣,我们可以为Android / IOS DSPS应用程序提供源代码。
2)广告字符串限制为31个字节,并且已全部保留3个字节,但我想您可以更改信标识别模式并发出扫描响应,并将设备名称放在扫描响应字符串中。
谢谢mt_dialog.
嗨,谢谢你的答案
1)是的,我的意思是应用程序的源代码(Android和iOS),我可以在哪里得到这个?
2)会做,谢谢
嗨Asalhuv,
邮件发送。
谢谢mt_dialog.