实训ZigBee报告

时间:2024.4.14

ZigBee实训报告

实训要求:(1)EB板按键能控制LED灯的亮灭;

         (2)C#软件开发界面控件能控制ZigBee板上LED灯的亮灭;

         (3)C#界面能通过图片实时显示ZigBee板上LED的亮灭情况;

需求分析:这次实训做的是一个简单的智能家居控制灯,能实现PC机控制灯,并且实时查看灯的开与关状态,锻炼我们上位机对下位机的控制与下位机反馈信息到上位机的能力,要求能熟炼使用IAR软件进行ZigBee编程和使用Microsoft Visual Studio进行C#界面的开发。

知识点整理:(1)ZigBee按键控制LED灯程序的运用;

           (2)ZigBee接收串口发送来的数据识别并做处理;

           (3)ZigBee发送串口数据函数的调用;

           (4)C#串口部分如串口号,波特率,检验位的设定;

           (5)C#接收到串口数据并处理,C#发送串口数据;

遇到的难题:(1)ZigBee使用到的串口中断和按键中断两个中断,经常使得功能不稳定;

           (2)C#串口接收到的数据可以调用显示但无法识别;

           (3)C#的接收后显示和发送出现线程经常出错,无法在一个元件实现实时LED灯状态;

           (4)程序整合的过程经常出现无法兼顾两个程序原来的功能。

部分问题处理办法:

l  下位机ZigBee:

 if(KEY1==1)      

     {

Delay(25000);

           }               注:按键的简单去抖

   if(KEY1==1)

           {

                KeyTouchtimes++;

               }

               if(KeyTouchtimes ==1)     

               {

                  UartTX_Send_String(Txdata,r);      

                  RLED = 0;

                  KeyTouchtimes =2;

              }

            if(KeyTouchtimes ==3)      

               {

                 UartTX_Send_String(Txdata2,r);       

                 RLED = 1;

                 KeyTouchtimes =0;

              }

注:按键每次按下KeyTouchtimes加1,当1状态时关LED灯并且发送Txdata数组到上位机同时自身跳转到状态2;当3状态时开LED灯并且发送Txdata2数组到上位机同时自身跳转到0;这样写可以保证每次按键按下时LED灯会取反并且每次状态改变时把状态通过数组发送到上位机。

上位机C#整体效果图:

·

上位机显示灯状态图:

        private void button2_Click(object sender, EventArgs e)

        {

            mySerialPort.Write("A1#");

            pictureBox1.Image = pictureBox3.Image;

        }

        private void button3_Click(object sender, EventArgs e)

        {

            mySerialPort.Write("A0#");

            pictureBox1.Image = pictureBox2.Image;

        }

当C#界面按下关灯按键时会发送A0#命令到ZigBee实现关灯命令同时把关灯图片付值到显示见面;当C#界面按下开灯按键时会发送A1#命令到ZigBee实现关灯命令同时把开灯图片付值到显示见面;

ZigBee接收C#命令程序:

1.         if(RXTXflag == 1)               //接收状态

2.                  {

3.                    if( temp != 0)

4.                    {

5.                        if((temp!='#')&&(datanumber<3))

6.                        {                                //’#‘被定义为结束字符

7.                                                         //最多能接收3个字符

8.                          Recdata[datanumber++] = temp;

9.                        }

10.                    else

11.                    {

12.                      RXTXflag = 3;                   //进入改变小灯的程序

13.                    }

14.                    if(datanumber == 3)RXTXflag = 3;

15.                  temp  = 0;

16.                }

17.              }

18.              if(RXTXflag == 3)

19.              {

20.               

21.                if(Recdata[0]=='A')

22.                {

23.                  if(Recdata[1]=='0')

24.                  { 

25.                     RLED = 0; 

26.                     YLED = 1; 

27.                     GLED = 1;                        // A0# 关所有LED

28.                  }

29.                  else

30.                  { 

31.                      RLED = 1; 

32.                      YLED = 1;

33.                      GLED = 1;                       // A1# 开所有LED

34.                  }

35.                }

    注:每次收到数据是以#号结束字符的判断并识别到接收的数据为A0#时关RLED灯,识别到接收的数据为A1#时开RLED灯。

C#接收来自EB板程序如下:

     Private void mySerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)

        {

            SerialPort sp = (SerialPort)sender;

            string text = string.Empty;

            int size = sp.BytesToRead;

            if (size % 2 == 0)  判断字节数是否是偶数

         {

                pictureBox1.Image = pictureBox2.Image;

            }

            else

            {

            pictureBox1.Image = pictureBox3.Image;

            }

            totalReceivedBytes += size;

            this.Invoke(UpdateTextHandler, text);

}

ZigBee按键按下时会发送Txdata数组或者Txdata2数组,均为一个字节,C#接受计算接收到的字节为奇偶判断此时是发送开灯命令还是关灯命令,并把开灯或者关灯图片附值到显示区。

                            实训总结

本次ZigBee实训任务让我重新学习了一次C#有关知识内容,实训过程中遇到很多问题,比如在CC2530单片机中如何去使用在一个中断响应两个不同事件,结果干扰很严重,能实现按键控制灯的亮灭和发送数据,就不能在实现C#界面发送数据给CC2530单片机,最后只能采用按键中断解决中断冲突问题,还有问题就是按下EB板按键时发送的数据不稳定,在这个问题上团队力量很重,最后经过我们三个的努力把这个问题也解决了,在老师指导下解决C#接收EB板的数据后C#界面的亮灯和灭灯图片的切换,其他问题都不是很大......

每次实训我深刻地知道了,实践源于真知,而只有更好更牢固掌握知识,多想多问多查,学会自己上网找资料,才能在实践中有较大的收获,同时团队解决问题能力远比个人的强,巩固了专业知识,发现了许多不足,明白了专业重心所在,专业运用于何处。对于自己专业知识掌握不扎实,缺乏独立思考探索的意识等等缺点,我将在今后的学习与工作中不断加以改正,认真学好专业知识,以求真正地将理论运用于实践,用实践指导理论。


第二篇:zigbee实验报告


《接入技术课题报告》

学    院:计算机与信息学院

专业班级:通信工程一班

       课题名称:Zigbee实现树状网络

      日    期:20##年5月9日

课题任务:1.用 zigbee 开发套件实现 zigbee 设备的组网;

       2.了解 PAN 协调器的启动过程;

       3.了解路由器与设备加入网络的过程;

       4.通过 zigbee 网络传输温度与湿度的数据;

       5.理解 Z-stack 的协议架构;

       6.用抓包器分析 MAC 帧的内容。

课题结果

任务1:用 zigbee 开发套件实现 zigbee 设备的组网

Zigbee组网就是调用协议栈的组网函数、加入网络函数,实现网络的建立与节点的加

入。组网可有多种方案而且还有不同的拓扑结构,如任务4中我们所建立的数据传输网络也是其中的一部分。详见任务4

任务2:了解 PAN协调器的启动过程

建立网络是一个自动的过程,协调器在应用指定的网络信道范围内进行能量扫描,通过在各个信道上进行监听,获取各信道能量水平。协调器会选择一个干扰和冲突最少的信道建立网络。确定了工作信道后,设备可以进一步设置其余网络参数,包括PAN标识,网络地址,扩展PAN标识等。

应用层通过NLME-NETWORK-FORMATION.request触发网络层进行网络建立过程。原语包括扫描信道,扫描时间,信标阶,超帧阶,电池寿命扩展标志等参数。网络建立的具体过程:调用MAC层MLME-SCAN原语先后进行能量扫描和主动扫描,在选择好信道、PAN标识等参数后调用NLME-SET原语先后对参数进行设置,最后通过MLME-START原语启动协调器。

具体过程如下:

ZSEG int main ( void )

{

……

//初始化操作系统

osal_init_system ();

……

}

OSAL.c

byte osal_init_system( void )

{

……

//初始化系统的任务

osalInitTasks ();

……

}

OSAL_SampleApp.c

void osalInitTasks( void )

{

……

ZDApp_Init( taskID++ );

SampleApp_Init( taskID );

}

ZDApp.c

void ZDApp_Init( byte task_id )

{

ZDAppTaskID = task_id;

// Initialize the ZDO global device short address storage

ZDAppNwkAddr.addrMode = Addr16Bit;//地址模式为 16bit 短地址

ZDAppNwkAddr.addr.shortAddr = INVALID_NODE_ADDR;//短地址=0xFFFE

(void)NLME_GetExtAddr();   //API 函数,用于得到 64bit IEEE 地址

// Initialize ZDO items and setup the device - type of device to create.

ZDO_Init();

afRegister( (endPointDesc_t *)&ZDApp_epDesc );//为设备注册端点 0 描述符

// Start the device?

if ( devState != DEV_HOLD ) //  无 HOLD_AUTO_START 此项预编译,所以 devState = DEV_INIT

{

ZDOInitDevice( 0 );

}

ZDApp_RegisterCBs();

}

ZDApp.c

uint8 ZDOInitDevice( uint16 startDelay )

{

uint8 networkStateNV = ZDO_INITDEV_NEW_NETWORK_STATE;//0x01,初始化该设备新的网络状态

devState = DEV_INIT;     //  无连接

ZDAppDetermineDeviceType();//确定该设备的类型

extendedDelay = (uint16)((NWK_START_DELAY + startDelay)

+ (osal_rand() & EXTENDED_JOINING_RANDOM_MASK));//加入网络的时延

ZDApp_NetworkInit( extendedDelay );//开始形成网络

}

ZDApp.c

void ZDApp_NetworkInit( uint16 delay )

{

if ( delay )

{

// Wait awhile before starting the device

osal_start_timerEx( ZDAppTaskID, ZDO_NETWORK_INIT , delay );

}

else

{

osal_set_event( ZDAppTaskID, ZDO_NETWORK_INIT );

}

}

UINT16 ZDApp_event_loop( byte task_id, UINT16 events )

{

if ( events & ZDO_NETWORK_INIT )//网络初始化事件处理

{

// Initialize apps and start the network

devState = DEV_INIT;

ZDO_StartDevice( (uint8)ZDO_Config_Node_Descriptor.LogicalType, devStartMode,

DEFAULT_BEACON_ORDER, DEFAULT_SUPERFRAME_ORDER );

HalLedSet (HAL_LED_1, HAL_LED_MODE_ON);//点亮 LED1 表示网络初始化完成。

ZDObject.c

void  ZDO_StartDevice(  byte  logicalType,  devStartModes_t  startMode,  byte  beaconOrder,  byte superframeOrder )

{

devState = DEV_COORD_STARTING;

ret = NLME_NetworkFormationRequest( zgConfigPANID, zgDefaultChannelList,

zgDefaultStartingScanDuration, beaconOrder,superframeOrder,false );

……

}

任务3:了解路由器与设备加入网络的过程

zigbee协调器设备建立网络后,路由器设备或者终端设备,可以加入协调器建立的网络,具体加入网络有两种方式,一种是通过关联方式,就是待加入的设备发起加入网络,具体实现方式后面讨论,另一中是直接方式,就是待加入的设备具体加入到那个设备下,作为该设备的子节点,由以前网络中的设备,想待加入的设备作为其子设备决定。由于我们一般都用方式一所以我们只了解方式一。

加入一个设备,是两个设备的事,即子设备和待定父设备,对于子设备,首先子设备调用NLME-NETWORK-DISCOVERY.request 原语,设定待扫描的信道,以及每个信道扫描的时间,网络层收到这个原语,将要求MAC层执行被动或主动扫描。

 具体发送到设备外的是一个becon request 帧,当在这个信道中的设备收到该帧,将会发送becon帧,这是子设备通过BEACON-NOTIFY.indication原语,告知该设备的MAC层,该becon帧包含了发送该帧的地址信息,以及是否允许其他设备以其子节点的方式加入。待加入的设备,在网络层,将检查该 becon帧协议ID是否是zigbee ID。如果不是,将忽略;如果是,该设备将复制收到每个becon帧的相关信息到其关联表中(neighbor table)。一旦MAC层完成了扫描,将发送MLME-SCAN.confirm原语,告知网络层,网络层将发送NLME-NETWORK-DISCOVERY.confirm原语,告知应用层。

     应用层收到该原语,应用层将根据情况,要么重新要求扫描,或者从关联表中选择所发现的网络加入。调用NLME-JOIN.request 原语,原语中各个参数的设置参看协议。如果在关联表中找不到合适的准父节点,将调用原语告知应用层,如果由多个设备可以满足要求,将选择到协调器节点深度最低的设备,如果有几个设备的深度相同,且都是最小深度,将从中随机选择一个。

     一旦潜在的父节点确定,网络层将调用MLME-ASSOCIATE.request 原语到MAC层。具体设置参看协议相关部分,连接状态将通过MLME-ASSOCIATE.confirm 原语反馈。

    如果试图加入不成功,网络层将收到MAC层通过MLME-ASSOCIATE.confirm告知的加入失败,如果收到的是潜在父节点拒绝该设备加入,这时候,网络层将会在关联表中,把该潜在父节点的相应部分,潜在父节点位(potential parent bit)置为零,确保网络层,不再给这个设备二次发送加入请求。

    如果一次加入没成功,将选择另一个潜在的父节点加入,指导找到一个合适的设备加入或者所有的设备都不适合。如果加入成功,网络层收到的MLME-ASSOCIATE.confirm 原语,将含有该设备可用的16唯一的逻辑地址,网络层将在关联表中设置与其父节点的关系,同时,这个父节点也会在其关联表中加入这个新设备。

    如果是以路由器(router)形式成功加入网络,该设备的应用层将发送NLME-STAT_ROUTER. request 原语,网络层将发送MLME-STAT.request 原语到MAC层。收到了MLME-START.confirm 原语,网络层 将发送 NLME-START-ROUTER.confirm 原语,含有同样的状态值。

   对于父节点设备:

     只有协调器或路由器,可以加入设备,进行该操作,首先从MAC层开始,MAC接收到一帧(ASSOCIATE)数据 ,通过 MLME_ASSOCIATE.indication原语传到网罗层,潜在的父节点收到这帧数据,首先判断该设备是否已经存在其关联表中,如果找 到,NLME将获取相应的16位网络地址,并发送 association  response 到MAC层,如果没有找到,将分配一个在这个网络中唯一的地址给待加入的设备,如果潜在父节点已经用完了地址分配,NLME将中止,通过MLME- ASSOCIATE.reponse 原语,告知该设备,不能接收子设备了,在多跳网络中,其他的设备还可以接收。

  如果设备加入得到许可,这时候,将在关联表中创建一个表项,作为其子节点,并通过MLME-ASSOCIATE.reponse 原语,告知该设备,已经成功加入网络。

代码:路由器入网

ZDObject.c

void  ZDO_StartDevice(byte logicalType,  devStartModes_t  startMode,  byte  beaconOrder,  byte  superframeOrder )

{

devState = DEV_NWK_DISC;

ret= NLME_NetworkDiscoveryRequest( zgDefaultChannelList, zgDefaultStartingScanDuration ); 

……

}

终端设备入网

ZDObject.c

void  ZDO_StartDevice( byte logicalType, devStartModes_t startMode, byte beaconOrder,  byte  superframeOrder )

{

devState = DEV_NWK_DISC;

ret= NLME_NetworkDiscoveryRequest( zgDefaultChannelList, zgDefaultStartingScanDuration ); 

……

}

任务4:通过 zigbee 网络传输温度与湿度的数据

代码如下:

#include <ioCC2530.h>

#include <string.h>

#include "UART.H"

#include "DHT11.H"

void main(void)

{

        Delay_ms(1000);//让设备稳定

        InitUart();    //串口初始化

       while(1)

       {         

         DHT11();       //获取温湿度

         P0DIR |= 0x40; //IO口需要重新配置

        

         /******温湿度的ASC码转换*******/

         temp[0]=wendu_shi+0x30;

         temp[1]=wendu_ge+0x30;

         humidity[0]=shidu_shi+0x30;

         humidity[1]=shidu_ge+0x30;

        

         /*******信息通过串口打印********/

         Uart_Send_String(temp1,5);

         Uart_Send_String(temp,2);

         Uart_Send_String("\n",1);

         Uart_Send_String(humidity1,9);

         Uart_Send_String(humidity,2);

         Uart_Send_String("\n",1);

        

         Delay_ms(2000);  //延时,使周期性2S读取1次

      

        }

}

实验结果如图:

吹气前的结果:

对着温湿度传感器吹气的结果

显然可见吹气后所得到的温度和湿度数据明显变化,且之种变化也是符合常理的。

任务5:理解 Z-stack 的协议架构

Z-Stack采用分层的软件结构,目的是为了使各层相对独立,每一层都提供一些服务,服务由协议定义,程序员只需关心与他的工作直接相关的那些层的协议,它们向高层提供服务,并由低层提供服务。

硬件抽象层(HAL)提供各种硬件模块的驱动,包括定时器Timer,通用I/O接口GPIO,通用异步收发传输器UART,模数转换ADC的应用程序接口API,提供各种服务的扩展集。操作系统抽象层OSAL实现了一个易用的操作系统平台,通过时间片轮转函数实现任务调度,提供多任务处理机制。用户可以调用OSAL提供的相关API进行多任务编程,将自己的应用程序作为一个独立的任务来实现。整个Z-Stack协议栈结构如图

Z-Stack在项目中的目录结构:

1.APP:应用层目录,这是用户创建各种不同工程的区域,在这个目录中包含了

应用层的内容和用户创建项目的主要内容,在协议栈里面是以操作系统的任务实

现的"

2.HAL:硬件层目录,包含有与硬件相关的配置和驱动及操作函数"

3.MAC:MAC层目录,包含了MAC层的参数配置文件及其MAC的LIB库的

函数接口文件"

4.MT:监制调试层目录,该目录下的文件主要用于调试目的,即实现通过串口调试各层,与各层进行直接交互。

5.NWK:网络层目录,含网络层配置参数文件及网络层库的函数接口文件,APS

层库的函数接口"

6.OSAL:协议栈的操作系统"

7.Profile:AF层目录,Application Farmework 应用框架,包含AF层处理函数接口文件。

8.Seeurity:安全层目录,安全层处理函数

9.Services:ZigBee和802.15.4设备地址处理函数目录,包括地址模式的定义及地址处理函数

10.Tools:工作配置目录,包括空间划分及Z-Stack相关配置信息

11.ZDO:指ZigBee设备对象,可认为是一种公共的功能集,文件用户用自定义的对象调用APS子层的服务和NWK层的服务

12.ZMac:MAC层目录,包括MAC层参数配置及MAC层LIB库函数回调处理

函数"

13.ZMain:主函数目录,包括入口函数及硬件配置文件

14. Output:输出文件目录

任务6:用抓包器分析 MAC 帧的内容

用Packet Sniffer软件来分析MAC帧的内容,实验结果如下

总结:通过此次作业的练习,学习到了很多东西。第一是对Zigbee有了进一步的了解,;第二是加强了在资料的搜索与资料的筛选,;第三是一个小小的团队分工合作的重要性。我们这个作业所涉及的内容很多,而且我和我的队友事先对我们这次的作业也没有太多的了解,很多东西都得自己去慢慢查阅和筛选资料,我和我队友进行分工合作,直到最后把作业完成。

参考文献:

FS_ZigBee协议栈实验指导书 锋硕电子科技有限公司  王锋

更多相关推荐:
gis实习报告

GIS课程软件的实习应用与二次开发资源与环境科学学院指导老师:****20XX年6月GIS课程软件的实习应用与二次开发摘要:如今信息科技的发展为各专业的同学都提供了一个更为广阔和便捷的探索与研究领域。对于我们地…

gis二次开发实习报告

重庆交通大学测量与空间信息处理实验报告实验课程GIS二次开发程序设计实验名称设计程序完成图像基本操作班级测绘一班学号09210111姓名程佳琦实验日期20xx年6月5日重庆交通大学测量与空间信息处理实验室一实验...

MapGis作图实验报告

计算机制图实验报告系别国土资源系班级土管082班学号083932232姓名提交时间新疆农业大学经济与管理学院一实验目的此次实验的目的在于学会使用MapGIS软件掌握土地资源调查与评价基本原理与方法并掌握如何利用...

地理信息系统(Mapgis)实习报告

土地信息学系统课程设计报告书课程名称土地信息系统专业班级土地资源管理0634091学号063409134学生姓名张强指导教师李艳马文明20xx年12月15日目录一概述31课程设计的意义和目的32土地信息系统简介...

mapgis实验报告

巨鹿整饰地图屏幕数字化MapGis地图屏幕数字化实习目的掌握栅格图像配准图像格式转换图例板建立属性结构建立及地图屏幕数字化的方法和步骤实习内容利用给定的土地利用遥感影像图文件名巨鹿整饰JPG转换为MapGIS的...

mapgis实习指导书

1MAPGIS实习目的与任务11MAPGIS实习目的1了解MAPGIS软件的操作界面和基本功能2了解MAPGIS矢量化的基本原理和方法3掌握MAPGIS矢量化的基本操作完成栅格地图的矢量化和属性数据输入12MA...

mapgis 矢量化报告

1实验目的11常用数字化软件Mapgis的认识和使用12理解地图数字化的原理和方法13使用数字化软件Mapgis对栅格地形图进行屏幕跟踪数字化的操作包括等高线水系道路陡崖陡坎居民地注记高程点等的矢量化2实验准备...

计网实验五报告_Cisco IOS基本操作

计算机网络课程设计实验报告模板

苹果应用程序实训报告-Snowfall小程序

12苏州市职业大学实习实训报告名称20xx年1月7日至20xx年1月12日共一周院系计算机工程系班级11软件外包姓名蒋思思系主任教研室主任指导教师郝允辉马志明目录目录1一题目说明211程序开发背景2二总体设计3...

gps报告

苏州科技学院环境科学与工程学院测绘工程专业7GPS原理与应用A习报告专业班级测绘1班实习小组3学号1020xx5127姓名仲鸣贺实习地点西山缥缈村指导教师连达军20xx724实目录实习目的和意义2实习内容2数据...

gps定位实习报告

第一部分前言前言全球定位系统GlobalPositioningSystem是美国从20世纪70年代开始研制历时20年于19xx年全面建成具有在海陆空进行全方位实时三维导航与定位功能的新一代卫星导航与定位系统经近...

gps实习报告

GPS测量与数据处理题目GPS实习报告学号08351205姓名龚炜班级测绘2班083512指导老师肖根如目录一实习目的二实习人员组成三实习仪器四实习内容41RTK测量411RTK测量原理412RTK测量内容42...

gis实训报告(2篇)