ZStack协议栈SimpleApp小解

买的开发板上,给的资料,少之又少,乱七八糟,看着又难懂。话说这Zigbee的ZStack协议栈,真难学。


今天,来说下simpleApp程序的部分功能。


平台介绍:ZigBee模块CC2530,开发套件IAR for 51 7.51,协议栈:ZStack-2.2.2.1.3.0.

使用的TI程序模板地址为:C:\Texas Instruments\ZStack-CC2530-2.2.2-1.3.0\Projects\zstack\Samples\SimpleApp\CC2530DB\SimpleApp.eww.


第一部分:用两个对等模块,实现点对点通信。

1)操作流程

两块板子跳线接法,相同。均接成终端节点样式。

首先对板子进行代码烧写,将一个板子记作A作为控制器(相当于协调器,用于创建网络),将工作空间为SimpleControllerEB的程序烧写到板子上。另一个板子记作B用作开关节点(相当于终端节点,来加入网络),将工作空间为SimpleSwitchEB的程序烧写到板子上。此时,A节点相当于协调器,B节点相当于终端节点。A节点创建网络,B节点可以加入到A节点创建的网络中。

2)按键操作功能

首先启动A节点,按Up键,使得LED3常亮,此时表示A节点创建网络成功,允许其他节点加入,进行绑定。

然后,启动B节点,之后,LED3开始闪烁,表明,找到网络,可以加入,进行绑定。

按下A节点的Up键,进行绑定声明,表示在此后的10S时间段内,可以进行节点绑定。

A节点Up键按下之后的10s内,按下节点B的Up键,完成节点B的绑定。板子反应为节点A的LED1闪烁一次,节点B的LED1和LED3快速闪烁。绑定成功之后,节点B的Right键,就可以控制节点A的LED1的亮与灭。

如果要解绑定,可以按下节点B的Down键。即可解除绑定。节点A的LED1便不再受节点B的控制。如果需要再次控制,则需要进行重新绑定。

第二部分:代码分析

节点A(创建网络的控制器节点)启动之后,创建网络部分没有看懂。

节点A按下Up键之后,触发KEY_CHANGE事件,在sapi.c文件中。进入zb_HandleKeys( ((keyChange_t *)pMsg)->state, ((keyChange_t *)pMsg)->keys );其实,在此程序中,只要按下按键,就触发KEY_CHANGE事件,然后进入上述程序中。具体的处理方案,在程序中详述。

对于节点A,在按键处理函数中,不考虑shift参数,在判定时,首先查看当前应用状态是不是初始状态,如果是初始状态,key1和key2都进入初始化状态,并进入通告逻辑模式阶段,并不进行相应的操作。只有,当前节点被认证过之后,myAppState不在是APP_INIT时,则进行允许绑定操作。此操作,需要执行绑定操作的节点(例如节点B)在10s之内,进行绑定响应。在此之前,其他按键没有实际意义。

以下是节点A(SimpleControllerEB)的按键处理函数。与节点B(SimpleSwitchEB)的按键处理函数略微不同。

void zb_HandleKeys( uint8 shift, uint8 keys )
{
  uint8 startOptions;
  uint8 logicalType;
  // Shift is used to make each button/switch dual purpose.
  if ( shift )
  {
    if ( keys & HAL_KEY_SW_1 ) {    }
    if ( keys & HAL_KEY_SW_2 ) {    }
    if ( keys & HAL_KEY_SW_3 ) {    }
    if ( keys & HAL_KEY_SW_4 ) {    }
  }
  else
  {
    if ( keys & HAL_KEY_SW_1 )
    {
      if ( myAppState == APP_INIT  )
      {
        // In the init state, keys are used to indicate the logical mode.
        // Key 1 starts device as a coordinator
        zb_ReadConfiguration( ZCD_NV_LOGICAL_TYPE, sizeof(uint8), &logicalType );
        if ( logicalType != ZG_DEVICETYPE_ENDDEVICE )
        {
          logicalType = ZG_DEVICETYPE_COORDINATOR;
          zb_WriteConfiguration(ZCD_NV_LOGICAL_TYPE, sizeof(uint8), &logicalType);
        }
        // Do more configuration if necessary and then restart device with auto-start bit set
        // write endpoint to simple desc...dont pass it in start req..then reset
        zb_ReadConfiguration( ZCD_NV_STARTUP_OPTION, sizeof(uint8), &startOptions );
        startOptions = ZCD_STARTOPT_AUTO_START;
        zb_WriteConfiguration( ZCD_NV_STARTUP_OPTION, sizeof(uint8), &startOptions );
        zb_SystemReset();
      }
      else
      {
        // Initiate a binding
        zb_AllowBind( myAllowBindTimeout );
      }
    }
    if ( keys & HAL_KEY_SW_2 )
    {
      if ( myAppState == APP_INIT )
      {
        // In the init state, keys are used to indicate the logical mode.
        // Key 2 starts device as a router
        zb_ReadConfiguration( ZCD_NV_LOGICAL_TYPE, sizeof(uint8), &logicalType );
        if ( logicalType != ZG_DEVICETYPE_ENDDEVICE )
        {
          logicalType = ZG_DEVICETYPE_ROUTER;
          zb_WriteConfiguration(ZCD_NV_LOGICAL_TYPE, sizeof(uint8), &logicalType);
        }
        zb_ReadConfiguration( ZCD_NV_STARTUP_OPTION, sizeof(uint8), &startOptions );
        startOptions = ZCD_STARTOPT_AUTO_START;
        zb_WriteConfiguration( ZCD_NV_STARTUP_OPTION, sizeof(uint8), &startOptions );
        zb_SystemReset();
      }
      else  {  }
    }
    if ( keys & HAL_KEY_SW_3 )  {  }
    if ( keys & HAL_KEY_SW_4 )  {  }
  }
}
以上是节点A(SimpleControllerEB)的按键处理函数。

下面看节点B(SimpleSwitchEB)的KEY_CHANGE按键处理函数。

当节点B启动时,如果节点A(SimpleControllerEB)没有启动的话,节点B的应用状态都不会发生变化按下Up(HAL_KEY_SW_1),始终执行初始化状态,并作为终端设备,重启系统。当节点A(SimpleControllerEB)已启动,则节点B(SimpleSwitchEB)则可以检测到网络。此时,按下按键,网络状态仍旧没有变化,仍旧无法实现通信,因为,节点B还没有与节点A完成绑定,加入到网络中。下面就是节点A发出允许绑定命令之后,节点B就可以进行绑定。节点B进入如下函数中,进行执行绑定设备。

zb_BindDevice(TRUE, TOGGLE_LIGHT_CMD_ID, NULL);

完成绑定之后,节点状态变化,并可响应一下函数:

zb_SendDataRequest( 0xFFFE, TOGGLE_LIGHT_CMD_ID, 0,(uint8 *)NULL, myAppSeqNumber, 0, 0 );
zb_BindDevice(FALSE, TOGGLE_LIGHT_CMD_ID, NULL);

分别是实现数据的发送与解绑定。其实绑定与解绑定,就是一个参数的差别,用到是一个函数。下面是节点B(SimpleSwitchEB)的 KEY_CHANGE按键处理函数。

void zb_HandleKeys( uint8 shift, uint8 keys )
{
  uint8 startOptions;
  uint8 logicalType;
  // Shift is used to make each button/switch dual purpose.
  if ( shift )
  {
    if ( keys & HAL_KEY_SW_1 )   {    }
    if ( keys & HAL_KEY_SW_2 )    {    }
    if ( keys & HAL_KEY_SW_3 )    {    }
    if ( keys & HAL_KEY_SW_4 )    {    }
  }
  else
  {
    if ( keys & HAL_KEY_SW_1 )
    {
      if ( myAppState == APP_INIT )
      {
        // In the init state, keys are used to indicate the logical mode.
        // The Switch device is always an end-device
        logicalType = ZG_DEVICETYPE_ENDDEVICE;
        zb_WriteConfiguration(ZCD_NV_LOGICAL_TYPE, sizeof(uint8), &logicalType);
        // Do more configuration if necessary and then restart device with auto-start bit set
        zb_ReadConfiguration( ZCD_NV_STARTUP_OPTION, sizeof(uint8), &startOptions );
        startOptions = ZCD_STARTOPT_AUTO_START;
        zb_WriteConfiguration( ZCD_NV_STARTUP_OPTION, sizeof(uint8), &startOptions );
        zb_SystemReset();
      }
      else
      {
        // Initiate a binding with null destination
        zb_BindDevice(TRUE, TOGGLE_LIGHT_CMD_ID, NULL);
      }
    }
    if ( keys & HAL_KEY_SW_2 )
    {
      if ( myAppState == APP_INIT )
      {
        // In the init state, keys are used to indicate the logical mode.
        // The Switch device is always an end-device
        logicalType = ZG_DEVICETYPE_ENDDEVICE;
        zb_WriteConfiguration(ZCD_NV_LOGICAL_TYPE, sizeof(uint8), &logicalType);
        zb_ReadConfiguration( ZCD_NV_STARTUP_OPTION, sizeof(uint8), &startOptions );
        startOptions = ZCD_STARTOPT_AUTO_START;
        zb_WriteConfiguration( ZCD_NV_STARTUP_OPTION, sizeof(uint8), &startOptions );
        zb_SystemReset();
      }
      else
      {
        // Send the command to toggle light
        zb_SendDataRequest( 0xFFFE, TOGGLE_LIGHT_CMD_ID, 0,(uint8 *)NULL, myAppSeqNumber, 0, 0 );
      }
    }
    if ( keys & HAL_KEY_SW_3 )
    {
      // Remove all existing bindings
      zb_BindDevice(FALSE, TOGGLE_LIGHT_CMD_ID, NULL);
    }
    if ( keys & HAL_KEY_SW_4 )    {    }
  }
}


以上是节点B(SimpleSwitchEB)的KEY_CHANGE按键处理函数。

对于节点A,当节点B进行绑定之后,就可以接受发来的信息。从而响应LED1的点亮与熄灭。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值