zigbee初识

zigbee简介

zigbee 是IEEE 802.15.4协议的代名词。这个协议规定的短距离,低功耗的无线通信技术。

协议栈

协议栈是指网络中各层协议的总和, 其反应了网络中文件传输的过程:由上层到底层,再由底层到上层的过程。zigbee联盟在2005年发布了第一份zigbee规范。

TI Z-stack 2007年由TI发布, 其配合OSAL(多任务操作系统)完成整个协议栈的运行

zigbee协议栈建立在IEEE 802.15.4的PHY层和MAC层规范之上。它实现了网络层(NWK)和应用层(APL)

应用层由提供了应用子层, APS和zigbee设备对象(ZDO)。

物理层(PHY)

物理层定义了物理无线信道和MAC子层的接口, 提供物理层数据服务和物理层管理服务。

物理层内容:

1) zigbee的激活

2)当前信道的能量检测

3)接收链路服务质量信息

4)zigbee信道接入方式

5)信道频率选择

6)数据传输和接收

介质接入控制子层(MAC)

MAC层负责处理所有物理层无线信道访问,并产生网络信号,同步信号;支持PAN连接和分离, 提供两个对等MAC实体之间可靠的链路。

MAC层功能:

1) 网络协调器产生信标(beaeon)

2) 与信标同步

3) 支持PAN(个域网)链路的建立和断开

4) 为设备的安全性提供支持

5) 信道接入方式采用免冲突载波检测多址接入机制

6) 处理和维护保护时隙机制

7) 在两个对等的MAC实体键提供安全可靠的通信链路

网络层(NWK)

网络层是zigbee的核心。 网络层主要实现节点加入或离开网络,接收或抛弃其他节点, 路由查找及数据传输等功能。

网络层功能:

1) 网络发现

2) 网络形成

3) 允许设备连接

4) 路由器初始化

5) 设备同网络连接

6) 直接将设备和网络连接

7) 断开网络连接

8) 重新复位设备

9) 接收机同步

10) 信息库维护

应用层(APL)

zigbee应用层包括应用支持层APS, zigbee设备对象ZDO和制造商定义的应用对象。

应用支持层(APS)功能:

1) 维持绑定表

2) 在绑定设备间传递信息

设备对象(ZDO)功能:

1) 定义设备在网络中的角色

2) 发起和响应绑定请求

3) 在网络设备中建立安全机制

4) 发现网络设备,并决定提供应用服务类型

应用程序框架(AF)

运行在zigbee协议栈上的应用程序实际上是厂商自定义的应用对象, 并且遵循规范运行在端点1~240上。

zigbee提供两种标准服务类型: 键值对(KVP) 和 报文(MSG)。

zigbee基本概念

设备类型:

1) Coordinator (协调器)

2) Router (路由器)

3) End-Device(终端)

zigbee网络中由一个Coordinator 和多个Router和多个End-Device组成。

Coordinator(协调器)

协调欺负责启动整个网络。它是网络的第一个设备。协调欺选择一个信道和一个网络ID(PAN ID),启动整个网络。 协调欺也可以协助建立网络中安全层和应用层的绑定(bindings)。

注意: 协调器的角色主要涉及网络启动和配置,一旦完成,就像一个路由器或者消失。由于整个zigbee网络的分布特性, 因此接下来整个网络的操作就不在依赖协调器是否存在。

Router(路由器)

路由器的功能是允许其他设备加入网络,多跳路由或者协助它自己由电池供电的终端设备的通讯。

通常路由器希望一直是活动状态,因此必须使用主电源供电,但是当使用树状网络拓扑结构时,允许路由间隔一定的周期操作一次。这样就可以使用电池供电。

Ebd-Device(终端设备)

终端设备没有特定的维持网络结构的责任,它可以睡眠或者唤醒,因此它可以是一个电池供电的设备。通常终端设备对存储空间要求比较小。

 

协议栈规范(stack profile)

Zigbee定义了两个规范; zigbee 和zigbee PRO

协议栈规范的ID(STACK_PROFILE_ID)在nwk_global.h中定义如下:

// Controls various stack parameter settings
#define NETWORK_SPECIFIC      0         // 特定网络
#define HOME_CONTROLS         1         // zigbee
#define ZIGBEEPRO_PROFILE     2         // zigbee pro
#define GENERIC_STAR          3
#define GENERIC_TREE          4

zigbee协议组成

端点(endpoint)

8位字段, 描述一个射频端所支持的不同应用。

端点0x00 : 用于寻址设备配置文件, 这是每个zigbee设备必须使用的端点。

端点0xFF : 用于寻址所有活动端点

端点0xF1 ~ 0xFE : reservered

端点0x01 ~ 0xF0 : 共240个, 支持240个应用,即物理信道最多支持240个虚拟链路。

簇 (cluster)

多个属性的汇集形成了簇, 簇是属性的集合,每个簇拥有一个唯一的ID。

// sampleApp.c
const cId_t SampleApp_ClusterList[SAMPLEAPP_MAX_CLUSTERS] =
{
  SAMPLEAPP_PERIODIC_CLUSTERID,                   // 1
  SAMPLEAPP_FLASH_CLUSTERID                       // 2
};

属性(attribute)

设备之间通信的每一种数据对象,比如开关状态或者温度值等都是属性。每个属性可得到唯一的ID,

File :zcl.h
// Attribute record
typedef struct
{
  uint16  attrId;         // Attribute ID
  uint8   dataType;       // Data Type - defined in AF.h
  uint8   accessControl;  // Read/write - bit field
  void    *dataPtr;       // Pointer to data field
} zclAttribute_t;
typedef struct
{
  uint16          clusterID;    // Real cluster ID
  zclAttribute_t  attr;
} zclAttrRec_t;

描述符(descriptor)

一个设备(device)可以拥有240个端点(endpoint), 每一个端点必须有一个端点描述符endPointDesc, 端点描述符包括一个简单描述符(SimpleDescriptionFormat)

File : af.h
typedef struct
{
  uint8 endPoint;
  uint8 *task_id;  // Pointer to location of the Application task ID.
  SimpleDescriptionFormat_t *simpleDesc;
  afNetworkLatencyReq_t latencyReq;
} endPointDesc_t;

例子SampleApp.c:
// Fill out the endpoint description.
  SampleApp_epDesc.endPoint = SAMPLEAPP_ENDPOINT;     // 20
  SampleApp_epDesc.task_id = &SampleApp_TaskID;         //全局uint8
  SampleApp_epDesc.simpleDesc
            = (SimpleDescriptionFormat_t *)&SampleApp_SimpleDesc;
  SampleApp_epDesc.latencyReq = noLatencyReqs;           // enum 

其中SimpleDescriptionFormat_t定义如下:

typedef struct
{
  uint8          EndPoint;                 // 端点1——240
  uint16         AppProfId;                // profile ID
  uint16         AppDeviceId;              // device ID
  uint8          AppDevVer:4;              // Descriptor version
  uint8          Reserved:4;             // AF_V1_SUPPORT uses for AppFlags:4.
  uint8          AppNumInClusters;        // cnts of input Cluster 
  cId_t         *pAppInClusterList;         // cnts of input Cluster ID
  uint8          AppNumOutClusters;       // cnts of output Cluster 
  cId_t         *pAppOutClusterList;        // cnts of output Cluster
} SimpleDescriptionFormat_t;

上面的SampleApp_SimpleDesc :

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;
};

绑定(binding)

上面的key1 绑定EP3, key2 绑定EP4和EP5,利用这种绑定关系可以实现控制。

路由

路由对于应用层来说是透明的, 应用程序只要简单向下发送任何设备的数据到栈中, 栈会负责寻找路径。这种方法,应用程序不知道操作是在一个多跳或者什么网络中。路由另一个功能是自愈ZigBee网络,如果某个无线连接断开, 路由功能又能自动寻找新的路径避开断开的网络连接, 这极大提高了网络的可靠性,是ZigBee网络的关键特性。

 

点播,组播和广播

点播: 点对点通信, 不容许第三个设备收到信息

组播: 网络中节点分组,每个组员发出的信息只有相同组号组员才能收到

广播: 发送模块发出信息, 网络中所有节点都可以收到数据。

File : af.h
typedef enum
{
  afAddrNotPresent = AddrNotPresent,    // Indirect
  afAddr16Bit      = Addr16Bit,        // Unicast 
  afAddr64Bit      = Addr64Bit,        // 
  afAddrGroup      = AddrGroup,
  afAddrBroadcast  = AddrBroadcast      // Broadcast
} afAddrMode_t;

在ZigBee中, 数据包可以单点传送(Unicast), 多点传送(Multicasr)或者广播传送(Broadcast)

,每种方式都对应上面一个地址参数.

对于广播传送, 目标地址DstAddr.addr.shortAddr有如下配置:

typedef struct
{
  union
  {
    uint16      shortAddr;
    ZLongAddr_t extAddr;
  } addr;
  afAddrMode_t addrMode;
  uint8 endPoint;
  uint16 panId;  // used for the INTER_PAN feature
} afAddrType_t;

其中shortAddr可以选择:

enum  bcast_addr_e {
  NWK_BROADCAST_SHORTADDR_RESRVD_F8  = 0xFFF8,
  NWK_BROADCAST_SHORTADDR_RESRVD_F9,
  NWK_BROADCAST_SHORTADDR_RESRVD_FA,
  NWK_BROADCAST_SHORTADDR_RESRVD_FB,
  NWK_BROADCAST_SHORTADDR_DEVZCZR,            // 0xFFFC: Routers and Coordinators
  NWK_BROADCAST_SHORTADDR_DEVRXON,        // 0xFFFD: Everyone with RxOnWhenIdle == TRUE
                                              // 0xFFFE: Reserved (legacy: used for 'invalid address')
  NWK_BROADCAST_SHORTADDR_DEVALL     = 0xFFFF
};

猜你喜欢

转载自blog.csdn.net/qq_21353001/article/details/82733243
今日推荐