***协议***就是通信方之间共同的约定,以保证通信的成功事先定义好的一组通信规则(约定),例如:数据单元的格式,数据的内容及其表达的含义,通信开始、结束的标志。(可以理解为暗号,双方的口令对上即可通信)网络中的设备必须严格遵守通信协议,不然通信就无法实现。
协议栈就是一组用程序代码实现的通信协议的库函数。即厂商为了通信方便编写的函数库,调用函数库中不同的函数可以实现不同的约定。不同厂商的协议栈不一定相同。Zstack就是TI公司的Zigbee协议
*
主要由3种设备组成:协调器、路由器、终端节点
**协调器**负责网络的组建、维护、控制节点的加入、数据包路由选择等等。Zigbee网络中只有一个协调器。
**路由器**主要负责数据包的路由选择、网络连接等,可以有多个路由器,也可以不设路由器。
**终端节点**负责数据的采集和执行机构的控制,例如温湿度的采集,电机照明灯的控制等等。可以有1个多个终端节点。
在Zigbee网络中,协调器具备路由器的功能,也可以作为终端节点来使用,路由器不具备网络组建功能,也可以作为路由器来使用。终端节点不具备路由器的功能。一个Zigbee网络至少要有一个协调器和一个终端节点组成,路由器也可以充当终端节点。
Zigbee中,事件被定义为能被系统识别,用来控制某个程序做某种事情,例如定时时间到,用户按下按键、发送传感数据等
TI公司在Zstack中将事件分为系统和用户事件。系统事件是协议栈内部事先定义的事件,用户不必再定义。Zstack中系统事件用宏SYS_EVENT_MSG表示,定义于comdef.h头文件中,定义格式:
#define SYS_EVENT_MSG 0x8000;
Zstack中的系统事件是事件的集合,包括了收到报文(MSG类)的消息、节点加入网络等诸多子事件。这些子事件在ZComDef.h中定义,在使用时只需了解事件宏的含义,不必重新定义。
常用的**系统子事件**如下所示:
用户事件是指用户在应用开发的过程中根据是实际需要自定义的事件,例如获取AD采集值,获取串口接收数据等。用户事件需要在用户程序中定义,定义方法:在程序中用宏定义指定事件的编码。例如,定义LED翻转事件:
#define LED_TOGGLE_EVT 0x0001
在Zstack中,事件的定义有以下特点:
1:一个任务可以包含多个事件,即一个人物可以有由几个事件中的某个事件触发。
2:一个事件只能归属于一个任务之中,及一个事件的发生只能出发一个任务的执行。
3:任务的事件用16位二进制数表示,一个二进制位代表一个单一的事件,当二进制的位为1时,代表该位二进制代表的事件发生了,为0时代表没有发生。所以,单一事件的编码值一般为0x8000;0x4000;
0x0800;以此类推。复合事件的编码为上述单一事件位编码和的值。如0x0003;表示0x0002和0x0001两个事件都发生了。
注意:
一:同一任务的各个事件编码不能相同,不同任务的事件编码可以相同
Zstack中事件处理的原理:根据任务的先后检查任务的事件,若有事件发生,则执行该任务的事件处理程序。即先查任务,再查人物的事件。因此不同任务事件编码相同不会产生混乱
二:事件编码中,0x8000为系统事件的编码,用户为每个任务所能定义的单一事件最多有15个,0x0001;0x0002;0x0004;x0x0008;…0x4000;
函数1:osal_msg_recieve()
unit8 *osal_msg_recieve(uint8 task_id)
功能:为指定的任务从消息队列中检索一条消息
task_id为任务编号。函数的返回值为指向存放该消息的缓冲区的指针
函数2:osal_msg_dealllocate()
unit8 osal_msg_recieve(uint8 *msg_ptr)
msg_ptr为指向所需回收的消息缓冲区指针,返回数值为操作结果。返回SUCCESS(0x00)成功,INVALID_MSG_POINTER(0x05)失败
函数3:osal_start_timerEx()
unit8 osal_start_timerEx(unit8 taskID, unit16 eventid,unit16 timeout_value)
启动定时器,当定时时间到后为指定的任务设置事件
taskID指定的任务号
eventid所需设置的事件编码
timeout_value 定时的时长,单位(ms)
返回SUCCESS(0x00)成功,INVALID_MSG_POINTER(0x05)失败
函数4:HalLedSet()
unit8 HalLedSet(unit8 leds,unit8 mode)
设置发光二极管的状态
HalLedSet(HAL_LED1|HAL_LED2,HAL_LED_MODE_TOGGLE)
函数5:HalLedBlink()
void HalLedBlink(unit8 leds,unit8 numsBlinks,unit8 percent ,unit16 period)
leds:要闪烁的LED
numsBlinks:闪烁的次数,0表示一直闪烁
percent:LED点亮时间占闪烁周期的百分比。0时发光二极管熄灭
period 闪烁的周期
例如,控制二极管LED1以1s周期闪烁程序:
HalLedBlink(HAL_LED_1,0,50,1000)