网络通信之点播

来源:互联网 发布:mysql数据库查看 编辑:程序博客网 时间:2024/05/16 15:00

点播:通俗来讲就是点对点的通信。两者参与。

下面代码主要开始是组网,入网,这里就不多讲,终端节点向协调器发送了一个终端节点的地址,当协调器收到后,返回向终端节点发送点播数据。

coorddinator.c

//协调器部分代码

我运行的现象, 在串口(看你连接的是几了)显示: Rx:D1

 协调器周期性发送数据D1,串口也是周期性显示数据 在这里我设置了一个全局变量int led=1,来判断(是为了后面使用Rled_on,Rled_off命令) 当led=1时,灯是灭的; 当led=0时,灯是亮的;


#include "Coordinator.h"/********************************************************************* * INCLUDES */#include "OSAL.h"#include "AF.h"#include "ZDApp.h"#include "ZDObject.h"#include "ZDProfile.h"#include "OSAL_Nv.h"  //使用NV操作函数,必须包含该头文件#include "aps_groups.h"#include "DebugTrace.h"#if !defined( WIN32 )  #include "OnBoard.h"#endif/* HAL */#include "hal_lcd.h"#include "hal_led.h"#include "hal_key.h"#include "hal_uart.h"#include "MT_UART.h"#include "MT_APP.h"#include "MT.h"#define TEST_SEND_DATA  0x01/********************************************************************* * GLOBAL VARIABLES */// 群集列表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; GENERICAPP_MAX_CLUSTERS,        //  byte  AppNumInClusters;  (cId_t *)GenericApp_ClusterList  //  byte *pAppInClusterList;};// 端点描述符endPointDesc_t GenericApp_epDesc;/********************************************************************* * LOCAL VARIABLES */// 任务ID,优先级byte GenericApp_TaskID; // 发送数据序号byte GenericApp_TransID;  // This is the unique message ID (counter)// 设备状态devStates_t GenericApp_NwkState;/********************************************************************* * LOCAL FUNCTIONS *///存储终端节点发送过来的网络地址uint16 end_addr;// 发送数据static void GenericApp_Send_P2P_Message( void );static void GenericApp_MessageMSGCB( afIncomingMSGPacket_t *pckt );static void GenericApp_MessageMSGCB( afIncomingMSGPacket_t *pkt );/********************************************************************* * @fn      GenericApp_Init * * @brief   Initialization function for the Generic App Task. *          This is called during initialization and should contain *          any application specific initialization (ie. hardware *          initialization/setup, table initialization, power up *          notificaiton ... ). * * @param   task_id - the ID assigned by OSAL.  This ID should be *                    used to send messages and set timers. * * @return  none */void GenericApp_Init( uint8 task_id ){  GenericApp_TaskID = task_id;   GenericApp_TransID = 0;    // Fill out the endpoint description.  GenericApp_epDesc.endPoint = GENERICAPP_ENDPOINT;  GenericApp_epDesc.task_id = &GenericApp_TaskID;  GenericApp_epDesc.simpleDesc            = (SimpleDescriptionFormat_t *)&GenericApp_SimpleDesc;  GenericApp_epDesc.latencyReq = noLatencyReqs;  // Register the endpoint description with the AF  afRegister( &GenericApp_epDesc );  // 没有注册不能使用OSAL提供的服务    // 窗口配置  halUARTCfg_t uartConfig;     uartConfig.configured = true;  uartConfig.baudRate = HAL_UART_BR_115200;  uartConfig.flowControl = false;  uartConfig.callBackFunc = NULL;    HalUARTOpen ( 0, &uartConfig );}/********************************************************************* * @fn      GenericApp_ProcessEvent * * @brief   Generic Application Task event processor.  This function *          is called to process all events for the task.  Events *          include timers, messages and any other user defined events. * * @param   task_id  - The OSAL assigned task ID. * @param   events - events to process.  This is a bit map and can *                   contain more than one event. * * @return  none */uint16 GenericApp_ProcessEvent( uint8 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;      case ZDO_STATE_CHANGE:   // 接收到无线数据事件          GenericApp_NwkState = (devStates_t)(MSGpkt->hdr.status);          if (GenericApp_NwkState == DEV_ZB_COORD)          {            HalLedSet(HAL_LED_ALL, HAL_LED_MODE_ON);            osal_set_event(GenericApp_TaskID, TEST_SEND_DATA);                      }          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);   // 返回其他未处理的消息  }    // 处理  if (events & TEST_SEND_DATA)  {     GenericApp_Send_P2P_Message();//点播    osal_start_timerEx( GenericApp_TaskID, TEST_SEND_DATA, 5000 );                return (events ^ TEST_SEND_DATA);   // 返回其他未处理的消息  }  // Discard unknown events  return 0;}static void GenericApp_Send_P2P_Message( void ){ byte SendData[3]="D1"; afAddrType_t GenericApp_DstAddr;    GenericApp_DstAddr.addr.shortAddr = end_addr;    // 刚获取的终端短地址  GenericApp_DstAddr.addrMode =(afAddrMode_t)Addr16Bit;   // 点播  GenericApp_DstAddr.endPoint = GENERICAPP_ENDPOINT;  // 接收端的端点号    if ( AF_DataRequest( &GenericApp_DstAddr, &GenericApp_epDesc,                       GENERICAPP_CLUSTERID,                       2,                       SendData,                       &GenericApp_TransID,                       AF_DISCV_ROUTE, AF_DEFAULT_RADIUS ) == afStatus_SUCCESS )  {  }  else  {              // Error occurred in request to send.  } }//接受终端的地址static void GenericApp_MessageMSGCB( afIncomingMSGPacket_t *pkt ){ //HalLedSet( HAL_LED_1, HAL_LED_MODE_ON );   switch ( pkt->clusterId){case GENERICAPP_CLUSTERID:    osal_memcpy(&end_addr,pkt->cmd.Data,2);      break;      default:      break;}}

EndDevice.c

//终端节点代码

/********************************************************************* * INCLUDES */#include "OSAL.h"#include "AF.h"#include "ZDApp.h"#include "ZDObject.h"#include "ZDProfile.h"#include "Coordinator.h"#include "DebugTrace.h"#include "aps_groups.h"#if !defined( WIN32 )  #include "OnBoard.h"#endif/* HAL */#include "hal_lcd.h"#include "hal_led.h"#include "hal_key.h"#include "hal_uart.h"/********************************************************************* * GLOBAL VARIABLES */// 群集列表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;  GENERICAPP_MAX_CLUSTERS,          //  byte  AppNumInClusters;  (cId_t *)GenericApp_ClusterList   //  byte *pAppInClusterList;};// 端点描述符endPointDesc_t GenericApp_epDesc;/********************************************************************* * LOCAL VARIABLES */// 任务ID,优先级byte GenericApp_TaskID; // 设备状态devStates_t GenericApp_NwkState;byte GenericApp_TransID; /********************************************************************* * LOCAL FUNCTIONS */// 接收到消息后,进行消息处理static void GenericApp_MessageMSGCB( afIncomingMSGPacket_t *pckt );static void GenericApp_SendTheMessage( void );static void SendTheMessage( void );void To_String(uint8 *dest, char* src, uint8 length);/********************************************************************* * @fn      GenericApp_Init * * @brief   Initialization function for the Generic App Task. *          This is called during initialization and should contain *          any application specific initialization (ie. hardware *          initialization/setup, table initialization, power up *          notificaiton ... ). * * @param   task_id - the ID assigned by OSAL.  This ID should be *                    used to send messages and set timers. * * @return  none */void GenericApp_Init( uint8 task_id ){  GenericApp_TaskID = task_id;    GenericApp_NwkState = DEV_INIT;  // 设备未连接任何网络  // Fill out the endpoint description.  GenericApp_epDesc.endPoint = GENERICAPP_ENDPOINT;  GenericApp_epDesc.task_id = &GenericApp_TaskID;  GenericApp_epDesc.simpleDesc            = (SimpleDescriptionFormat_t *)&GenericApp_SimpleDesc;  GenericApp_epDesc.latencyReq = noLatencyReqs;  // Register the endpoint description with the AF  afRegister( &GenericApp_epDesc );  // 没有注册不能使用OSAL提供的服务        // 初始化串口  halUARTCfg_t uartConfig;  uartConfig.configured = TRUE;  uartConfig.baudRate = HAL_UART_BR_115200;  uartConfig.flowControl = FALSE;  uartConfig.callBackFunc = NULL;    HalUARTOpen(0, &uartConfig);  }/********************************************************************* * @fn      GenericApp_ProcessEvent * * @brief   Generic Application Task event processor.  This function *          is called to process all events for the task.  Events *          include timers, messages and any other user defined events. * * @param   task_id  - The OSAL assigned task ID. * @param   events - events to process.  This is a bit map and can *                   contain more than one event. * * @return  none */uint16 GenericApp_ProcessEvent( uint8 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;       case ZDO_STATE_CHANGE:  // 设备状态发生改变          GenericApp_NwkState = (devStates_t)(MSGpkt->hdr.status);       if ( (GenericApp_NwkState == DEV_ZB_COORD)            || ( GenericApp_NwkState == DEV_END_DEVICE)              || GenericApp_NwkState == DEV_ROUTER)  // 设备状态为终端设备,加入网络成功          {           SendTheMessage();
 HalLedSet(HAL_LED_ALL, HAL_LED_MODE_OFF);
          }        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);   // 返回其他未处理的消息  }  // Discard unknown events  return 0;} static void SendTheMessage( void ) {   // 目的地址  afAddrType_t GenericApp_DstAddr;  uint16 nwk = NLME_GetShortAddr();            //获取本节点的网络地址  GenericApp_DstAddr.addr.shortAddr = 0x0000;  // 协调器的网络地址固定为0  GenericApp_DstAddr.addrMode = afAddr16Bit;  GenericApp_DstAddr.endPoint = GENERICAPP_ENDPOINT;  // 接收端的端点号    if ( AF_DataRequest( &GenericApp_DstAddr, &GenericApp_epDesc,                       GENERICAPP_CLUSTERID,                       2,                       (uint8*)&nwk,                       &GenericApp_TransID,                       AF_DISCV_ROUTE, AF_DEFAULT_RADIUS ) == afStatus_SUCCESS )  {            // Successfully requested to be sent.    //HalLedSet( HAL_LED_1, HAL_LED_MODE_ON );  // 灭灯  } }                          static void GenericApp_SendTheMessage( void ){  char theMessageData[] = "Router Received!";    // 目的地址  afAddrType_t GenericApp_DstAddr;    GenericApp_DstAddr.addr.shortAddr = 0x0000;  // 协调器的网络地址固定为0  GenericApp_DstAddr.addrMode = afAddr16Bit;  GenericApp_DstAddr.endPoint = GENERICAPP_ENDPOINT;  // 接收端的端点号    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.    //HalLedSet( HAL_LED_1, HAL_LED_MODE_TOGGLE );  // 点灯  }  else  {        //HalLedSet( HAL_LED_1, HAL_LED_MODE_OFF );   // 关灯    // Error occurred in request to send.  }}int led=1;static void GenericApp_MessageMSGCB( afIncomingMSGPacket_t *pkt ){ switch ( pkt->clusterId  ){  case GENERICAPP_CLUSTERID:       HalUARTWrite(0, "Rx:", 3);       //提示接收到数据    HalUARTWrite(0, pkt->cmd.Data, pkt->cmd.DataLength); //串口输出接收到的数据   if(led==0)    {   HalLedSet( HAL_LED_2, HAL_LED_MODE_OFF);//点灯  这里OFF是点灯,主要具体是啥我也忘了,跟电平有关吧   }   else   {   HalLedSet( HAL_LED_2, HAL_LED_MODE_ON); //关灯   }      break;      default:      break;}}void To_String(uint8 *dest, char* src, uint8 length){  int i = length-1;  int j = 0;  while(i >= 0)  {    uint8 uctemp;    if (j % 2 == 0)    {      uctemp = (src[i] >> 4) & 0xf;    }    else    {      uctemp = src[i] & 0xf;    }         if (uctemp < 0xa)    {      dest[j] = uctemp + 0x30;    }    else    {      dest[j] = uctemp + 0x41 - 0xa;    }    j++;    if (j % 2 == 0)    {      i--;    }  }}

共用的头文件代码

coordinate.h

#ifndef COORDINATOR_H#define COORDINATOR_H/********************************************************************* * INCLUDES */#include "ZComDef.h"/********************************************************************* * CONSTANTS */#define GENERICAPP_ENDPOINT           10#define GENERICAPP_PROFID             0x0F04#define GENERICAPP_DEVICEID           0x0001#define GENERICAPP_DEVICE_VERSION     0#define GENERICAPP_FLAGS              0#define GENERICAPP_MAX_CLUSTERS       3#define GENERICAPP_CLUSTERID          1#define GENERICAPP_PERIODIC_CLUSTERID  1#define GENERICAPP_FLASH_CLUSTERID     2#define GENERICAPP_P2P_CLUSTERID       3/********************************************************************* * FUNCTIONS *//* * Task Initialization for the Generic Application */// 任务初始化函数extern void GenericApp_Init( byte task_id );/* * Task Event Processor for the Generic Application */// 任务事件处理函数extern UINT16 GenericApp_ProcessEvent( byte task_id, UINT16 events );/******************************************************************************************************************************************/#endif /* COORDINATOR_H */
                                             
0 0
原创粉丝点击