• zigbee 自动绑定的实现


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

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

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

  • 相关阅读:
    CentOS查看和修改MySQL字符集
    centos修改mysql密码或者进入mysql后解决Access denied for user ''@'localhost' to database 'mysql错误
    Centos设置开机启动Apache和Mysql
    centos搭建ftp服务器
    1QT在线帮助文档
    storm学习
    java提高篇之理解java的三大特性——多态
    基于AQS的锁
    反转单链表的几种方法
    Java:基于LinkedList实现栈和队列
  • 原文地址:https://www.cnblogs.com/farbeyond/p/5204591.html
Copyright © 2020-2023  润新知