简单入门Zigbee

简单入门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.6
  P0SEL &= 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;
  else
    zgDeviceLogicalType = 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 everyone
  SampleApp_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 1
  SampleApp_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 AF
  afRegister( &SampleApp_epDesc );

  // Register for all key events - This app will handle all key events
  RegisterForKeys( SampleApp_TaskID );

  // By default, all devices start out in Group 1
  SampleApp_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 parameter

  if ( events & SYS_EVENT_MSG )
  {
    MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( SampleApp_TaskID );
    while ( MSGpkt )
    {
      switch ( MSGpkt->hdr.event )
      {
        // Received when a key is pressed
        case KEY_CHANGE:
          SampleApp_HandleKeys( ((keyChange_t *)MSGpkt)->state, ((keyChange_t *)MSGpkt)->keys );
          break;

        // Received when a messages is received (OTA) for this endpoint
        case AF_INCOMING_MSG_CMD:
          SampleApp_MessageMSGCB( MSGpkt );
          break;

        // Received whenever the device changes state in the network
        case 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 memory
      osal_msg_deallocate( (uint8 *)MSGpkt );

      // Next - if one is available
      MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( SampleApp_TaskID );
    }

    // return unprocessed events
    return (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 events
    return (events ^ SAMPLEAPP_SEND_PERIODIC_MSG_EVT);
  }

  // Discard unknown events
  return 0;
}

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

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

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

已标记关键词 清除标记
相关推荐
Zigbee入门开发 Zigbee是一种新型的短距离无线通信技术。其特点是低功耗,低成本,组网灵活。Zigbee协议由zigbee联盟指定,包括应用层,和网络层,其下层采用IEEE802.15.4协议。 无论是学习zigbee技术,还是利用zigbee技术开发产品,都需要较好的掌握zigbee协议,并比较深入的了解IEEE802.15.4协议.然而仅zigbee协议就接近400页,而IEEE802.15.4协议多达600页,全部是英文。如果从来没有接触过无线通信的开发,要迅速掌握这么多内容确实有一些难度,笔者考虑到广大急切进入zigbee的同仁者,结合自己开发中总结出的理解协议的特定方法,从开发的角度,阐述协议内容,以达到抛砖引玉的效果,同时和广大同仁交流,共同提高,并希望zigbee技术能够在中国发扬光大。 协议从功能实现来讲,ZigBee协议层共包括物理层(又称实体层)、MAC层、数据链接层、网络层和应用支持层五个主要层次。在标准制定的分工上,ZigBee协议层是由ZigBee联盟和IEEE802.15.4的任务小组共同完成的。其中,物理层(又称实体层)、MAC层、数据链接层,以及传输过程中的资料加密机制等都是由IEEE所主导的。网络层和应用支持层则由ZigBee联盟来完成。IEEE802.15.4小组与ZigBee联盟共同针对ZigBee协议栈的发展进行研究,而未来还能依据系统客户的要求来修正其所需的应用界面。如图1所示: Zigbee协议整体架构 作为理解协议,从开发者的角度来讲,这样学习协议是比较费时间的,也较难掌握。笔者从自己长期开发的经验来看,对无线通信,最重要的就是在发送端根据用户的要求,把数据能够扔出去,并且是扔到指定的设备,在接收端,能够把发送到该设备的数据捡起来。并根据用户要求的作特定的处理。如果考虑在一个无线网路中的话,就得首先建立网络,其他得设备加入网络。最后是才是一些其他的问题,如设备离开网络,设备重新加入网络,等等。 这样从通信过程去理解协议,将会使得协议的内容非常明了,也可以很好的知道利用协议开发产品,达到事半功倍的效果。 本人将根据这样的思路,分五期具体讲述协议内容: 第一期:设备建立网络过程 第二期:设备加入网络过程 第三期:数据发送过程 第四期:数据接收过程 第五期:其他的问题 zigbee设备建立网络过程 在一个zigbee网络中,只有协调器(coordinator)设备可以建立网络,在建立网络过程中,所有的实现过程都是通过原语实现的(具体在程序中,如用c语言,就是调用一个一个函数,或者是一个一个任务来实现(不要刻意最求这句话的准确性,本来好的协议就是只要达到这样的结果,不管具体实现)),首先协调器设备的应用层调用NLME_NETWORK_FORMATION.request原语,发出建立网络请求,网络层收到这个原语,就要求MAC层执行信道能量扫描(在IEEEE802.15.4协议中规定,在2.4G频段,共有16个信道,每个信道的带宽为5M,深入理解,可以看协议和通信原理的相关资料)。这调用MLME_SCAN.request,主要找到信道能量低于设定能量值的信道,并且标注这些信道是可用信道,下 一步就在可用信道中执行活动情况扫描(active scan),就是在可接受的信道
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页