您好!
采用CC2530模块+ZStack-CC2530-2.3.0-1.4.0,已知远程节点的IEEE地址,想要获取远程节点的网络地址,调用协议栈API接口
ZDP_NwkAddrReq(IEEEaddr,reqType,StartIndex,Securityenable); 网络中只要一个协调器节点和一个终端节点,匹配描述符方式自动绑定后,在协调节点上调用该API,在终端节点上没有处理这个请求。什么原因,请指教!
谢谢!
VV:
可以通过断点方式跟踪下执行的情况,终端节点在ZDP_IncomingData( afIncomingMSGPacket_t *pData )函数里处理收到的IEEE_req, 然后调用注册的callback函数,zdpProcessAddrReq。
chw chw:
回复 VV:
您好!
CC2530 协调器调用AF_DataRequest()函数发送数据到终端节点,ZDP_IncomingData( afIncomingMSGPacket_t *pData )函数处理接收到的数据。我想问一下数据包是如何发送出去的,终端节点怎么进入到ZDP_IncomingData()函数里的,具体的代码流程能解释一下吗?
谢谢!
VV:
回复 chw chw:
在发送端,从AF->APS->NWk->MAC 一次把数据发送出去,你可以通过AF_DataRequest函数里面的调用APSDE_DataReq,然后再发到网络层,直最后调用macTxFrame()调用 txGo()调用txCsmaGo()发送出去。
在接收端,最底层的肯定是RF的中断函数里面,HAL_ISR_FUNCTION( macMcuRfIsr, RF_VECTOR ),调用macRxThresholdIsr();把数据包收完整,然后再有MAC-NWK-APS-AF-ZDO往上送,再每一层如果需要处理的,就做相应的处理函数来处理。
afIncomingData()收到数据以后 调用afBuildMSGIncoming()将消息通过osal_msg_send( *(epDesc->task_id), (uint8 *)MSGpkt );发送上去,在ZDApp_event_loop( uint8 task_id, UINT16 events )函数收到消息后进入处理,调用ZDApp_ProcessOSALMsg( (osal_event_hdr_t *)msg_ptr ), 再调用ZDP_IncomingData( (afIncomingMSGPacket_t *)msgPtr )去处理。
具体的流程你可以通过代码跟踪着去调试下。谢谢!
chw chw:
回复 VV:
您好,
我还想请教你一个问题。调用APSDE_DataReq( )函数后,什么时候调用 APSDE_DataCnf()函数或APSDE_DataConfirm()函数。
其中下面的两个函数与APSDE-DATA.confirm 原语是对应的吗?
extern void APSDE_DataConfirm( nwkDB_t *rec, ZStatus_t Status );extern void APSDE_DataCnf( APSDE_DataCnf_t* cnf );
APSDE-DATA.confirm {DstAddrMode,DstAddress,DstEndpoint,SrcEndpoint,Status,TxTime}
如何使用这两个函数?请指导!
谢谢!
VV:
回复 chw chw:
如果发送没有要求ACK的则,直接调用afDataConfirm(),如果是要求有ACK的,则在收到ACK以后再调用afDataConfirm().
你列出来的两个函数本质上都是调用afDataConfirm(). 实现APSDE-DATA.confirm 原语的效果,但是
extern void APSDE_DataConfirm( nwkDB_t *rec, ZStatus_t Status ); 是指网络层上来的dataconfirm 再往上层发送消息
extern void APSDE_DataCnf( APSDE_DataCnf_t* cnf ); 是指直接从APS子层发送的datacomfirm
chw chw:
回复 VV:
您好!
请问下面这个APS层原语API对应的confirm在代码的什么位置。我没有找到,如果有的话,怎么去调用相关的confirm接口。
ZStatus_t APSME_GetRequest( ZApsAttributes_t AIBAttribute, uint16 Index, byte *AttributeValue );
ZStatus_t APSME_SetRequest( ZApsAttributes_t AIBAttribute, uint16 Index, byte *AttributeValue );
谢谢!
chw chw:
回复 chw chw:
您好!
我按照下面的方法调用可以吗?
stat = APSDE_DataReq( &req ); APSDE_DataCnf_t *p1= (APSDE_DataCnf_t *)osal_mem_alloc( sizeof(APSDE_DataCnf_t)); uint8 frm[4]; p1->dstAddr = dstAddr->addr.shortAddr; p1->dstEP =dstAddr->endPoint; p1->srcEP =srcEP->endPoint; p1->transID = *transID; p1->status =stat; APSDE_DataCnf(p1); frm[0] = p1->dstEP ; frm[1] = p1->srcEP ; frm[2] = p1->status ; HalUARTWrite(HAL_UART_PORT_0,frm,3); osal_mem_free(p1);
请指导!
Jian Ye:
回复 VV:
您好!“在接收端,最底层的肯定是RF的中断函数里面,HAL_ISR_FUNCTION( macMcuRfIsr, RF_VECTOR ),调用macRxThresholdIsr();把数据包收完整,然后再有MAC-NWK-APS-AF-ZDO往上送,再每一层如果需要处理的,就做相应的处理函数来处理”您说的关于这个流程,能否再具体一点,也就是把其中所涉及到的函数能够说明一下,我现在在线调试,没有发现从MAC曾到NWK层传送的函,您能否指明一下,我在调试时,其中接受的数据rxbuf和buf的内容都是正确的,至于它是怎么传送到NWK层,还希望您能说明下,谢谢!
注:我现在做的是用GREENPOWER的协议来和普通的zigbee协议来通讯。