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.

ZSTACK 3.0.2网络相关问题

Other Parts Discussed in Thread: Z-STACK

协调器基于switch例程,终端基于light例程

1.终端加上协调器后,等一会把终端复位,

发现终端再也入不了网了,此时我通过按键触发,

协调器端触发bdb_StartCommissioning(BDB_COMMISSIONING_MODE_NWK_FORMATION | BDB_COMMISSIONING_MODE_FINDING_BINDING);

终端触发bdb_StartCommissioning(BDB_COMMISSIONING_MODE_NWK_STEERING | BDB_COMMISSIONING_MODE_FINDING_BINDING);

终端还是无法入网

2.关于终端当前的状态,是否在线,是用ZDO_STATE_CHANGE判断还是用zclSampleSw_ProcessCommissioningStatus

如果用zclSampleSw_ProcessCommissioningStatus,怎么判断终端是否掉线?

3.协调器和终端恢复出厂用什么接口函数?

  • 1、终端即使在入网后每次复位还是要调用 bdb_StartCommissioning()。
    2、终端可在 zclSampleSw_ProcessCommissioningStatus() 中的 case BDB_COMMISSIONING_PARENT_LOST: 中判断掉线了。
    3、恢复出厂设置调用 bdb_resetLocalAction() 函数。
  • 1. 你終端有使能NV_RESTORE嗎?

    2. 建議用ZDO_STATE_CHANGE

    3. 用bdb_resetLocalAction

  • 1.协调器和终端都使能了NV_INIT和NV_RESTORE
    2.协调器按键里面调用的是bdb_StartCommissioning(BDB_COMMISSIONING_MODE_NWK_FORMATION | BDB_COMMISSIONING_MODE_NWK_STEERING | BDB_COMMISSIONING_MODE_FINDING_BINDING);
    3.bdb_resetLocalAction和下面的函数功能是一样的吧?是不是factory reset?
    zgWriteStartupOptions( ZG_STARTUP_SET, (ZCD_STARTOPT_DEFAULT_NETWORK_STATE | ZCD_STARTOPT_DEFAULT_CONFIG_STATE) );
    SystemResetSoft();
    4.现在正常组网后,等一段时间把终端复位,复位后就加不上了,我在协调器和终端双方都触发了bdb_StartCommissioning也是加不上
    5.我把协调器断电,3.0.2协议栈默认的,终端是不是会一直重连?
  • 对了,Z-Stack 3.0.2 的终端是不会主动发送 rejoin request 的,要在 zclSampleSw_ProcessCommissioningStatus() 中的 case BDB_COMMISSIONING_PARENT_LOST: 中调用 rejoin request 函数。
    case BDB_COMMISSIONING_PARENT_LOST:
    {
    if(bdbCommissioningModeMsg->bdbCommissioningStatus == BDB_COMMISSIONING_NETWORK_RESTORED)
    {

    }
    else
    {
    // Parent not found, attempt to rejoin again after a fixed delay
    osal_start_timerEx(Cursor_TaskID, EVENT_END_DEVICE_REJOIN, END_DEVICE_REJOIN_DELAY);
    }
    }
    break;
    在 zclSampleSw_ProcessEvent 中:
    // 设备失去父节点消息后定期发送rejoin
    if( events & EVENT_END_DEVICE_REJOIN )
    {
    bdb_ZedAttemptRecoverNwk();
    return (events ^ EVENT_END_DEVICE_REJOIN);
    }
  • 我这边试了,把协调器断电再上电,终端会自动连上的,
    是不是开启了NV的原因?
    需要加bdb_ZedAttemptRecoverNwk吗?
  • 你协调器断电,终端掉线后,协调器再上电,终端在不调用 bdb_StartCommissioning 的情况下能自动连上吗?
  • 是因為开启了NV、應該不用加bdb_ZedAttemptRecoverNwk
  • 可以,我两边都开启了NV,重启协调器,终端会自动连上,终端没有调用bdb_StartCommissioning
  • 1.加入终端或者协调器由于某种原因NV信息在上电的时候没有恢复成功,
    保险起见,是不是建议在终端里加个bdb_ZedAttemptRecoverNwk?
    2.现在正常组网后,等一段时间把终端复位(即调用bdb_resetLocalAction),复位后就加不上协调器了,我在协调器和终端双方都触发了bdb_StartCommissioning也是加不上,请问是什么原因?如何解决?
  • 那你的問題是?
  • 1.加入终端或者协调器由于某种原因NV信息在上电的时候没有恢复成功,
    保险起见,是不是建议在终端里加个bdb_ZedAttemptRecoverNwk?
    2.现在正常组网后,等一段时间把终端复位(即调用bdb_resetLocalAction),终端复位后就加不上协调器了,我在协调器和终端双方都触发了bdb_StartCommissioning也是加不上,请问是什么原因?如何解决?
  • 1. 建議先抓包看是什麼原因
    2. 协调器和终端双方触发bdb_StartCommissioning的參數用的是什麼?
  • 协调器端bdb_StartCommissioning(BDB_COMMISSIONING_MODE_NWK_FORMATION | BDB_COMMISSIONING_MODE_NWK_STEERING | BDB_COMMISSIONING_MODE_FINDING_BINDING);
    终端bdb_StartCommissioning(BDB_COMMISSIONING_MODE_NWK_STEERING | BDB_COMMISSIONING_MODE_FINDING_BINDING);
  • 协调器需要有BDB_COMMISSIONING_MODE_NWK_STEERING 。

    建议你使用STACK之前看一下 协议栈里面的文档

  • 正常组网后,等一段时间(10分钟左右)把终端复位(即调用bdb_resetLocalAction),终端复位后就加不上协调器了,我在协调器和终端双方都触发了bdb_StartCommissioning也是加不上,请问是什么原因?如何解决?通过按键调用的函数如下
    协调器端调用bdb_StartCommissioning(BDB_COMMISSIONING_MODE_NWK_FORMATION | BDB_COMMISSIONING_MODE_NWK_STEERING | BDB_COMMISSIONING_MODE_FINDING_BINDING);
    终端调用bdb_StartCommissioning(BDB_COMMISSIONING_MODE_NWK_STEERING | BDB_COMMISSIONING_MODE_FINDING_BINDING);
  • 请用抓包文件说明,看一下有没有leave,以及新的beacon request
  • 把终端复位(即调用bdb_resetLocalAction)的話,就必須协调器端调用bdb_StartCommissioning(BDB_COMMISSIONING_MODE_NWK_FORMATION | BDB_COMMISSIONING_MODE_NWK_STEERING | BDB_COMMISSIONING_MODE_FINDING_BINDING);
    终端调用bdb_StartCommissioning(BDB_COMMISSIONING_MODE_NWK_STEERING | BDB_COMMISSIONING_MODE_FINDING_BINDING);
  • bdb_StartCommissioning的有效时间是多长?和NLME_PermitJoiningRequest有没有关系?
    比如说一个ZigBee网络已经工作了一段时间,我想新加入一个终端,此时是不是终端和协调器两边都要触发
    bdb_StartCommissioning,还是只需终端这边触发bdb_StartCommissioning即可?
  • 180s调用了 permit join,两个设备都需要 。
  • 有效时间180s,想新加入一个终端,终端和协调器两边都要触发
    bdb_StartCommissioning
  • 1.帮忙看一下配置是否正确,如下:
    协调器端:
    zclSampleSw_Init初始化里加入
    bdb_StartCommissioning(BDB_COMMISSIONING_MODE_NWK_FORMATION | BDB_COMMISSIONING_MODE_NWK_STEERING | BDB_COMMISSIONING_MODE_FINDING_BINDING);
    按键里也加入了
    bdb_StartCommissioning(BDB_COMMISSIONING_MODE_NWK_FORMATION | BDB_COMMISSIONING_MODE_NWK_STEERING | BDB_COMMISSIONING_MODE_FINDING_BINDING);

    终端:
    zclSampleLight_Init初始化里加入
    bdb_StartCommissioning(BDB_COMMISSIONING_MODE_NWK_STEERING | BDB_COMMISSIONING_MODE_FINDING_BINDING);
    按键里也加入了
    bdb_StartCommissioning(BDB_COMMISSIONING_MODE_NWK_STEERING | BDB_COMMISSIONING_MODE_FINDING_BINDING);

    2.bdb_resetLocalAction是不是把NV信息也清除了?
    3.如果终端是灯,想对他factory reset,是不是就用bdb_resetLocalAction
    这个一般是怎么操作的,不是在灯上搞个按键吧?有没有什么好的方便的方法去复位灯?
  • 1.帮忙看一下配置是否正确,如下:
    协调器端:
    zclSampleSw_Init初始化里加入
    bdb_StartCommissioning(BDB_COMMISSIONING_MODE_NWK_FORMATION | BDB_COMMISSIONING_MODE_NWK_STEERING | BDB_COMMISSIONING_MODE_FINDING_BINDING);
    按键里也加入了
    bdb_StartCommissioning(BDB_COMMISSIONING_MODE_NWK_FORMATION | BDB_COMMISSIONING_MODE_NWK_STEERING | BDB_COMMISSIONING_MODE_FINDING_BINDING);

    终端:
    zclSampleLight_Init初始化里加入
    bdb_StartCommissioning(BDB_COMMISSIONING_MODE_NWK_STEERING | BDB_COMMISSIONING_MODE_FINDING_BINDING);
    按键里也加入了
    bdb_StartCommissioning(BDB_COMMISSIONING_MODE_NWK_STEERING | BDB_COMMISSIONING_MODE_FINDING_BINDING);

    2.bdb_resetLocalAction是不是把NV信息也清除了?
    3.如果终端是灯,想对他factory reset,是不是就用bdb_resetLocalAction
    这个一般是怎么操作的,不是在灯上搞个按键吧?有没有什么好的方便的方法去复位灯?
  • 1. 是的
    2. 是
    3. 一般會用在一段固定時間內累積連續斷電上電次數超過一個次數去复位灯
  • 现在测试了一个协调器带20个终端的情况,
    协调器是2538,终端是2530,
    测试发现终端会随机出现掉线的情况(非DEV_END_DEVICE情况,我用闪烁的LED去指示掉线情况)
    掉线后闪烁几下会自动恢复,抓包发现确实是掉线了(终端发送beacon request了)
    这是什么原因?终端和协调器的距离很近的
    另外我把终端设置为xPOWER_SAVING和-DRFD_RCVC_ALWAYS_ON=TRUE,终端怎么还一直在data request?
    一直掉线的情况不清楚,基本上一直都有掉线的终端,一会这几个一会那几个
  • 终端和协调器的距离很近还一直都有掉线的話可能是有干擾或是RF硬件設計有問題
  • 不是设备和环境的问题,这之前用的是home版协议栈测试的,没遇到这样的现象。
    由于其他原因换成3.0.2版本的协议栈
    这肯定是协议栈软件的问题,20个终端,基本上每时每刻都有终端掉线,掉线了有恢复,
    一直这样持续,是不是哪里设置问题?应该不会出现这样的情况的
  • 可以提供抓包档?
  • 掉线终端抓包如附件,一直掉线重连,终端2530(light),协调器2538(switch)

    排除硬件问题,用Home版本的协议栈没这样的现象

    7455.掉线.psd

  • 已经在另一个帖子回复你了。
  • 入网部分几乎没做改动。我更改的部分如下:终端节点
    1、上电初始化函数中,执行入网
    void zclGenericApp_Init( byte task_id )
    {
    ……
    bdb_StartCommissioning(BDB_COMMISSIONING_MODE_NWK_STEERING );
    }
    2、
    case ZDO_STATE_CHANGE:
    zclGenericApp_NwkState = (devStates_t)(MSGpkt->hdr.status);
    if(zclGenericApp_NwkState == DEV_END_DEVICE)
    {
    osal_start_timerEx(zclGenericApp_TaskID,MYAPP_SEND_MSG_EVT,1000);//1秒后产生一个自定义事件
    }
    else //其他网络状态
    {
    if(zclGenericApp_NwkState == DEV_NWK_ORPHAN) //丢失父节点
    {
    osal_start_timerEx(zclGenericApp_TaskID, GENERICAPP_END_DEVICE_REJOIN_EVT, GENERICAPP_END_DEVICE_REJOIN_DELAY);
    }
    }
    break;

    3、
    static void zclGenericApp_ProcessCommissioningStatus(bdbCommissioningModeMsg_t *bdbCommissioningModeMsg)
    {
    switch(bdbCommissioningModeMsg->bdbCommissioningMode)
    {
    ……
    case BDB_COMMISSIONING_NWK_STEERING: //加入网络成功
    if(bdbCommissioningModeMsg->bdbCommissioningStatus == BDB_COMMISSIONING_SUCCESS)
    {
    }
    else
    {
    sprintf((char *)temp_Info,"加入网络 error: %d\r\n",bdbCommissioningModeMsg->bdbCommissioningStatus);
    HalUARTWrite(0,temp_Info,strlen((char const*)temp_Info)); //串口显示错误类型。
    bdb_StartCommissioning(BDB_COMMISSIONING_MODE_NWK_STEERING); //重新执行入网
    }
    break;

    case BDB_COMMISSIONING_INITIALIZATION: //初始化
    break;

    #if ZG_BUILD_ENDDEVICE_TYPE //只适合于终端节点
    case BDB_COMMISSIONING_PARENT_LOST:
    if(bdbCommissioningModeMsg->bdbCommissioningStatus == BDB_COMMISSIONING_NETWORK_RESTORED)
    {
    }
    else
    {
    osal_start_timerEx(zclGenericApp_TaskID, GENERICAPP_END_DEVICE_REJOIN_EVT, GENERICAPP_END_DEVICE_REJOIN_DELAY);
    }
    break;
    #endif
    }
    }
    其他地方未做更改,我也搞不懂是咋回事?请问能给出修改入网代码的建议么?
  • "case ZDO_STATE_CHANGE:"理頭修改的程序去掉試試