网络通信之点播

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

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

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
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值