当前位置: 首页 > wzjs >正文

如何创建自己公司网站站长之家怎么找网址

如何创建自己公司网站,站长之家怎么找网址,马鞍山网站开发,做外贸女装有哪些网站有哪些07_Z-Stack多节点组网及终端消息上报 多节点组网 ​ 实现两个终端与协调器组网。 在zcl_samplesw.c文件中,定义全局变量用于保存连接的设备地址 #ifdef ZCL_REPORT #define ZCLAPP_ENDDEVICE_NUM 2 // 连接设备数量 static uint16 zclSampleSw_EndDeviceAddr…

07_Z-Stack多节点组网及终端消息上报

多节点组网

​ 实现两个终端与协调器组网。

  • zcl_samplesw.c文件中,定义全局变量用于保存连接的设备地址
#ifdef ZCL_REPORT
#define ZCLAPP_ENDDEVICE_NUM 2    // 连接设备数量
static uint16 zclSampleSw_EndDeviceAddrs[ZCLAPP_ENDDEVICE_NUM];  // 全局变量保存连接到的设备地址
static uint8 zclSampleSw_ProcessInReportCmd( zclIncomingMsg_t *pInMsg );
#endif // ZCL_REPORT
  • zclSampleSw_Init初始化函数中,协调器创建网络,终端加入网络
#ifdef ZDO_COORDINATOR// Init UartzclSampleSw_InitUart();ZDO_RegisterForZDOMsg ( zclSampleSw_TaskID, Device_annce );  // 注册 Device_annce 簇IDbdb_StartCommissioning( BDB_COMMISSIONING_MODE_NWK_FORMATION |BDB_COMMISSIONING_MODE_FINDING_BINDING );  // 协调器建立网络NLME_PermitJoiningRequest(255);
#elsebdb_StartCommissioning( BDB_COMMISSIONING_MODE_NWK_STEERING |BDB_COMMISSIONING_MODE_FINDING_BINDING );  // 入网/* //该部分代码写至zclSampleSw_ProcessCommissioningStatus中// 当终端设备入网成功后, 开始上报osal_start_timerEx(zclSampleSw_TaskID, SAMPLEAPP_REPORT_EVT, SAMPLEAPP_REPORT_PERIOD); // 初始触发上报数据事件zclSampleSw_DeviceAnnce();  // 成功加入网络后 广播自己的地址*/
#endif
  • 在回调函数zclSampleSw_ProcessCommissioningStatus中,若终端成功加入网络则广播自己的地址,否则触发重连事件
    case BDB_COMMISSIONING_NWK_STEERING:if(bdbCommissioningModeMsg->bdbCommissioningStatus == BDB_COMMISSIONING_SUCCESS){// 成功加入网络//We are on the nwk, what now?#ifdef ZDO_COORDINATOR#elseosal_start_timerEx(zclSampleSw_TaskID, SAMPLEAPP_REPORT_EVT, SAMPLEAPP_REPORT_PERIOD); // 初始触发上报数据事件zclSampleSw_DeviceAnnce();  // 加入网络后 广播自己的地址#endif}else{#ifdef ZDO_COORDINATOR#else// 触发重新连接事件osal_start_timerEx(zclSampleSw_TaskID, SAMPLEAPP_REJOIN_EVT, SAMPLEAPP_REJOIN_PERIOD);#endif}break;
/*** @brief 终端广播自己的网络地址*/static void zclSampleSw_DeviceAnnce( void ){    ZDP_DeviceAnnce(NLME_GetShortAddr(),//获取本设备的网络地址(短地址)NLME_GetExtAddr(),//获取本设备的物理地址(通常就是MAC地址)ZDO_Config_Node_Descriptor.CapabilityFlags,0);    }
  • zclSampleSw_event_loop事件处理函数中,终端处理重连事件
#ifdef ZDO_COORDINATOR
#else// Rejoin 重新加入网络if ( events & SAMPLEAPP_REJOIN_EVT ){bdb_StartCommissioning(BDB_COMMISSIONING_MODE_NWK_STEERING |BDB_COMMISSIONING_MODE_FINDING_BINDING );return ( events ^ SAMPLEAPP_REJOIN_EVT );}
#endif
  • zclSampleSw_event_loop事件处理函数中,协调器处理ZDO_CB_MSG事件,将收到的终端广播的地址保存
#ifdef ZDO_COORDINATORcase ZDO_CB_MSG:zclSampleSw_processZDOMgs( (zdoIncomingMsg_t *)MSGpkt ); // ZDO消息处理函数break; 
#endif
/*** @brief ZDO消息处理函数*/static void zclSampleSw_processZDOMgs(zdoIncomingMsg_t *pMsg){     switch ( pMsg->clusterID )//判断消息中的Cluster ID{case Device_annce: // 收到终端的宣告广播{static uint8 idx = 0;// 把终端的网络地址保存到全局变量中if(idx < ZCLAPP_ENDDEVICE_NUM){zclSampleSw_EndDeviceAddrs[idx] = pMsg->srcAddr.addr.shortAddr;// 打印信息HalLcdWriteStringValue("EndAddr:", zclSampleSw_EndDeviceAddrs[idx], 16, idx%2+3);idx++;}else if(idx > ZCLAPP_ENDDEVICE_NUM){}}break;default:break;}}

ZCL层消息上报

​ 终端定时上报数据给协调器,协调器收到数据后在屏幕上显示

  • 在回调函数zclSampleSw_ProcessCommissioningStatus中,终端在成功入网后触发SAMPLEAPP_REPORT_EVT上报事件
case BDB_COMMISSIONING_NWK_STEERING:if(bdbCommissioningModeMsg->bdbCommissioningStatus == BDB_COMMISSIONING_SUCCESS){// 成功加入网络//We are on the nwk, what now?#ifdef ZDO_COORDINATOR#elseosal_start_timerEx(zclSampleSw_TaskID, SAMPLEAPP_REPORT_EVT, SAMPLEAPP_REPORT_PERIOD); // 初始触发上报数据事件zclSampleSw_DeviceAnnce();  // 加入网络后 广播自己的地址#endif}else{...}
break;
  • zclSampleSw_event_loop事件处理函数中,处理SAMPLEAPP_REPORT_EVT事件
#ifdef ZDO_COORDINATOR
#else// Report  上报数据if ( events & SAMPLEAPP_REPORT_EVT ){zclSampleSw_ReportTest(); // 上报数据处理函数osal_start_timerEx(zclSampleSw_TaskID, SAMPLEAPP_REPORT_EVT, SAMPLEAPP_REPORT_PERIOD);  // 重复触发上报事件return ( events ^ SAMPLEAPP_REPORT_EVT );}
#endif
  /*** @brief 终端上报数据给协调器 */static void zclSampleSw_ReportTest(void){static uint8 seqNum = 0;zclReportCmd_t *reportCmd;afAddrType_t destAddr;  // 目标地址destAddr.addrMode = afAddr16Bit; // 模式为短地址destAddr.endPoint = SAMPLESW_ENDPOINT; // 端点号destAddr.addr.shortAddr = 0x0000; // 0x0000表示协调器reportCmd = (zclReportCmd_t *)osal_mem_alloc(sizeof(zclReportCmd_t) + sizeof(zclReport_t));  // 分配空间if(reportCmd == NULL)return;reportCmd->attrList[0].attrData = (uint8 *)osal_mem_alloc(sizeof(uint8)); // 为上报的数据分配空间if(reportCmd->attrList[0].attrData == NULL)return;reportCmd->numAttr = 1;  // 上报属性个数reportCmd->attrList[0].attrID = ATTRID_ON_OFF_SWITCH_TYPE;reportCmd->attrList[0].dataType = ZCL_DATATYPE_ENUM8;*((uint8 *)(reportCmd->attrList[0].attrData)) = seqNum;  // 上报的数据=seqNum// 调用上报函数zcl_SendReportCmd( SAMPLESW_ENDPOINT, // 源端点号&destAddr,  // 目标设备地址信息ZCL_CLUSTER_ID_GEN_ON_OFF_SWITCH_CONFIG, // 属性所属Cluster ID reportCmd, // 上报的属性值ZCL_FRAME_CLIENT_SERVER_DIR, // 通信方向 TRUE, // 关闭默认相应seqNum++ ); // 每上报一次 seqNum+1HalLcdWriteStringValue("Report: ", (seqNum-1), 10, 4);osal_mem_free(reportCmd->attrList[0].attrData); // 释放内存osal_mem_free(reportCmd);}
extern ZStatus_t zcl_SendReportCmd(uint8 srcEP, //源端点号afAddrType_t *dstAddr, //目标设备地址信息uint16 realClusterID, //属性所属Cluster IDzclReportCmd_t *reportCmd,//描述待上报的属性值uint8 direction, //通信方向uint8 disableDefaultRsp, //是否关闭默认响应(目标设备的响应)uint8 seqNum); //数据包标号,由开发者自定义
  • 协调器收到上报信息后会触发ZCL_INCOMING_MSG事件,在zclSampleSw_event_loop事件处理函数中调用zclSampleSw_ProcessIncomingMsg处理该事件,在zclSampleSw_ProcessIncomingMsg中判断命令ID是否为ZCL_CMD_REPORT,然后调用zclSampleSw_ProcessInReportCmd处理终端上报的信息
// zclSampleSw_event_loop 调用 zclSampleSw_ProcessIncomingMsg
case ZCL_INCOMING_MSG:{zclSampleSw_ProcessIncomingMsg( (zclIncomingMsg_t *)MSGpkt );}break;
// zclSampleSw_ProcessIncomingMsg 调用 zclSampleSw_ProcessInReportCmd
case ZCL_CMD_REPORT:zclSampleSw_ProcessInReportCmd( pInMsg );  break;
static uint8 zclSampleSw_ProcessInReportCmd( zclIncomingMsg_t *pInMsg )
{zclReportCmd_t *reportCmd;uint8 i;reportCmd = (zclReportCmd_t *)pInMsg->attrCmd;for ( i = 0; i < reportCmd->numAttr; i++ ) // 解包{if( pInMsg->clusterId == ZCL_CLUSTER_ID_GEN_ON_OFF_SWITCH_CONFIG && reportCmd->attrList[i].attrID == ATTRID_ON_OFF_SWITCH_TYPE){int8 attrDat = *(reportCmd->attrList[i].attrData);  // 接收消息for(uint8 j=0; j < ZCLAPP_ENDDEVICE_NUM; j++) {// 根据 短地址分行打印上报的消息if(pInMsg->srcAddr.addr.shortAddr == zclSampleSw_EndDeviceAddrs[j])HalLcdWriteStringValue("Rx Value:", attrDat, 10, 3+j%2);}}}return ( TRUE );
}
  • 预编译选项中开启ZCL_REPORT_DESTINATION_DEVICEZCL_REPORT

终端断电无法重连问题解决

  • Tools文件夹下f8wConfig.cfg文件中配置PAN ID为固定数值
// -DZDAPP_CONFIG_PAN_ID=0xFFFF
-DZDAPP_CONFIG_PAN_ID=0x0001
  • 预编译选项中开启NV_INIT=1NV_RESTORE=1, 开启后Zigbee会将一些网络配置参数和网络状态存储到非易失活存储器中, 以便重连时能迅速恢复网络状态

  • ZDO文件夹下ZDApp.c文件中的ZDApp_ProcessOSALMsg函数里加入以下内容(加到最后即可)

    case ZDO_NWK_JOIN_REQ:      //重连事件if ( ZG_BUILD_JOINING_TYPE && ZG_DEVICE_JOINING_TYPE ){retryCnt = 0;devStartMode = MODE_RESUME;                                     //让设备处于网络恢复模式_tmpRejoinState = true;                                         //初始化临时状态为重连osal_cpyExtAddr( ZDO_UseExtendedPANID, _NIB.extendedPANID );    //初始化ZDO为之前的PANIDzgDefaultStartingScanDuration = BEACON_ORDER_60_MSEC;           //每60毫秒发送一个信标ZDApp_NetworkInit( 0 );                                         //重新初始化网络产生ZDO_NETWORK_INIT事件}break;
  • 完成以上步骤后,终端断电后也能重新连上协调器了,具体重连策略可看参考资料中官方论坛的帖子

参考资料

第7章:基于ZCL的属性上报实验 - ZigBee 3.0 开发指南

zigbee端末掉线和重连的问题 cc2530协议栈2.5.1a - Zigbee 和 Thread 论坛 - Zigbee 和 Thread - E2E™ 设计支持

zigbee终端无法重连的问题解决_zigbee 设置掉电后不重连-CSDN博客

http://www.dtcms.com/wzjs/284855.html

相关文章:

  • 沅江网站设计seo刷排名公司
  • 城阳做网站关键词推广系统
  • wordpress表单提交的邮箱百度快速seo
  • 云平台网站叫什么爱奇艺科技有限公司
  • 中国网站优化哪家好seo关键词优化如何
  • 虚拟主机如何做网站seo优化6个实用技巧
  • 做英语阅读的网站产品推广外包
  • 国内品牌备案建站艾滋病阻断药
  • 淮安做网站app深圳网站seo
  • 个人的小说网站如何做线上营销模式有哪些
  • 网站前置审批 查询seo竞价
  • 邱县手机网站建设怎么宣传自己新开的店铺
  • 怎么免费给网站做收录山东济南最新消息
  • 建设部网站政策法规东莞网站营销推广
  • 网站上做地图手机上显示不出来的周口seo推广
  • 网站建设是自己做好还是外包在线磁力搜索神器
  • 三维在线设计网站无锡网站优化
  • 武汉建设管理局网站西安疫情最新数据消息5分钟前
  • 做的课件能做教育部网站查询码中文搜索引擎排名
  • 网站建设维护宣传网站seo主要是做什么的
  • 做的比较唯美的网站有哪些百度首页快速排名系统
  • 做带v头像的网站江苏seo团队
  • 做网站 深圳网络上如何推广网站
  • 白云建设网站新网站百度多久收录
  • 网站建设内容方向活动策划
  • 淘宝网站可以做轮播吗网站关键词优化的价格
  • 网站界面建议无锡百度推广平台
  • 世界疫情最新数据一览表seo有名气的优化公司
  • 品牌网站建设4小蝌蚪百度账号快速注册
  • 设计公司资质申请岳阳seo公司