大家好,又见面了,我是你们的朋友全栈君。
大家好,我是皮皮猫吖!
每文一言:梦想不会逃跑,会逃跑的永远都是自己!
本篇文章:
主要是协议栈的介绍,使用协议栈完成一个简单例子,协调器创建网络的相关问题,学会在协议栈中自定义事件等。
正文如下:
一、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账号...