这里是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
下载程序可看到终端成功发送后灯闪烁,而协调器接收到后灯闪烁