如何利用ti的zstack协议栈组网

如何利用ti的zstack协议栈组网,第1张

TI的Z-Stack装载在一个基于IAR开发环境的工程里。强大的IAR Embedded Workbench除了提供编译下载功能外,还可以结合编程器进行单步跟踪调试和监测片上寄存器、Flash数据等。Z-Stack根据IEEE 802. 15.4和ZigBee标准分为以下几层:API(Application Programming Interface),HAL (Hardware Abstract Layer),MAC(Media Access Control), NWK(Zigbee Network Layer),OSAL(Operating System Abstract System),Security,Service,ZDO(Zigbee Device Objects)。使用IAR打开工程文件SampleApp.eww后,即可查看到整个协议栈从HAL层到APP层的文件夹分布。该协议栈可以实现复杂的网络链接,在协调器节点中实现对路由表和绑定表的非易失性存储,因此网络具有一定的记忆功能。

APP是应用层,一般只是在这里修改就可以,如果程序不是特别复杂的话,是不需要修改协议栈的。

至于协调器如何确认收到的是3个不同终端的数据,传感器向协调器发送数据的时候,是会发送自己的网络地址的,根据网络地址就可以判断是哪个节点发的了。如果是单纯组网的话,你可以看下SensorDemo例程,在TI官网上应该可以下到,在飞比网站上也可以找到。

如果要添加DS18B20采集温度和IH3605采集湿度这些外设,那么需要在传感器的程序里添加你自己的温湿度程序,设置好IO口和时序,明确你温湿度外设的数据发送流程和算法,把接收进来的数据再添加到SensorDemo原本的发送中就可以了。

CC2530用的是TI公司的zstack协议栈。学习zigbee关键在于多看官方给出的例程,基本的功能和用

法都有。对于zigbee组网,初学者不需要具体了解协议栈的内部结构,而且zstack是半开源的,你

也没机会了解核心代码,我们要做的就是了解应用程序的接口函数,然后应用它。如果你要实现温

度值的传输就要了解SimpleSensor.c和SimpleCollector.c,在ZStack-1.4.3-1.2.1的Projects

\zstack\Samples\SimpleApp下。

3.Zigbee超低功耗遥控器的设计

做zigbee设计首先要有zigbee协议栈,我用的是ZStack-1.4.3-1.2.1,芯片为CC2430。zigbee编程

主要在协议栈中修改。按你的要求应该用SimpleApp范例,在ZStack-1.4.3-1.2.1的Projects

\zstack\Samples\SimpleApp下。主要看SimpleSwitch.c和SimpleController.c两个文件。例如要

遥控LED灯的亮灭,由终端向协调器发送控制命令:

//SimpleSwitch.c

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 )

{

}

}

}

这个函数定义了开关的用法,按键1用来设置协调器,按键2用来设置终端或发送控制命令TOGGLE_LIGHT_CMD_ID,按键3用来绑定设备。

// SimpleController.c

void zb_ReceiveDataIndication( uint16 source, uint16 command, uint16 len, uint8 *pData )

{

if (command == TOGGLE_LIGHT_CMD_ID)

{

// Received application command to toggle the LED

HalLedSet(HAL_LED_1, HAL_LED_MODE_TOGGLE)

}

}

若接收到数据,判断命令command是否为TOGGLE_LIGHT_CMD_ID,若是则点亮LED1。其实TOGGLE_LIGHT_CMD_ID值就定义为1,为了让读者明白含义所以用一串字符表示,初学者不要认为zigbee协议栈有多复杂,耐心的看下去问题都会迎刃而解。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11291057.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-15
下一篇 2023-05-15

发表评论

登录后才能评论

评论列表(0条)

保存