【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)


相关推荐

  • 2021年最新idea激活注册码破解方法

    2021年最新idea激活注册码破解方法,https://javaforall.cn/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

  • ubuntu: 查看cuda版本

    ubuntu: 查看cuda版本nvcc-V

  • 对于三极管饱和状态的理解「建议收藏」

    对于三极管饱和状态的理解「建议收藏」对于三极管饱和状态的理解https://zhidao.baidu.com/question/172715750.html问题来源对于三极管饱和状态的理解三极管如工作在饱和状态也就是开的状态,那么就是双结正偏这是书上的解释我自己的理解是这样的:饱和状态和从放大状态转变过来的,极电结和发射结正偏是结果,而不是原因就是说,三极管首先工作在放大状态,极电结反偏,发射结正偏当基级电流增大时,一直增大到三极管的非线性区(这里指的是饱和区),注意,在这一瞬间偏置情况并未改变,也就是说依然是极电结反偏,

  • Win10安装程序修复计算机,directx修复工具win10最新版

    Win10安装程序修复计算机,directx修复工具win10最新版directx修复工具win10最新版是一款以排除电脑软件异常导致的无法正常使用问题而特别打造的优质工具。全自动的智能检测修复功能能够确保用户们因为程序问题而导致的电脑异常无法使用都得到解决。directx修复工具win10最新版功能1、Directx修复增强版是一个系统DirectX组件修复工具,主要用于检测当前系统的DirectX状态。2、发现异常就进行修复。DirectX修复工具可以完美解决…

  • webstorm根据eslint保存的时候格式化代码

    webstorm根据eslint保存的时候格式化代码前言:用webstrom把vue项目设置eslint规则,然后保存的时候根据eslint规则格式化当前组件的代码目录:操作步骤:(参考入口)1、点击settings->pluings->搜索eslint->Install安装​​2、安装好之后,找到settings中ESLint,选中,就会进入配置页面,3、到这一步,实际规则已经配置好了,下来就是调用的问题了,搜索keymap,然后把右边的去掉,改成esli,就可以看到FixESLintP…

  • 原生js数组排序

    原生js数组排序原生js数组排序js排序以正序为例(即由小到大)vararr=[0,2,1,4,3,9,6,5,7,8];//未排序的数组varsortArr=null;//排序后得到的数组1sort排序sortArr=arr.sort(function(a,b){ returna-b})sort是es3增加的数组方法,大家可以放心使用(支持到ie…

发表回复

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

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