⚠️
大家好. .谢谢你来到论坛。令人兴奋的消息!我们现在正在转移到新的论坛平台,它将提供更好的功能,包含在主对话网站中。所有岗位和账户都已迁移。我们现在只接受新论坛的流量-请在上面发布任何新帖子//www.xmece.com/support。我们将在未来几天修复错误/优化搜索和标记。
6个职位/ 0个新职位
最后一篇
Ruchi Patel.
离线
最后一次露面:2年8个月前
加入:2017-03-29 10:50
角色转换

hello dialog_support,

我有配置的角色交换机ble_app_peripheral.示例和DSPS项目。默认操作模式是外围当我按下按钮时,将切换当前角色中央。除了角色交换机之外,它还执行连接到其他外设和发送数据的操作。现在只有按下按钮时,才会发生下一个角色交换机。角色交换机部分顺利工作,但在发生与各个中央和外围设备的连接时,在发生变化后,我就会面临问题。我已经创建了自定义客户端配置文件配置文件,其中dsps项目名为custc1.c和custc1_task.c。在此文件中,我声明了两个常量结构。

1.如果我在下面的结构中声明gattc_cmp_evt然后在外围模式下,它平滑地连接到移动应用,但在中央模式期间它无法连接到外围设备。
const struct ke_msg_handler custc1_connected [] =
{
{custc1_data_write_req,(ke_msg_func_t)custc1_data_write_req_handler},
{gattc_cmp_evt,(ke_msg_func_t)gattc_cmp_evt_handler},
};

2.如果我在下面的结构中声明gattc_cmp_evt然后在中央模式下,它能够连接到其他外设但在外围模式期间,当我们尝试连接到移动应用程序时,它进入hardfault_handler。
Const struct ke_msg_handler custc1_default_state[] =
{
{custc1_enable_req,(ke_msg_func_t)custc1_enable_req_handler},
{gapc_disconnect_ind,(ke_msg_func_t)gapc_disconnect_ind_handler},
{gattc_cmp_evt,(ke_msg_func_t)gattc_cmp_evt_handler},
};

以上gattc_cmp_evt_handler.在custs1_task.c和custc1_task.c中定义。但是这个处理程序被声明为静态的。你能帮我查一下是什么原因吗?

我已经上传了custc1_task.c文件的结构,我已经使用的图像。

感谢致敬,
Ruchi Patel.

设备:
mt_dialog.
离线
最后一次露面:4个月2周前
工作人员
加入:2015-06-08 11:34
嗨Ruchi Patel,

嗨Ruchi Patel,

我不知道您在这个自定义设计上有什么实现,但我认为您正在使用一个设备,它将切换角色,它将启用不同的配置文件每次取决于指定的角色,我还认为,只有当设备作为中心而不是外设时,你附加的新文件和代码才会生效,例如,如果该设备是一个外设,那么应该被触发的GATTC_CMP_EVT将在对应的文件中,该文件对应于task_cust1,而不是在task_cust1(您已经创建的)中。您引用的处理程序是通过prf_init_func()设置的,并且每个不同的概要文件为每个交付的消息初始化自己的处理程序,因此这是您应该检查的第一件事。所有初始化时的任务都使用ke_task_create()函数来创建任务并为每个可用状态声明处理程序。

谢谢mt_dialog.

Ruchi Patel.
离线
最后一次露面:2年8个月前
加入:2017-03-29 10:50
hello dialog_support,

hello dialog_support,

例如,如果设备是外设,则应该触发的Gattc_cmp_evt将在对应于task_custs1的对应文件中,而不是在task_custc1中(您已创建的)。

我已经检查了这个,它不正常发生。如果配置文件是外围然后两者task_custc1.task_custs1.触发。我无法解决这个问题。请帮帮我。

在这里,我附上了我的自定义实现的Google Drive链接。
https://drive.google.com/open?id=1uszepipusbgj1fv7huw8yoemhicqwhjv.

感谢致敬,
Ruchi Patel.

mt_dialog.
离线
最后一次露面:4个月2周前
工作人员
加入:2015-06-08 11:34
嗨Ruchi Patel,

嗨Ruchi Patel,

嗯,据我所知,您正在启用中央配置文件,一旦您启用外围设备(自定义配置文件),就我所知,这不是您想做的确切的事情,不是吗?因此,当您在custs1_connected[]数组中有GATTC_CMP_EVT时,相应的处理程序不会执行,因为概要文件的状态与连接的状态不同,所以什么也不会执行。当custc1_default_handler[]中有相同的消息时,如果GATTC_CMP_EVT到达特定的任务,它将被执行,显然,无论你在该处理程序中做什么,它将导致硬错误发生。收到GATTC_CMP_EVT的原因是您正在启用一个发现过程(您调用了启用概要文件),显然发现过程没有成功返回,因此,您使用PRF_ERR_STOP_DISC_CHAR_MISSING调用custc1_enable_cfm_send()函数,并且在custc1_enable_cfm_send()中再次调用PRF_CLIENT_ENABLE_ERROR,它会触发硬故障。发生硬错误是因为你在PRF_CLIENT_ENABLE_ERROR宏中传递了错误的变量,你传递了PRF_CLIENT_ENABLE_ERROR(custc1_env, con_info->prf_id, CUSTC1);但是你应该传递的是PRF_CLIENT_ENABLE_ERROR(custc1_envs, con_info->prf_id, CUSTC1);这是一个错误的指针,因此ke_free()函数由于该硬错误而失败。

谢谢mt_dialog.

Ruchi Patel.
离线
最后一次露面:2年8个月前
加入:2017-03-29 10:50
hello dialog_support,

hello dialog_support,

感谢您的快速和完美的回复。

1.您可以在启用外设(自定义配置文件)时立即启用中央配置文件。

是的,我不想要这种配置。如何配置一个配置文件启用一次?我的代码中缺少什么步骤?

2.替换此prf_client_enable_error(custc1_envs,con_info-> prf_id,custc1);,现在我的应用程序没有进入任何处理程序。

3.当外设模式首次运行时,它工作正常,但当我切换到模式中心时,我的设备无法连接到其他外围设备。

4.经过2-3次角色切换,外设也不能正常工作。当我尝试连接周边设备到移动应用程序,它显示我的状态“连接”。

你能帮我解决这个档案相关的问题吗?

感谢致敬,
Ruchi Patel.

mt_dialog.
离线
最后一次露面:4个月2周前
工作人员
加入:2015-06-08 11:34
嗨Ruchi Patel,

嗨Ruchi Patel,

  1. 关于第一个问题和启用两个配置文件,SDK在交换机之后没有提供了在开关后启用相应角色配置文件的规定,因此在启用配置文件时,必须添加检查以检查每次中的角色是否有效。在连接时作为外围设备时,不需要执行发现,因此一个想法是在启用和启动发现之前检查App_custsc1_enable()中的角色状态,同样是外围角色也是相同的。
  2. 关于第二个问题,并且设备不会进入任何处理程序,是一个中心还是外围设备?由于在您提供的FW中,我能够获得连接指示,设备作为中央或外围设备运行,并且在连接到CustC1_discovering []阵列时,在连接时和Gattc_cmp_evt_handler()的启用功能这可以在将项目连接到外围设备时测试它。如果设备未执行处理程序,则意味着发现失败的原因失败。
  3. 将连接作为到设备的中心,当作为中心操作时,当您找到匹配您的发布字符串的设备时,您调用app_easy_gap_start_connection_to_set()来设置连接参数,然后取消扫描过程,这意味着设备将执行user_on_scanning_completed回调。在回调你检查扫描命令的状态重新扫描,以防GAP_ERR_TIMEOUT以外的值,所以你永远不会发送一个连接请求到另一边,在每一个广告字符串,你停止扫描,然后你再重新启动扫描。您应该做的是检查状态是否被取消,然后调用app_easy_gap_start_connection_to(),否则开始扫描。
  4. 关于最后一个问题,我使用了Pro套件上的按钮,命令从外设来回切换到中心,我能够在每个开关中连接没有问题,我有一个电话设备和外围设备(FW被配置为根据BD地址连接)在这两种情况下,无论如何切换我都没有发出连接。

谢谢mt_dialog.