【Zigbee】进阶篇(1) Zigbee协议栈创建简单项目,协议栈、事件、消息学习[通俗易懂]

【Zigbee】进阶篇(1) Zigbee协议栈创建简单项目,协议栈、事件、消息学习[通俗易懂]本篇文章:主要是协议栈的介绍,使用协议栈完成一个简单例子,协调器创建网络的相关问题,学会在协议栈中自定义事件等。正文如下:一、Zigbee协议栈1)Z-stack协议栈是什么?2)Zigbee协议栈分为应用层、网络层、MAC层、物理层.二、Z-stack协议栈1)安装配置协议栈2)创建协议栈项目3)信道4)事件5)消息

大家好,又见面了,我是你们的朋友全栈君。

大家好,我是皮皮猫吖!

每文一言:梦想不会逃跑,会逃跑的永远都是自己!


本篇文章:

主要是协议栈的介绍,使用协议栈完成一个简单例子,协调器创建网络的相关问题,学会在协议栈中自定义事件等。

正文如下:

一、Zigbee协议栈

1)Z-stack协议栈是什么?

Z-Stack协议栈是一个基于任务轮询方式的操作系统,其任务调度和资源分配由操作系统抽象层OSAL管理着。即Z-Stack协议栈=OSAL操作系统+CC2530硬件模块+AF无线网络应用。

2)Zigbee协议栈分为应用层、网络层、MAC层、物理层。

① 应用层:

Zigbee的应用层由应用支持子层、Zigbee设备对象、Zigbee应用框架、Zigbee设备模板和制造商定义的应用对象等组成。

应用支持子层通过一组通用的服务为网络层和应用层之间提供接口,应用程序框架提供端点的管理和数据的收发功能,Zigbee设备对象提供网络建立、发现网络、加入网络、应用端点的绑定和安全管理服务的功能。

② 网络层:

网络层主要实现网络的建立、路由的实现以及网络地址的分配。Zigbee网络层的不同功能由不同的设备完成。其中Zigbee网络中的设备有三种类型,及协调器、路由器和终端节点,分别实现不同的功能。

③ MAC层:

MAC层数据服务为物理层与网络层之间的数据传输提供一个接口, 以实现数据发送、接收和处理排列中清除一个MAC层服务数据单元。

MAC层管理服务允许上层与MAC层管理实体之间传输管理指令, 其主要功能为设备通信链路的连接和断开管理、信标管理、个域网信息库管理、孤点管理、复位管理、接收管理、信道扫描管理、通信状态管理、设备的状态管理、启动、网络同步、轮询管理等。

④ 物理层:

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

物理层频率范围: 868/915 MHz 和 2.4 GHz。

2.4 GHz波段射频:提供250kbps的数据速率和16个不同的信道。

868/915MHz波段射频:868MHz支持1个数据速率为20kbps的信道,915MHz支持10个数据速率为40kbps的信道。

二、Z-stack协议栈

1)安装、配置协议栈

我在学习Zigbee的时候,使用的是胜达电子的Zigbee开发板。在学习Zigbee协议栈的时候,使用的也是电子开发板配套的协议栈。

① 安装胜达电子提供的协议栈,一路Next即可。最后在C盘下可以得到Zigbee协议栈文件夹:

在这里插入图片描述

② 协议栈文件夹:进入到协议栈的GenericApp文件夹,进行协议栈的学习

在这里插入图片描述

③ 协议栈相关配置:

  • 配置Linker
    在这里插入图片描述

  • 配置生成.hex文件

在这里插入图片描述

  • 开发板烧录模式

在这里插入图片描述

2)练习:在协议栈的前提下,协调器显示:C,路由器显示:R,终端显示:E

① 在APP文件夹中添加数码管模块文件:

在这里插入图片描述

② 在Zmain.c文件中,添加数码管头文件,并进行数码管的初始化

在这里插入图片描述

③ 在FiveGroupApp.c(我该过名字,没有改过名字的是GenericApp.c)文件中,添加协调器、路由器、终端初始化代码:
在这里插入图片描述

④ 将代码编译到三个模块中,选择不同的选项卡进行编译:

在这里插入图片描述

⑤ 三个模块分别烧入协调器、路由器、终端的代码,三个模块上的数码管分别显示“C”、“R”、“E”字符。

在这里插入图片描述

3)为什么只更改了选项卡的内容,在三个模块中烧入了看似相同的代码,三个模块却显示出了不同的内容?

选项选择不同,就会导致参与编译的配置文件不同,配置文件不同就会导致部分宏定义不同,宏定义不同就会导致工程里某些宏的值不同。

这些宏值不同就会影响程序执行的流程,就会导致出现不同的功能,所有有了不同功能的代码版本:协调器、路由器、终端。

协调器:C、路由器:R、终端:E。

4)在选项卡里每一种版本模块都貌似有2个分为不带-Pro和带Pro,他们的区别是什么?

Zigbee协议在发展过程中经历了3个版本,其中Zigbee在07出的是最新的规范,这个规范有2个版本。

ZIgbee2007、ZigbeePRO之间的区别是:

两个版本功能基本相同。但是,PRO版本功能稍微强大,在项目开发中一般都选择PRO。

5)协议栈中信道相关配置:

① 信道、协调器创建PAN配置文件

在这里插入图片描述

② 信道配置参数:
-DDEFAULT_CHANLIST=0x00000800  // 11 - 0x0B 
#define DEFAULT_CHANLIST 0x00000800 相当于c语言的中的这个

DEFAULT_CHANLIST:表明Zigbee模块要工作的网络,当有多个信道参数值进行或操作之后,把结果作为DEFAULT_CHANLIST的值。

② DEFAULT_CHANLIST的值对于路由器和终端协调器的意义分别是什么?

DEFAULT_CHANLIST 0x00001800是两个信道的或操作(协调器建立网络时,会在较好的信道上进行建立;终端和路由器会在两个信道上选择一个较好的网络加入进去)

6)TI支持的信道【我手上的胜达开发板支持的信道】:

在这里插入图片描述

① 路由器和终端:

我可以在参与或操作的这些信道上(多个信道)选择一个相对于我来说信号质量最佳的网络,加入进去。

② 协调器:

我可以在参与或操作的这些信道上(多个信道)选择一个最佳的信道。并在这个信道上创建自己的Zigbee网络。

(可以解决:当某个信道上的数据包较多的时候,可以选择其他比较空闲的信道传输数据,增加数据传输的稳定性,数据传输的效率。)可以自己选择特定的信道创建网络。

7)协调器创建网络【PANID】

① PANID配置参数:

在这里插入图片描述

② 当DZDAPP_CONFIG_PAN_ID的值为非0xFFFF时:
  • 路由器和终端
    • 我必须要加入到PANID为DZDAPP_CONFIG_PAN_ID这样一个Zigbee无线局域网
  • 协调器
    • 我要创建一个网络,需要创建一个PANID为DZDAPP_CONFIG_PAN_ID的值的一个网络
③ 当DZDAPP_CONFIG_PAN_ID为0xFFFF时:
  • 路由器和终端
    • 在加入网络的时候我没有PANID的限制,我可以加入到信道上,网络状态较好的网络中
  • 协调器
    • 我可以随机生成一个PANID,我的名字不是指定的PANID(0XFFFF)

8)问题:当2个节点下载了相同的协调器代码,并且指定的PANID参数值为非0xffff,后果会怎样?

① 先上电的协调器模块会先创建PANID为非0xFFFF这样一个Zigbee网络,

② 后上电的模块发现该信道上已经存在PANID为0xFFF8的网络,它会创建一个PANID在0xFFF8基础上加1的网络。后上电的下载了协调器代码的模块会创建一个PANID为0xFFF9的网络。

③ 如果后面还有烧录了相同协调器代码的模块,产生的PANID依次往后加1。

9)Z-stack协议栈分层、事件

① 事件

在ZSTACK里,根据代码,按照功能来划分,可以将代码分成不同的层。

比如,硬件操作相关硬件层。 网络相关的代码称为网络层。自己写的应用程序部分叫应用层。

几乎每一个层都是一个任务,系统为每一个任务(层)分配一个一字节的唯一数值编号。每一个任务都能处理一些它们能够处理的事物。

我们把这个数值编号叫做任务ID。它们能够处理的事物叫做事件。

//系统事件:调用任务名为task_id的事件名为event_flag的事件
uint8 osal_set_event( uint8 task_id, uint16 event_flag )
//系统延迟响应事件:timeout_value毫秒之后触发任务名为taskID下的事件名为event_id的事件
uint8 osal_start_timerEx( uint8 taskID, uint16 event_id, uint16 timeout_value )
② 注意:
  • 每个任务只允许定义16个事件,并且事件名为0x8000 的是系统事件,不允许自定义事件的名字相同。
  • 在自定义的事件中,如果要进行点亮LED灯的操作,或者其他相关的操作的时候。在进行功能实现之前,一些寄存器在协议栈会被默认使用,寄存器已经不是原来的初始化的样子,在使用某个寄存器之前,需要重新配置。
③ 自定义事件
  • 声明自定义事件

在这里插入图片描述

  • 定义事件处理内容

在这里插入图片描述

10)Z-stack协议栈消息:

① 消息

在ZSTACK里,任务事件定义的特点决定了每一个任务最多只能处理16种不同的事件,而系统在运行时候有许多事务需要处理,如果每一个事物处理都定义成1个事件,那么16种事件肯定是不够用,所以引入了消息的概念。

② 消息处理事务的原理:

当需要应用层任务来处理某个事务的时候,首先给应用层任务会发送一个消息:调用osal_set_event(SDApp_TaskID,SYS_EVENT_MSG);函数。

然后,应用层就会进入SYS_EVENT_MSG中事件中进行处理。在这个事件中,判断到底刚刚引发我们产生SYS_EVENT_MSG事件的是哪一种类型的消息,然后根据消息的类型做相应的处理。

而消息的类型可以自己定义,这样一来消息的种类可以很多,那么应用层任务处理的事物种类就很多了。

//事件为0x8000为该任务的系统事件
#define SYS_EVENT_MSG 0x8000 // A message is waiting event
③ 消息触发系统事件

在这里插入图片描述

10)生成.hex文件

① 在原来生成.hex的基础上,做如下步骤

在这里插入图片描述


资源链接:https://pan.baidu.com/s/1TURQuWAPN0rzHzGD9phy-w

提取码:d9v7


希望本篇文章对大家有所帮助,后续会继续分享Zigbee相关学习知识…

如果文章内容有错误的地方,请在留言处留下你的见解,方便大家共同学习。谢谢!

如有侵权或其他任何问题请联系:QQ1370922071,本文主要用于学习交流,转载请声明!

作者:皮皮猫吖


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/140395.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号