zigbee学习之路(十四):基于协议栈的无线数据传输
一.前言
上次实验,我们介绍了zigbee原理的应用与使用,进行了基于zigbee的串口发送协议,但是上个实验并没有实现数据的收发。在这个实验中,我们要进行zigbee的接受和发送实验。
二.实验功能
协调器以3 秒为周期(周期性广播),向终端节点发送一个数组数据0123456789,协调器接收到数据后,通过串口让电脑显示接收到的数据。
三.代码分析
本实验是一个周期性广播实验,故有终端节点,协调器之分。先给大家介绍一下什么是协调器和终端节点。协调器在整个zigbee网络中只能有一个,相当于网络中的最高维护者。终端节点是具体执行的数据采集传输的设备,他不能转发其他节点的消息。所以本次实验我们要用两个zigbee节点,一个节点用于发送一个用于接收,接收的节点通过串口连接电脑,显示接收到的数据,验证传送与接受的正确性。我们把讲解分成发送与接收两部分,先讲解发送的。
终端节点(数据发送)
我们大致要干3件事,(1) 串口初始化;(2) 登记任务号;(3) 执行任务。登记任务号,是zigbee的特色,这样才能去执行一个事情。
首先,作一个解释,就是:当我们从TI 官网得到协议栈代码之后,在没有任何修改过的情况之下,如果我们进行编译的话,那么,程序是默认执行周期性广播的,只不过我们没有将TI 定义为发送数据的指针,指向我们的数据,所以,数据就没有发送,但是,其实设备的任务初始化工作早就完成了。下面我们就来讲解。
步骤(1):任务初始化(登记任务号、设置编号、发送时间)

我们来看看图中的case,一旦网络状态改变,就执行case 后面的代码,代码中的osal_start_timerEx();函数就帮我们登记任务(对应SampleApp_TaskID)、设置编号(对应
SAMPLEAPP_SEND_PERIODIC_MSG_EVT)、发送时间了(对应SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT)。
步骤(2):设置发送内容
在SampleApp_ProcessEvent( uint8 task_id, uint16 events )函数里找到SampleApp_SendPeriodicMessage()函数,SampleApp_ProcessEvent是一个事件函数,通过它调用发送函数SampleApp_SendPeriodicMessage。

在图中的if 语句里,就有我们步骤一看到的已经设置好的编号SAMPLEAPP_SEND_PERIODIC_MSG_EVT,也就是说,在设定好的发送时间内,就会执行一次SampleA
pp_SendPeriodicMessage()函数。
我们来看一下SampleApp_SendPeriodicMessage()函数

10就是数组长度,data就是发送的数组。
步骤(3):执行任务(自动周期性地发送)
当步骤(1)里设置好编号,那么程序就会执行步骤(2),而在步骤(2)中,我们又设置了发送内容,故当程序执行到步骤(2)的时候,其实已经执行了发送数据的任务了。到此
发送部分的代码讲解完毕,只要选择EndDeviceEB-Pro 编译即可下载程序。至此,发送方面就介绍完了,下面介绍接受方面。
协调器(数据接收)
数据接收部分的代码有两个工作:
(1) 接收数据;
(2) 串口发送数据给电脑显示。
步骤(1):接收数据

当接收到数据时,也就是AF_INCOMING_MSG_CMD 发生了,就会执行case中的代码,也就是调用接收数据的函数。让我们来看一下这个函数的具体代码。
void SampleApp_MessageMSGCB( afIncomingMSGPacket_t *pkt ) //接收数据
2 {
3 uint16 flashTime;
4
5 switch ( pkt->clusterId ) {
6 case SAMPLEAPP_PERIODIC_CLUSTERID:
7 HalUARTWrite(0,"Received data: \n",16); //提示收到数据
8 HalUARTWrite(0, pkt->cmd.Data, pkt->cmd.DataLength); //输出接收到的数据
9 HalUARTWrite(0, "\n", 1); //回车换行
10 break;
SAMPLEAPP_PERIODIC_CLUSTERID这个是一个簇,在发送函数中已经定义过,是为了接收数据的。HalUARTWrite()函数就是一个把信息发送给串口的函数,之前说过,在次不作介绍,大家明白功能就行,至此,就完成了zigbee数据的发送以及接受,希望大家能够学到东西,最后给大家看一下实验效果。

zigbee学习之路(十四):基于协议栈的无线数据传输的更多相关文章
- zigbee学习之路(十五):基于协议栈的按键实验
一.前言 经过上次的学习,相信大家已经初步学会使用zigbee协议进行发送和接受数据了.今天,我们要进行的实验是按键的实验,学会如何在协议栈里实现按键中断. 二.实验功能 在协议栈上实现按键中断,BU ...
- zigbee学习之路(十二):zigbee协议原理介绍
一.前言 从今天开始,我们要正式开始进行zigbee相关的通信实验了,我所使用的协议栈是ZStack 是TI ZStack-CC2530-2.3.0-1.4.0版本,大家也可以从TI的官网上直接下载T ...
- zigbee学习之路(十):串口(接收)
一.前言 上次我们学习了串口的发送,今天我们要学习串口的接收,要实现的功能是接收电脑发来的数据,控制LED 灯闪烁,而且将收到的数据发回给电脑显示出来.而且要采用不占用cpu资源的中断. 二原理与分析 ...
- 学习之路十四:客户端调用WCF服务的几种方法小议
最近项目中接触了一点WCF的知识,也就是怎么调用WCF服务,上网查了一些资料,很快就搞出来,可是不符合头的要求,主要有以下几个方面: ①WCF的地址会变动,地址虽变,但是里面的逻辑不变! ②不要引用W ...
- 嵌入式Linux驱动学习之路(十四)按键驱动-同步、互斥、阻塞
目的:同一个时刻,只能有一个应用程序打开我们的驱动程序. ①原子操作: v = ATOMIC_INIT( i ) 定义原子变量v并初始化为i atomic_read(v) 返回原子变量 ...
- IOS学习之路十四(用TableView做的新闻客户端展示页面)
最近做的也个项目,要做一个IOS的新闻展示view(有图有文字,不用UIwebview,因为数据是用webservice解析的到的json数据),自己一直没有头绪,可后来听一个学长说可以用listvi ...
- Linux学习总结(十四)—— 查看CPU信息
文章首发于[博客园-陈树义],点击跳转到原文Linux学习总结(十四)-- 查看CPU信息. Linux学习总结(十四)-- 查看CPU信息 商用服务器CPU最常用的是 Intel Xeon 系列,该 ...
- 设计模式学习(二十四):Spring 中使用到的设计模式
设计模式学习(二十四):Spring 中使用到的设计模式 作者:Grey 原文地址: 博客园:设计模式学习(二十四):Spring 中使用到的设计模式 CSDN:设计模式学习(二十四):Spring ...
- 我的MYSQL学习心得(十四) 备份和恢复
我的MYSQL学习心得(十四) 备份和恢复 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) ...
随机推荐
- Thinkphp 验证码
一.生成验证码 $Verify = new \Think\Verify(); $Verify->entry(); 生成的验证码信息会保存到session中,里面包含数据有: array('ver ...
- 自动化测试selenium----css选择器总结
选择器 示例 描述 * * 匹配任何元素 element DIV 标签选择器,匹配所有使用DIV标签的元素 .class .tips class选择器,匹配所有class属性中包含info的元素 ...
- canvas 拖拽实现
Canvas 依赖分辨率 不支持事件处理器 弱的文本渲染能力 能够以 .png 或 .jpg 格式保存结果图像 最适合图像密集型的游戏,其中的许多对象会被频繁重绘 SVG 不依赖分辨率 支持事件处理器 ...
- Magento table rates表运费设置
在magento中集成了Table rate表运费,这种运输方式.表运费就是我们自己写个运费表,根据距离和商品重量设置运费,制做成一张csv格式的表,导入到magento中,来实现运费的控制. 在我的 ...
- 【leetcode】两数之和
https://leetcode.com/problems/two-sum/ Example: Given nums = [2, 7, 11, 15], target = 9, Because num ...
- Python之路-(Django进阶一)
Django请求生命周期: 首先,客户端发送请求到服务器的urls库,通过匹配url后面的关键字,去找指定app里面的的view. 然后,app通过判断,拿到数据库数据和html模板文件. 最后,将拿 ...
- varnish4.1 配置文件default.vcl
varnish4.1 配置文件default.vcl # This .x VCL file vcl 4.0; backend default { .host = "127.0.0.1&quo ...
- javascript获取当前url
在WEB开发中,许多开发者都比较喜欢使用javascript来获取当前url网址,本文就此为大家总结一下比较常用获取URL的javascript实现代码,以下示例是前面为相应实现方法,后面是获取URL ...
- C/C++ 结构体 数组 函数传递
#include <stdio.h> #include <stdlib.h> struct student{ int num; ]; double dec; }; void s ...
- hduoj 1285 确定比赛名次
http://acm.hdu.edu.cn/showproblem.php?pid=1285 确定比赛名次 Time Limit: 2000/1000 MS (Java/Others) Memory ...