以前了解过ZStack-CC2530-2.5.1a,收发数据时,发送端调用AF_DataRequest()函数,接收端通过AF_INCOMING_MSG_CMD就可以接收到数据。
但是在Z-Stack 3.0.2中使用这样的操作无法收发数据。那么应该用什么函数发送和接受数据呢?
哪位了解,麻烦解答一下,谢谢~
YiKai Chen:
Z-Stack 3.0.2基本上就是透過ZCL來收发数据,所以你发送端调用AF_DataRequest要弄對cluster,接收就在zclxxx_ProcessIncomingMsg
A B6:
回复 YiKai Chen:
谢谢你的回复。
假设我想在协调器发送一个自定义的信息data[4]={'0','1','2','3'};
然后在终端接收这个信息,确认接收到这个信息后翻转LED灯。
那么我应该怎么自定义cluster,并调用哪个发送函数呢?
请帮忙再解答一下,谢谢~
Viki Shi:
回复 A B6:
参考下这个academy:dev.ti.com/…/node
A B6:
回复 Viki Shi:
你好,感谢你的回复
我在《Zigbee Fundamental Project Development》——Part 2: Send raw data packets over-the-air查看了相关信息
但是我是用IAR基于Z-Stack 3.0.2\Projects\zstack\HomeAutomation\GenericApp进行开发
在GenericApp工程下找不到文档中提到的“Zstackapi_AfDataReq(appServiceTaskId, &pReq);”和“zclSampleSw_processAfIncomingMsgInd”等函数。
就像文档中说的“Sometimes it is desired to send a custom, non-ZCL data packet to a target device.”我就想发送自己的数据而不使用ZCL,应该怎么操作呢?
YiKai Chen:
回复 A B6:
Z-Stack 3.0.2就是用AF_DataRequest去發raw data,接收可以到afBuildMSGIncoming想辦法接收
A B6:
回复 YiKai Chen:
感谢你的回复
再帮忙看看我的一下操作哪里有问题。基于Z-Stack 3.0.2\Projects\zstack\HomeAutomation\GenericApp工程做了以下修改:
1.我自定义了:
#define USER_CLUSTER_ID_COMM_TEST0x2000//通信测试(我自定义的Cluster ID)
uint8 SampleApp_TransID;//(我自定义的)
2.将Cluster ID添加至输入、输出Cluster ID列表:
const cId_t zclGenericApp_InClusterList[] =
{ZCL_CLUSTER_ID_GEN_BASIC,ZCL_CLUSTER_ID_GEN_IDENTIFY,USER_CLUSTER_ID_COMM_TEST,//通信测试
};const cId_t zclGenericApp_OutClusterList[] =
{ZCL_CLUSTER_ID_GEN_BASIC,
USER_CLUSTER_ID_COMM_TEST,//通信测试
};
3.初始化SampleApp_TransID 为0:
void zclGenericApp_Init( byte task_id )
{zclGenericApp_TaskID = task_id;SampleApp_TransID = 0;
……
}
4.使用协调器广播发送时我新建了以下函数:
void SampleApp_SendPeriodicMessage( void )
{uint8 data[10]={'0','1','2','3','4','5','6','7','8','9'};//自定义数据afAddrType_t SampleApp_Periodic_DstAddr;endPointDesc_t *epDesc;// Setup for the periodic message's destination address// Broadcast to everyoneSampleApp_Periodic_DstAddr.addrMode = (afAddrMode_t)AddrBroadcast;SampleApp_Periodic_DstAddr.endPoint = GENERICAPP_ENDPOINT;SampleApp_Periodic_DstAddr.addr.shortAddr = 0xFFFF;epDesc = afFindEndPointDesc( GENERICAPP_ENDPOINT );if ( AF_DataRequest( &SampleApp_Periodic_DstAddr, epDesc,USER_CLUSTER_ID_COMM_TEST,10,//字节数data,//指针头&SampleApp_TransID,AF_DISCV_ROUTE,AF_DEFAULT_RADIUS ) == afStatus_SUCCESS ){//数据发送成功翻转LEDHalLedSet ( HAL_LED_1, HAL_LED_MODE_TOGGLE );}else{// Error occurred in request to send.}
}
5.在终端节点接收时使用如下方法:
uint16 zclGenericApp_event_loop( uint8 task_id, uint16 events )
{afIncomingMSGPacket_t *MSGpkt;
(void)task_id;// Intentionally unreferenced parameter
if ( events & SYS_EVENT_MSG ){while ( (MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( zclGenericApp_TaskID )) ){switch ( MSGpkt->hdr.event ){case AF_INCOMING_MSG_CMD://期望在此处接收协调器发来的数据HalLedSet( HAL_LED_1, HAL_LED_MODE_TOGGLE );//接收到数据后翻转LEDbreak;
…
}经过以上的操作,由协调器定时发送数据,实验现象为协调器的LED定时翻转,但是终端节点的LED无变化。
对终端节点单步调试,发现确实无法进入AF_INCOMING_MSG_CMD 。请帮忙看看我的以上设置那里错了呢?
YiKai Chen:
回复 A B6:
zclGenericApp_event_loop理面無法收AF_INCOMING_MSG_CMD,除非你去修改afBuildMSGIncoming讓他收到自定义的Cluster ID後會轉送到zclGenericApp_event_loop
TI中文支持网