点播描述的就是网络中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_DstAddrSampleApp_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协议栈点播相关推荐

  1. zigbee协议栈初使用(五)点播无线通讯

    zigbee协议栈初使用(五)点播无线通讯 点播:点对点通讯,即两个设备间通讯,不容许第三个设备接收数据信息. 在AF.h中 有如下定义 typedef enum {afAddrNotPresent ...

  2. ZStack通信(Zigbee协议栈通信)

    ZStack通信-Zigbee协议栈通信 一.注册端点 二.发送数据函数 三.接收数据 一.注册端点 应用都是建立在端点ZDO(Zigbee Device Object)之上的, 所以要实现通信首先要 ...

  3. zigbee协议栈学习(二)

    协议栈规范的 ID号可以通过查询设备发送的 beacon 帧获得.在设备加入网络之前,首先 需要确认协议栈规范的 ID."特定网络"规范 ID号为0: ZigBee协议栈规范的 I ...

  4. ZigBee协议栈简介和流程

    ZigBee协议栈实际上就是ZigBee协议的API接口 一般步骤为: 1.组网:调用协议栈的组网函数.加入网络函数,实现网络的建立与节点的加入 2.发送:发送节点调用协议栈的无线数据发送函数,实现无 ...

  5. ZIGBEE通讯-7.ZigBee协议栈简介

    想要学习协议栈,必须先知道协议是什么.协议定义的是一系列的通信标准,通信双方需要共同按照这一标准进行正常的数据收发,而协议栈是协议的具体实现形式,通俗的理解为用代码实现的函数库,以便于开发人员调用. ...

  6. ZigBee协议栈浅显解读(一)

    目前ZigBee开发主要用的是TI的CC2530.CC2530内部集成看增强型的51所以对于只学过51的小白入门不成问题. 本篇文章我只会介绍ZigBee的协议栈. 我们打开ZigBee协议栈后可以加 ...

  7. Zigbee协议栈ZStack构架

     协议栈版本信息: ZigBee2006\ZStack-1.4.3-1.2.1 1.ZStack协议栈构架 Zigbee协议栈就是将各个层定义的协议都集合在一起,以函数的形式实现,并给用户提供一些 ...

  8. zigbee协议栈ADC采集外部电压

    ADC 由于最近在做一个项目,其中一个步骤是需要CC2530片内ADC采集外设的电压值,三天反思不得其解,终于解决了这个问题. zigbee协议栈是有错误的,稍后我会写出来 ADC支持14位模数转换, ...

  9. CC2530下ZigBee协议栈中添加BH1750数字光照传感器

    项目里需要获得光照强度,之前用的是光敏电阻,但是光敏电阻实在不精确,换用BH1750数字光照传感器.网上购买后,送的资料都是单片机的,移植到ZigBee协议栈里面,时序有些问题,在网上找的一些资料,很 ...

  10. CC2530/Zigbee协议栈外部中断配置详解

    CC2530/Zigbee协议栈配置外部中断 一.I/O端口 二.配置寄存器 三.中断处理函数 一.I/O端口 1.在CC2530芯片中,其I/O口用作通用 I/O 时,引脚可以组成 3 个 8 位端 ...

最新文章

  1. php+curl+restapi,php – cURL适用于我的REST API,但不是Guzzle
  2. hdu 1879 继续畅通工程 最小生成树
  3. JSP EL表达式 将数组拼接成字符串
  4. jupyter notebook 主题
  5. java imageview的使用_Android使用控件ImageView加载图片的方法
  6. 认识计算机硬件实验项目,实验1 认识计算机的硬件与硬件组装
  7. i9可以装服务器系统吗,i9服务器
  8. 谷歌AI用“深度”学习来虚化背景,单摄手机可用,Jeff Dean表示优秀
  9. 知乎回答:为什么微博很难起到社交的作用?
  10. 简单解决新浪博客“您短时间发表文章过多,请稍后再试”的问题
  11. [Shader2D]浮雕效果
  12. 使用detours技术hook系统API
  13. ibm服务器显示器接口,显示器接口类型怎么选,4种主流接口要了解
  14. HTML顶部状态栏更改背景,html css导航菜单点击后改变背景图片
  15. 11-微信小程序商城 分类和产品 产品页面顶部切换功能(微信小程序商城开发、小程序毕业设计、小程序源代码)(黄菊华-微信小程序开发教程)
  16. 【Java】window系统JDK7,JDK8环境安装详细教程
  17. 计算机研究生要高额学费?盘点高学费的大学!
  18. 铁大课表 测试分析报告
  19. 天翼去主机linux密码是什么意思,恢复ESXi宿主机根用户的密码
  20. windows外接一个显示屏可以,两个黑屏解决办法

热门文章

  1. burpsuite插件xssValidator的安装及使用(XSS自动扫描工具)
  2. unity天空盒渐变_unity如何制作绚丽的太空天空盒?
  3. 使用SubSonic生成数据访问层步骤
  4. EasyClick IOS 自动化测试报错
  5. 上海工程技术大学c语言商店存货管理系统,商店存货管理系统解决方案.doc
  6. 如何删除pdf中计算机属性,从 PDF 中删除敏感内容
  7. 2018java面试(1)- 自我介绍和项目介绍
  8. Java实现坦克大战(源码全)
  9. php读取execl 实例,php读取excel的实例代码
  10. 使用WPF设计类似Visio的简单绘图软件