传感网应用开发(高级)课件4.4 基于Z-Stack的点对多点通信
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
•
&SampleApp_epDesc,
•
SAMPLEAPP_PTP_CLUSTERID,
•
6,
•
data,
•
&SampleApp_TransID,
•
AF_DISCV_ROUTE,
•
AF_DEFAULT_RADIUS ) == afStatus_SUCCESS )
•{
•}
• else
•{
• // Error occurred in request to send.
•}
•}
【知识链接】
• 单播配置步骤:
• 五、使终端周期性地向协调器发送数据
• SampleApp.c文件中: • if ( events & SAMPLEAPP_SEND_PERIODIC_MSG_EVT ) •{ • // Send the periodic message • //SampleApp_SendPeriodicMessage(); 注释掉 • SampleApp_SendPTPMessage(); //调用PTP发送函数 • // 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)) );
【任务实施】 • 第一步,打开Z-Stack的SampleApp.eww工程。
• 在路径C:\Texas Instruments\ZStack-CC2530-2.5.1a\Projects\zstack\Samples\SampleApp\
• CC2530DB目录下找到SampleApp.eww工程,双击SampleApp.eww文件,打开工程。
【知识链接】
• 单播配置步骤:
Hale Waihona Puke • 四、编写PTP数据发送数据
• SampleApp.c文件中: • void SampleApp_SendPTPMessage(void)
•{
• uint8 data[6] = "NEWLab";
• if ( AF_DataRequest(
•
&SampleApp_PTP_DstAddr,
• 配置思路: • 地址模式设置为
afAddrGroup 并且addr.shortAddr 设置为组ID。 • 节点要加入特定的组
【知识链接】
• 组播配置步骤:
• 一、首先声明一个组对象
• SampleApp.c文件中:aps_Group_t SampleApp_Group;
• aps_Group_t结构体的定义:
•
HAL_TOGGLE_LED2(); //每收到正确数据1次,LED2取反1次
•
break;
•}
•}
【知识链接】
• 单播配置步骤:
• 七、禁止协调器发数据给自己
• SampleApp.c文件中:
• case ZDO_STATE_CHANGE:
• SampleApp_NwkState = (devStates_t)(MSGpkt->hdr.status);
•)
【知识链接】
• 参数1:afAddrType_t *dstAddr, //目的地址指针 • 该参数包含了目的节点的网络地址、端点号及数据传送的模式,如单
播、广播或多播等。
• afAddrType_t 是个结构体如下:
• typedef struct
•{
• union
•{
• uint16 shortAddr; //用于标识该节点网络地址的变量
• typedef struct
•{
• uint16 ID;
// Unique to this table
• uint8 name[APS_GROUP_NAME_LEN]; // #define APS_GROUP_NAME_LEN 16
• } aps_Group_t;
• 每个组有个特定的ID跟组名,组名存放在name数组中,name数组的第一个 元素是组名的长度,第二个元素开始存放组名字符串。
•
if ( //(SampleApp_NwkState == DEV_ZB_COORD) //禁止协调器发数据给自己
•
|| (SampleApp_NwkState == DEV_ROUTER)
•
|| (SampleApp_NwkState == DEV_END_DEVICE) )
•{
•
// Start sending the periodic message in a regular interval.
点属于同一组的节点,才能收到该数据包。 • 广播表示一个节点发送的数据包,网络中所有节点都可以收到。
【知识链接】
• 复习一下之前学习的 Zigbee协议栈进行数据发送的函数:
• AF_DataRequest(
•
afAddrType_t *dstAddr, //目的地址指针
•
endPointDesc_t *srcEP, //发送节点的端点描述符指针
传感网应用开发传感网应用开发协议栈组网开发协议栈组网开发北京新大陆时代教育科技有限公司zzstackstack01单播通信组网02组播通信组网03广播通信组网contents任务要求任务一
“1+X”传感网应用开发
ZigBee协议栈组网开发
基于Z-Stack的点对多点通信
目录
01
单播通信组网
CONTENTS
• 一种是直接指定目标地址的单播传输,比如协调器就是 0x0000。
绑定后面再学 吧!
【知识链接】
• 单播配置步骤:
• 一、自定义点对点通信地址结构体变量(单播)
• afAddrType_t SampleApp_PTP_DstAddr; //单播
• 二、对自定义的单播结构体变量进行填充
• SampleApp_PTP_DstAddr.addrMode = (afAddrMode_t)Addr16Bit; //单播通信模式 • SampleApp_PTP_DstAddr.endPoint = SAMPLEAPP_ENDPOINT; //端口号 • SampleApp_PTP_DstAddr.addr.shortAddr = 0x0000; //发送目标地址
• 三、簇的定义和修改 • 簇代通信协议中表示某种(类)命令
• SampleApp.h文件中: • #define SAMPLEAPP_MAX_CLUSTERS 3 //由2修改为3 • #define SAMPLEAPP_PTP _CLUSTERID 3 //定义点对点数据传输命令
【知识链接】
• 单播配置步骤:
•
uint16 cID, //ClusID 簇ID号
•
uint16 len, //发送数据的长度
•
uint8 *buf, //指向存放发送数据的缓冲区指针
•
uint8 *transID,//传输序列号
•
uint8 options, //发送选项
•
uint8 radius //最大传输半径(发送的跳数)
•
osal_start_timerEx( SampleApp_TaskID,
•
SAMPLEAPP_SEND_PERIODIC_MSG_EVT,
•
SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT );
•}
【任务要求】
• 任务一:采用2个ZigBee模块,分别作为协调 器和终端。终端采用单播的方式向协调器发送 数据。(单播)
• enum •{ • AddrNotPresent = 0, • AddrGroup = 1, • Addr16Bit = 2, • Addr64Bit = 3, • AddrBroadcast = 15 • };
3种不同的通信模
式,我们要设置 哪些参数呢?
【知识链接】
• 其实单播有两种方式:
• 一种是绑定传输my_DstAddr.addrMode=(afAddrMode_t) AddrNotPresent
02
组播通信组网
03
广播通信组网
【任务要求】
• 任务一:采用2个ZigBee模块,分别作为协调器和终端。终端采用单 播的方式向协调器发送数据。(单播)
• 任务二:采用3个ZigBee模块,分别作为协调器、路由器1和路由器2 ,其协调器和路由器1的组号设置为0x0001,路由器2的组号设置为0x0003 ,测试组播通信。(组播)
• // return unprocessed events • return (events ^ SAMPLEAPP_SEND_PERIODIC_MSG_EVT); •}
【知识链接】
• 单播配置步骤: • 六、配置接收(消息处理)函数
• SampleApp.c文件中: • void SampleApp_MessageMSGCB( afIncomingMSGPacket_t *pkt ) •{ • uint16 flashTime;
• 第二步,协调器通过串口向PC机发送数据。
• 1. 通过串口线,把协调器模块与PC机连接起来。
• 2. 编写协调器的程序。采用MT层配置串口,简化操作流程,因此协调器程序主要包括串口初 始化、任务注册和串口数据发送三个部分。
• 具体程序代码见本教材资源。
• 3. 向协调器烧录程序。每复位一次协调器,都会向PC机发送一次数据,则在串口调试软件上 显示一行“NEWLab”字符,如图所示。注意:在IAR的Workspace栏要记得选择“CoordinatorEB”(协 调器),再编辑,烧录。
•
HalLedBlink( HAL_LED_4, 4, 50, (flashTime / 4) );
•
break;
•
• case SAMPLEAPP_PTP_CLUSTERID:
•
if(osal_memcmp(pkt->cmd.Data[0],"NEWLab",6) //判断接收数据是否为NEWLab
• SampleApp.c文件中: • const cId_t SampleApp_ClusterList[SAMPLEAPP_MAX_CLUSTERS] = •{ • SAMPLEAPP_PERIODIC_CLUSTERID, • SAMPLEAPP_FLASH_CLUSTERID, • SAMPLEAPP_PTP _CLUSTERID //添加点对点簇命令 • };
• 任务三:采用3个ZigBee模块,分别作为协调器、路由器和终端,协 调器向外周期性地发送数据,路由器和终端接收数据,测试广播通信。 (广播)
【知识链接】
• 在ZigBee无线传感网络中,数据通信主要有单播、组播和广播三种类 型,用户可以根据通信的需要灵活采用某种通信方式。
• 单播表示网络中两个节点之间进行数据发送与接收的过程。 • 组播,又称多播,表示网络中一个节点发送的数据包时,只有与该节
• switch ( pkt->clusterId )
•{
• case SAMPLEAPP_PERIODIC_CLUSTERID:
•
break;
• case SAMPLEAPP_FLASH_CLUSTERID:
•
flashTime = BUILD_UINT16(pkt->cmd.Data[1], pkt->cmd.Data[2] );
【小结】
• 单播配置步骤:
• 一、自定义点对点通信地址结构体变量(单播) • 二、对自定义的单播结构体变量进行填充 • 三、簇的定义和修改 • 四、编写PTP数据发送数据 • 五、使终端周期性地向协调器发送数据 • 六、配置接收(消息处理)函数 • 七、禁止协调器发数据给自己
【知识链接】
• 组播:当应用程序需要将数据包发送给网络上的一组设 备时,使用该模式。
• } addr;
• afAddrMode_t addrMode; //用于指定数据传送模式,单播、多
•
播还是广播
• byte endPoint; //端点号
• } afAddrType_t; // 其定义在AF.h中
【知识链接】
• afAddrMode_t addrMode 就是用于指定数据传送模式,是个枚举类型,可以设置为以下几个值: • typedef enum •{ • afAddrNotPresent = AddrNotPresent, //表示通过绑定关系指定目的地址 • afAddr16Bit = Addr16Bit, //单播发送 • afAddrGroup = AddrGroup, //组播 • afAddrBroadcast = AddrBroadcast //广播 • } afAddrMode_t;