ZStack协议栈点对点通信

这里是zstack3.0安装包:链接:https://pan.baidu.com/s/1-N8FFQ86zenF1iq-wgkmJQ?pwd=2023
提取码:2023

新建自己的zstack工程这篇写得详细:新建
这个点对点通信主要是终端节点向协调器发送命令D1,协调器收到命令后判断数据是否为D1如果是则会调用闪烁LED的库函数。
协调器主要是收发终端节点的数据然后汇总这些数据,你可以把这些数据传给上位机等等,终端节点主要用来采集各种传感器数据,协调器首先创建网络,终端节点加入网络,这里面的具体细节还是很有趣的。
首先我们打开GenericApp的项目,然后remove掉GenericApp.c和GenericApp.h这两个文件

ZStack协议栈点对点通信_第1张图片
在这里插入图片描述
因为我们要模拟终端节点向协调器发送数据,协调器对发送的数据判断然后做相应的处理,所以添加Coordinator.c和Coordinator.h还有EndDevice.c和EndDevice.h四个文件
ZStack协议栈点对点通信_第2张图片
注意不同的设备状态必须把有的文件不要加载到里面,比如如果我现在是协调器
ZStack协议栈点对点通信_第3张图片
我就要把终端不能编译到项目里面,所以在想要不参加编译的文件右键option,勾选Override inheried seetting这个选项
ZStack协议栈点对点通信_第4张图片
然后代码
Coordinator.h:

#ifndef COORDINATOR
#define COORDINATOR
//群集个数
#define GENERICAPP_MAX_CLUSTERS 1
//输入簇ID
#define  GENERICAPP_CLUSTERID 0001
//端点ID
#define GENERICAPP_ENDPOINT 10
//profileid
#define GENERICAPP_PROFID             0x0F04
//设备id号
#define GENERICAPP_DEVICEID           0x0001
//版本号
#define GENERICAPP_DEVICE_VERSION     0
//保留位
#define GENERICAPP_FLAGS              0
//外部声明
void GenericApp_Init( byte task_id );
UINT16 GenericApp_ProcessEvent( byte task_id, UINT16 events );

#endif

Coordinator.c:

//头文件
#include "OSAL.h"
#include "AF.h"
#include "ZDApp.h"
#include "ZDObject.h"
#include "ZDProfile.h"
#include "Coordinator.h"
#include "DebugTrace.h"
#if !defined( WIN32 )
  #include "OnBoard.h"
#endif
#include "hal_led.h"

//输入簇
const cId_t GenericApp_ClusterList[GENERICAPP_MAX_CLUSTERS] =
{
  GENERICAPP_CLUSTERID
};
//简单描述符
const SimpleDescriptionFormat_t GenericApp_SimpleDesc =
{
  GENERICAPP_ENDPOINT,              //  int Endpoint;
  GENERICAPP_PROFID,                //  uint16 AppProfId[2];
  GENERICAPP_DEVICEID,              //  uint16 AppDeviceId[2];
  GENERICAPP_DEVICE_VERSION,        //  int   AppDevVer:4;
  GENERICAPP_FLAGS,                 //  int   AppFlags:4;
  GENERICAPP_MAX_CLUSTERS,          //  byte  AppNumInClusters;
  (cId_t *)GenericApp_ClusterList,  //  byte *pAppInClusterList;
  0,                                //  byte  AppNumInClusters;
  (cId_t *)NULL                     //  byte *pAppInClusterList;
};
//端点描述符
endPointDesc_t GenericApp_epDesc;
//任务ID号
byte GenericApp_TaskID;
//声明
static void GenericApp_MessageMSGCB( afIncomingMSGPacket_t *pkt );
//任务初始化函数
void GenericApp_Init( byte task_id )
{
  //身份证号码
  GenericApp_TaskID = task_id;
  //填写端点描述。
  GenericApp_epDesc.endPoint = GENERICAPP_ENDPOINT;
  GenericApp_epDesc.task_id = &GenericApp_TaskID;
  GenericApp_epDesc.simpleDesc
            = (SimpleDescriptionFormat_t *)&GenericApp_SimpleDesc;
  GenericApp_epDesc.latencyReq = noLatencyReqs;
  // 注册
  afRegister( &GenericApp_epDesc );
}
//应用层事件处理函数 当应用层任务有时间发生自动调用该函数
/*
task_id:发生事件的任务id号
events:事件
*/
UINT16 GenericApp_ProcessEvent( byte task_id, UINT16 events )
{
  //消息包指针
  afIncomingMSGPacket_t *MSGpkt;
  //是否是系统事件
  if ( events & SYS_EVENT_MSG )
  {
    //从消息队列里读取(接收)当前任务的消息
    MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( GenericApp_TaskID );
    while ( MSGpkt )
    {
      switch ( MSGpkt->hdr.event )
      {
        case AF_INCOMING_MSG_CMD:
          GenericApp_MessageMSGCB( MSGpkt );
          break;
        default:
          break;
      }
      // 释放空间
      osal_msg_deallocate( (uint8 *)MSGpkt );
      // 再次循环读取当前任务消息
      MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( GenericApp_TaskID );
    }
    // return unprocessed events
    return (events ^ SYS_EVENT_MSG);
  }
  //用户事件

 
  // Discard unknown events
  return 0;
}
//事件处理函数
static void GenericApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )
{
  uint8 buffer[10];
  switch ( pkt->clusterId )
  {
    //终端节点发来的消息
    case GENERICAPP_CLUSTERID:
      osal_memcpy(buffer,pkt->cmd.Data,2);
      if(buffer[0]=='D'&&buffer[1]=='1'){
        HalLedBlink(HAL_LED_2,10,50,1000);
      }
      break;
    default:
      break;
  }
}

EndDevice.c:

//头文件
#include "OSAL.h"
#include "AF.h"
#include "ZDApp.h"
#include "ZDObject.h"
#include "ZDProfile.h"
#include "EndDevice.h"
#include "DebugTrace.h"
#if !defined( WIN32 )
  #include "OnBoard.h"
#endif
#include "hal_led.h"


//终端节点发送数据 输出簇
const cId_t GenericApp_ClusterList[GENERICAPP_MAX_CLUSTERS] =
{
  GENERICAPP_CLUSTERID
};
//简单描述符
const SimpleDescriptionFormat_t GenericApp_SimpleDesc =
{
  GENERICAPP_ENDPOINT,              //  int Endpoint;
  GENERICAPP_PROFID,                //  uint16 AppProfId[2];
  GENERICAPP_DEVICEID,              //  uint16 AppDeviceId[2];
  GENERICAPP_DEVICE_VERSION,        //  int   AppDevVer:4;
  GENERICAPP_FLAGS,                 //  int   AppFlags:4;
  0,                                //  byte  AppNumInClusters;
  (cId_t *)NULL,                    //  byte *pAppInClusterList;
  GENERICAPP_MAX_CLUSTERS,          //  byte  AppNumInClusters;
  (cId_t *)GenericApp_ClusterList   //  byte *pAppInClusterList;
};
//端点描述符
endPointDesc_t GenericApp_epDesc;
//任务ID号
byte GenericApp_TaskID;
//设备状态
devStates_t GenericApp_NwkState;
//发送数据序号
byte GenericApp_TransID;


static void GenericApp_SendTheMessage(void);

//任务初始化函数
void GenericApp_Init( byte task_id )
{
  //保存系统分配的任务id
  GenericApp_TaskID = task_id;
  //设备未连接任何网络
  GenericApp_NwkState=DEV_INIT;
  GenericApp_TransID=0;
  //填写端点描述。
  GenericApp_epDesc.endPoint = GENERICAPP_ENDPOINT;
  GenericApp_epDesc.task_id = &GenericApp_TaskID;
  GenericApp_epDesc.simpleDesc
            = (SimpleDescriptionFormat_t *)&GenericApp_SimpleDesc;
  GenericApp_epDesc.latencyReq = noLatencyReqs;
  // 注册
  afRegister( &GenericApp_epDesc );
}

UINT16 GenericApp_ProcessEvent( byte task_id, UINT16 events )
{
  //消息包指针
  afIncomingMSGPacket_t *MSGpkt;
  //是否是系统事件
  if ( events & SYS_EVENT_MSG )
  {
    //从消息队列里读取(接收)当前任务的消息
    MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( GenericApp_TaskID );
    while ( MSGpkt )
    {
      switch ( MSGpkt->hdr.event )
      {
        case ZDO_STATE_CHANGE:
          GenericApp_NwkState=(devStates_t)MSGpkt->hdr.status;
          if((GenericApp_NwkState==DEV_END_DEVICE)||(GenericApp_NwkState==DEV_ROUTER)){
            //向协调器发送
            GenericApp_SendTheMessage();
          }
          break;
        default:
          break;
      }
      // 释放空间
      osal_msg_deallocate( (uint8 *)MSGpkt );
      // 再次循环读取当前任务消息
      MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( GenericApp_TaskID );
    }
    // return unprocessed events
    return (events ^ SYS_EVENT_MSG);
  }
  //用户事件

 
  // Discard unknown events
  return 0;
}

static void GenericApp_SendTheMessage(void){
  char theMessage[]="D1";
  afAddrType_t GenericApp_DstAddr;
  //协调器网络地址是0x0000
  GenericApp_DstAddr.addr.shortAddr=0x0000;
  GenericApp_DstAddr.addrMode=afAddr16Bit;
  GenericApp_DstAddr.endPoint=GENERICAPP_ENDPOINT;
  
  if(AF_DataRequest(&GenericApp_DstAddr,//目的地址
                 &GenericApp_epDesc,//源(发送端点号)
                 GENERICAPP_CLUSTERID,//命令号簇id
                 (uint16)osal_strlen(theMessage),//发送数据长度
                 (unsigned char*)theMessage,//消息内容
                 &GenericApp_TransID,//只想发送序号指针
                 AF_DISCV_ROUTE,
                 AF_DEFAULT_RADIUS)==afStatus_SUCCESS){
                    HalLedBlink(HAL_LED_1,10,50,1000);
                 }else{
                    HalLedSet(HAL_LED_1,HAL_LED_MODE_ON);
                 } 
}

EndDevice.h:

#ifndef ENDDEVICE_H
#define ENDDEVICE_H

#define  GENERICAPP_CLUSTERID 0001
//群集个数
#define GENERICAPP_MAX_CLUSTERS 1
//端点ID
#define GENERICAPP_ENDPOINT 10
//profileid
#define GENERICAPP_PROFID             0x0F04
//设备id号
#define GENERICAPP_DEVICEID           0x0001
//版本号
#define GENERICAPP_DEVICE_VERSION     0
//保留位
#define GENERICAPP_FLAGS              0


void GenericApp_Init( byte task_id );
UINT16 GenericApp_ProcessEvent( byte task_id, UINT16 events );
#endif

下载程序可看到终端成功发送后灯闪烁,而协调器接收到后灯闪烁

你可能感兴趣的:(CC2530,单片机)