问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

zigbee 网络建立过程以及ZDO_STATE_CHANGE 在什么情况下被触发!

发布网友 发布时间:2022-04-25 23:56

我来回答

2个回答

热心网友 时间:2023-10-19 17:47

  ZDO_STATE_CHANGE 只有当设备角色发生转变后才会触发,才能被告诉COOR你的网络中有一个设备变了角色。
  zigbee网络启动流程 ---- 协调器
  main()->osal_init_system()->osalInitTasks()->ZDApp_Init()
  进入ZDApp_Init()函数:
  void ZDApp_Init( uint8 task_id )
  {
  ZDAppTaskID = task_id;
  // Initialize the ZDO global device short address storage
  ZDAppNwkAddr.addrMode = Addr16Bit;
  ZDAppNwkAddr.addr.shortAddr = INVALID_NODE_ADDR;
  (void)NLME_GetExtAddr(); // Load the saveExtAddr pointer.
  // Check for manual "Hold Auto Start"
  ZDAppCheckForHoldKey();
  // Initialize ZDO items and setup the device - type of device to create.
  ZDO_Init();
  // Register the endpoint description with the AF
  // This task doesn't have a Simple description, but we still need
  // to register the endpoint.
  afRegister( (endPointDesc_t *)&ZDApp_epDesc );
  #if defined( ZDO_USERDESC_RESPONSE )
  ZDApp_InitUserDesc();
  #endif // ZDO_USERDESC_RESPONSE
  // Start the device?
  if ( devState != DEV_HOLD )
  {
  ZDOInitDevice( 0 );
  }
  else
  {
  // Blink LED to indicate HOLD_START
  HalLedBlink ( HAL_LED_4, 0, 50, 500 );
  }
  ZDApp_RegisterCBs();
  }
  协调器没有编译HOLD_AUTO_START,也没有手工设置SW_1,初始化devState = DEV_INIT(参见基本问题说明3).因此直接在ZDApp_Init()中进入ZDOInitDevice( 0 )开启设备.
  uint8 ZDOInitDevice( uint16 startDelay )
  {
  uint8 networkStateNV = ZDO_INITDEV_NEW_NETWORK_STATE;
  uint16 extendedDelay = 0;
  if ( devState == DEV_HOLD )
  {
  // Initialize the RAM items table, in case an NV item has been updated.
  zgInitItems( FALSE );
  }
  ZDConfig_InitDescriptors();
  //devtag.071807.todo - fix this temporary solution
  _NIB.CapabilityFlags = ZDO_Config_Node_Descriptor.CapabilityFlags;
  devState = DEV_INIT; // Remove the Hold state
  // Initialize leave control logic 函数读取NV项目ZCD_NV_LEAVE_CTRL的值,ZDApp_LeaveCtrl指向这个值
  ZDApp_LeaveCtrlInit();
  // Check leave control reset settings
  ZDApp_LeaveCtrlStartup( &devState, &startDelay );
  // Leave may make the hold state come back以上两个函数设置了对设备离开时的控制,如果有延时则延时,没有则把设备状态设为DEV_HOLD
  if ( devState == DEV_HOLD )
  {
  // Set the NV startup option to force a "new" join.
  zgWriteStartupOptions( ZG_STARTUP_SET, ZCD_STARTOPT_DEFAULT_NETWORK_STATE );
  // Notify the applications
  osal_set_event( ZDAppTaskID, ZDO_STATE_CHANGE_EVT );
  return ( ZDO_INITDEV_LEAVE_NOT_STARTED ); // Don't join - (one time).
  }
  #if defined ( NV_RESTORE )
  // Get Keypad directly to see if a reset nv is needed.
  // Hold down the SW_BYPASS_NV key (defined in OnBoard.h)
  // while booting to skip past NV Restore.
  if ( HalKeyRead() == SW_BYPASS_NV )
  networkStateNV = ZDO_INITDEV_NEW_NETWORK_STATE;
  else
  {
  // Determine if NV should be restored
  networkStateNV = ZDApp_ReadNetworkRestoreState();
  }
  if ( networkStateNV == ZDO_INITDEV_RESTORED_NETWORK_STATE )
  {
  networkStateNV = ZDApp_RestoreNetworkState();
  }
  else
  {
  // Wipe out the network state in NV
  NLME_InitNV();
  NLME_SetDefaultNV();
  // clear NWK key values
  ZDSecMgrClearNVKeyValues();
  }
  #endif
  if ( networkStateNV == ZDO_INITDEV_NEW_NETWORK_STATE )
  {
  ZDAppDetermineDeviceType();
  // Only delay if joining network - not restoring network state
  extendedDelay = (uint16)((NWK_START_DELAY + startDelay)
  + (osal_rand() & EXTENDED_JOINING_RANDOM_MASK));
  }
  // Initialize the security for type of device
  ZDApp_SecInit( networkStateNV );
  // Trigger the network start
  ZDApp_NetworkInit( extendedDelay );
  // set broadcast address mask to support broadcast filtering
  NLME_SetBroadcastFilter( ZDO_Config_Node_Descriptor.CapabilityFlags );
  return ( networkStateNV );
  }
  
  注:
  (1)自启动模式下SampleApp的终端和路由器总体流程基本一致、
  (2)以SampleApp为例,ZDO_StartDevice()函数的两个重要参数比较:
  终端:
  ZDO_Config_Node_Descriptor.LogicalType = NODETYPE_DEVICE
  devStartMode = MODE_JOIN
  路由器:
  ZDO_Config_Node_Descriptor.LogicalType = NODETYPE_ROUTER
  devStartMode = MODE_JOIN
  协调器:
  ZDO_Config_Node_Descriptor.LogicalType = NODETYPE_COORDINATOR
  devStartMode = MODE_HARD

热心网友 时间:2023-10-19 17:48

ZDO_STATE_CHANGE 只有当设备角色发生转变后才会触发,才能被告诉COOR你的网络中有一个设备变了角色。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
说课包括哪些方面 说课内容包括()。 如何在手机百度上删除对话记录? 结核病是什么样的疾病? 曹丕17岁得了肺痨,明知自己命不长久,还要强争王位,是不是很自私呢?_百... 古代小说常出现的病名 急求一篇"生活小窍门"(500字)的作文 至今最有什么小妙招 健康的戒烟方法 笔记本电池锁死是什么原因引起的? 开机进入BIOS是哪个键?里面的设置有什么用? 开机进入BIOS是哪个键?里面的设置有什么用? GetDevicePower 怎么用 电脑ACPI Suspend state选项如何设置? 电脑ACPI Suspend state选项如何设置? 蓝牙什么时候会用到device id profile 蓝牙什么时候会用到device id profile android耳机插拔监听做不了全局注册吗 android耳机插拔监听做不了全局注册吗 BIOS设置中last state的中文意思是什么? C#C++如何确定鼠标点击的坐标? 在插入数据库表中一直报java.lang.Integer cannot be cast to java.lang.String的造型错误, windows10 关闭tpm自动 C++中如何从一个类引用public变量(这个变量是另一个类的成员)? Android开发中 循环命令 怎么 循环一次先后执行两条命令 pro/e4.0安装后运行出现无法定位程序输入点提示 联想手机device state locked怎么解决 device state unlocked什么意思 device state locked 是什么意思 device state-unlocker什么意思 zigbee 网络建立过程以及ZDO_STATE_CHANGE 在什么情况下被触发! 为什么英语中“state-of-the art”表示'最先进的"意思 为什么英语中“state-of-the art”表示'最先进的"意思 戴尔售后电话多少,笔记本开不开机了? dell售后投诉电话是什么啊 蒸熟的米剩下的怎么做好吃 剩下的大米怎么做好吃 微信零钱通提出转出申请后怎样才能撤回申请来? 取消零钱通怎么取消? 熬米汤剩下的米怎么用 微信零钱通怎么解除 微信转成零钱通已经收账怎么撤回 剩下的米饭怎么办,简单几下就做出好吃的炒米,不需要 微信零钱通怎么撤回转账 洒净剩下的米怎么处理 做米酒剩下的米料还能再利用吗? 微信零钱通转账超过十几天没到账,要怎么办,可以撤销转账吗 中午剩下的米怎么做米汤 剩下的大米怎样炒好吃?谢谢! 剩下多少米?