ZStack协议栈点对点通信

文章介绍了如何使用ZStack3.0创建一个包含协调器和终端节点的工程,协调器负责收发数据并处理来自终端节点的D1命令,终端节点用于采集传感器数据并发送给协调器。在协调器接收到D1命令后,会闪烁LED灯作为响应。通过删除和添加特定文件,以及配置不同设备的状态,实现了点对点通信的功能。
摘要由CSDN通过智能技术生成

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

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值