OpenThread调用otServerGetNextLeaderService返回OT_ERROR_NOT_FOUND如何解决
解决方案
- 先确认节点角色与网络数据同步状态
- 调用
otThreadGetDeviceRole确认当前节点为已正常附着Thread网络的非睡眠终端设备,若为SED休眠节点,默认不会主动拉取Leader全量网络数据,需先调用otServerRequestNetworkData主动触发全量同步 - 调用
otNetDataGet获取本地缓存的网络数据长度,确认长度大于0且包含目标服务对应的TLV条目,若本地缓存为空,等待2~3个心跳周期后再重试查询
- 调用
- 检查服务注册参数合法性
- 确认调用
otServerAddService时传入的aService结构体符合要求:mEnterpriseNumber不得为0(Thread标准服务填OT_ENTERPRISE_NUMBER_THREAD_GROUP,自定义服务填对应IANA企业号)、mServiceData长度不超过15字节、mServerConfig.mStable标识与期望的网络数据类型匹配,若设为稳定服务,需确认Leader已启用稳定网络数据同步功能 - 确认调用
otServerRegister的返回值为OT_ERROR_NONE,若注册阶段返回错误,服务实际未同步到Leader网络数据中,可在Leader节点CLI模式下执行netdata show确认目标服务是否已出现在Leader公开网络数据列表
- 确认调用
- 修正接口调用逻辑
otServerGetNextLeaderService为迭代遍历接口,首次调用时必须将aIterator参数初始化为0,每次调用成功后迭代器自动偏移,仅遍历到最后一个服务后才会返回OT_ERROR_NOT_FOUND,若仅注册1个服务,首次调用参数正确时应返回成功,第二次调用才会返回对应错误- 不要在调用前手动修改
aIterator值,也不要跨线程复用同一个迭代器变量,避免迭代位置异常直接返回遍历结束错误
- 特殊场景排查
- 若为多节点网络,确认添加服务的节点与调用查询接口的节点属于同一个Thread分区,不同分区的Leader网络数据独立,跨分区无法查询到目标服务
- 确认固件编译时
OPENTHREAD_CONFIG_TMF_NETDATA_SERVICE_ENABLE配置项已开启,若关闭了服务网络数据支持,相关接口都会返回找不到错误
内容的提问来源于stack exchange,提问作者Tester
相关产品推荐
相关产品推荐

