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.

CC2530在Ztack 3.0中发送数据和接收数据用什么函数???

Other Parts Discussed in Thread: Z-STACK

以前了解过ZStack-CC2530-2.5.1a,收发数据时,发送端调用AF_DataRequest()函数,接收端通过AF_INCOMING_MSG_CMD就可以接收到数据。

但是在Z-Stack 3.0.2中使用这样的操作无法收发数据。那么应该用什么函数发送和接受数据呢?

哪位了解,麻烦解答一下,谢谢~

  • Z-Stack 3.0.2基本上就是透過ZCL來收发数据,所以你发送端调用AF_DataRequest要弄對cluster,接收就在zclxxx_ProcessIncomingMsg
  • 谢谢你的回复。
    假设我想在协调器发送一个自定义的信息data[4]={'0','1','2','3'};
    然后在终端接收这个信息,确认接收到这个信息后翻转LED灯。
    那么我应该怎么自定义cluster,并调用哪个发送函数呢?
    请帮忙再解答一下,谢谢~
  • 你好,感谢你的回复

    我在《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,应该怎么操作呢?

  • Z-Stack 3.0.2就是用AF_DataRequest去發raw data,接收可以到afBuildMSGIncoming想辦法接收
  • 感谢你的回复
    再帮忙看看我的一下操作哪里有问题。

    基于Z-Stack 3.0.2\Projects\zstack\HomeAutomation\GenericApp工程做了以下修改:

    1. 我自定义了:
    #define USER_CLUSTER_ID_COMM_TEST 0x2000 //通信测试(我自定义的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 everyone
    SampleApp_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 )
    {
    //数据发送成功翻转LED
    HalLedSet ( 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 ); //接收到数据后翻转LED
    break;
    ...
    }

    经过以上的操作,由协调器定时发送数据,实验现象为协调器的LED定时翻转,但是终端节点的LED无变化。
    对终端节点单步调试,发现确实无法进入AF_INCOMING_MSG_CMD 。

    请帮忙看看我的以上设置那里错了呢?
  • zclGenericApp_event_loop理面無法收AF_INCOMING_MSG_CMD,除非你去修改afBuildMSGIncoming讓他收到自定义的Cluster ID後會轉送到zclGenericApp_event_loop