ZigBee协议栈点播
点播描述的就是网络中2
个节点相互通信的过程,确定通信对象的就是节点的16 bit
短地址。
打开AF.h
(在Profile
目录下)文件,找到下面的代码:
typedef enum {afAddrNotPresent = AddrNotPresent,afAddr16Bit = Addr16Bit,afAddr64Bit = Addr64Bit,afAddrGroup = AddrGroup,afAddrBroadcast = AddrBroadcast
} afAddrMode_t;
该类型是一个枚举类型:
- 当
addrMode = Addr16Bit
时,对应点播方式。 - 当
addrMode = AddrGroup
时,对应组播方式。 - 当
addrMode = AddrBroadcast
时,对应广播方式。
打开SampleApp.c
文件,发现已经存在如下代码:
afAddrType_t SampleApp_Periodic_DstAddr;
afAddrType_t SampleApp_Flash_DstAddr;
分别是组播和广播。我们按照格式来添加自己的点播:
afAddrType_t Point_To_Point_DstAddr;
参考SampleApp_Periodic_DstAddr
和SampleApp_Flash_DstAddr
,对Point_To_Point_DstAddr
的参数进行配置。在SampleApp_Init
函数中加入如下代码:
Point_To_Point_DstAddr.addrMode = ( afAddrMode_t ) Addr16Bit; /* 点播 */
Point_To_Point_DstAddr.endPoint = SAMPLEAPP_ENDPOINT;
Point_To_Point_DstAddr.addr.shortAddr = 0x0000; /* 发给协调器 */
第3行的含义是点播的发送对象为0x0000
,也就是协调器的地址,节点和协调器之间实现点对点通讯。这段代码在如下位置添加:
/* Setup for the flash command's destination address - Group 1 */
SampleApp_Flash_DstAddr.addrMode = ( afAddrMode_t ) afAddrGroup;
SampleApp_Flash_DstAddr.endPoint = SAMPLEAPP_ENDPOINT;
SampleApp_Flash_DstAddr.addr.shortAddr = SAMPLEAPP_FLASH_GROUP;
继续添加自己的点对点发送函数,在SampleAPP.c
最后加入下面的代码:
void SampleApp_SendPointToPointMessage ( void ) {uint8 data[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};if ( AF_DataRequest ( &Point_To_Point_DstAddr,&SampleApp_epDesc,SAMPLEAPP_POINT_TO_POINT_CLUSTERID,10,data,&SampleApp_TransID,AF_DISCV_ROUTE,AF_DEFAULT_RADIUS ) == afStatus_SUCCESS ) {} else {/* Error occurred in request to send. */}
}
还需要在SampleAPP.c
文件开头添加头函数声明:
void SampleApp_SendPointToPointMessage ( void );
在SampleApp.h
中加入SAMPLEAPP_POINT_TO_POINT_CLUSTERID
的定义:
#define SAMPLEAPP_MAX_CLUSTERS 3
#define SAMPLEAPP_PERIODIC_CLUSTERID 1
#define SAMPLEAPP_FLASH_CLUSTERID 2
#define SAMPLEAPP_POINT_TO_POINT_CLUSTERID 3
接下来把数据传输实验的SampleApp.c
文件中的SampleApp_SendPeriodicMessage
函数替换成点对点发送函数SampleApp_SendPointToPointMessage
,这样的话就能实现周期性点播发送数据了。
if ( events &SAMPLEAPP_SEND_PERIODIC_MSG_EVT ) {/* Send the periodic message *///SampleApp_SendPeriodicMessage(); /* 周期性发送函数 */SampleApp_SendPointToPointMessage(); /* 此处替换成点播函数 *//* Setup to send message again in normal period (+ a little jitter) */osal_start_timerEx ( SampleApp_TaskID, SAMPLEAPP_SEND_PERIODIC_MSG_EVT,( SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT + ( osal_rand() & 0x00FF ) ) );return ( events ^ SAMPLEAPP_SEND_PERIODIC_MSG_EVT ); /* return unprocessed events */
}
在接收方面,我们进行如下修改:将接收ID
在原来基础上改成刚定义的SAMPLEAPP_POINT_TO_POINT_CLUSTERID
:
void SampleApp_MessageMSGCB ( afIncomingMSGPacket_t *pkt ) {uint16 flashTime;switch ( pkt->clusterId ) {case SAMPLEAPP_POINT_TO_POINT_CLUSTERID:HalUARTWrite ( 0, "I get data\n", 11 ); /*用于提示有数据 */HalUARTWrite ( 0, &pkt->cmd.Data[0], 10 ); /* 打印收到数据 */HalUARTWrite ( 0, "\n", 1 ); /* 回车换行,便于观察 */break;case SAMPLEAPP_FLASH_CLUSTERID:flashTime = BUILD_UINT16 ( pkt->cmd.Data[1], pkt->cmd.Data[2] );HalLedBlink ( HAL_LED_4, 4, 50, ( flashTime / 4 ) );break;}
}
由于协调器不允许给自己点播,故周期性点播初始化时协调器不能初始化:
/* Received whenever the device changes state in the network */
case ZDO_STATE_CHANGE:SampleApp_NwkState = ( devStates_t ) ( MSGpkt->hdr.status );if ( //(SampleApp_NwkState == DEV_ZB_COORD)|| /* 协调器不给自己点播 */( SampleApp_NwkState == DEV_ROUTER ) || ( SampleApp_NwkState == DEV_END_DEVICE ) ) {/* Start sending the periodic message in a regular interval */osal_start_timerEx ( SampleApp_TaskID,SAMPLEAPP_SEND_PERIODIC_MSG_EVT,SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT );} else {/* Device is no longer in the network */}break;
将修改后的程序分别以协调器、路由器、终端的方式下载到3
个节点设备中,并连接串口。可以看到只有协调器在一个周期内收到信息,也就是说路由器和终端均与地址为0x00
(协调器)的设备通信,不与其他设备通信,实现点对点传输。
ZigBee协议栈点播相关推荐
- zigbee协议栈初使用(五)点播无线通讯
zigbee协议栈初使用(五)点播无线通讯 点播:点对点通讯,即两个设备间通讯,不容许第三个设备接收数据信息. 在AF.h中 有如下定义 typedef enum {afAddrNotPresent ...
- ZStack通信(Zigbee协议栈通信)
ZStack通信-Zigbee协议栈通信 一.注册端点 二.发送数据函数 三.接收数据 一.注册端点 应用都是建立在端点ZDO(Zigbee Device Object)之上的, 所以要实现通信首先要 ...
- zigbee协议栈学习(二)
协议栈规范的 ID号可以通过查询设备发送的 beacon 帧获得.在设备加入网络之前,首先 需要确认协议栈规范的 ID."特定网络"规范 ID号为0: ZigBee协议栈规范的 I ...
- ZigBee协议栈简介和流程
ZigBee协议栈实际上就是ZigBee协议的API接口 一般步骤为: 1.组网:调用协议栈的组网函数.加入网络函数,实现网络的建立与节点的加入 2.发送:发送节点调用协议栈的无线数据发送函数,实现无 ...
- ZIGBEE通讯-7.ZigBee协议栈简介
想要学习协议栈,必须先知道协议是什么.协议定义的是一系列的通信标准,通信双方需要共同按照这一标准进行正常的数据收发,而协议栈是协议的具体实现形式,通俗的理解为用代码实现的函数库,以便于开发人员调用. ...
- ZigBee协议栈浅显解读(一)
目前ZigBee开发主要用的是TI的CC2530.CC2530内部集成看增强型的51所以对于只学过51的小白入门不成问题. 本篇文章我只会介绍ZigBee的协议栈. 我们打开ZigBee协议栈后可以加 ...
- Zigbee协议栈ZStack构架
协议栈版本信息: ZigBee2006\ZStack-1.4.3-1.2.1 1.ZStack协议栈构架 Zigbee协议栈就是将各个层定义的协议都集合在一起,以函数的形式实现,并给用户提供一些 ...
- zigbee协议栈ADC采集外部电压
ADC 由于最近在做一个项目,其中一个步骤是需要CC2530片内ADC采集外设的电压值,三天反思不得其解,终于解决了这个问题. zigbee协议栈是有错误的,稍后我会写出来 ADC支持14位模数转换, ...
- CC2530下ZigBee协议栈中添加BH1750数字光照传感器
项目里需要获得光照强度,之前用的是光敏电阻,但是光敏电阻实在不精确,换用BH1750数字光照传感器.网上购买后,送的资料都是单片机的,移植到ZigBee协议栈里面,时序有些问题,在网上找的一些资料,很 ...
- CC2530/Zigbee协议栈外部中断配置详解
CC2530/Zigbee协议栈配置外部中断 一.I/O端口 二.配置寄存器 三.中断处理函数 一.I/O端口 1.在CC2530芯片中,其I/O口用作通用 I/O 时,引脚可以组成 3 个 8 位端 ...
最新文章
- php+curl+restapi,php – cURL适用于我的REST API,但不是Guzzle
- hdu 1879 继续畅通工程 最小生成树
- JSP EL表达式 将数组拼接成字符串
- jupyter notebook 主题
- java imageview的使用_Android使用控件ImageView加载图片的方法
- 认识计算机硬件实验项目,实验1 认识计算机的硬件与硬件组装
- i9可以装服务器系统吗,i9服务器
- 谷歌AI用“深度”学习来虚化背景,单摄手机可用,Jeff Dean表示优秀
- 知乎回答:为什么微博很难起到社交的作用?
- 简单解决新浪博客“您短时间发表文章过多,请稍后再试”的问题
- [Shader2D]浮雕效果
- 使用detours技术hook系统API
- ibm服务器显示器接口,显示器接口类型怎么选,4种主流接口要了解
- HTML顶部状态栏更改背景,html css导航菜单点击后改变背景图片
- 11-微信小程序商城 分类和产品 产品页面顶部切换功能(微信小程序商城开发、小程序毕业设计、小程序源代码)(黄菊华-微信小程序开发教程)
- 【Java】window系统JDK7,JDK8环境安装详细教程
- 计算机研究生要高额学费?盘点高学费的大学!
- 铁大课表 测试分析报告
- 天翼去主机linux密码是什么意思,恢复ESXi宿主机根用户的密码
- windows外接一个显示屏可以,两个黑屏解决办法
热门文章
- burpsuite插件xssValidator的安装及使用(XSS自动扫描工具)
- unity天空盒渐变_unity如何制作绚丽的太空天空盒?
- 使用SubSonic生成数据访问层步骤
- EasyClick IOS 自动化测试报错
- 上海工程技术大学c语言商店存货管理系统,商店存货管理系统解决方案.doc
- 如何删除pdf中计算机属性,从 PDF 中删除敏感内容
- 2018java面试(1)- 自我介绍和项目介绍
- Java实现坦克大战(源码全)
- php读取execl 实例,php读取excel的实例代码
- 使用WPF设计类似Visio的简单绘图软件