Zigbee学习之路2(Zigbee节点详解)

嗨,又和大家见面了,接下来就该说道我们Zigbee的数据通信的方式了偷笑

首先,在Zigbee无线局域网里,节点(即无线模块)按照在网络里的功能来划分, 有协调器 路由器 终端3大类。他们的硬件设计可以完全一样,即完全一样的模块,之所以不一样,是下载了不同功能版本的代码。而不管是协调器 路由器还是 终端,必须在一个Zigbee无线局域网里,才是。如果没有入网,那么充其量就是一个模块罢了。

而对于无线局域网而言,任何一个网络,第一个节点一定是该网络的协调器,且网络里有且仅有一个协调器.  而路由器和终端却可以有多个。

对于协调器 路由器 终端的了解如下:

协调器(Co-ordinator),是启动和配置网络的一种设备,是网络的中心节点,一个ZigBee网络只允许有一个ZigBee协调器

路由器(Router),是一种支持关联的设备,能够将消息转发到其他设备

ZigBee终端设备(End Device),执行具体功能的设备。

Zigbee网络组建以后,网络里的节点可以进行相互通信,数据通信的方式有4种,即单播, 广播, 组播,  绑定.

入网前
   路由器
   路由器在入网之前,一直发送信标请求帧,它的作用是,让在它附近的所有具备介绍人资格的节点,都回复信标帧,这些返回的信标帧被这个想要加入的无线模块拿到,通过这些信标帧,选出最佳介绍人节点,请求加入。
   终端
   它在入网前的行为和下载了路由器代码模块在入网前行为是一样的。
   协调器
   发送了一帧信标请求帧,发送这一帧也会得到周围具备介绍人资格的节点回复信标帧,但是协调器拿到这些信标帧,用来判断周围的环境情况,为创建网络做准备。
   当协调器创建成功以后,就会发送一个数据帧,这个帧里面可以看到协调器的地址0x0000,PANID,可以把这个帧叫做网络连接状态帧。

每个设备节点都包括以下的2种地址:

IEEE MAC 地址:这是一种 64 位的地址,这个地址由 IEEE 组织进行分配,用于唯一的标识设备,全球没有任何两个设备具有相同的 MAC 地址。在 zigbee 网络中,有时也叫 MAC地址为扩展地址。

 协调器的MAC :6550F
 终端 MAC: 65837
 路由器的MAC :65581

16位短地址16 位短地址用于在本地网络中标识设备,和在网络中发送数据,所以如果是处于不同的网络中有可能具有相同的短地址。当一个节点加入网络的时候将由它的父节点给它分配短地址。协调器的短地址是0

个域网标识符(PANID) 用来区别不同的网络

PANID值:
 非0xFFFF
   路由器和终端
   我必须要加入到PANID为参数值这样一个Zigbee无线局域网
   协调器来说,我要创建一个网络,并且把这个参数值作为这个网络的PANED

为0xFFFF
   路由器和终端
   在加入网络的时候没有PANID的限制
   协调器
   我可以随机生成一个值,把这个随机值作为这个网络的PANED

我们可以思考一个问题,当2个模块下载相同的协调器代码,并且指定的PANID参数值为非0xffff,后果会怎样?

答案是:先上电的模块可以创建0xFFF8这样一个Zigbee网络,后上电的模块创建一个在0xFFF8基础上加1的网络。

在ZSTACK里按照代码按照功能来划分,分成不同的层,几乎每一个层都是一个任务,系统为每一个任务分配一个一个字节的唯一数值编号
每一个任务都能处理一些他们能够处理的事物,我们把这个数值编号叫做任务ID, 他们能够处理的事物叫做事件

任务ID系统不是随便分配,我们可以通过这个值立即找到这个任务自己的任务事件处理函数和事件变量

几乎每一个层都是一个任务,那么每一个层都有1个任务ID  任务事件处理函数  任务事件变量
FUN函数数组={任务事件处理A,任务事件处理B,任务事件处理C..}
 0
Arr变量数组={任务事件变量a,任务事件变量b,任务事件变量c..}
任务ID系统不是随便分配,我们可以通过这个值立即找到这个任务自己的任务事件处理函数和事件变量
对于关系是FUN[0] Arr[0]
应用层任务的任务ID是8
FUN[8]  Arr[8]
tasksArr[8]就是我们应用层事件处理函数
tasksEvents[8]

系统在运行的时候会不断的去读应用层任务事件变量,当它发现这个变量为0就认为,应用层任务当前没有事件需要去处理,如果发现这个变量不为0,它就认为应用层任务有事件将要去处理.

osal_set_event(SDApp_TaskID,SDApp_SEND_MSG_EVT);//设置任务事件函数

调用上面的函数,SDApp_TaskID就会去执行SDApp_SEND_MSG_EVT事件相应的处理代码.

本质是:把SDApp_TaskID(应用层任务)的任务事件变量中对应于SDApp_SEND_MSG_EVT宏值为1的那个为变成1,这样话首先这个任务事件变量就变成了非0,系统在检测到任务事件变量为非0,就会去调用任务事件处理函数SDApp_ProcessEvent,在这个函数里,任务事件变量肯定和SDApp_SEND_MSG_EVT宏值与操作为1,所以必定会执行这个事件相关的代码。


uint8 osal_start_timerEx( uint8 taskID, uint16 event_id, uint16 timeout_value )

ZSTACK里,任务事件定义的特点决定了,每一个任务最多只能处理16种不同的事件,而系统在运行时候有许多事务需要处理,如果每一个实物处理都定义成1个事件,那么16种事件肯定是不够用,所有引入消息。
消息的处理事务的原理:
 定义了一个事件#define SYS_EVENT_MSG               0x8000  // A message is waiting event
当需要应用层任务来处理某个事务的时候,首先给应用层任务发送一个消息
osal_set_event(SDApp_TaskID,SYS_EVENT_MSG);
那么这样一来,应用层就会进入SYS_EVENT_MSG处理,在这个事件处理里判断到底刚刚引发我们产生SYS_EVENT_MSG事件是哪一种类型的消息,然后根据消息的类型做相应的处理。
而消息的类型可以自己定义,这样一来消息的类可以很多,那么应用层任务处理的事物种类就很多了.

今天的学习就在这里结束了,下次聊再见




  • 11
    点赞
  • 79
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值