ZIGBEE协议栈通信——阿里云上传数据(STM32)(二)

上一节,介绍了ZigBee协议栈基本知识。

这一节,介绍ZigBee 3.0的网络知识,并实现通过Z-Stack3.0代码实现单播。

本文内容参考:

 ZigBee 3.0 开发指南 (topthink.com)https://z7po9bxpe4.k.topthink.com/@zigbee-dev-guide/1.1%20xieyicengcijiegou.htmlZ_Stack3.0 协议层次结构(ZigBee 3.0协议栈之上)

IEEE 802.14.4 PHY layer:物理层,其工作内容由IEEE 802.15.4定义,主要作用是将一个设备的数据转换为电磁波信号之后发送到另一个设备,再由另一个设备解读电磁波信号获取数据。

IEEE 802.14.4 MAC layer:MAC层,其工作内容由IEEE 802.15.4定义,其主要作用是控制多个网络设备有序地利用物理通信资源电磁波来通信。

Network (NWK)layer:网络层,负责多个设备之间的组网、数据传输以及网络安全管理等。

Application layer:应用层,可以划分为以下两个层次:
(1)Application Support(APS)Sub-Layer:应用支持子层,是网络层到应用框架层的过渡,提供数据的收发、安全加密,以及设备地址管理等功能。
(2)Application Framework:应用框架层,由一个或者多个应用端点(EndPoint)组成。应用端点是不同设备间通信的出入口,同时也是描述设备具备哪些功能的基础。

ZigBee Cluster Library(ZCL):ZigBee集群库,由ZigBee联盟定义,是ZigBee 3.0的基础,也是不同厂商设备能够互联互通的基础

ZigBee Device Objects(ZDO):ZigBee设备对象,也就是应用端点0,它是应用层其他端点与应用子层管理实体交互的中间件,主要提供的功能如下:(1)管理ZigBee设备。(2)创建、扫描及加入网络。(3)应用端点绑定、解绑。(4)安全管理。

Base Device Behavior(BDB):ZigBee基础设备行为,定义设备的行为规范,以确保不同厂商设备间的互操作性,基础设备行为规范的范围定义如下:(1)基础设备所需的环境。(2)基础设备的初始化(initialization)过程。(3)基础设备的组网 Commissioning 过程。(4)基础设备的重置(reset)过程。(5)基础设备的安全(security)过程。

ZigBee设备进行网络通信时,最终是应用端点间的通信。例如,ZigBee协调器的端点1向智能插座的端点1发送了打开插座命令。应用开发时,只需调用应用层、ZDO和BDB层相关代码即可。

端点采用无符号8位整型类型进行表示,开发者可以使用的端点取值范围是1-240,端点0为特殊端点(ZDO),端点255用于向其他端点的广播,端点241~254是保留端点。

 IEEE 802.15.4协议(物理层和MAC层)

IEEE 是一个组织,叫作“电气和电子工程师协会”, 802.15 是这个协会里面的一个部门,部门里的第 4 工作组开发了一个协议,就叫 IEEE 802.15.4协议。这个协议是专门为低速无线个人区域网络(Low-rate wireless personal area network,WPAN)而设计的,具有超低复杂度、超低功耗、低数据传输率的特点。ZigBee的物理层和MAC层就是 IEEE 802.15.4 协议。

(物理层)

在中国,ZigBee协议是基于2.4GHz的,支持240kb/s的数据率,定义了16个信道。可通过ZStack 3.0的工程文件Tools/f8wConfig.cfg进行配置。

在不同的信道中创建的ZigBee网络互不干扰,但在相同的信道下,也可以组建多个独立的ZigBee网络,每个ZigBee网络都会被分配一个唯一的ID号,称为“PanID”,可以利用PanID来区分相同信道中的不同ZigBee网络。

(MAC层)

设备划分为协调器和普通设备,协调器产生并发送信标帧,普通设备根据协调器的信标帧与协调器同步,个域网的关联和取消关联,MAC层的主要作用是控制多个网络设备有序地进行可靠通信。

ZigBee 网络的中的每一个设备都会有一个固定的MAC地址,也称为物理地址或者IEEE地址,用于标识MAC层设备的地址。MAC这是一个64位的二进制地址,通常由芯片厂商在芯片生产过程固化到芯片中的。

NWK(Network,网络层)

处于网络中的ZigBee设备都会被分配一个用于标识的网络地址,通过这个网络地址可以找到对应的设备。ZigBee网络地址是一个16位的地址(0x0000 - 0xFFFF)。

以上,阐述了Z-Stack 3.0 的底层的物理层和MAC层,用以搭建基础,下面通过应用层进行网络组建和数据发送,即采用APS服务,通过BDB创建网络,并通过AF(ZDO)层管理设备。

BDB(Base Device Behavior,设备基本行为)

ZigBee设备在相互发送数据之前,需要先组建网络。BDB为各个ZigBee设备提供了一套统一的机制,让它们正确地组建ZigBee网络。其中主要的是Commissioning模式,可笼统地理解为“组网模式”,定义了ZigBee设备之间组网的基本规范。

BDB提供了4种主要的Commissioning模式给开发者使用,分别是Network Steering(协调器允许加入,其他设备寻找网络)、Network Formation(建立一个以协调器为中心的安全网络)、Finding and Binding(F & B)(ZigBee设备的Cluster之间的相互发现、相互绑定)和Touchlink(用于两个ZigBee设备之间直接进行通信)。

ZigBee 3.0是使用Cluster(集群)来描述设备的功能的。

调用Z-Stack 3.0 提供的API函数即可组建ZigBee网络。

协调器创建网络:

bdb_StartCommissioning(//组建网络
    BDB_COMMISSIONING_MODE_NWK_FORMATION | //支持Network Formation
    BDB_COMMISSIONING_MODE_FINDING_BINDING //支持Finding and Binding(F & B)
);

路由器或终端加入网络:

bdb_StartCommissioning(//设备入网
    BDB_COMMISSIONING_MODE_NWK_STEERING | //支持Network Steering
    BDB_COMMISSIONING_MODE_FINDING_BINDING //支持Finding and Binding(F & B)
);

<处理入网失败>

在设备入网失败后,让设备自动重新尝试入网。

在zcl_samplesw.c文件中可以找到一个zclSampleSw_ProcessCommissioningStatus()函数,这个函数的作用是处理Commissioning结果,例如协调器创建网络是否成功、设备是否成功加入到网络等。

可以在这个函数中根据Commissioning的结果采取相应的处理,例如在设备入网失败后重新调用bdb_StartCommissioning()来再次入网。用事件的机制来实现这个过程,当设备入网失败后就启动一个事件,让程序在1s(1000ms)后重新尝试入网。

AF(Application Framework ,应用框架)

开发者可以基于这个层次编写代码,实现ZigBee设备之间的数据通信。

ZigBee的设备通过网络地址和端点号进行通信,如协调器要向这个插座发送一个打开指令,不能简单地使用网络地址0x0EF1来说明把命令发送给这个插座,还需要利用端点号8来说明把命令发送给端点号8对应的服务。

Z-Stack 3.0 中利用简单描述符来描述一个设备的某一方面的服务,其定义是这样的:

typedef struct{
uint8    EndPoint;//端点号,简单描述符的编号
uint16   AppProfId;//描述所在应用场景,例如家居自动化
uint16   AppDeviceId;//设备ID,ZigBee联盟为不同类型的设备定义了对应的ID值,称为Device ID。
uint8    AppDevVer:4;//由开发者自定义,表示版本号
uint8    Reserved:4;//保留字段
uint8    AppNumInClusters;//端点支持的输入簇个数
cId_t    *pAppInClusterList;//指向输入簇列表的指针
uint8    AppNumOutClusters;//端点支持的输出簇个数
cId_t    *pAppOutClusterList;//指向输出簇列表的指针
}SimpleDescriptionFormat_t;

//cluser簇,或者集群,划分为输入簇(In Cluseter)和输出簇(Out Cluster),描述这个服务的具体内容。

设备的简单描述符在zcl_samplesw_data.c文件中创建,包含了端点号、ProfID、Cluser簇配置等,代码(for ZCL)如下:

SimpleDescriptionFormat_t zclSampleSw_SimpleDesc =
{
  SAMPLESW_ENDPOINT,                  //  int Endpoint;
  ZCL_HA_PROFILE_ID,                  //  uint16 AppProfId[2];
  ZCL_HA_DEVICEID_ON_OFF_LIGHT_SWITCH,//  uint16 AppDeviceId[2];
  SAMPLESW_DEVICE_VERSION,            //  int   AppDevVer:4;
  SAMPLESW_FLAGS,                     //  int   AppFlags:4;
  ZCLSAMPLESW_MAX_INCLUSTERS,         //  byte  AppNumInClusters;
  (cId_t *)zclSampleSw_InClusterList, //  byte *pAppInClusterList;
  ZCLSAMPLESW_MAX_OUTCLUSTERS,        //  byte  AppNumInClusters;
  (cId_t *)zclSampleSw_OutClusterList //  byte *pAppInClusterList;
};

ZigBee支持3种通信方式,分别是点对点、广播和组播。

  • 点对点通信(P2P,Peer to Peer):顾名思义,就是两个设备之间一对一通信。
  • 广播:给其他的所有设备发送数据。
  • 组播:给一部分的设备发送数据,这里的“一部分”说的就是一个特定的组。

本次采用P2P通信完成温度数据的传输。

在使用AF通信前,需要先注册简单描述符并且让对应的端点号生效。在应用层初始化函数zclSampleSw_Init()中,直接调用afRegister()直接在AF中注册简单描述符,其中参数为端点信息,包含端点号,目标端点号、任务ID、简单描述符以及网络配置。

static endPointDesc_t sampleSw_TestEp =
{
  7,                  // endpoint
  0,                                  //                                          
  &zclSampleSw_TaskID,
  (SimpleDescriptionFormat_t *)&zclSampleSw_SimpleDesc,  // No Simple description for this test endpoint
  (afNetworkLatencyReq_t)0            // No Network Latency req
};

调用AF层的数据发送API即可进行数据传输,代码如下:

/*
* @param dstAddr 目标设备地址,包含网络地址和端点号
* @param srcEP 发送设备的简单描述符
* @param cID Cluster ID
* @param len 待发送数据的长度
* @param buf 待发送的数据
* @param transID 传输ID,可以用来给每一次发送的数据包编一个号
* @param options 附加选项,可以用来给这次数据发送添加一些说明                      
* @param radius 最大的路由跳转级数
*/
afStatus_t AF_DataRequest(
	afAddrType_t *dstAddr, 
	endPointDesc_t *srcEP,
	uint16 cID,
	uint16 len, 
	uint8 *buf,
	uint8 *transID,
	uint8 options,
	uint8 radius );

基于这个API封装出了点对点通信API,代码如下:

/*
* @param destNwkAddr 目标设备的网络地址
* @param cid Cluster ID
* @param len 数据长度
* @param data 数据内容
*/
static void zclSampleSw_AF_P2P(
	uint16 destNwkAddr, 
	uint16 cid, 
	uint8 len, 
	uint8 *data)
{    
	afAddrType_t dstAddr; //寻址信息配置 
	static uint8 transferId = 0;//传输ID,是数据包的标识符

	/* Destination */    
	dstAddr.addrMode = afAddr16Bit;// 设置目标地址模式为16位网络地址,表示使用P2P的通信方式
	dstAddr.addr.shortAddr = destNwkAddr;//目标设备的网络地址  
	dstAddr.endPoint = SAMPLESW_ENDPOINT;//目标设备的端点号

	 transferId++;    
	AF_DataRequest(&dstAddr, 
		&sampleSw_TestEp,//已经创建好的简单描述符
		cid,    
		len, 
		data,    
		&transferId,
		AF_DISCV_ROUTE,//进行路由扫描操作,用于建立发送数据报文的通信路径。关于这个参数,暂时保持例程默认的代码就可以了
		AF_DEFAULT_RADIUS);//指定最大的路由跳转级数
}

接收和处理数据

ZigBee设备在组网成功之后,接收到数据时会产生一个系统事件AF_INCOMING_MSG_CMD表示现在接收到数据了。

应用层事件处理函数zclSampleSw_event_loop()中,系统事件处理代码中已经包含了对系统事件AF_INCOMING_MSG_CMD的识别了,开发者只需要在接收到这个事件后进行相应的处理就可以了。

至此,使用Z-Stack 3.0 完成单播。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值