嗨
我使用了一个外部处理器来控制DA14580(基于SPS设备代码),外部处理器对DA14580进行编程,然后在运行时需要修改advertise字符串。
在我通过UART端口收集数据后,我试图取消广告使用"app_adv_stop()",然后调用"app_adv_start()"和修改数据到*cmd指针。问题是广告不是再次开始。
如果我在数据接收的开始而不是在结束调用app_adv_stop(),广告将停止并再次开始,但数据保持不变(传输的数据-在cmd->数据中我看到数据确实改变了)。
我的问题是,是否有其他东西需要修改,或有另一种方法来改变广告字符串。
顺便说一下:我已经改变了“cmd->info.host.”的长度。Adv_data_len "到我的数据长度,并在注释这个过程中设置长度将是好的:
If (device_name_avail_space > 0)
{
//获取要添加到广告数据中的设备名称(默认或NVDS)
#如果(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);
}
如果(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.adv_data [cmd - > info.host。Adv_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端口获取字符串的最后一个字节时)。同样,如果我在使用“uart_txdata_setf()”函数发送字节后立即调用函数“app_adv_start()”,广告字符串将不会被更新(我调用advertise start函数并更新“&cmd->info.host.adv_data[6]”)。
谢谢
嗨asalhuv,
很难知道内核会在多长时间内执行stop advertise命令,这取决于操作系统此刻正在做什么。您可以做的是发出stop advertise命令,然后捕获stop advertise请求的完整处理程序。在完整请求中,您可以更改广告字符串并重新启动advertise。请查看app_adv_undirect_complete_function()中的信标引用设计。
由于MT_dialog
你好,谢谢你的回复,你的意思是“app_adv_undirect_complete(uint8_t status)”对吗?
标志指示是(status == GAP_ERR_CANCELED)?这是不是说明广告已经停止了?
我必须说,很难理解操作系统的流程,似乎如果试图修改状态机,它有很多问题。你对描述操作系统状态机的文档有什么建议吗?
谢谢
嗨asalhuv,
没错,当你停止广告时,处理器就会被执行。你说的OS状态机是什么意思?你指的是代码的哪一部分?
由于MT_dialog
你好,谢谢你的回复,我指的是内核任务。我不知道如何遵循这个系统的流程。例如:在连接之后,调用了哪些句柄?什么是内核的例行程序。
关于SPS项目还有两个问题:
1.有一个SDK的SPS android/IOS应用程序,我将在一个新的应用程序中实现类似的东西。
2.如何修改本地设备名称在广告模式,我看到,如果我设置一个信标字符串没有空间留给设备名称,是否有可能添加它?
谢谢
嗨asalhuv,
连接后调用的处理程序依赖于你从主机和ble堆栈获得的消息,例如,如果你从主机接收到一个连接请求,应该调用gapc_connection_req_ind_handler()回调。通过签出RW_BLE_GAP_IS,您可以了解连接过程中交换的消息。内核只调度它从堆栈和应用程序任务接收的消息。
1)我不确定我理解你的问题,但没有SDK用于开发特别是android或iOS应用程序的DSPS,但如果你感兴趣,我们可以提供android/iOS DSPS应用程序的源代码。
2)广告字符串被限制为31个字节,其中3个字节已经被保留,但我假设你可以改变信标发布方式并发出扫描响应,并将设备名称放入扫描响应字符串中。
由于MT_dialog
嗨,谢谢你的回答
1)是的,我指的是应用程序(Android和IOS)的源代码,我可以从哪里得到它?
我会的,谢谢
嗨asalhuv,
邮件发送。
由于MT_dialog