ZigBee实现基础组网成功返回LED 字符 P1_1绿闪烁

今天帮老师处理一些实验录制。

今天做的做的两个实验   一个是昨天写好的 但是没配置对 今天花了一个小时弄出来了。

实验功能   节点板向协调器发送LED字符   协调器进行无线接收   判断是不是接收的是       ”LED“   如果是P1_1的小绿灯闪烁

正题:

1 新建Coordinator.c  & Coordinator.h  & Enddevicw.c file工作空间目录

ZigBee实现基础组网成功返回LED 字符 P1_1绿闪烁_第1张图片

2写头文件:Coordinator.h文件  //下面的程序大部分是从ZStack中默认的C.H文件中复制的。不嫌麻烦就Ctrl C  .......V  就行。在基础上修改就好。

<span style="color:#009900;">#ifndef COORDINATOR_H
#define COORDINATOR_H

#include "ZComDef.h"

#define GENERICAPP_ENDPOINT                10     //定义普通应用端口为10

#define GENERICAPP_PROFID                  0x0F04
#define GENERICAPP_DEVICEID                0x0001 //器件号
#define GENERICAPP_DEVICE_VERSION          0      //器件版本
#define GENERICAPP_FLAGS                   0      //标志
#define GENERICAPP_MAX_CLUSTERS            1      //器件最大集群组个数//应该是最大可以与节点连接的个数
#define GENERICAPP_CLUSTERID               1      //一个簇标识的周期;一个簇标识的闪烁;簇标识号

extern  void GenericApp_Init(byte task_id);//extern可置于变量或者函数前,以表示变量或者函数的定义在别的文件中
extern UINT16 GenericApp_ProcessEvent( byte task_id, UINT16 events );

#endif</span><span style="color:#ff0000;">

</span>
<span style="color:#ff0000;">
</span>

3向OSAL_GenericAPP.c 中声明一个头文件

ZigBee实现基础组网成功返回LED 字符 P1_1绿闪烁_第2张图片

4写Coordinator.c文件 这是负责协调器运行的主程序

<span style="color:#3366ff;">#include "OSAL.h"
#include "AF.h"
#include "ZDApp.h"
#include "ZDObject.h"
#include "ZDProfile.h"
#include <string.h>

</span><h2><span style="color:#ff0000;">#include "Coordinator.h"//添加添加添加</span></h2><span style="color:#3366ff;">
#include "DebugTrace.h"

#if !defined (WIN32)
#include "OnBoard.h"
#endif

#include "hal_lcd.h"
#include "hal_led.h"
#include "hal_key.h"
#include "hal_uart.h"

const cId_t GenericApp_ClusterList[GENERICAPP_MAX_CLUSTERS] =   //它限定一个变量不允许被改变,产生静态作用
{                                                               //参数是  //器件最大集群组个数//应该是最大可以与节点连接的个数
  GENERICAPP_CLUSTERID////一个簇标识的周期;一个簇标识的闪烁;簇标识号   都在 Coordinator.h 中已经定义好的
};


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;
 </span><span style="color:#ff0000;"> (cId_t *)GenericApp_ClusterList,  //  byte *pAppInClusterList;
  0,          
  (cId_t *)NULL </span><span style="color:#3366ff;">  
};


endPointDesc_t GenericApp_epDesc;//定义结构体 Go to
byte GenericApp_TaskID;//普通应用工号
byte GenericApp_TransID;


void GenericApp_MessageMSGCB( afIncomingMSGPacket_t *pckt );//消息处理函数
void GenericApp_SendTheMessage( void );//数据发送函数



void GenericApp_Init( byte task_id )//任务初始化函数
{
  GenericApp_TaskID = task_id;//任务优先级
  GenericApp_TransID = 0;//将发送的数据包初始化 0//每发送一个包 自动加 1
  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 AF_INCOMING_MSG_CMD://传过来信息
          GenericApp_MessageMSGCB( MSGpkt );
          break;
        default:
          break;
      }

      // Release the memory
      osal_msg_deallocate( (uint8 *)MSGpkt );

      // Next
      MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( GenericApp_TaskID );
    }

    // return unprocessed events
    return (events ^ SYS_EVENT_MSG);
  }

  return 0;
}


void GenericApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )
{
  unsigned char buffer[4]=" ";
  switch(pkt->clusterId)
  {
  case GENERICAPP_CLUSTERID:
    osal_memcpy(buffer,pkt->cmd.Data, 3 );//将数据缓冲到buffer
    if((buffer[0]=='L')||(buffer[1]=='E')||(buffer[2]=='D'))
    {
      HalLedBlink(HAL_LED_2,0,50,500);//HalLedBlink函数是是某个LED闪烁
//#if defined(GENERICAPP_CLUSTERID)
//      SampleApp_SendPeriodicMessage();
//#endif
    }
    
    else
    {
      HalLedSet(HAL_LED_2,HAL_LED_MODE_ON);//HalLedSet函数是设置LED的状态
    }
    break;
  }
}

</span><span style="color:#ff0000;">

</span>

5 我们先别管Enddevice.c文件将它禁止编译

右键Enddevice.c文件  ----》 Options   左上角打钩!!!!!!!!!!!!!!!!!!!!


ZigBee实现基础组网成功返回LED 字符 P1_1绿闪烁_第3张图片

到这一步 协调器版写完了,可以烧写到板子上了。


6以下就是写节点板上的程序了:就是主要是往Enddevice.c文件里写了(在这前提要把workspaceEB下的CoordinatorEB改成EndeviceEB)

ZigBee实现基础组网成功返回LED 字符 P1_1绿闪烁_第4张图片

然后以第五步的方法  把Coordinator.c设成禁止编译!!!!!!!!!!

Enddevice.c程序如下:
<span style="color:#9999ff;">#include "OSAL.h"
#include "AF.h"
#include "ZDApp.h"
#include "ZDObject.h"
#include "ZDProfile.h"
#include <string.h>
#include "Coordinator.h"
#include "DebugTrace.h"

#if !defined (WIN32)
#include "OnBoard.h"
#endif

#include "hal_lcd.h"
#include "hal_led.h"
#include "hal_key.h"
#include "hal_uart.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,
  (cId_t *)NULL,  
  GENERICAPP_MAX_CLUSTERS,
  (cId_t *)GenericApp_ClusterList   
};

endPointDesc_t GenericApp_epDesc;//定义结构体 Go to
byte GenericApp_TaskID;//普通应用工作号  
byte GenericApp_TransID;
devStates_t GenericApp_NwkState;


void GenericApp_MessageMSGCB( afIncomingMSGPacket_t *pckt );//消息处理函数
void GenericApp_SendTheMessage( void );//数据发送函数



void GenericApp_Init( byte task_id )//任务初始化函数
{
  GenericApp_TaskID = task_id;//任务优先级
  GenericApp_NwkState = DEV_INIT;
  GenericApp_TransID = 0;//将发送的数据包初始化 0//每发送一个包 自动加 1
  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_SendTheMessage();
        }
          break;
        default:
          break;
      }

      // Release the memory
      osal_msg_deallocate( (uint8 *)MSGpkt );

      // Next
      MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( GenericApp_TaskID );
    }

    // return unprocessed events
    return (events ^ SYS_EVENT_MSG);
  }

  return 0;
}


void GenericApp_SendTheMessage( void )
{
  unsigned char theMessageData[4] = "LED";//命令字符
  afAddrType_t my_DstAddr;//goto
  my_DstAddr.addrMode = (afAddrMode_t)Addr16Bit;//Addr16Bit设置单播
  my_DstAddr.endPoint = GENERICAPP_ENDPOINT;//初始化端口号
  my_DstAddr.addr.shortAddr = 0x0000;
  AF_DataRequest(&my_DstAddr,&GenericApp_epDesc,//AF_DataRequest 发送函数  有原型
  GENERICAPP_CLUSTERID,
  3,
  theMessageData,//修改
  &GenericApp_TransID,
  AF_DISCV_ROUTE,
  AF_DEFAULT_RADIUS );
  HalLedBlink(HAL_LED_2,0,50,500);//调用闪烁函数 
  }

//  if ( AF_DataRequest( &GenericApp_DstAddr, &GenericApp_epDesc,
//                       GENERICAPP_CLUSTERID,
//                       (byte)osal_strlen( theMessageData ) + 1,
//                       (byte *)&theMessageData,
//                       &GenericApp_TransID,
//                       AF_DISCV_ROUTE, AF_DEFAULT_RADIUS ) == afStatus_SUCCESS )
//  {
//     //Successfully requested to be sent.
//  }
//  else
//  {
//     //Error occurred in request to send.
//  }</span><span style="color:#006600;">
</span>


然后编译烧写到另一个板子上就OK了。

我的源码         http://download.csdn.net/detail/csdnhejingzhou/9210487


你可能感兴趣的:(ZigBee实现基础组网成功返回LED 字符 P1_1绿闪烁)