简单入门Zigbee

之前一直忙于校招,没有来得及时间做,前段时间终于签约了,所以现在趁着时间空,赶紧把坑填上了,后面再献上一篇关于校招的心得。闲话不多说,开始进入正题。

先给大家基本介绍一下zigbee

ZigBee译为"紫蜂",它与蓝牙相类似。是一种新兴的短距离无线通信技术,相较于传统网络通信技术,ZigBee无线通信技术表现出更为高效、便捷的特征。作为一项近距离、低成本、低功耗的无线网络技术,ZigBee无线通信技术其关于组网、 安全及应用软件方面的技术是基于IEEE批准的802 15.4无线标准。
简单的说,Zigbee是一种高可靠的无线数传网络,类似于CDMA和GSM网络。Zigbee数传模块类似于移动网络基站。通讯距离从标准的75m到几百米、几公里,并且支持无限扩展。
  
ZigBee的优势
  ①低功耗。在低耗电待机模式下,2 节5 号干电池可支持1个节点工作6~24个月,甚至更长。这是Zigbee的突出优势。相比较,蓝牙只能工作数周、WiFi只能工作数小时
  ②低成本。通过大幅简化协议(不到蓝牙的1/10) ,降低了对通信控制器的要求,按预测分析,以8051的8位微控制器测算,全功能的主节点需要32KB代码,子功能节点少至4KB代码,而且Zigbee免协议专利费。每块芯片的价格大约为2 美元。
  ③自组网.Zigbee协议采用网状网拓扑,自动加入网络,自动寻找路由.节点断线快速自愈.
  ④距离远.Zigbee可以经过最多达256个路由,每个节点之间的距离可以达到1.6KM远,从而实现无线扩展
  ⑤高容量。Zigbee 可采用星状、片状和网状网络结构,由一个主节点管理若干子节点,最多一个主节点可管理254 个子节点;同时主节点还可由上一层网络节点管理,最多可组成65000 个节点的大网。
  ⑦高安全。Zigbee 提供了三级安全模式,包括无安全设定、使用接入控制清单(ACL) 防止非法获取数据以及采用高级加密标准(AES 128) 的对称密码,以灵活确定其安全属性
  
更加详细的就请自行百度吧。

如何学习Zigbee
zigbee可以直接配置成各种模式,然后像蓝牙那样收发数据就可以了,也可以AT指令来控制。不过zigbee内置有个8051的内核,其实可以直接跑程序,非常方便,所以个人介意,既然要学还是玩二次开发比较好,不然就没有意义了。
要学肯定要买板子,市面上的zigbee基本上都是基于TI的cc2530的,8051内核,不过现在好像已经有arm内核的了,不过我用的还是8051的,所以还是会基于8051来给大家讲。
买开发板的话学习会方便点,因为都集成好了,无论是接线,下载都会更方便,但开发板的话成本相对较贵,所以我自己买的还是核心板,买的是网蜂的核心板。

配套的话还需要买个下载器

ps:核心板不止买一个,因为要用来组网,至少两个以上,下载器的话也可以买两个,不然接线来回挺麻烦,不过有条件的话做个底板会很好。

而且网蜂提供的资料也很全面,各种例程,文档和手册都在他的社区里了,不懂的也可以问技术客服,比较基本的也可以问我。

打开那个实战演练的文档

第二章主要教51的,学过的就可以不用看了。第一章就是教你环境搭建和下载调试,一开始会让你下个IARfor8051的开发环境,这里多嘴说一句,不同的IAR最好装在不同目录下,否则不能兼容,后面下来一个for arm的那个51的就没有了。下载的话买了之前我说的下载器的同学接好线就打开例程就可以直接点下载了,之前我糊里糊涂弄了半天都不行。下载际只用5根线:VCC , GND, RST, DC, DD。下载器灯变绿就说明连接成功了。

接下来第三章是重点

每个都要仔细看,特别是串口,无线通信,网络实验那些,因为基本都会用到,而且之后我们写程序就基本从3.8,,3.9那几个例程上改了。

接下来第四第五章都是一些传感器和项目例程,包括官方给的一些程序里还有更多的例程,理解以后就可以照葫芦画瓢了。

我们打开一个温湿度传感器实验来看下

主要看app这个文件夹里的东西,基本上都在这里添加自己的用户程序。
打开SampleApp.c找到SampleApp_Init函数,可以看到这里放的是各种初始化函数,还有一些基本配置。

void SampleApp_Init( uint8 task_id )
{SampleApp_TaskID = task_id;SampleApp_NwkState = DEV_INIT;SampleApp_TransID = 0;MT_UartInit();//串口初始化MT_UartRegisterTaskID(task_id);//登记任务号HalUARTWrite(0,"Hello World\n",12); //(串口0,'字符',字符个数。)//温湿度传感器初始化 P0.6P0SEL &= 0xbf;// Device hardware initialization can be added here or in main() (Zmain.c).// If the hardware is application specific - add it here.// If the hardware is other parts of the device add it in main().#if defined ( BUILD_ALL_DEVICES )// The "Demo" target is setup to have BUILD_ALL_DEVICES and HOLD_AUTO_START// We are looking at a jumper (defined in SampleAppHw.c) to be jumpered// together - if they are - we will start up a coordinator. Otherwise,// the device will start as a router.if ( readCoordinatorJumper() )zgDeviceLogicalType = ZG_DEVICETYPE_COORDINATOR;elsezgDeviceLogicalType = ZG_DEVICETYPE_ROUTER;
#endif // BUILD_ALL_DEVICES#if defined ( HOLD_AUTO_START )// HOLD_AUTO_START is a compile option that will surpress ZDApp//  from starting the device and wait for the application to//  start the device.ZDOInitDevice(0);
#endif// Setup for the periodic message's destination address// Broadcast to everyoneSampleApp_Periodic_DstAddr.addrMode = (afAddrMode_t)AddrBroadcast;SampleApp_Periodic_DstAddr.endPoint = SAMPLEAPP_ENDPOINT;SampleApp_Periodic_DstAddr.addr.shortAddr = 0xFFFF;// Setup for the flash command's destination address - Group 1SampleApp_Flash_DstAddr.addrMode = (afAddrMode_t)afAddrGroup;SampleApp_Flash_DstAddr.endPoint = SAMPLEAPP_ENDPOINT;SampleApp_Flash_DstAddr.addr.shortAddr = SAMPLEAPP_FLASH_GROUP;// 网蜂点对点通讯定义Point_To_Point_DstAddr.addrMode = (afAddrMode_t)Addr16Bit;//点播Point_To_Point_DstAddr.endPoint = SAMPLEAPP_ENDPOINT;Point_To_Point_DstAddr.addr.shortAddr = 0x0000; //发给协调器// Fill out the endpoint description.SampleApp_epDesc.endPoint = SAMPLEAPP_ENDPOINT;SampleApp_epDesc.task_id = &SampleApp_TaskID;SampleApp_epDesc.simpleDesc= (SimpleDescriptionFormat_t *)&SampleApp_SimpleDesc;SampleApp_epDesc.latencyReq = noLatencyReqs;// Register the endpoint description with the AFafRegister( &SampleApp_epDesc );// Register for all key events - This app will handle all key eventsRegisterForKeys( SampleApp_TaskID );// By default, all devices start out in Group 1SampleApp_Group.ID = 0x0001;osal_memcpy( SampleApp_Group.name, "Group 1", 7  );aps_AddGroup( SAMPLEAPP_ENDPOINT, &SampleApp_Group );#if defined ( LCD_SUPPORTED )HalLcdWriteString( "SampleApp", HAL_LCD_LINE_1 );
#endif
}

这个例程主要是终端测温湿度数据然后通过点播传到协调器。

Point_To_Point_DstAddr.addrMode = (afAddrMode_t)Addr16Bit;//点播
Point_To_Point_DstAddr.endPoint = SAMPLEAPP_ENDPOINT;
Point_To_Point_DstAddr.addr.shortAddr = 0x0000; //发给协调器

接下来看SampleApp_ProcessEvent函数

uint16 SampleApp_ProcessEvent( uint8 task_id, uint16 events )
{afIncomingMSGPacket_t *MSGpkt;(void)task_id;  // Intentionally unreferenced parameterif ( events & SYS_EVENT_MSG ){MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( SampleApp_TaskID );while ( MSGpkt ){switch ( MSGpkt->hdr.event ){// Received when a key is pressedcase KEY_CHANGE:SampleApp_HandleKeys( ((keyChange_t *)MSGpkt)->state, ((keyChange_t *)MSGpkt)->keys );break;// Received when a messages is received (OTA) for this endpointcase AF_INCOMING_MSG_CMD:SampleApp_MessageMSGCB( MSGpkt );break;// Received whenever the device changes state in the networkcase ZDO_STATE_CHANGE:SampleApp_NwkState = (devStates_t)(MSGpkt->hdr.status);if ( //(SampleApp_NwkState == DEV_ZB_COORD)|| //协调器不给自己点播(SampleApp_NwkState == DEV_ROUTER)|| (SampleApp_NwkState == DEV_END_DEVICE) ){// Start sending the periodic message in a regular interval.osal_start_timerEx( SampleApp_TaskID,SAMPLEAPP_SEND_PERIODIC_MSG_EVT,SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT );}else{// Device is no longer in the network}break;default:break;}// Release the memoryosal_msg_deallocate( (uint8 *)MSGpkt );// Next - if one is availableMSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( SampleApp_TaskID );}// return unprocessed eventsreturn (events ^ SYS_EVENT_MSG);}// Send a message out - This event is generated by a timer//  (setup in SampleApp_Init()).if ( events & SAMPLEAPP_SEND_PERIODIC_MSG_EVT ){uint8 T[8];     //温度+提示符     DHT11();   //温度检测    T[0]=wendu_shi+48;T[1]=wendu_ge+48;T[2]=' ';T[3]=shidu_shi+48;T[4]=shidu_ge+48;T[5]=' ';T[6]=' ';T[7]=' ';   /*******串口打印 WEBEE*********/HalUARTWrite(0,"temp=",5);HalUARTWrite(0,T,2);HalUARTWrite(0,"\n",1);    HalUARTWrite(0,"humidity=",9);HalUARTWrite(0,T+3,2);HalUARTWrite(0,"\n",1);    /*******LCD显示  WEBEE*********/HalLcdWriteString("Temp: humidity:", HAL_LCD_LINE_3 );//LCD显示HalLcdWriteString( T, HAL_LCD_LINE_4 );//LCD显示   SampleApp_SendPointToPointMessage();//点播函数// Setup to send message again in normal period (+ a little jitter)osal_start_timerEx( SampleApp_TaskID, SAMPLEAPP_SEND_PERIODIC_MSG_EVT,(SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT + (osal_rand() & 0x00FF)) );// return unprocessed eventsreturn (events ^ SAMPLEAPP_SEND_PERIODIC_MSG_EVT);}// Discard unknown eventsreturn 0;
}

zigbee主要的运行过程就是注册登记事件,然后事件发生后调用回调函数,所有的事件都放在这个函数里了,之后我们可以往里添加其他的事件。

关于zigbee我大致就讲这么多,文档里几乎包括了所有东西,所以我就不再多嘴了,大家只要反复看基本都能理解,之后就用一个自己做的小项目来给大家介绍一下,毕竟例程终究是纸上谈兵,自己实战一下会发现很多问题。

多谢观赏,欢迎讨论,大佬轻喷。

简单入门Zigbee相关推荐

  1. 7天快速入门Zigbee:无线传输与接收

    7天快速入门Zigbee:无线传输与接收 点击左上角的"关注",定期更新Zigbee最新资讯,总有你想要的信息! 目录 概述 解析Zigbee通信机制 数据发送 数据接收 数据处理 ...

  2. BizTalk 2006 简单入门示例程序(附源项目文件下载)

    BizTalk 2006 简单入门示例程序(附源项目文件下载) 为初学BizTalk Server 2006的开发人员,提供一个简单入门的示例程序,包括一个Receive Port.Send Port ...

  3. python如何读取mat文件可视化_python Matplotlib数据可视化(1):简单入门

    1 matplot入门指南 matplotlib是Python科学计算中使用最多的一个可视化库,功能丰富,提供了非常多的可视化方案,基本能够满足各种场景下的数据可视化需求.但功能丰富从另一方面来说也意 ...

  4. ARM NEON 编程简单入门1

    原文:http://blog.csdn.net/silentob/article/details/72954618  ARM NEON 编程简单入门1 NEON简介 NEON是适用于ARM Corte ...

  5. Python 简单入门指北(二)

    Python 简单入门指北(二) 2 函数 2.1 函数是一等公民 一等公民指的是 Python 的函数能够动态创建,能赋值给别的变量,能作为参传给函数,也能作为函数的返回值.总而言之,函数和普通变量 ...

  6. EChart.js 简单入门

    EChart.js 简单入门 最近有一个统计的项目要做,在前端的数据需要用图表的形式展示.网上搜索了一下,发现有几种统计图库. MSChart   这个是Visual Studio里的自带控件,使用比 ...

  7. 【我的区块链之路】- Hyperledger fabric的简单入门(四)链码的编写及调试

    [我的区块链之路]- Hyperledger fabric的简单入门(四)链码的编写及调试       之前的文章中我们有讲过了fabric的一些核心的配置文件的选项说明,讲过fabric 的网络启动 ...

  8. 基于vue-cli、elementUI的Vue超简单入门小例子

    基于vue-cli.elementUI的Vue超简单入门小例子 这个例子还是比较简单的,独立完成后,能大概知道vue是干嘛的,可以写个todoList的小例子. 开始写例子之前,先对环境的部署做点简单 ...

  9. 【java开发系列】—— spring简单入门示例

    回顾 1 JDK安装 2 Struts2简单入门示例 前言 作为入门级的记录帖,没有过多的技术含量,简单的搭建配置框架而已.这次讲到spring,这个应该是SSH中的重量级框架,它主要包含两个内容:控 ...

最新文章

  1. Mat矩阵基本操作与示例 OpenCV
  2. ELK:收集k8s容器日志最佳实践
  3. 小测试来检验一下你原型链理解的怎么样。
  4. 生产订单结算KKS1常见错误
  5. Python基础概念_9_输入输出
  6. python数据库自动重连_python mysql断开重连的实现方法
  7. SpringAOP 注解方式代码示例
  8. 用SSE加速CPU蒙皮计算
  9. 无限循环小数四则运算_狐狸笔记 | 0.999999无限循环下去,就等于1吗?
  10. LINUX中注销其他已登陆帐户
  11. Atitit图像处理的用途
  12. 《JavaScript高效图形编程(修订版)》——导读
  13. html跑马灯代码大全(图片文字移动代码)
  14. android 签名工具 autoSign jarsigner
  15. java 找不到符号 con_Java,找不到符号:奇怪
  16. 题目 1902: 九宫格
  17. IT零起点转FICO学习路线(转)
  18. springboot网页小图标
  19. R 返回元素在数据框或者向量中的位置?
  20. form表单,账号注册实例

热门文章

  1. macbook pro苹果笔记本快捷键(切换界面、剪切、重命名、截屏)
  2. goaccess 基本使用
  3. 柏睿数据董事长兼CTO刘睿民:未来数据库行业大有可为
  4. 山东大学2021级数据结构实验全集代码
  5. 大三如何备战考研?需要注意些什么?
  6. 关于mysql的delete和主从同步问题
  7. 高通平台power_supply 框架下添加第三方充电IC的驱动方法
  8. 0x00000001是个啥?十六进制表示
  9. Android L2TP 一直连接失败,但PPTP可连接,实践解决方案
  10. 分别导入.xls和.xlsx后缀的excel文件