在跟踪调试config过程有些不理解的地方,请教下面几个问题:
1.我在查看了generateConfigRequests();有如下部分,不是很明白其中的处理
/* Clear any timed out transactions */
for(x = 0; x < CONFIG_MAX_DEVICES; x++)
{
if((Cllc_associatedDevList[x].shortAddr != CSF_INVALID_SHORT_ADDR)
&& (Cllc_associatedDevList[x].status & CLLC_ASSOC_STATUS_ALIVE))
{
if((Cllc_associatedDevList[x].status &
(ASSOC_CONFIG_SENT | ASSOC_CONFIG_RSP))
== (ASSOC_CONFIG_SENT | ASSOC_CONFIG_RSP))
{
Cllc_associatedDevList[x].status &= ~(ASSOC_CONFIG_SENT
| ASSOC_CONFIG_RSP);
}
}
}
不知道Cllc_associatedDevList[x].status什么时候被置为CLLC_ASSOC_STATUS_ALIVE,才使得进入上面的判断?
我向前查找,在入网过程assocIndCb()中找到与Cllc_associatedDevList相关的部分,"maintainAssocTable(&devInfo, &pData->capabilityInformation, 1, 0,(false));",但该函数是将status置0并不是CLLC_ASSOC_STATUS_ALIVE。
2.
通过wireshark抓包看到的数据包的交互过程,我的理解是config过程是collector应用层发送了一个包,sensor接收该包后进行处理后回复ConfigResponse包。
config包是上面部分的generateConfigRequests函数中发送,ConfigResponse包是在dataIndCB中将收到处理,如下:
static void dataIndCB(ApiMac_mcpsDataInd_t *pDataInd)
{
if((pDataInd != NULL) && (pDataInd->msdu.p != NULL)
&& (pDataInd->msdu.len > 0))
{
Smsgs_cmdIds_t cmdId = (Smsgs_cmdIds_t)*(pDataInd->msdu.p);
…..
switch(cmdId)
{
caseSmsgs_cmdIds_configRsp:
processConfigResponse(pDataInd);
break;
case Smsgs_cmdIds_trackingRsp:
processTrackingResponse(pDataInd);
break;
…..
}
但我看到collector.c文件中static voiddataCnfCB(ApiMac_mcpsDataCnf_t *pDataCnf);函数有如下部分:
if(pDataCnf->msduHandle & APP_MARKER_MSDU_HANDLE)
{
/* What message type was the original request? */
if(pDataCnf->msduHandle & APP_CONFIG_MSDU_HANDLE)
{
/* Config Request */
Cllc_associated_devices_t *pDev;
pDev = findDeviceStatusBit(ASSOC_CONFIG_MASK, ASSOC_CONFIG_SENT);
if(pDev != NULL)
{
if(pDataCnf->status != ApiMac_status_success)
{
/* Try to send again */
pDev->status &= ~ASSOC_CONFIG_SENT;
Csf_setConfigClock(CONFIG_DELAY);
}
else
{
pDev->status |= ASSOC_CONFIG_SENT;
pDev->status |= ASSOC_CONFIG_RSP;
pDev->status |= CLLC_ASSOC_STATUS_ALIVE;
Csf_setConfigClock(CONFIG_RESPONSE_DELAY);
}
}
/* Update stats */
if(pDataCnf->status == ApiMac_status_success)
{
Collector_statistics.configReqRequestSent++;
}
}
….
}
猜测这部分应该与1.的问题相关,该函数dataCnfCB的作用是什么?什么情况下会回调到它?这个与dataIndCB的关系是什么,ConfigResponse在dataIndCB中处理了,这里处理config相关的代码又是在操作什么?
望不吝赐教,谢谢!
Invoker:
dataIndCB()是无线接收最终进到的Callback,if((pDataInd != NULL) && (pDataInd->msdu.p != NULL) 这个pDataInd就是你无线接收的数据,pDataInd->msdu.p就是具体的Payload。
dataCnfCB()是无线发送最终进到的Callback,pDataCnf->status != ApiMac_status_success 这个status就是发送返回的状态,ApiMac_status_success,就是发送成功,你可以看下还有其他的很多状态Noack啊等等。
如果有兴趣可以查下“网络原语”就是4个单词,—— request / indication / response / confirmTI的这套就是基于网络原语的。整个的TI15.4协议栈你会看到很多这4个单词相关的。 Ind就是 indication Cnf就是confirm