This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

ZigBee协议栈的一些疑问

Other Parts Discussed in Thread: CC2538, Z-STACK

同一个环境有多个协调器

1.如果想节点只加入指定的协调器,按一下该协调器的按键,该协调器3分钟内运行加入,其他协调器因没有按按键则不允许加入,这个用什么函数实现?

2.协调器这边按按键允许加入的时候,节点这边要不要按按键?还是直接就加入了?

3.节点加入协调器后,节点和协调器都开启了NV,下次节点和协调器都重启了,还需要再按一下协调器的按键,节点才能加入吗?还是不需要按协调器按键,节点也能加入?

4.一个协调器可以带多少个节点(无路由器),CC2538协调器

  • 1. ZDP_MgmtPermitJoinReq
    2. 這要看你的軟件設計
    3. 不需要
    4. 這要看你协调器有多少的RAM/FLASH,CC2538應該可以帶60-80个节点沒有什麼問題
  • 你好,谢谢,协议栈里面的按键,如果我想区别长按和短按,该怎么识别?有没有什么好的建议?比如3秒内算短按,超过3秒算长按
  • 這個你要自己從application的程序自己作
  • 请问一下,协议栈对于按键的处理,按下去就触发按键事件,还是按下去再松手后才触发按键事件?如果协议栈可以设置,请问在哪里设置?
  • 你好,之前咨询你的问题,我想实现按下协调器板子上的按键,3分钟内允许节点加入网络,但是你说的是用ZDP_MgmtPermitJoinReq函数,我看到论坛关于这个函数的描述如下:
    NLME_PermitJoiningRequest是让自己不允许其他设备加入,只是一个内部的操作,没有无线数据的交互
    ZDP_MgmtPermitJoinReq发送命令给别人,让别的设备不允许其他设备加入。是通过无线数据让别的设备不允许加入。
    是不是应该用NLME_PermitJoiningRequest这个函数?如果用的是ZDP_MgmtPermitJoinReq,按下按键后,协调器需要发给别人,这就不对了吧?
  • 还有个问题,就是在按协调器按键之前,协调器要设置成不允许新的节点加入,请问这个怎么设置?
  • 這兩個函數都可以用,NLME_PermitJoiningRequest只可以開關自己的允许节点加入网络,ZDP_MgmtPermitJoinReq可以開關所有其他設備包含自己允许节点加入网络,用NLME_PermitJoiningRequest的話就直接用時間當參數,用ZDP_MgmtPermitJoinReq就還要指定要開關允许节点加入网络的設備地址
  • 谢谢
    1.NLME_PermitJoiningRequest这个函数,按按键的时候才执行,需要把没按按键之前协调器设置为不允许加入,这个在哪里设置?
    2.关于按键长按短按的识别,协议栈是否有相关的函数?这个是不是不能用中断而必须用查询的方法?
  • 1.在协调器init的時候使用 NLME_PermitJoiningRequest(0)就可以將协调器设置为不允许加入
    2. 沒有相关的函数,要你自己實作
  • 你好,在协调器init的時候使用 NLME_PermitJoiningRequest(0)就可以將协调器设置为不允许加入,

    初始化函数如下,我需要在什么位置加入该函数?

    另外HOLD_AUTO_START需要怎么处理?他和NLME_PermitJoiningRequest有什么不同?

    void zclSampleDoorLockController_Init( byte task_id )
    {
      zclSampleDoorLockController_TaskID = task_id;
    
      // Set destination address to indirect  Addr16Bit
      zclSampleDoorLockController_DstAddr.addrMode = (afAddrMode_t)AddrNotPresent;
      zclSampleDoorLockController_DstAddr.endPoint = 0;
      zclSampleDoorLockController_DstAddr.addr.shortAddr = 0;
    
      // This app is part of the Home Automation Profile
      zclHA_Init( &zclSampleDoorLockController_SimpleDesc );
    
      // Register the ZCL General Cluster Library callback functions
      zclGeneral_RegisterCmdCallbacks( SAMPLEDOORLOCKCONTROLLER_ENDPOINT, &zclSampleDoorLockController_CmdCallbacks );
    
      // Register the application's attribute list
      zcl_registerAttrList( SAMPLEDOORLOCKCONTROLLER_ENDPOINT, SAMPLEDOORLOCKCONTROLLER_MAX_ATTRIBUTES, zclSampleDoorLockController_Attrs );
    
      // Register the Application to receive the unprocessed Foundation command/response messages
      zcl_registerForMsg( zclSampleDoorLockController_TaskID );
    
      // Register for all key events - This app will handle all key events
      RegisterForKeys( zclSampleDoorLockController_TaskID );
    
      //Register the ZCL DoorLock Cluster Library callback function
      zclClosures_RegisterDoorLockCmdCallbacks( SAMPLEDOORLOCKCONTROLLER_ENDPOINT, &zclSampleDoorLockController_DoorLockCmdCallbacks );
    
      // Register for a test endpoint
      afRegister( &sampleDoorLockController_TestEp );
    
    #ifdef ZCL_EZMODE
      // Register EZ-Mode
      zcl_RegisterEZMode( &zclSampleDoorLockController_RegisterEZModeData );
    
      // Register with the ZDO to receive Match Descriptor Responses
      ZDO_RegisterForZDOMsg(task_id, Match_Desc_rsp);
    #endif
    
      ZDO_RegisterForZDOMsg( zclSampleDoorLockController_TaskID, End_Device_Bind_rsp );
      ZDO_RegisterForZDOMsg( zclSampleDoorLockController_TaskID, Match_Desc_rsp );
      
      // register for end device annce and simple descriptor responses
      ZDO_RegisterForZDOMsg( zclSampleDoorLockController_TaskID, Device_annce );
      
      // initialize NVM for storing PIN information
      /*if ( SUCCESS == osal_nv_item_init( ZCD_NV_APS_DOORLOCK_PIN, 5, aiDoorLockPIN ) )
        // use NVM PIN number in APP
        osal_nv_read( ZCD_NV_APS_DOORLOCK_PIN, 0, 5, aiDoorLockPIN );*/
    
    /*#ifdef LCD_SUPPORTED
      // display the device name
      HalLcdWriteString( (char *)sDeviceName, HAL_LCD_LINE_3 );
    #endif*/
      //串口初始化
      MT_UartInit();//串口
      MT_UartRegisterTaskID(task_id);//登记任务号
      //协调器收到启动EZMODE,绑定后无需进入EZMODE也能控制
    }

  • zclSampleDoorLockController_Init的最後作應該就可以了
  • 不過比較保險的是在ZDO_STATE_CHANGE的時候作,你用的Z-Stack版本是?
  • 1.版本是HA的3.0版本

    2.再请问一个问题,没按一下按键,发送一下按键的状态,代码如下,但是按了按键之后计数不变,也进入函数里了,

    把按键状态上报的部分去了,计数累加正常,请问是什么原因?

        if(keys == KEY_DOWN)
        {
         Sw2Count++;
         reportCmd.numAttr = 1;
         reportCmd.attrList[0].attrID = ATTRID_BASIC_DEVICE_ENABLED;
         reportCmd.attrList[0].dataType = ZCL_DATATYPE_UINT8;
         //单播发送到协调器
         zclSampleDoorLock_DstAddr.addrMode = (afAddrMode_t)Addr16Bit;
         zclSampleDoorLock_DstAddr.endPoint = DLSAPP_EP;//目的端点号
         zclSampleDoorLock_DstAddr.addr.shortAddr = 0x00;//Coordinator 
         if((Sw2Count%2) == 1)
          {
            Board_Led_control(board_led_type_LED4, board_led_state_ON);
            zdlLockState = 0x21;/
            reportCmd.attrList[0].attrData = &zdlLockState;
            zcl_SendReportCmd(DLSAPP_EP, &zclSampleDoorLock_DstAddr,ZCL_CLUSTER_ID_CLOSURES_DOOR_LOCK,&reportCmd,ZCL_FRAME_CLIENT_SERVER_DIR,TRUE,zclSampleDoorLockSeqNum++);
          }
          else
          {
            Board_Led_control(board_led_type_LED4, board_led_state_OFF);
            zdlLockState = 0x20;
            reportCmd.attrList[0].attrData = &zdlLockState;
            zcl_SendReportCmd(DLSAPP_EP, &zclSampleDoorLock_DstAddr,ZCL_CLUSTER_ID_CLOSURES_DOOR_LOCK,&reportCmd,ZCL_FRAME_CLIENT_SERVER_DIR,TRUE,zclSampleDoorLockSeqNum++);
          }
        }  

  • 不大懂你的問題,可以在具體描述清楚嗎?
  • 你好,上面的问题解决了,怎么获取协调器的PANID?想协调器上电后发送自己的PANID到串口
  • 可以用 _NIB.nwkPanId
  • 测试中遇到一个现象,故意把协调器断电,节点会一直尝试入网(用闪烁的LED去指示)
    但是过了一段时间(一个小时吧),节点的LED就不闪了,上电协调器,也不加入协调器,
    协调器发命令也不回复,是不是节点一段时间搜不到网络就不搜索了?
  • 把协调器断电,Z-Stack 3.0.1的节点会一直每10秒一次尝试入网,不会搜不到网络就不搜索了
  • 你好:

    请问TIMAC1.5.2是怎么控制节点搜索网络的频率的?找了一下并没有找到

    提前谢谢你的 帮助了

  • YiKai你好:

    请问TIMAC1.5.2是怎么控制节点搜索网络的频率的?找了一下并没有找到

    提前谢谢你的 帮助了