Zigbee组网程序
实验-ZigBee组网

实验-ZigBee组⽹实验:ZigBee基本通信实验⼀、实验⽬的1.了解ZigBee协议及其在软件上如何实现。
2.学习使⽤sniffer嗅探⽹络节点之间通信数据包并分析数据包。
3. 学习Zigbee⽹络组⽹及路由选择。
⼆、实验内容1.基于z-stack协议栈的组⽹及数据传输。
2.使⽤sniffer抓取节点之间传输的数据包并分析数据包组成。
三、实验设备1.IAR开发平台环境2.ZigBee开发套件3.Sniffer抓包⼯具(软件和硬件)实验开发套件的领取注意事项:1、每周五上午1-2节可到电信5号楼东303A房间,协同创新中⼼找蓝伟涛学长(领取FPGA开发板)或电信1号楼515室找赵曜学长(领取Zigbee开发套件)。
2、每个⼩组以组长为代表签字领取⼀套开发套件,并在三周内归还。
请爱护实验套件,归还时确保所有部件完好齐全。
3、实验中若有问题可在周五上午1-2节课时间去上述地址找两位助教答疑。
四、实验原理1,ZigBee协议概述ZigBee作为⼀种⽆线通信标准,它是以IEEE802.15.4⽆线通信技术为基础的⼀组涉及到⽹络、安全和应⽤⽅⾯的软件协议。
它是⼀种短距离、低复杂度、低功耗、地数据传输速率和低成本的双向⽆线通信技术。
该技术可以应⽤于超低功耗率损耗的⽆线⽹络中,它满⾜ISO/OSI参考模型。
其物理层和MAC层采⽤了IEEE802.15.4标准;ZigBee联盟定义了上层部分,包括⽹络层和应⽤层。
⽆线通信⽹络软件以z-stack作为ZigBee的协议栈,硬件为基于CC2530-ZigBee开发套件。
2 设备类型(Device Types)在ZigBee⽹络中存在三种逻辑设备类型:Coordinator(协调器),Router(路由器)和End-Device(终端设备)。
ZigBee⽹络由⼀个Coordinator以及多个Router和多个End_Device组成。
在ZStack-CC2530-2.3.1-1.4.0中⼀个设备的类型通常在编译的时候通过编译选项确定。
Zigbee组网流程——理论

星形网络和树型网络可以看成是网状网络的一个特殊子集,所以接下来分析如何组建一个Zigbee网状网络。
组建一个完整的Zigbee网络分为两步:第一步是协调器初始化一个网络;第二步是路由器或终端加入网络。
加入网络又有两种方法,一种是子设备通过使用MAC层的连接进程加入网络,另一种是子设备通过与一个先前指定的父设备直接加入网络。
一、协调器初始化网络协调器建立一个新网络的流程如图1所示。
图1 协调器建立一个新网络1、检测协调器建立一个新的网络是通过原语NLME_NETWORK_FORMATION.request发起的,但发起NLME_NETWORK_FORMATION.request原语的节点必须具备两个条件,一是这个节点具有ZigBee协调器功能,二是这个节点没有加入到其它网络中。
任何不满足这两个条件的节点发起建立一个新网络的进程都会被网络层管理实体终止,网络层管理实体将通过参数值为INVALID_REQUEST的NLME_NETWORK_FORMATION.confirm的原语来通知上层这是一个非法请求。
2、信道扫描协调器发起建立一个新网络的进程后,网络层管理实体将请求MAC子层对信道进行扫描。
信道扫描包括能量扫描和主动扫描两个过程。
首先对用户指定的信道或物理层所有默认的信道进行一个能量扫描,以排除干扰。
网络层管理实体将根据信道能量测量值对信道进行一个递增排序,并且抛弃能量值超过了可允许能量值的信道,保留可允许能量值内的信道等待进一步处理。
接着在可允许能量值内的信道执行主动扫描,网络层管理实体通过审查返回的PAN描述符列表,确定一个用于建立新网络的信道,该信道中现有的网络数目是最少的,网络层管理实体将优先选择没有网络的信道。
如果没有扫描到一个合适的信道,进程将被终止,网络层管理实体通过参数仠为STARTUP_FAILURE的NLME_NETWORK_FORMATION.confirm的原语来通知上层初始化启动网络失败。
zigbee组网方案

zigbee组网方案Zigbee是一种基于IEEE 802.15.4标准的低功耗、低速率、短距离无线通信技术。
Zigbee通信协议通常被应用于物联网领域,而Zigbee组网方案则是实现这一点的关键。
一、Zigbee技术的优势Zigbee组网方案之所以受到广泛的关注和应用,是因为它具有以下的优势:1.低功耗:Zigbee是一种低功耗的无线通信技术,通过使用短时间的周期性传输来降低功耗,同时在通信过程中会控制射频功率,以达到更低的能耗。
2.价格低廉:Zigbee组网所需要的硬件和软件的成本都非常低廉,这使得它在普通家庭生活中得到了广泛的应用。
3.简单的网络拓扑:Zigbee的组网拓扑结构非常简单,由于其支持多种不同的拓扑结构,因此适用于各种不同的应用场景。
4.安全可靠:Zigbee具有高度的安全性和可靠性,支持多种不同的加密方式,能够保证网络传输的安全性和数据的完整性。
二、Zigbee组网方案的组成部分Zigbee的组网方案由三个不同的组成部分组成:1.协调器(Coordinator):负责管理整个Zigbee网络,具有最高的权限和范围。
在Zigbee网络中只有一个协调器。
2.路由器(Router):负责转发和路由信息,具有一定的范围和权限。
在Zigbee网络中可有多个路由器。
3.端节点(End Device):具有最低的范围和权限。
在Zigbee 网络中可以有多个端节点。
三、Zigbee组网方案的拓扑结构Zigbee支持多种不同的拓扑结构,包括:1.星型拓扑结构(Star Topology):所有设备都连接到一个中心节点(协调器)。
2.网状拓扑结构(Mesh Topology):所有设备都连接到其他设备,形成一个复杂的网络结构。
3.混合拓扑结构(Hybrid Topology):网状拓扑结构和星型拓扑结构的混合。
四、Zigbee组网方案的应用场景Zigbee组网方案通常应用于以下场景:1.智能家居系统:Zigbee组网技术可以使设备之间更方便地进行连接和通信,从而实现安全、便捷、节能等目标。
Zigbee组网流程

1、网络形成组网开始时,网络层首先向MAC层请求分配协议所规定的信道,或者由PHY层进行有效信道扫描,网络层管理实体等待信道扫描结果,然后根据扫描结果选择可允许能量水平的信道。
找到合适的信道后,为这个新的网络选择一个个域网标识符(PANID)。
PANID可由网络形成请求时指定,也可以随机选择一个PANID(除广播PANID固定为0xFFFF外),PANID 在所选信道中应该是唯一的。
PANID一旦选定,无线网关将选择16位网络地址0x0000作为自身短地址,同时进行相关设置。
完成设置后,通过MAC层发出网络启动请求,返回网络形成状态。
2、网络维护网络维护网络维护主要包括设备加入网络和离开网络过程。
当网络形成后,通过网络管理实体设定MAC层连接许可标志来判断是否允许其他设备加设备初始化为协调器入网络。
加入方式有联合方式和直接方式,在协议实现中采取直接加入网络方式。
这种方式下由待加入的设备发送请求加入信标帧,网关接收到后,网络管理实体首先判断这个设备是否已存在于网络。
存在,则使其加入网络;若不存在,则向设备发送信标帧,为这个设备分配一个网络中唯一的16位的短地址。
这里的信标帧是由网关无线协议MAC层生成作为PHY层载荷,它包含PANID、加入时隙分配等信息。
网内设备也可以请求断开网络。
当网关收到设备断开连接请求后,MAC层向网络层发送报告,开始执行断开流程,从设备列表中删除该设备相关信息。
网络层上层请求网络层发现当前在运行的网络:NLME NETWORK DISCOVERY.request(ScanChannels,ScanDuration)ScanChannels:高5为保留(b27~b31),低27为分别表示27个有效信道,该位为1,表示扫描;为0不扫描。
ScanDuration:扫描时间,aBaseSuperframeDuration*(2^n+1),n为ScanDuration值。
网络层在家收到该原语后,将通过检查ScanChannels参数发现网络,如果该设备为一个FFD 设备,则执行主动的扫描。
NB-IOT Lora Zigbee的组网方式

成本
模块 5-10$,未来目 标降到 1$
模块约 5$
模块约 1~2$
频段
License 频段,运营 商频段
unlicense 频段, Sub-GHZ(433、868、915 MHz 等)
unlicense 频段 2.4G
理 论 160kbp ~
传输速 度
250Kbps,实际一般 小于 100kbps,受限
短距离(10 米~百米 级别)
单网接 入 节 点 约 20 万 容量
约 6 万,实际受网关信道数量,节点 发包频率,数据包大小等有关。一般 有 500~5000 个不等
理论 6 万多个,一般 情况 200~500 个
电池续 航
理论约 10 年/AA 电 池
理论约 10 年/AA 电池
理论约 2 年/AA 电池
0.3~50kbps
低速通信接口 UART
理论 250kps,实际一 般小于 100kbps,受 限低速通信接口 UART
网络时 延
6s -10s
TBD
不到 1S
适 合 领 户外场景,LPWAN
域
大面积传感器应用
户外场景,LPWAN,
常见于户内场景,户
大面积传感器应用
外也有,LPLAN
可搭私有网网络,蜂窝网络覆盖不到 小范围传感器应用
NB-IOT/Lora/Zigbee 的组网方式
无线组网由于其可移动性强,能突破时空的限制,同时网络的扩展性强,并且安装简单,成本也 比有线低很多而广受欢迎,我们常见的无线组网方式主要有:NB-IOT、Lora、Zigbee、WIFI、 蓝牙等,今天将前三个组网方式进行一个简单的对比,以供在做方案选择时候做参考:
NB-IOT
zigbee组网方案

zigbee组网方案Zigbee组网方案简介Zigbee是一种低功耗、近距离的无线通信技术,主要应用于物联网领域。
它基于IEEE 802.15.4标准,通过无线信号传输数据,可以实现设备之间的互联和通信。
本文将介绍Zigbee组网的原理以及常见的组网方案。
Zigbee组网原理Zigbee组网主要由三个组成部分组成:协调器(Coordinator),路由器(Router)和终端设备(End Device)。
协调器是整个网络的中心,负责管理和控制整个网络,并在必要时与外部网络通信。
路由器可以通过多跳方式将数据传输到不同的节点,终端设备是网络中的终端节点,主要用于数据的采集和传输。
Zigbee网络采用星状拓扑结构,协调器位于网络的中心,路由器和终端设备通过与协调器的连接来建立网状拓扑结构。
这种结构可以保证网络的稳定性和可靠性。
组网过程中,首先需要进行网络的初始化和配置。
协调器将会发出一个网络启动信号,其他设备在接收到信号后可以加入已有网络或创建一个新的网络。
随后,设备会通过Zigbee的网络协议进行数据的传输和交换。
协议包括了设备之间的通信规则、数据的格式和传输的方式。
Zigbee组网方案Zigbee组网方案有两种常见的方式:单主结构和多主结构。
单主结构在单主结构中,只有一个协调器作为网络的中心,其他设备通过与协调器的连接来进行通信。
这种结构的优点是简单和易于部署,适用于规模较小的网络。
然而,由于只有一个协调器,整个网络的稳定性和可靠性会受到限制。
多主结构多主结构中,可以有多个协调器作为网络的中心。
这种结构的优点是能够提供更高的灵活性和可扩展性,并且可以实现区域之间的连接和通信。
每个协调器都可以管理一部分设备和节点,通过多跳方式实现数据的传输。
然而,多主结构的部署和管理相对复杂,需要更多的设备和资源。
Zigbee网络拓扑结构除了单主结构和多主结构之外,Zigbee还支持多种拓扑结构,包括星状、网状、树状和混合结构。
ZIGBee组网流程

ZIGBee组网流程第一个功能:协调器的组网,终端设备和路由设备发现网络以及加入网络//第一步:Z-Stack 由main()函数开始执行,main()函数共做了2 件事:一是系统初始化,另外一件是开始执行轮转查询式操作系统int main( void ){.......// Initialize the operating systemosal_init_system(); //第二步,操作系统初始化......osal_start_system(); //初始化完系统任务事件后,正式开始执行操作系统......}//第二步,进入osal_init_system()函数,执行操作系统初始化uint8 osal_init_system( void ) //初始化操作系统,其中最重要的是,初始化操作系统的任务{// Initialize the Memory Allocation Systemosal_mem_init();// Initialize the message queueosal_qHead = NULL;// Initialize the timersosalTimerInit();// Initialize the Power Management Systemosal_pwrmgr_init();// Initialize the system tasks.osalInitTasks(); //第三步,执行操作系统任务初始化函数// Setup efficient search for the first free block of heap.osal_mem_kick();return ( SUCCESS );}//第三步,进入osalInitTasks()函数,执行操作系统任务初始化void osalInitTasks( void ) //第三步,初始化操作系统任务{uint8 taskID = 0;tasksEvents = (uint16 *)osal_mem_alloc( sizeof( uint16 ) * tasksCnt);osal_memset( tasksEvents, 0, (sizeof( uint16 ) * tasksCnt));//任务优先级由高向低依次排列,高优先级对应taskID 的值反而小macTaskInit( taskID++ ); //不需要用户考虑nwk_init( taskID++ ); //不需要用户考虑Hal_Init( taskID++ ); //硬件抽象层初始化,需要我们考虑#if defined( MT_TASK )MT_TaskInit( taskID++ );#endifAPS_Init( taskID++ ); //不需要用户考虑#if defined ( ZIGBEE_FRAGMENTATION )APSF_Init( taskID++ );#endifZDApp_Init( taskID++ ); //第四步,ZDApp层,初始化,执行ZDApp_init函数后,如果是协调器将建立网络,如果是终端设备将加入网络。
Zigbee组网实验报告

Zigbee组网实验一.实验目的1.了解zigbee网络2.掌握zigbee节点程序下载方式3.掌握如何组建zigbee星状网络二.实验意义通过实验了解zibee网络的特点,体会其组网及通信过程三.实验环境PC机一台(内安装IAR环境)智能网关一个ZigBee节点ZigBee仿真器一套四.实验原理每一个星状网络中只有一个协调器,当协调器被激活后,它就会建立一个自己的网络。
其它位于协调器附近的zigbee节点,如果与该协调器处于同一信道,则会自动加入到该网络当中。
五.实验步骤一、认识实验设备以及下载设备连接连接线路如图所示:二、Zigbee网络组建1、协调器下载协调器在本套智能家居系统中担任信息收集与传输的工作,它和每个ZigBee模块进行无线通讯,并将信息传送给智能网关,同时也将网关的控制指令发送给各个模块。
我们首先将一个ZigBee模块下载成协调器,具体步骤如下:(1)打开“\实验程序\协调器\Projects\zstack\Samples\collector SimpleApp 1.25\ CC2430DB\SimpleApp.eww”。
如图1-6所示:(2)不同的实验小组选择自己所分配的信道。
点击左侧的文件导航栏,找到tools文件夹,打开其中的文件f8wConfig.cfg,找到自己小组的信道,将行的注释去掉,并且确认其他各个信道代码均为注释状态。
更改完信道之后,在菜单栏中选择Project\Rebuild All进行编译,编译完成后生成的HEX 文件保存在\实验程序\协调器\Projects\zstack\Samples\collectorSimpleApp1.25\CC2430DB\SimpleCollectorEB\Exe 中。
(3)更改完信道之后,在菜单栏中选择Project\Rebuild All进行编译,编译完成后生成的HEX文件保存在\实验程序\协调器\Projects\zstack\Samples\collectorSimpleApp1.25\CC2430DB\SimpleCollec torEB\Exe中;(4)打开smartRF下载软件,如图所示,按照图将下载设备的各个线连接好,之后按一下下载器(也就是白色盒子)上面的黑色按钮,则下载界面中将会识别到要与下载器相连接的zigbee模块芯片,如图所示,对相关条件进行勾选;2.其它zigbee终端节点的下载Zigbee终端节点在上电后自动加入到处于同一信道的zigbee协调器所组建的zigbee网络当中。
ZigBee源码程序及解释

协议栈无线透传编程原理:第一个功能:协调器的组网,终端设备和路由设备发现网络以及加入网络//第一步:Z-Stack 由 main()函数开始执行,main()函数共做了 2 件事:一是系统初始化,另外一件是开始执行轮转查询式操作系统int main( void ) { .......// Initialize the operating systemosal_init_system(); //第二步,操作系统初始化......osal_start_system(); //初始化完系统任务事件后,正式开始执行操作系统......}//第二步,进入 osal_init_system()函数,执行操作系统初始化uint8 osal_init_system( void ) //初始化操作系统,其中最重要的是,初始化操作系统的任务{// Initialize the Memory Allocation Systemosal_mem_init();// Initialize the message queueosal_qHead = NULL;// Initialize the timersosalTimerInit();// Initialize the Power Management Systemosal_pwrmgr_init();// Initialize the system tasks.osalInitTasks(); //第三步,执行操作系统任务初始化函数// Setup efficient search for the first free block of heap.osal_mem_kick();return ( SUCCESS );}//第三步,进入osalInitTasks()函数,执行操作系统任务初始化void osalInitTasks( void ) //第三步,初始化操作系统任务{uint8 taskID = 0;tasksEvents = (uint16 *)osal_mem_alloc( sizeof( uint16 ) * tasksCnt);osal_memset( tasksEvents, 0, (sizeof( uint16 ) * tasksCnt));//任务优先级由高向低依次排列,高优先级对应 taskID 的值反而小macTaskInit( taskID++ ); //不需要用户考虑nwk_init( taskID++ ); //不需要用户考虑Hal_Init( taskID++ ); //硬件抽象层初始化,需要我们考虑#if defined( MT_TASK )MT_TaskInit( taskID++ );#endifAPS_Init( taskID++ ); //不需要用户考虑#if defined ( ZIGBEE_FRAGMENTATION )APSF_Init( taskID++ );#endifZDApp_Init( taskID++ ); //第四步,ZDApp层,初始化,执行ZDApp_init函数后,如果是协调器将建立网络,如果是终端设备将加入网络。
ZigBee组网调试工具1.4

ZigBee组网调试工具1.4说明
一、软件概况
二、使用说明
1、节点检测。
如果第一次使用节点检测功能,需要在“数量设定”左侧的文本框中输入网络中的节点说量(不含协调器)。
然后点击“数量设定”按钮。
然后点击“节点检测”按钮进行检测,如果已经设定了数量即可直接检测。
2、电压检测:点击“电压检测”即可完成对网络中节点电压的检测。
3、修改与读取PANID。
通过点击“读取PANID”可以读取设备现在所在网络的PANID。
设定PANID可以修改该设备的PANID(只是单个设备的PANID,不会改变设备所在网络的PANID)。
4、修改与读取ID。
通过点击“读取ID”可以读取该设备的ID值。
设定ID可以修改该设备的ID值
5、开启与禁止ID功能。
开启ID功能后数据前端会加入设备ID,以区分是那个节点发来的数据。
如果传感器有地址则可以禁用ID功能,直接用用户传感器的地址。
如何实现ZigBee快速组网?

如何实现ZigBee快速组网?真想一键组网,真想让它自组网,真不想看繁琐的组网协议,究竟如何快速实现ZigBee 组网,请看图!Zigbee的前身是1998年由 INTEL、lBM等产业巨头发起的“ Homer flite”技术,随着我国物联网正进入发展的快车道,ZigBee也正逐步被国内越来越多的用户接受。
但在发展上还是有很多的挑战,比如说如何最大化发挥ZigBee组网优势?Zigbee技术的主要特点是支持自组网能力强,自恢复能力强,因此,对于井下定位,停车场车位定位,室外温湿度采集,污染采集等应用非常具有吸引力。
图 1 ZigBee在智慧停车应用组建一个完整的ZigBee网络包括两个步骤:网络初始化、节点加入网络。
其中节点加入网络又包括两个步骤:通过与协调器连接入网和通过已有父节点入网。
图 2 ZigBee网络拓扑结构网络初始化流程:↖确定网络协调器;↖进行信道扫描过程;↖设置网络ID;节点通过协调器加入网络:↖查找网络协调器;↖发送关联请求命令(Associaterequest command);↖等待协调器处理;↖发送数据请求命令;↖回复组网确认;节点通过已有节点加入网络ZLG致远电子基于Silicon Lab EFR32MG芯片设计的ZM32系列ZigBee模块,充分发挥ZigBee协议优势,结合致远电子在无线行业积累创新,可为客户提供三种不同组网方式。
手动组网图 3 手动组网流程图配置网络参数:◆选择工作类型:协调器要先保存好配置参数,成为网络内第一台物理设备;◆配置通道号;◆配置网络号 (PAN ID);图 4 分别设置模块配置提交保存当设备的本地地址变成非 0xFFFF 时,设备入网成功。
图 5 路由与终端设备成功入网图 6 测试实例普通自组网图 7 主机与从机模块普通自组网流程图图 8 配置模块工作类型图 9 启用自组网功能✧控制协调器组网●在协调器所在的 DEMO Board 上找到 S2,按下至少 3 秒后放开,然后观察DEMO Board 上 STATE LED 是否从闪烁 4 下,变成闪烁 2 下;(如果还是闪烁 4 下,请重新按下 S2 3 秒);●在协调器所在的 DEMO Board 上找到 S3,一直按着不要松开,STATE LED 从闪烁 2下,变成闪烁 1 下;此时协调器允许新设备加入网络;图 10 控制协调器允许入网使用配置工具获取设备信息,协调器已经自动设置了唯一网络号信息;图 11 协调器设置网络PAN ID图 12 控制路由/终端设备组网●在路由/终端设备所在的 DEMO Board 上找到 S3,按下至少 100 ms 后放开;●观察DEMO Board 上 STATE LED 是否从闪烁 4 下,到闪烁 3 下,最后闪烁 2下;●如果还是闪烁 4 下,检查协调器是否一直按着按钮 S3;图 13 网络建立成功模块信息此时,使用配置工具获取设备信息,本地地址已自动设置,表示网络建立成功。
第8讲 ZigBee组网流程报告

ZigBee网络关键技术研究0 引言20世纪六七十年代,计算资源放在计算中心,计算机的体积庞大;80年代,个人计算机普及,借助网络通信,实现资源共享、信息互通;90年代随着无线电话的普及,无线通信技术得到发展。
现在常见的几种近距离无线通信技术:(1)WiFi:即IEEE802.11x,提供无线局域网的接入(2)蓝牙:工作在2.4GHz的频段(3)红外线数据通信IrDA:利用红外线进行点对点通信(4)ZigBee:近距离无线通信技术,以2.4GHz为主要频段,采用扩频技术Zigbee是IEEE 802.15.4协议的代名词,是一种短距离、低功耗的无线通信技术。
其特点是近距离、低复杂度、自组织、低功耗、低数据速率、低成本。
主要适合用于自动控制和远程控制领域,可以嵌入各种设备。
Zigbee是一个由可多到65000个无线数传模块组成的一个无线数传网络平台,十分类似现有的移动通信的CDMA网或GSM网,每一个Zigbee网络数传模块类似移动网络的一个基站,在整个网络范围内,它们之间可以进行相互通信;每个网络节点间的距离可以从标准的75米,到扩展后的几百米,甚至几公里。
1 ZigBee网络拓扑结构Zigbee协议标准中定义了三种网络拓扑结构形式:星状结构,树状结构,网状结构。
星形网络和树型网络可以看成是网状网络的一个特殊子集,网络拓扑结构是最常用的结构形式。
如图1所示,图1 ZigBee网络拓扑结构图Zigbee网络只支持2种物理设备;全功能设备(FFD,Full Function Device)和精简功能设备(RFD,Reduced FunctionDevice),其中FFD设备可提供全部服务,可充当任何Zigbee节点,不仅可以发送和接收数据,还具有路由功能,因此可以接收子节点;而RFD设备只提供部分服务,只能充当终端节点,不能充当协调器和路由节点,它只负责将采集的数据信息发送给协调器和路由节点,并不具备路由功能,因此不能接收子节点,并且RFD之间的通信必须通过FFD才能完成。
zigbee的系统结构和组网方式

简介ZigBee是一种新兴的短距离、低功耗、低数据传输速率的无线网络技术,它是一种介于无线标记技术和蓝牙之间的技术方案。
ZigBee是建立在IEEE 802.15.4标准之上,它确定了可以在不同制造商之间共享的应用纲要。
IEEE 802。
15.4标准定义了ZigBee协议的PHY层和MAC层。
PHY层规范确定了在2.4GHz(全球通用的ISM频段)以250kb/s的基准传输率工作的低功耗展频无线电以及另有一些以更低数据传输率工作的915MHz(北美的ISM频段)和868MHz(欧洲的ISM频段)的实体层规范。
MAC层规范定义了在同一区域工作的多个IEEE 802。
15。
4无线电信号如何共享空中通道。
为了促进ZigBee技术的发展,2001年8月成立了ZigBee联盟,2002年下半年,英国Invensys公司、日本三菱电子公司、美国摩托罗拉公司以及荷兰飞利浦半导体公司四大巨头共同宣布,它们将加入“ZigBee联盟”,目前该联盟已经有150多家成员,以研发名为ZigBee的下一代无线通信标准.正如前面所述,ZigBee不仅仅只是802。
15.4的名字,IEEE 802。
15.4仅处理低级MAC层和PHY层协议,所以ZigBee联盟对其网络层协议和API进行了标准化,还开发了安全层,以保证这种便携设备不会意外泄漏其标识。
ZigBee的组成和构网方式1。
FFD和RFD利用zigbee技术组件的无线个人区域网(WPAN)是一种低速率的无线个人区域网(LR WPAN),这种低速率个人区域网的网络结构简单、成本低廉,具有有限的功率和灵活的吞吐量。
在一个LR WPAN网络中,可同时存在两种不同类型的设备,一种是具有完整功能的设备(FFD),另一种是简化功能的设备(RFD)。
在网络中,FFD通常有3中工作状态:(1)作为个人区域网络(PAN)的主协调器;(2)作为一个普通协调器;(3)作为一个终端设备。
FFD可以同时和多个RFD或其他FFD通信。
Zigbee组网原理详解

Zigbee组网原理详解1.组网概述组建一个完整的zigbee网状网络包括两个步骤:网络初始化、节点加入网络。
其中节点加入网络又包括两个步骤:通过与协调器连接入网和通过已有父节点入网。
2. 网络初始化预备Zigbee网络的建立是由网络协调器发起的,任何一个zigbee节点要组建一个网络必须要满足以下两点要求:(1)节点是FFD节点,具备zigbee协调器的能力;(2)节点还没有与其他网络连接,当节点已经与其他网络连接时,此节点只能作为该网络的子节点,因为一个zigbee网络中有且只有一个网络协调器。
FFD:Full FuncTIon Device 全功能节点RFD:Reduced FuncTIonDevice 半功能节点3.网络初始化流程3.1 确定网络协调器:首先判断节点是否是FFD节点,接着判断此FFD节点是否在其他网络里或者网络里是否已经存在协调器。
通过主动扫描,发送一个信标请求命令(Beaconrequest command),然后设置一个扫描期限(T_scan_duraTIon),如果在扫描期限内都没有检测到信标,那么就认为FFD在其pos内没有协调器,那么此时就可以建立自己的zigbee网络,并且作为这个网络的协调器不断地产生信标并广播出去。
注意:一个网络里,有且只能有一个协调器(coordinator)。
3.2 进行信道扫描过程。
包括能量扫描和主动扫描两个过程:首先对指定的信道或者默认的信道进行能量检测,以避免可能的干扰。
以递增的方式对所测量的能量值进行信道排序,抛弃那么些能量值超出了可允许能量水平的信道,选择可允许能量水平的信道并标注这些信道是可用信道。
接着进行主动扫描,搜索节点通信半径内的网络信息。
这些信息以信标帧的形式在网络中广播,。
zigbee无线通信协议程序流程

zigbee无线通信协议程序流程关键信息项:合同双方信息项目名称及描述协议目的及范围Zigbee协议技术要求项目实施计划及时间表合同金额及支付方式风险管理及保障措施变更及调整条款违约责任及处理措施保密条款知识产权归属争议解决方式合同的有效期及终止条件其他条款签署日期及地点1. 合同双方信息1.1 委托方(购买方)名称:____________________________1.2 委托方法定代表人或授权代表姓名:____________________________1.3 委托方联系地址:____________________________1.4 承包方(服务提供方)名称:____________________________1.5 承包方法定代表人或授权代表姓名:____________________________1.6 承包方联系地址:____________________________2. 项目名称及描述2.1 项目名称:____________________________2.2 项目描述及范围:____________________________2.3 项目实施地点:____________________________3. 协议目的及范围3.1 协议目的:确定Zigbee无线通信协议的应用及实施细节,确保双方对协议的理解和执行一致。
3.2 协议范围:包括Zigbee协议的技术实现、系统集成、测试及维护等方面的内容。
4. Zigbee协议技术要求4.1 Zigbee协议版本:____________________________4.2 技术规格和标准:____________________________4.3 设备兼容性要求:____________________________4.4 数据传输要求及网络安全标准:____________________________5. 项目实施计划及时间表5.1 实施计划:____________________________5.2 关键时间节点及里程碑:____________________________5.3 各阶段完成时间及验收时间:____________________________6. 合同金额及支付方式6.1 合同总金额:____________________________6.2 支付方式(如银行转账、支票等):____________________________6.3 支付时间及安排:____________________________6.4 其他费用及支付安排:____________________________7. 风险管理及保障措施7.1 风险识别与评估:____________________________7.2 风险管理计划及措施:____________________________7.3 履约保证金及其使用条件:____________________________7.4 意外情况处理及紧急预案:____________________________8. 变更及调整条款8.1 项目范围及技术要求变更的条件:____________________________8.2 变更申请及审批程序:____________________________8.3 变更导致的费用调整及时间安排:____________________________9. 违约责任及处理措施9.1 委托方违约责任:若委托方未按合同规定付款或提供必要的支持,承包方有权要求赔偿违约损失。
zigbee组网方案

Zigbee组网方案介绍Zigbee是一种低功耗、短距离、低速率的无线通信技术,常用于物联网应用。
Zigbee组网方案是指在Zigbee网络中,如何合理布局设备和搭建网络结构,以实现稳定的通信和高效的数据传输。
本文将介绍Zigbee组网的基本原理、网络拓扑结构以及常用的组网方案。
基本原理Zigbee使用IEEE 802.15.4无线通信标准,工作于2.4GHz频段。
它采用低功耗、低速率的通信方式,支持星型和网状拓扑结构,以及多种网络拓扑结构的组合。
Zigbee组网的基本原理是利用协调器(Coordinator)作为网络的核心,连接所有的设备,并管理网络的功能。
其他设备可以是从节点(End Device)或路由器(Router),将数据通过网络传输给协调器。
协调器负责设备的加入和离开、数据的传输和路由选择等功能。
从节点负责传感器数据的采集和发送,路由器则负责数据的中继和路由选择。
网络拓扑结构Zigbee网络支持多种网络拓扑结构的组合,常见的有星型和网状两种。
星型结构星型结构是最简单的网络拓扑结构,所有设备都直接连接到协调器。
这种结构下,数据传输的距离较近,通信效果稳定可靠。
然而,星型结构下的设备数量有限,且中心节点容易成为瓶颈。
星型结构星型结构网状结构网状结构是一种多对多的网络拓扑结构。
各个设备可通过路由器相互连接,数据可以从源设备通过多个中继节点传输到目标设备。
这种结构下,网络的扩展性较好,且传输距离也可以更远。
网状结构网状结构组网方案根据实际应用需求,选择合适的组网方案是关键。
下面介绍几种常用的Zigbee 组网方案。
单一网状结构在小型范围内,可使用单一网状结构。
所有设备通过路由器连接,数据可以从源设备直接传输到目标设备。
这种方案易于部署,但设备数量和覆盖范围有限。
多层级网状结构对于大范围的应用场景,可使用多层级网状结构。
将网络划分为多个区域,每个区域内有一个协调器和多个路由器。
协调器之间通过路由器连接,形成多层级的网状结构。
ZigBee如何快速一键自组网?

ZigBee如何快速一键自组网?ZigBee技术作为物联网领域最常用的无线技术,经常受限于协议栈开发难、组网过于繁琐等问题而难以应用,这里将为您介绍ZigBee如何快速一键自组网? ZigBee技术作为物联网领域最常用的无线技术,目前在智能家居、农田智能管理、节能应用等行业得到大量应用。
为方便大家利用ZigBee进行项目开发,今天对ZigBee协议栈及组网相关知识做个分享。
图1 ZigBee无线网络应用 ZigBee协议栈可以分为四层:物理层(PHY)、媒体访问控制层(MAC)、网络层(NWK)及应用层(APL)。
如图2所示,粉色的部分是由IEEE标准中定义的,浅蓝色部分是由ZigBee联盟规定的,黄色部分是由设备厂商自行定义。
图2 ZigBee协议栈图示 ZigBee协议栈的物理层及MAC层都是IEEE802.5.14标准中定义的。
PHY 层(物理层)规定了所使用的频段,以及所使用的编码、调制、扩频、调频等无线传输技术。
MAC层的主要作用规定了无线信道的访问控制机制,也就是规定各个设备按照什幺规矩轮流使用信道;如果没有MAC层协议,节点一多,没有规矩的收发机制,就会发生信号冲突,则无法正常传输数据了。
ZigBee协议栈在802.15.4协议基础上定义了网络层。
网络层的主要作用是负责设备的连接和断开、在帧数据传递时采用的安全机制、路由发现和维护。
简单说,就是保障设备之间的组网和网络节点间的数据传输。
标准的ZigBee网络协议包括协调器、路由器和终端节点,而建立一个ZigBee网络除了必须要有的协调器之外,仅需加上路由器或终端节点即可。
在启动标准ZigBee Pro网络通讯前,如果没有建立存储跳转路径的路由表,则节点无法通信,同样需要定时地发送网络报文检查节点是否异常。
由此可见,ZigBee Pro不仅启动速度慢,而且定时发送网络报文占用大量的带宽。
图3 ZigBee Pro组网图示。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
SappleApp.c#include "OSAL.h"#include "ZGlobals.h"#include "AF.h"#include "aps_groups.h"#include "ZDApp.h"#include "SampleApp.h"#include "SampleAppHw.h"#include "OnBoard.h"/* HAL */#include "hal_lcd.h"#include "hal_led.h"#include "hal_key.h"#include "string.h"#include "MT_UART.h"//#include "Lcd128X64.h"#include "UtOled.h"#include "sensor.h"#include "HAL_ADC.h"#include "exsensor.h"#include "lcd128_64.h"const cId_t SampleApp_ClusterList[SAMPLEAPP_MAX_CLUSTERS] ={SAMPLEAPP_PERIODIC_CLUSTERID,SAMPLEAPP_FLASH_CLUSTERID};const SimpleDescriptionFormat_t SampleApp_SimpleDesc ={SAMPLEAPP_ENDPOINT, // int Endpoint; SAMPLEAPP_PROFID, // uint16 AppProfId[2]; SAMPLEAPP_DEVICEID, // uint16 AppDeviceId[2]; SAMPLEAPP_DEVICE_VERSION, // int AppDevVer:4; SAMPLEAPP_FLAGS, // int AppFlags:4; SAMPLEAPP_MAX_CLUSTERS, // uint8 AppNumInClusters; (cId_t *)SampleApp_ClusterList, // uint8 *pAppInClusterList; SAMPLEAPP_MAX_CLUSTERS, // uint8 AppNumInClusters; (cId_t *)SampleApp_ClusterList // uint8 *pAppInClusterList;};endPointDesc_t SampleApp_epDesc;uint8 SampleApp_TaskID;devStates_t SampleApp_NwkState;uint8 SampleApp_TransID;uint8 changeline[2]={0x0a,0x0d};union h{uint8 RxBuf[70];Union_DATA RXDATA;}UartRxBuf;//串口接收缓冲区union e{uint8 TxBuf[70];Union_DATA TXDATA;}UartTxBuf;//串口发送缓冲区union f{uint8 RxBuf[70];Union_DATA RXDATA;}RfRx;//无线接收缓冲区union g{uint8 TxBuf[70];Union_DATA TXDATA;}RfTx;//无线接收缓冲区void SampleApp_MessageMSGCB( afIncomingMSGPacket_t *pckt );void SampleApp_SendData(unsigned char buff[],uint8 length);static void rxCB(uint8 port, uint8 event);void SampleApp_Init( uint8 task_id ){halUARTCfg_t uartConfig;SampleApp_TaskID = task_id;SampleApp_NwkState = DEV_INIT;SampleApp_TransID = 0;SampleApp_epDesc.endPoint = SAMPLEAPP_ENDPOINT; SampleApp_epDesc.task_id = &SampleApp_TaskID;SampleApp_epDesc.simpleDesc= (SimpleDescriptionFormat_t *)&SampleApp_SimpleDesc; SampleApp_tencyReq = noLatencyReqs;afRegister( &SampleApp_epDesc );RegisterForKeys( SampleApp_TaskID );MT_UartRegisterTaskID(SampleApp_TaskID);LCDInit();ClearScreen();Print(0,10,"COORDINATOR",1);Print(2,5,"ZhangHang",1);Print(4,5,"FengGuangWen",1);Print(6,5,"YaoJiaDong",1);uartConfig.configured = TRUE;uartConfig.baudRate = HAL_UART_BR_115200;uartConfig.flowControl = FALSE;uartConfig.callBackFunc = rxCB ;//uartConfig.callBackFunc = NULL ;HalUARTOpen( 0, &uartConfig);}uint16 SampleApp_ProcessEvent( uint8 task_id, uint16 events ){afIncomingMSGPacket_t *MSGpkt;(void)task_id;if ( events & SYS_EVENT_MSG ){MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( SampleApp_TaskID );while ( MSGpkt ){switch ( MSGpkt->hdr.event ){case ZDO_STATE_CHANGE:SampleApp_NwkState = (devStates_t)(MSGpkt->hdr.status);HalLedBlink(0x02,0,50,500);uint8 *buff;buff[0]='A';buff[1]='B';buff[2]='C';HalUARTWrite(0,buff,3);HalUARTWrite(0,changeline,2);break;case AF_INCOMING_MSG_CMD:HalLedBlink(0x01,0,50,500);SampleApp_MessageMSGCB( MSGpkt );break;/*case SPI_INCOMING_ZTOOL_PORT:HalLedBlink(0x02,0,50,500);rxCBX();*/default:break;}osal_msg_deallocate( (uint8 *)MSGpkt );MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( SampleApp_TaskID );}return (events ^ SYS_EVENT_MSG);}return 0;}static uint8 SerialApp_TxLen;void SampleApp_MessageMSGCB( afIncomingMSGPacket_t *pkt ){unsigned char buffer[42];osal_memcpy(buffer,pkt->cmd.Data ,42);HalUARTWrite(0,buffer,42);HalUARTWrite(0,changeline,2);/*unsigned char buffer[100];osal_memcpy(buffer,pkt->cmd.Data ,100);SerialApp_TxLen=HalUARTRead(0,buffer,100);HalUARTWrite(0,buffer,SerialApp_TxLen);HalUARTWrite(0,changeline,2);*/}void SampleApp_SendData(uint8 buff[],uint8 length){afAddrType_t SendDataAddr;SendDataAddr.addrMode = (afAddrMode_t)AddrBroadcast;SendDataAddr.endPoint = SAMPLEAPP_ENDPOINT;SendDataAddr.addr.shortAddr = 0xffff;AF_DataRequest( &SendDataAddr, &SampleApp_epDesc,2,length,buff,&SampleApp_TransID,AF_DISCV_ROUTE,AF_DEFAULT_RADIUS );}static void rxCB(uint8 port, uint8 event){uint8 length = Hal_UART_RxBufLen(0);uint8 *buff;buff = osal_mem_alloc(length);HalUARTRead(0,buff,length);if(length!=0){SampleApp_SendData(buff,length);Printn8(5,5,length,1,3);}osal_mem_free(buff);}Router.c#include "OSAL.h"#include "ZGlobals.h"#include "AF.h"#include "aps_groups.h"#include "ZDApp.h"#include "SampleApp.h"#include "SampleAppHw.h"#include "OnBoard.h"#include "ioCC2530.h"/* HAL */#include "hal_lcd.h"#include "hal_led.h"#include "hal_key.h"#include "string.h"#include "MT_UART.h"//#include "Lcd128X64.h"#include "UtOled.h"#include "sensor.h"#include "HAL_ADC.h"#include "exsensor.h"#include "lcd128_64.h"const cId_t SampleApp_ClusterList[SAMPLEAPP_MAX_CLUSTERS] ={SAMPLEAPP_PERIODIC_CLUSTERID,SAMPLEAPP_FLASH_CLUSTERID};const SimpleDescriptionFormat_t SampleApp_SimpleDesc ={SAMPLEAPP_ENDPOINT, // int Endpoint; SAMPLEAPP_PROFID, // uint16 AppProfId[2]; SAMPLEAPP_DEVICEID, // uint16 AppDeviceId[2]; SAMPLEAPP_DEVICE_VERSION, // int AppDevVer:4; SAMPLEAPP_FLAGS, // int AppFlags:4; SAMPLEAPP_MAX_CLUSTERS, // uint8 AppNumInClusters; (cId_t *)SampleApp_ClusterList, // uint8 *pAppInClusterList; SAMPLEAPP_MAX_CLUSTERS, // uint8 AppNumInClusters; (cId_t *)SampleApp_ClusterList // uint8 *pAppInClusterList;};endPointDesc_t SampleApp_epDesc;uint8 SampleApp_TaskID;devStates_t SampleApp_NwkState;uint8 SampleApp_TransID;uint8 myMac[16];//物理地址uint8 myShort[4];//本节点网络地址uint8 temp;uint16 NWK;uint8 readbuf[50];uint8 sendbuf[50];uint8 changeline[2]={0x0a,0x0d};uint8 LEDSTATE =1;uint8 LEDSTATE5=1;uint8 LEDSTATE6=1;uint8 PEOPLE=0;uint8 PEOPLE1=0;uint8 PEOPLE2=0;uint8 LIGHT=115;int timexx1=0;int timexx2=0;union h{uint8 RxBuf[70];Union_DATA RXDATA;}UartRxBuf;//串口接收缓冲区union e{uint8 TxBuf[70];Union_DATA TXDATA;}UartTxBuf;//串口发送缓冲区union f{uint8 RxBuf[70];Union_DATA RXDATA;}RfRx;//无线接收缓冲区union g{uint8 TxBuf[70];Union_DATA TXDATA;}RfTx;//无线接收缓冲区typedef struct RFTXBUF{uint8 myNWK[4];uint8 myMAC[16];uint8 pNWK[4];uint8 pMAC[16];}RFTX;void SampleApp_HandleKey( uint8 shift, uint8 keys );void SampleApp_SendData(void);void DataPack(void);void SampleApp_MessageMSGCB( afIncomingMSGPacket_t *pkt ); void ToString(uint8 *dest, char *src ,uint8 length);void ShowScreen(void);void HalInit(void);void DoLight(void);void SampleApp_Init( uint8 task_id ){halUARTCfg_t uartConfig;SampleApp_TaskID = task_id;SampleApp_NwkState = DEV_INIT;SampleApp_TransID = 0;SampleApp_epDesc.endPoint = SAMPLEAPP_ENDPOINT;SampleApp_epDesc.task_id = &SampleApp_TaskID;SampleApp_epDesc.simpleDesc= (SimpleDescriptionFormat_t *)&SampleApp_SimpleDesc;SampleApp_tencyReq = noLatencyReqs;afRegister( &SampleApp_epDesc );RegisterForKeys( SampleApp_TaskID );MT_UartRegisterTaskID(SampleApp_TaskID);HalInit();uartConfig.configured = TRUE;uartConfig.baudRate = HAL_UART_BR_115200;uartConfig.flowControl = FALSE;uartConfig.callBackFunc = NULL;HalUARTOpen( 0, &uartConfig);}uint16 SampleApp_ProcessEvent( uint8 task_id, uint16 events ){afIncomingMSGPacket_t *MSGpkt;(void)task_id;if ( events & SYS_EVENT_MSG ){MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( SampleApp_TaskID );while ( MSGpkt ){switch ( MSGpkt->hdr.event ){case ZDO_STATE_CHANGE:SampleApp_NwkState = (devStates_t)(MSGpkt->hdr.status);if(SampleApp_NwkState == DEV_ROUTER){HalLedBlink(0x02,0,50,500);// DataPack();//osal_set_event(SampleApp_TaskID,SEND_DATA_EVENT);//osal_set_event(SampleApp_TaskID,SHOW_DATA_EVENT);//osal_set_event(SampleApp_TaskID,LIGHT_EVENT);// ClearScreen();uint8 *buff;buff[0]='A';buff[1]='B';buff[2]='C';HalUARTWrite(0,buff,3);HalUARTWrite(0,changeline,2);}break;case AF_INCOMING_MSG_CMD:HalLedBlink(0x01,0,50,500);SampleApp_MessageMSGCB(MSGpkt);break;default:break;}osal_msg_deallocate( (uint8 *)MSGpkt );MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( SampleApp_TaskID );}return (events ^ SYS_EVENT_MSG);}if(events & SEND_DATA_EVENT){SampleApp_SendData();osal_start_timerEx(SampleApp_TaskID,SEND_DATA_EVENT,1000);return (events ^ SEND_DATA_EVENT);}if(events & SHOW_DATA_EVENT){ShowScreen();DataPack();DoLight();osal_start_timerEx(SampleApp_TaskID,SHOW_DATA_EVENT,100);return (events ^ SHOW_DATA_EVENT);}return 0;}void DataPack(void){sendbuf[0]='&';sendbuf[1]='S'; //数据包头包括节点类型sendbuf[2]='C';sendbuf[3]='U';sendbuf[4]='R';sendbuf[5]='O';sendbuf[6]='3';ToString(myMac,NLME_GetExtAddr(),8); // 物理地址for(int i=7;i<=22;i++)sendbuf[i]=myMac[i-7];NWK= NLME_GetShortAddr(); //网络地址ToString(myShort,(uint8 *)&NWK,2);for(int i=23;i<=26;i++)sendbuf[i]=myShort[i-23];temp=ReadTemp(); //温度信息sendbuf[27]=temp/10+'0';sendbuf[28]=temp%10+'0';unsigned char adc=HalAdcRead(0x00,1); //光感传感器值sendbuf[29]=adc/100+'0';sendbuf[30]=(adc/10)%10+'0';sendbuf[31]=adc%10+'0';sendbuf[32]=LEDSTATE + '0'; //总灯光控制sendbuf[33]=LEDSTATE5+ '0'; //两路灯光控制sendbuf[34]=LEDSTATE6+ '0';PEOPLE=P0_4; //来人检测sendbuf[35]= PEOPLE + '0';sendbuf[36]=LIGHT; //光感阙值用于判断灯的亮否for(int i=37;i<=40;i++)sendbuf[i]='z'; //待用数据包sendbuf[41]='&';sendbuf[42]='\0';}static uint8 SerialApp_TxLen;void SampleApp_SendData(){afAddrType_t SendDataAddr;SendDataAddr.addrMode = (afAddrMode_t)Addr16Bit;SendDataAddr.endPoint = SAMPLEAPP_ENDPOINT;SendDataAddr.addr.shortAddr = 0x00;AF_DataRequest( &SendDataAddr, &SampleApp_epDesc,2,42,sendbuf,&SampleApp_TransID,AF_DISCV_ROUTE,AF_DEFAULT_RADIUS );}void SampleApp_MessageMSGCB(afIncomingMSGPacket_t *pkt) {// uint8 buff[42];// osal_memcpy(buff,pkt->cmd.Data,42);///张航unsigned char buffer[42];osal_memcpy(buffer,pkt->cmd.Data ,42);HalUARTWrite(0,buffer,42);HalUARTWrite(0,changeline,2);/*unsigned char buffer[100];osal_memcpy(buffer,pkt->cmd.Data ,100);SerialApp_TxLen=HalUARTRead(0,buffer,100); HalUARTWrite(0,buffer,SerialApp_TxLen);HalUARTWrite(0,changeline,2);*///任意长度字符串/*if(buff[5]=='O'&&buff[6]=='3'){//uint8 changeline[2]={0x0A,0x0D};//HalUARTWrite(0,buff,42);//HalUARTWrite(0,changeline,2);if(buff[32]=='0')LEDSTATE =0;else LEDSTATE =1;if(buff[33]=='0')LEDSTATE5=0;else LEDSTATE5=1;if(buff[34]=='0')LEDSTATE6=0;else LEDSTATE6=1;if(buff[35]=='0')PEOPLE=0;else PEOPLE=1;LIGHT=buff[36];}*/}void ToString(uint8 *dest, char *src ,uint8 length) {uint8 *xad;uint8 i = 0;uint8 ch;xad = src +length -1;for(i=0;i<length;i++,xad--){ch=(*xad>>4)&0x0f;dest[i<<1]=ch+((ch<10)?'0':'7');ch=*xad & 0x0f;dest[(i<<1)+1]=ch+((ch<10)?'0':'7');}}void ShowScreen(){Print(0,30," Router3",1);uint16 temper;Print(2,1,"Tempe:",1);temper=ReadTemp()-6;Printn8(2,48,temper,1,2);Print(2,65,"C",1);uint16 light;Print(4,1,"Light:",1);light=HalAdcRead(0x00,1);Printn8(4,48,light,1,3);if(LEDSTATE==1)Print(4,80,"on ",0);else Print(4,80,"off",0);Print(6,1,"People:",1);if(PEOPLE==1)Print(6,80,"yes",0);else Print(6,80,"no ",0);}void HalInit(void){LCDInit();ClearScreen();Print(0,30," SCU",1);Print(2,10,"ZhangHang",1);Print(4,10,"FengGuangWen",1);Print(6,10,"YaoJiaDong",1);P0SEL &=~0x10;//热释电红外传感器的初始化P0DIR &=~0x10;P0INP |= 0x10;P0DIR |= 0x61; //两路路灯的硬件初始化P0_5 =LEDSTATE5;P0_6 =LEDSTATE6;}void DoLight(){unsigned char adc=HalAdcRead(0x00,1);if(LEDSTATE==0){P0_5=1;P0_6=1;LEDSTATE5=LEDSTATE6=0;}else if(LEDSTATE==1){if(LEDSTATE5==0)P0_5=1;else if(LEDSTATE5==1){if(adc>LIGHT){if(timexx1>20){if(PEOPLE==0)P0_5=1;timexx1=0;goto ll;}if(PEOPLE==1){P0_5=0;timexx1=0;}else if(PEOPLE==0)timexx1++;}else P0_5=1;}ll :;if(LEDSTATE6==0)P0_6=1;else if(LEDSTATE6==1){if(adc>LIGHT){if(timexx2>20){if(PEOPLE==0)P0_6=1;timexx2=0;goto xx;}if(PEOPLE==1){P0_6=0;timexx2=0;}else if(PEOPLE==0)timexx2++;}else P0_6=1;}xx:;}}Enddevice.c#include "OSAL.h"#include "ZGlobals.h"#include "AF.h"#include "aps_groups.h"#include "ZDApp.h"#include "SampleApp.h"#include "SampleAppHw.h"#include "OnBoard.h"/* HAL */#include "hal_lcd.h"#include "hal_led.h"#include "hal_key.h"#include "string.h"#include "MT_UART.h"//#include "Lcd128X64.h"#include "UtOled.h"#include "sensor.h"#include "HAL_ADC.h"#include "exsensor.h"#include "lcd128_64.h"const cId_t SampleApp_ClusterList[SAMPLEAPP_MAX_CLUSTERS] ={SAMPLEAPP_PERIODIC_CLUSTERID,SAMPLEAPP_FLASH_CLUSTERID};const SimpleDescriptionFormat_t SampleApp_SimpleDesc ={SAMPLEAPP_ENDPOINT, // int Endpoint; SAMPLEAPP_PROFID, // uint16 AppProfId[2]; SAMPLEAPP_DEVICEID, // uint16 AppDeviceId[2]; SAMPLEAPP_DEVICE_VERSION, // int AppDevVer:4; SAMPLEAPP_FLAGS, // int AppFlags:4; SAMPLEAPP_MAX_CLUSTERS, // uint8 AppNumInClusters; (cId_t *)SampleApp_ClusterList, // uint8 *pAppInClusterList; SAMPLEAPP_MAX_CLUSTERS, // uint8 AppNumInClusters; (cId_t *)SampleApp_ClusterList // uint8 *pAppInClusterList;};endPointDesc_t SampleApp_epDesc;uint8 SampleApp_TaskID;devStates_t SampleApp_NwkState;uint8 SampleApp_TransID;uint8 myMac[16];//物理地址uint8 myShort[4];//本节点网络地址uint8 temp;uint16 NWK;uint8 readbuf[50];uint8 sendbuf[50];uint8 changeline[2]={0x0a,0x0d};uint8 LEDSTATE=0;uint8 PEOPLE=0;union h{uint8 RxBuf[70];Union_DATA RXDATA;}UartRxBuf;//串口接收缓冲区union e{uint8 TxBuf[70];Union_DATA TXDATA;}UartTxBuf;//串口发送缓冲区union f{uint8 RxBuf[70];Union_DATA RXDATA;}RfRx;//无线接收缓冲区union g{uint8 TxBuf[70];Union_DATA TXDATA;}RfTx;//无线接收缓冲区typedef struct RFTXBUF{uint8 myNWK[4];uint8 myMAC[16];uint8 pNWK[4];uint8 pMAC[16];}RFTX;void SampleApp_HandleKey( uint8 shift, uint8 keys );void SampleApp_SendData(void);void DataPack(void);void SampleApp_MessageMSGCB( afIncomingMSGPacket_t *pkt );void ToString(uint8 *dest, char *src ,uint8 length);void ShowScreen(void);void SampleApp_Init( uint8 task_id ){halUARTCfg_t uartConfig;SampleApp_TaskID = task_id;SampleApp_NwkState = DEV_INIT;SampleApp_TransID = 0;SampleApp_epDesc.endPoint = SAMPLEAPP_ENDPOINT; SampleApp_epDesc.task_id = &SampleApp_TaskID;SampleApp_epDesc.simpleDesc= (SimpleDescriptionFormat_t *)&SampleApp_SimpleDesc; SampleApp_tencyReq = noLatencyReqs;afRegister( &SampleApp_epDesc );RegisterForKeys( SampleApp_TaskID );MT_UartRegisterTaskID(SampleApp_TaskID);LCDInit();Print(0,30," SCU",1);Print(2,10,"ZhangHang",1);Print(4,10,"FengGuangWen",1);Print(6,10,"YaoJiaDong",1);uartConfig.configured = TRUE;uartConfig.baudRate = HAL_UART_BR_115200;uartConfig.flowControl = FALSE;uartConfig.callBackFunc = NULL;HalUARTOpen( 0, &uartConfig);}uint16 SampleApp_ProcessEvent( uint8 task_id, uint16 events ){afIncomingMSGPacket_t *MSGpkt;(void)task_id;if ( events & SYS_EVENT_MSG ){MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( SampleApp_TaskID );while ( MSGpkt ){switch ( MSGpkt->hdr.event ){case ZDO_STATE_CHANGE:SampleApp_NwkState = (devStates_t)(MSGpkt->hdr.status);if(SampleApp_NwkState == DEV_END_DEVICE){HalLedBlink(0x02,0,50,500);osal_set_event(SampleApp_TaskID,SEND_DATA_EVENT);ClearScreen();}break;case AF_INCOMING_MSG_CMD:SampleApp_MessageMSGCB(MSGpkt);break;default:break;}osal_msg_deallocate( (uint8 *)MSGpkt );MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( SampleApp_TaskID );}return (events ^ SYS_EVENT_MSG);}if(events & SEND_DATA_EVENT){DataPack();SampleApp_SendData();ShowScreen();osal_start_timerEx(SampleApp_TaskID,SEND_DATA_EVENT,3000);return (events ^ SEND_DATA_EVENT);}/*if(events & SHOW_DATA_EVENT){ShowScreen();osal_start_timerEx(SampleApp_TaskID,SHOW_DATA_EVENT,1000);return (events ^ SHOW_DATA_EVENT);}*/return 0;}void SampleApp_MessageMSGCB(afIncomingMSGPacket_t *pkt){uint8 buff[42];osal_memcpy(buff,pkt->cmd.Data,42);if(buff[5]=='F'||buff[6]=='1'){uint8 changeline[2]={0x0A,0x0D};HalUARTWrite(0,buff,42);HalUARTWrite(0,changeline,2);if(buff[32]=='z'||buff[32]=='.')HalLedSet(0x01,LEDSTATE);if(buff[32]=='0'){HalLedSet(0x01,0);LEDSTATE=0;}else{HalLedSet(0x01,1);LEDSTATE=1;}}}void DataPack(void){uint16 site;sendbuf[0]='&';sendbuf[1]='S';sendbuf[2]='C';sendbuf[3]='U';sendbuf[4]='R';sendbuf[5]='F';sendbuf[6]='1';//sendbuf[6]='2';//数据包头包括节点类型ToString(myMac,NLME_GetExtAddr(),8); // 物理地址for(int i=7;i<=22;i++)sendbuf[i]=myMac[i-7];NWK= NLME_GetShortAddr(); //网络地址ToString(myShort,(uint8 *)&NWK,2);for(int i=23;i<=26;i++)sendbuf[i]=myShort[i-23];temp=ReadTemp(); //温度信息sendbuf[27]=temp/10+'0';sendbuf[28]=temp%10+'0';unsigned char adc=HalAdcRead(0x00,1); //光感传感器值sendbuf[29]=adc/100+'0';sendbuf[30]=(adc/10)%10+'0';sendbuf[31]=adc%10+'0';for(int i=32;i<=40;i++)sendbuf[i]='z'; //待用数据包sendbuf[41]='&';sendbuf[42]='\0';}void SampleApp_SendData(){afAddrType_t SendDataAddr;SendDataAddr.addrMode = (afAddrMode_t)Addr16Bit;SendDataAddr.endPoint = SAMPLEAPP_ENDPOINT;SendDataAddr.addr.shortAddr = 0x00;AF_DataRequest( &SendDataAddr, &SampleApp_epDesc,2,42,sendbuf,&SampleApp_TransID,AF_DISCV_ROUTE,AF_DEFAULT_RADIUS );}void ToString(uint8 *dest, char *src ,uint8 length) {uint8 *xad;uint8 i = 0;uint8 ch;xad = src +length -1;for(i=0;i<length;i++,xad--){ch=(*xad>>4)&0x0f;dest[i<<1]=ch+((ch<10)?'0':'7');ch=*xad & 0x0f;dest[(i<<1)+1]=ch+((ch<10)?'0':'7');}}void ShowScreen(){Print(0,30,"EndDevice1",1);uint16 temper;Print(2,1,"Tempe:",1);temper=ReadTemp()-6;Printn8(2,48,temper,1,2);Print(2,65,"C",1);uint16 light;Print(4,1,"Light:",1);light=HalAdcRead(0x00,1);Printn8(4,48,light,1,3);if(LEDSTATE==1)Print(4,80,"on ",0);else Print(4,80,"off",0);Print(6,1,"People:",1);if(PEOPLE==1)Print(6,80,"yes",0);else Print(6,80,"no",0);}。