MCU_ZigBee协议栈相关知识点总结_协议栈的使用,增加应用层任务事件,消息的定义, 协议栈中中断的使用OSAL的原理 ;通信原理 _ 单播通信原理 广播通信原理 组播通信原理 网络特性
/*****************************************************************************************************************************************
*Author:JYW
*Time:2019_05_08
*Describe:学而记之进而习之_以下都是个人学习笔记_
***************************************************************/
目录
协议栈的使用
增加应用层任务事件
#define TESTAPP_SEND_MSG_EVT 0x0001
/*
*定义的事件每一个二进制位只能有一位为1,即只能有16个事件
*
*/
#define OWN_DEFINE_SEND_MSG_EVT 0x0002
if ( events & OWN_DEFINE_SEND_MSG_EVT )
{
//自己新定义的事件
return (events ^ OWN_DEFINE_SEND_MSG_EVT);
}
消息的定义
在zstack里,任务事件定义的特点决定了,每一个任务最多只能处理16种不同的事件,而系统在运行时有许多事务需要处理,如果每一个事务处理都定义成1个事件,那么16种事件肯定是不够用的,所以引入了消息;
消息处理事务的原理:
定义了一个事件#define SYS_EVENT_MSG 0x8000
当需要应用层任务来处理某个事务的时候,首先给应用层任务发送一个消息
调用osal_set_event(JywApp_TaskID,SYS_EVENT_MSG);那么这样一来,应用层就会进入SYS_EVENT_MSG处理,在事件处理里判断引发我们产生SYS_EVENT_MSG事件是哪一类型的消息,然后根据消息的类型做相应的处理,而消息的类型可以自己定义,这样一来消息的种类可以很多,那么应用层任务处理的事务种类就很多了。
/*
*引入消息
*/
keyChange_t *msgptr;
//定义一个按钮改变的消息
msgptr = (keyChange_t *)osal_msg_allocate(sizeof(keyChange_t ));
if(msgptr)
{
//给这个消息填写相关的值,类型是按钮状态改变KEY_CHANGE
msgptr->hdr.event = KEY_CHANGE;
//消息里面的内容是3
msgptr->keys =3;
/*
* 把发送给应用层JywApp_TaskID的消息队列投到消息队列中
* 并且osal_msg_send()函数里面
* 调用osal_set_event( JywApp_TaskID, SYS_EVENT_MSG );
*
*/
osal_msg_send(JywApp_TaskID,(uint8 *)msgptr);
}
消息的类型是2个字节,在整个协议栈里只有1定义
协议栈中中断的使用
将协议栈中的中断注释掉
OSAL的原理
应用层是一个任务它有一个系统分配给它的数值唯一的编号叫任务ID;
任务可以处理事件,处理事件的这些代码都在一个函数里面,这个函数叫任务事件处理函数;
应用层任务还有一个2个字节的变量,叫做任务事件变量;
应用层任务事件变量和应用层定义事件的关系:如果事件变量和某个事件的宏值与操作为1,那么表示应用层任务将要处理这个事件;系统在运行的时候会不断的去读应用层任务事件变量,当发现这个变量为0,就认为应用层任务当前没有事件需要去处理,如果不为0,就认为应用层任务有事件需要去处理,;
通信原理
单播通信原理
广播通信原理
广播可以理解成,发送模块发出数据,这个网络里的所有节点都可以拿到这个数据。
广播的发送过程:
发送模块:
终端发送模块,定义了端点10,发送出去的方式是广播的方式,目标是网络里所有节点;
指定接收的模块,接收的这个数据的端点房间是10号端点,接收的族是0x0001;。
接收模块:
协调器和路由器接收方定义了端点10,并且和应用层任务挂钩,一旦外部给本模块发数据,就会进入应用层任务事件处理函数,在函数里外部来数据这个消息里判断是不是0x0001这个族,所以我们能够把数字8在数码管上显现出来;。。
组播通信原理
在zigbee网络里,模块可以分组来标记,;发送的模块,如果 发送的组号和网络里标记模块的组号相对应,那么这些模块就可以拿到这些无线数据包,;
组编号和族编号都是2个字节,组必须和已经定义了的可用的端点相关联,如果我们说一个模块标记为组1,那么 这个模块里至少有1个定义了的可用的端点和组0x0001相关联,;;
发送模块:需要有组编号,端点编号,目标族编号,;接收模块在原则上只有当组编号,端点编号,目标族编号这3个参数匹配上了才能拿到和处理这样一个无线数据包;
组标记中一个端点可以同时关联多个组号,一个组号也可以关联多个可用端点;;
无论是单播,广播,组播都用JywApp_DstAddr来描述接收模块的一些信息,
在初始化时默认挂钩定义了端点10到应用层:
发送模块(终端)要进行的代码修改:
成为终端后就会给组0x0001的10号端点的0x0001族发送信息,和广播没有什么区别仅仅是发送的地址模式和地址内容2个参数有不同,
JywApp_DstAddr.addrMode = (afAddrMode_t)AddrGroup;//组播
JywApp_DstAddr.endPoint = 10;//接收模块的端点号
JywApp_DstAddr.addr.shortAddr = 0x0001;//接收模块的组编号
char theMessageData[] = {1,0};
/*AF_DataRequest(&SampleApp_periodic_DstAddr,
发送目的地址+端点地址和传送模式
*/
AF_DataRequest( &JywApp_DstAddr, &JywApp_epDesc,
0x0001,//TESTAPP_CLUSTERID,
(byte)osal_strlen( theMessageData ) + 1,
(byte *)&theMessageData,
&JywApp_TransID,
AF_DISCV_ROUTE, AF_DEFAULT_RADIUS );
接收模块(协调器)要进行的代码修改:
aps_Group_t Jyw_Group;
Jyw_Group.ID = 0x0001;//组号
aps_AddGroup(10,&Jyw_Group);//组和端点相关联
aps_RemoveGroup(10,0x0002);//如果10号端点上关联了组0x0002
//那么就去掉组0x0002,如果根本没有关联,就不做处理
路由器要进行的代码修改:(与协调器类似)
协调器与路由器在组网成功以后,两者 的功能没有差别;;
网络特性
协调器创建网络之后,就和网络里的路由器节点在通信过程中在功能上没有任何区别,只不过网络地址有点特殊永远是0x0000,
其余的地方和路由器就没有任何区别了;
终端入网之后,它和网络里的其他节点无论是接收数据还是发送数据都要经过他的父节点转发出去;路由器在入网的时候虽然网络里也有它的父节点,有父子关系,但是他们发数据的时候不需要父节点转发,;入网后,协调器和所有的路由器他们的通信地位是平等的,,。