This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
工具与软件:
我已经尝试修正了这样的 SDK 代码。 它有时起作用、有时不起作用。
uint16_t afRtgDstAddress = INVALID_NODE_ADDR; afStatus_t AF_DataRequest(...) { .... if((req.dstAddr.addrMode == Addr16Bit) && (!(req.txOptions & APS_TX_OPTIONS_SKIP_ROUTING))) { afRtgDstAddress = req.dstAddr.addr.shortAddr; } if (len > afDataReqMTU( &mtu ) ) { if (apsfSendFragmented) { stat = (*apsfSendFragmented)( &req ); } else { stat = afStatus_INVALID_PARAMETER; } } else { stat = APSDE_DataReq( &req ); } afRtgDstAddress = INVALID_NODE_ADDR; ... } uint8_t afDataReqMTU( afDataReqMTU_t* fields ) { uint8_t len; uint8_t hdr; if ( fields->kvp == TRUE ) { hdr = AF_HDR_KVP_MAX_LEN; } else { hdr = AF_HDR_V1_1_MAX_LEN; } len = (uint8_t)(APSDE_DataReqMTU(&fields->aps) - hdr); //match rtg table to recalculate MTU, fixed by luoyiming 2025-01-04 if( zgConcentratorEnable && (afRtgDstAddress != INVALID_NODE_ADDR) ) { uint8_t relayCnt = 0; uint16_t *relayList = NULL; if ( (RTG_GetRtgSrcEntry(afRtgDstAddress, &relayCnt, &relayList) == RTG_SUCCESS) && (relayCnt > 0) ) { len -= 2 + relayCnt * sizeof(uint16_t); } } return len; }
您好、Aries、
我希望你做得好。 您在此处使用的是哪个 SDK 版本? 和 CCS 版本。
-您能指出您开始使用的示例和/或详细说明为什么代码片段有时工作/不工作(步骤/序列)?
谢谢!
Alex F
我 在、器上将"MAX_RTG_SRC_ENTRYes"设置为128 、但 在我的协调器上使用的 zgConcentratorEnable 为 "FALSE"。 我的协调器 将 AF-Packet 发送到属于另一个路由器的终端设备。 有时协调会触发发送的源路由、 有时 协调器不会触发 源路由。
如何 在调用"AF_DataRequest"时打开和关闭源路由
您好、Aries、
您可以在此处获取一些监听器调试日志吗?
以及提供路由定义和阐明节点角色(为什么协调器不是 MOT 协调器?)。
您 可以尝试使用 AF_DataRequest 中的 RTG_GetRtgSrcEntry 来确定源路由条目是否可用。
谢谢!
Alex F
我的程序 RTG_GetRtgSrcEntry 在 AF_DataRequest 中被调用、而 RTG_GetRtgSrcEntry 可以检测终端设备被记录在协调器的源路由表中。 但协调器不会触发 源路由。
嘿、Aries、您能否提供所有路由定义并阐明 您的节点角色(即为什么协调员不是 MTO 集中器?)
从 Z-Stack UG 中可以看出:"作为多对一布线的一部分、仅在特定情况下使用源布线。 首先、在集中器响应源设备启动的请求时使用。"
使用默认 Z-Stack 预编译库可能无法实现您想要的目标。
此致、
Ryan
LINK_DOWN_TRIGGER=12
NWK_ROUTE_AGE_LIMIT=5
DEF_NWK_RADIUS=30
default_route_request_RADIUSX=8
Route_discovery_time=12
SRC_RTG_VALIDE_TIME=10
MTO_RREQ_LIMIT_TIME=5000
CONCURRENT_DISCOVERY_Timex=120
MAX_RTG_SRC_ENTRYS=128
CONSTER_ROUE_CACHE=TRUE
CONTROLLER_ENABLE=TRUE
谢谢、这些与 swra650相似 、不存在任何问题。 嗅探器日志可以确认、根据设计、某些数据包情况不会触发 Z-Stack 库中的源路由。 这将如何影响您的终端应用?
此致、
Ryan
我希望数据单元分段发送触发源路由、但有时源 路由会触发、有时 源路由不会触发。 我想 预先判断将 在 AF_DataRequest 中触发源路由。
我已经研究过 Z-stack lib 的代码、发现协调器会首先在正常路由表(RTG 表)中搜索路由路径。 尽管目标地址记录在源路由表中、但不会触发源路由。 所以我在"uint8_t afDataReqmtu ( afDataReqmty_t* fields )"中固定的代码 可以像这样
uint8_t afDataReqMTU( afDataReqMTU_t* fields ) { uint8_t len; uint8_t hdr; if ( fields->kvp == TRUE ) { hdr = AF_HDR_KVP_MAX_LEN; } else { hdr = AF_HDR_V1_1_MAX_LEN; } len = (uint8_t)(APSDE_DataReqMTU(&fields->aps) - hdr); //match rtg table to recalculate MTU, fixed by luoyiming 2025-01-04 if(afRtgDstAddress != INVALID_NODE_ADDR) { if ( RTG_CheckRtStatus( afRtgDstAddress, RT_ACTIVE, 0 ) != RTG_SUCCESS ) { uint8_t relayCnt = 0; uint16_t *relayList = NULL; if ( (RTG_GetRtgSrcEntry(afRtgDstAddress, &relayCnt, &relayList) == RTG_SUCCESS) && (relayCnt > 0) ) { len -= 2 + relayCnt * sizeof(uint16_t); } } } return len; }