近来事情比较多,忙着答辩,忙着去应酬,尤其是同学之间的感情需要喝酒来加深,以至于没什么时间看书写码。所以就没什么空看书写码了。

      今天把绑定的实验重新做了一遍,但是觉得通过按键来绑定是手动实现的,过程很麻烦。所以就琢磨着用自动的方式实现。下面就讲讲实现自动绑定的过程了。

       BTW,把我在这次实验的过程中失败经验也介绍一下,希望大家一下。在开始的过程中,我在初始化中添加了自己的事件MY_EVENT,然后在事件中读取设备的类型,如果是协调器就允许绑定,绑定时间无限制,如果是终端就发送绑定请求。但是始终失败了,而且设备在不断的重启。甚是烦恼,不知道什么原因。

希望遇到类似问题的童鞋们可以和我讲解一下。

       ok,如正题吧。估计大家已经不赖烦了要喷我了。

       1、要保证设备的自动启动。在原来的程序中,设备的类型是依据不同按键进行设置的,也就是说按下不同的按键,其将该节点按照特定的设备进行启动。

       首先屏蔽掉在初始化程序中的按键部分。因为这部分关闭了自动启动模式。

/*

#if (defined HAL_KEY) && (HAL_KEY == TRUE)

  if ( HalKeyRead () == HAL_KEY_SW_1)

  {

    // If SW1 is pressed and held while powerup, force auto-start and nv-restore off and reset

    startOptions = 0;

    zb_WriteConfiguration( ZCD_NV_STARTUP_OPTION, sizeof(uint8), &startOptions );

    zb_SystemReset();

  }

#endif // HAL_KEY

*/

 

    初始化函数的结束部分添加如下代码:

  startOptions = ZCD_STARTOPT_AUTO_START;

  zb_WriteConfiguration( ZCD_NV_STARTUP_OPTION, sizeof(uint8), &startOptions );

  ZDOInitDevice(0);

  设备自动启动以后,会向任务发送一个设备状态改变的消息,在任务处理函数中对应如下的部分:

   case ZDO_STATE_CHANGE:

          // If the device has started up, notify the application

          if (pMsg->status == DEV_END_DEVICE ||

              pMsg->status == DEV_ROUTER ||

              pMsg->status == DEV_ZB_COORD )

          {

            SAPI_StartConfirm( ZB_SUCCESS );

          }

          break;

        当设备进行确认状态发生变化的时候,这个时候我们开始来允许设备进行绑定,或是发送绑定请求。

具体代码见SAPI_StartConfirm( ZB_SUCCESS );这个函数。

void SAPI_StartConfirm( uint8 status )

{

#if defined ( MT_SAPI_CB_FUNC )

  /* First check if MT has subscribed for this callback. If so , pass it as

  a event to MonitorTest and return control to calling function after that */

  if ( SAPICB_CHECK( SPI_CB_SAPI_START_CNF ) )

  {

    zb_MTCallbackStartConfirm( status );

  }

  else

#endif  //MT_SAPI_CB_FUNC

  {

    zb_StartConfirm( status );

  }

}

       在最后一个函数中我们来添加自己的代码。

void zb_StartConfirm( uint8 status )

{

  // If the device sucessfully started, change state to running

  if ( status == ZB_SUCCESS )

  {

    myAppState = APP_START;

    uint8 type;

    zb_ReadConfiguration( ZCD_NV_LOGICAL_TYPE, sizeof(uint8), &type );

    if(type==ZG_DEVICETYPE_COORDINATOR)

      zb_AllowBind(0xff);

    else

    {

      zb_BindDevice(TRUE, TOGGLE_LIGHT_CMD_ID, NULL);

    }

  }

  else

  {

    // Try again later with a delay

    osal_start_timer( MY_START_EVT, myStartRetryDelay );

  }

}

        首先读取设备的类型,如果为协调器,则允许设备进行绑定,注意绑定时间为0xff,意味着在所有时刻都允许设备进行绑定。如果为其他设备类型,则发送设备绑定请求。      经过上电后,发现设备能自动加入网络并且能进行自动绑定,当我们再次拨动开关设备上的灯控制按键的时候,协调器上对应的灯状态则发送翻转。因此,可以证明自动绑定实现了。

posted on 2016-02-21 11:13  farbeyond  阅读(1827)  评论(0编辑  收藏  举报