网络通信之点播
来源:互联网 发布: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
- 网络通信之点播
- 网络流媒体(flv)点播解决方案
- java 之网络通信
- 网络通信之UDP
- Android之网络通信
- Android之网络通信
- 网络通信之图片下载
- 网络通信之swoole
- 网络通信之HTTP
- 网络通信之UDP
- 网络通信之TCP
- java之网络通信
- Qt之网络通信
- Android网络通信之-Socket通信
- Win32程序设计之网络通信
- 网络编程之TCP通信
- select()网络通信之client
- 网络通信之tcp编程
- 缓存淘汰算法系列之1 --- LRU
- 吾日三省吾身
- (ros/navigation/slam_gmapping) map_server地图服务器
- struts1+json的应用
- 缓存淘汰算法系列之2 --- LFU
- 网络通信之点播
- 勿忘初衷,方得始终
- 【JAVA程序】寻找最小生成树的欧拉路径,即一笔画问题
- Linux基础学习——unit11
- 意志力与习惯
- MS Bing Translate API安全机制变化后的全新调用方式
- 优化临时表使用,SQL语句性能提升100倍
- 设定目标
- 冒泡、选择、插入排序算法小总结