大家好,我是皮皮猫吖!

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


本篇文章:

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

正文如下:

一、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,本文主要用于学习交流,转载请声明!

作者:皮皮猫吖


【Zigbee】进阶篇(1) Zigbee协议栈创建简单项目,协议栈、事件、消息学习相关推荐

  1. 在eclipse上使用Maven创建简单项目

    1.鼠标右键New -> Project -> Maven -> Maven Project 2.勾选 "Create a simple project( skip arc ...

  2. 〖Python语法进阶篇③〗- 进程的创建与常用方法

    订阅 Python全栈白宝书-零基础入门篇 可报销!白嫖入口-请点击我.推荐他人订阅,可获取扣除平台费用后的35%收益,文末名片加V! 说明:该文属于 Python全栈白宝书专栏,免费阶段订阅数量43 ...

  3. 前端学习(2948):webpack创建简单项目

  4. maven 一个简单项目 —— maven权威指南学习笔记(三)

    目标: 对构建生命周期 (build  lifecycle),Maven仓库 (repositories),依赖管理 (dependency management)和项目对象模型 (Project O ...

  5. Android日志[进阶篇]五-阅读错误报告

    Android日志[进阶篇]一-使用 Logcat 写入和查看日志 Android日志[进阶篇]二-分析堆栈轨迹(调试和外部堆栈) Android日志[进阶篇]三-Logcat命令行工具 Androi ...

  6. cocos2dx视频教程进阶篇--第2天--打砖块游戏-box2d物理引擎

    感谢大家的鼓励和支持,今天进阶篇2奉献给大家. 不了解cocos2dx基本概念的朋友,请移步 http://blog.csdn.net/s_xing/article/details/18557631. ...

  7. cocos2dx视频教程进阶篇--第1天--吃西瓜游戏。

    感谢大家的鼓励和支持,给了我很多动力,今天进阶篇终于和大家见面了. 2014-03-16更新:出品了box2d编辑工具PhysicsEditor的视频(一起做一个实战级别的游戏,需要MAC操作系统)h ...

  8. Maven -- 使用Myeclipse创建Maven项目

    使用Myeclipse创建Maven项目有如下几种方式: 1.创建Maven Java项目 1.1 选择新建Maven项目 1.2.选择创建简单项目 1.3.填写项目信息 1.4.创建成功后项目目录结 ...

  9. Maven安装和配置及eclipse创建Maven项目

    提示:使用Maven需要先安装jdk. 下载安装Maven 一.下载最新版的Maven,下载地址:http://maven.apache.org/download.cgi 二.将Maven下载到E:\ ...

  10. linux词语大全,简单词语大全二字学习软件-简单词语大全四字下载v1.5.3-Linux公社...

    简单词语大全二字学习软件是一款可以让用户快速背单词的软件,这款软件为用户提供了英语内容搭配影音的例句,让用户可以轻松学习英语.其中,用户可以在简单词语大全二字学习软件上对多人进行挑战,看自己的英语水平 ...

最新文章

  1. 设置tomcat的默认jdk
  2. OpenGL多维数据集的透视图渲染
  3. QT绘制具有向下钻取效果的园饼图
  4. 优化案例(part4)--A novel consensus learning approach to incomplete multi-view clustering
  5. 关于我使用的angular.js的上传---FileUploader
  6. mfc 监控文件操作_商务办公好伴侣 兄弟MFC系列多功能一体机
  7. JavaWeb 基于jsp+javabean+servlet+mongodb 增删改查
  8. 反转 鼠标_新版 Win10 中改变鼠标颜色
  9. Toml :设置策略配置文件
  10. 1、ARM嵌入式系统:KL25Z128 初始化整体流程
  11. 解决HD3000在OS X 10.10.2上横线和花屏问题
  12. Intel SGX背景、其他可信计算技术和TEE技术(翻译自Intel SGX Explained)
  13. saltstack自动化运维一键部署rpm安装httpd和源码安装nginx
  14. 2021最新小程序去水印源码教程
  15. 在恋爱游戏里跟你实时聊天的“AI”,其实可能是一位抠脚大汉
  16. python sklearn实现电力负荷区间预测
  17. Hadoop总结杂文
  18. RecyclerView加载sdcard/Music下的音乐列表
  19. 嵌入式邻域面试官必问的问题
  20. 读书札记:影响欧元的因素

热门文章

  1. 如何在快手批量下载高清不含水印视频
  2. Labview视觉模块安装
  3. 北大信科计算机考研科目,GitHub - 2584800190/kao_yan: 19年北大信科考研经验
  4. icem划分网格步骤_ICEM CFD教程-icem网格划分教程
  5. 理工科硕士自学ICEM网格划分的思考和感悟
  6. c语言屏蔽一段程序,C语言#if 0阻止代码段
  7. xjad反编译遇到break MISSING_BLOCK_LABEL_365问题
  8. 远程读取mysql_远程获取数据库和文件的方法
  9. grubbs准则 matlab_MATLAB-格拉布斯准则(MATLAB-Grubbs criterion)-M
  10. 品质体系及标准大集合(偏向软件)