切换设备角色

⚠️
大家好. .谢谢你来到论坛。令人兴奋的消息!我们现在正在转移到新的论坛平台,它将提供更好的功能,包含在主对话网站中。所有岗位和账户都已迁移。我们现在只接受新论坛的流量-请在上面发布任何新帖子//www.xmece.com/support.我们将在未来几天修复bug /优化搜索和标记。
4个职位/ 0个新
最后发表
moguilevski
离线
最后看到:2周1天前
加入:2019-04-30需要
切换设备角色

大家好,

我试图将设备角色从gap_role_broadcast /GAP_ROLE_ALL转换为GAP_ROLE_OBSERVER,以便定期交换广告和活动扫描。不幸的是,在下面给出的代码部分之后,代码执行中断,出现错误代码0x43 (GAP_ERR_COMMAND_DISALLOWED)。您知道在重新配置命令中可能出现什么错误吗?是否有任何关键步骤需要在此之前完成(如改变应用程序或任何其他任务的状态)?

KE_MSG_ALLOC(gapm_reset_cmd, TASK_GAPM, TASK_APP, gapm_reset_cmd);cmd1 - >操作= GAPM_RESET;ke_msg_send (cmd1);//重新配置设备结构gapm_set_dev_config_cmd* cmd2 = KE_MSG_ALLOC(gapm_set_dev_config_cmd, TASK_GAPM, TASK_APP, gapm_set_dev_config_cmd);cmd2 - >操作= GAPM_SET_DEV_CONFIG;cmd2 - >角色= GAP_ROLE_OBSERVER;cmd2 - > max_mtu = 23;cmd2 - > addr_type = APP_CFG_ADDR_TYPE (USER_CFG_ADDRESS_MODE);cmd2 - > renew_dur = 15000;nvds_tag_len_t假; nvds_get(NVDS_TAG_BD_ADDRESS, &dummy, cmd2->addr.addr); memcpy(cmd2->irk.key, user_gapm_conf.irk, KEY_LEN * sizeof(uint8_t)); cmd2->att_cfg = GAPM_MASK_ATT_SVC_CHG_EN; cmd2->gap_start_hdl = 0; cmd2->gatt_start_hdl = 0; cmd2->max_mps = 0; cmd2->max_txoctets = 0; cmd2->max_txtime = 0; ke_msg_send(cmd2);

提前谢谢。

设备:
PM_Dialog
离线
最后看到:5天14小时前
工作人员
加入:2018-02-08 11:03
嗨moguilevski,

嗨moguilevski,

由于您正在使用DA14585,为了执行角色切换,您可以在GAP_ROLE_ALL中设置角色并发布或扫描(不能同时做这两件事)。但是,你可以发布和设置一个计时器,在计时器到期时,你应该停止广告,一旦停止,您可以开始扫描,或者等待扫描完成(如果你扫描GAP_GEN_DISCOVERY或一组额外的计时器和取消扫描过程)所以就扫描完成后再次启动广告。请检查下面的步骤,以便在SDK的ble_app_peripheral示例中执行它:

  • 在user_config.h文件中将user_gapm_conf的.role成员更改为GAP_ROLE_ALL。
  • 创建一个user_scan_start()函数以便设备开始扫描:
struct gapm_start_scan_cmd* cmd = KE_MSG_ALLOC(gapm_start_scan_cmd, TASK_GAPM, TASK_APP, gapm_start_scan_cmd);cmd - > op。代码= GAPM_SCAN_ACTIVE;cmd - > op。addr_src = GAPM_STATIC_ADDR;cmd - >间隔= 16384;cmd窗口- > = 16384;cmd - >模式= GAP_GEN_DISCOVERY;cmd - > filt_policy = SCAN_ALLOW_ADV_ALL;cmd - > filter_duplic = SCAN_FILT_DUPLIC_EN; // Send the message ke_msg_send(cmd); // We are now connectable ke_state_set(TASK_APP, APP_CONNECTABLE); }
  • 在user_app_adv_start()函数中,有一个计时器将启动,以便在大约30秒后停止发布,因此我们将使用它来停止发布。
  • 因此,在计时器adv_data_update_timer_cb()的回调中,调用app_easy_gap_advertise_stop()函数,而不是更新广告字符串。
  • 在user_app_adv_undirect_complete()函数中调用user_scan_start()函数,以便当设备停止发布时开始扫描。
  • 为了停止扫描,我不会使用一个额外的定时器来取消命令,但我将使用扫描本身的超时。
  • 为了在扫描结束后立即开始发布,创建一个函数user_on_scanning_completed(),并从这个函数调用user_app_adv_start();

请尝试以上的步骤,并让我知道,如果它是工作。

谢谢,PM_Dialog

moguilevski
离线
最后看到:2周1天前
加入:2019-04-30需要
嗨PM-Dialog,

嗨PM-Dialog,

按照您的指示,广告和活动扫描之间的切换工作良好。

非常感谢您详细的回答!

PM_Dialog
离线
最后看到:5天14小时前
工作人员
加入:2018-02-08 11:03
嗨moguilevski,

嗨moguilevski,

很高兴我的评论对你有帮助,谢谢你接受我的回答。

谢谢,PM_Dialog