ZigBee学习笔记CC2530

合集下载

zigbee学习笔记

zigbee学习笔记

关于ZIGBEE技术Zigbee的由来在蓝牙技术的使用过程中,人们发现蓝牙技术尽管有许多优点,但仍存在许多缺陷。

对工业,家庭自动化控制和遥测遥控领域而言,蓝牙技术显得太复杂,功耗大,距离近,组网规模太小等,而工业自动化对无线通信的需求越来越强烈。

正因此,经过人们长期努力,Zigbee协议在2003年中通过后,于2004正式问世了。

Zigbee是什么Zigbee是一个由可多到65000个无线数传模块组成的一个无线数传网络平台,十分类似现有的移动通信的CDMA网或GSM网,每一个Zigbee网络数传模块类似移动网络的一个基站,在整个网络范围内,它们之间可以进行相互通信;每个网络节点间的距离可以从标准的75米,到扩展后的几百米,甚至几公里;另外整个Zigbee网络还可以与现有的其它的各种网络连接。

例如,你可以通过互联网在北京监控云南某地的一个Zigbee控制网络。

不同的是,Zigbee网络主要是为自动化控制数据传输而建立,而移动通信网主要是为语音通信而建立;每个移动基站价值一般都在百万元人民币以上,而每个Zigbee―基站‖却不到1000元人民币;每个Zigbee 网络节点不仅本身可以与监控对对象,例如传感器连接直接进行数据采集和监控,它还可以自动中转别的网络节点传过来的数据资料; 除此之外,每一个Zigbee网络节点(FFD)还可在自己信号覆盖的范围内,和多个不承担网络信息中转任务的孤立的子节点(RFD)无线连接。

每个Zigbee网络节点(FFD和RFD)可以可支持多到31个的传感器和受控设备,每一个传感器和受控设备终可以有8种不同的接口方式。

可以采集和传输数字量和模拟量。

Zigbee技术的应用领域Zigbee技术的目标就是针对工业,家庭自动化,遥测遥控,汽车自动化、农业自动化和医疗护理等,例如灯光自动化控制,传感器的无线数据采集和监控,油田,电力,矿山和物流管理等应用领域。

另外它还可以对局部区域内移动目标例如城市中的车辆进行定位.通常,符合如下条件之一的应用,就可以考虑采用Zigbee技术做无线传输:1.需要数据采集或监控的网点多;2.要求传输的数据量不大,而要求设备成本低;3.要求数据传输可性高,安全性高;4.设备体积很小,不便放置较大的充电电池或者电源模块;5.电池供电;6.地形复杂,监测点多,需要较大的网络覆盖;7.现有移动网络的覆盖盲区;8.使用现存移动网络进行低数据量传输的遥测遥控系统。

ZigBee学习电子笔记

ZigBee学习电子笔记

第一讲第二讲2530通用I/O口有21个:P0/P1/口个8个;P2口5个,其中,P1_0、P_1有20mA的驱动能力,其余只有4mA2.IO口配置相关的寄存器(3个)PxSEL: P0SEL、P1SEL、P2SEL,每个寄存器是1byte,分别用来设定3个口的工作模式。

IO的两种工作模式:1.普通IO口模式:点灯、监测按键输入2.片上外设模式:作为串口或者其他非普通IO口PxDIR:P0DIR/P1DIR/P2DIR,每个寄存器占一个字节,用来设定IO口作为输入还是输出PxINP:P0INP/P1INP/P2INP:输入情况下,注意P2INP寄存器后3位的用法(见下图):输出示例(以P0_0为例):1)设置P0_0为普通IO口工作模式,非片上外设:P0SEL=0xFE(&11111110) 2)让P0_0作为输出用,非输入监测用:P0DIR=0x01(+ 00000001)3)输出(如P0_0=0或P0_0=1等)。

输入示例(让P1_2作为输入):1)设置P1_2为普通IO口工作模式,非片上外设:P1SEL=0xfd(11111011)2)让P1_2作为输入检测用,非输出用P1DIR=0xfd(11111011)3)选择上拉、下拉或三态中的一种输入(因为上电的时候寄存器默认为0,所以IO口都默认工作在普通IO口输入、上下拉模式)4)检测用:If (P1_2= =0 or 1){}Else{}总结:由此可见,当芯片上电初始化后,3组IO口默认工作在普通IO口下的输入监测、上拉输入模式。

自己编程示例:第三讲:外部中断检测中断有3级开关:CPU中断总开关------IO口组中断开关---------IO组内某口中断开关中断信号触发类型选择:上升、下降因此,某IO口产生中断需配置:1)CPU中断开关打开;EA=1;2)该口所在的IO组中断打开;P0组的中断开关在IEN1的第5位;P1组的中断开关在IEN2的第4位;P2组的中断开关在IEN2的第1位;3)该口中断打开;P0IEN;8位寄存器。

基于CC2530的Zigbee无线传感网络的设计与实现

基于CC2530的Zigbee无线传感网络的设计与实现

基于CC2530的Zigbee无线传感网络的设计与实现二、硬件设计1. CC2530芯片CC2530是德州仪器(TI)公司推出的一款具有Zigbee通信功能的片上系统(SoC)芯片,集成了802.15.4无线通信功能以及8051微控制器。

CC2530具有低功耗、快速响应、可靠性高等特点,适合用于构建Zigbee传感网络。

2. 传感器节点传感器节点是Zigbee网络中的重要组成部分,它可以通过各种传感器采集环境信息,并通过无线网络发送到协调器节点。

传感器节点通常包括温度传感器、湿度传感器、光敏传感器等,以满足不同的监测需求。

3. 协调器节点协调器节点是Zigbee网络中的核心节点,负责网络管理、数据协调、安全认证等功能。

在本设计中,我们选择CC2530作为协调器节点的芯片,通过其内置的Zigbee功能实现网络连接和数据传输。

4. 网络拓扑在设计Zigbee无线传感网络时,需要考虑网络拓扑结构,一般可以选择星型、网状或者混合型拓扑结构。

根据实际应用需求,可以灵活选择合适的网络拓扑结构。

三、软件开发1. Zigbee协议栈在基于CC2530的Zigbee无线传感网络中,需要使用Zigbee协议栈来实现Zigbee协议的各层功能,包括PHY层、MAC层、网络层和应用层等。

TI 公司提供了针对CC2530芯片的Z-Stack协议栈,可以帮助开发者快速实现Zigbee通信功能。

2. 网络配置在软件开发过程中,需要对Zigbee网络进行配置,包括节点连接、网络路由、数据传输等方面。

通过Z-Stack协议栈提供的API接口,可以方便地进行网络配置和管理。

3. 数据处理在传感节点和协调器节点之间,需要进行数据的采集、传输和处理。

通过Z-Stack提供的数据传输接口和协议栈功能,可以实现传感数据的采集和传输,以及协调器节点的数据处理和分发。

3. 安全认证在Zigbee网络中,安全认证是至关重要的一环。

通过Z-Stack协议栈提供的安全认证接口,可以实现节点之间的安全通信,保障网络数据的安全性。

CC2530控制光敏传感器

CC2530控制光敏传感器
WeBee 团队
Zigbee 组网实验教程
3、 光敏传感器
前言:这一节我们我学习传感器部分内容中的光敏传感器,这一类型的传感器 跟前面温湿度的传感器最大的区别就是控制简单,只有硬件电路搭好了, 给 CC2530 的 IO 口一个高低电平就是反映外界情况。所以我们用起来就 很方便。
传感器介绍: 光敏传感器是最常见的传感器之一,它的种类繁多,主要有:光电管、光 电倍增管、光敏电阻、光敏三极管、太阳能电池、红外线传感器、紫外线 传感器、光纤式光电传感器、色彩传感器、CCD 和 CMOS 图像传感器等。 它的敏感波长在可见光波长附近,包括红外线波长和紫外线波长。光传感 器不只局限于对光的探测,它还可以作为探测元件组成其他传感器,对许 多非电量进行检测,只要将这些非电量转换为光信号的变化即可。光传感 器是目前产量最多、应用最广的传感器之一,它在自动控制和非电量电测 技术中占有非常重要的地位。最简单的光敏传感器是光敏电阻,当光子冲 击接合处就会产生电流。
22. void InitLed(void)
23. {
P1DIR |= 0x01; //P1_0 定义为输出
LED1 = 1;
//LED1 灯熄灭
24. }
25. /**************************** 光敏电阻初始化函数
26. *****************************/ 27. void LightInit() 28. {
16. {
17. uint i,j;
18. for(i=xms;i>0;i--)
for(j=587;j>0;j--);
19. }
20. /**************************** LED 初始化函数

CC2530学习路线-基础实验-GPIO按键控制LED灯亮灭(2)

CC2530学习路线-基础实验-GPIO按键控制LED灯亮灭(2)

CC2530学习路线-基础实验-GPIO按键控制LED灯亮灭(2)⽬录1.前期预备知识1.1 新⼤陆Zigbee模块按键电路图由上图可知,Zigbee模块的SW1按钮连接在P1.2端⼝上,当SW1导通,P1.2电平从3.3V被拉低接地。

所以P1.2输⼊模式为下拉输⼊.1.2 CC2530相关寄存器寄存器名称寄存器作⽤寄存器描述P1 (0x90)*控制端⼝1的⾼低电平端⼝1.通⽤I/O。

可以通过SFR位寻址P1SEL(0xF4)端⼝1 8个⼦端⼝的功能选择P1SEL的8个bit分别代表 => P1.7~P1.0的功能选择.值为 0:代表通⽤I/0(GPIO)功能.值为 1 : 代表外设功能P1DIR(0xFE)端⼝1 输⼊输出选择P1DIR的bit定义同P1SEL;值为 0:代表从外部输⼊信号⾄CC2530;值为 1:代表从CC2530输出信号⾄外部P1INP (0xF6)端⼝1 输⼊模式选择P1INP定义为P1.7~P1.2的I/O输⼊模式。

其中P1.0和P1.1是没有上拉/下拉功能。

值为 0:上拉/下拉。

值为 1:三态(⾼电平、低电平、⾼阻态)P2INP (0xINP)端⼝2 输⼊模式及其它端⼝选择P2INP⽐较特殊,因为P2端⼝引出的引脚只有3个,所以P2INP还有其它功能。

bit 0 ~ 4 : P2.4~P2.0的输⼊模式。

0 : 上拉/下拉; 1:三态bit 5 : 设置端⼝0上拉/下拉选择。

对端⼝P0上⾯的所有引脚设置为上拉/下拉输⼊ 0 : 上拉; 1: 下拉bit 6 : 同bit 5功能,但是是设置端⼝1上所有引脚bit 7 : 同bit5功能,但是是设置端⼝2上的所有引脚P1IEN(0x8D)端⼝1 中断屏蔽端⼝P1.7~P1.0的中断使能(也就是说中断是否Enable*(打开))0 : 中断禁⽤1 : 中断使能PICTL(0x8C)端⼝中断控制 P0ICON(bit0)端⼝0、1、2输⼊模式下的中断配置。

ZigBee芯片CC2530寄存器配置说明

ZigBee芯片CC2530寄存器配置说明

CC2530寄存器配置说明ZigBee的基础实验(1)这是飞比FB2530EB V2.0提供的芯片I/O对应表*more607*2011/11/17 22:13*飞比CC2530EB模块*/#include <ioCC2530.h>#define uint unsigned int#define uchar unsigned char//定义控制灯的端口#define RLED P1_0 //定义LED1为P1.0口控制#define GLED P1_1 //定义LED2为P1.1口控制#define YLED P1_4 //定义LED3为P1.4口控制#define BLED P0_1 //定义LED4为P0.1口控制#define S1 P0_1 //定义S1为P0.1口控制(注意:因为端口复用所以需要设置P0DIR,//在程序中复用比较难,所以本程序就不用来做按键了)#define S2 P0_3 //定义S2为P0.3口控制(我将P10的针脚接到P14针脚上,所以是P0.3口)#define S6 P1_2 //定义S6为P1.2口控制//函数声明void InitIO(void); //初始化LED控制IO口函数void InitKey(void); //初始化按键void keyScan(void); //按键输入//全局变量int times; //计数器void InitIO(void) //初始化IO口程序{P1DIR |= 0x13; //P1_0、P1_1、P1_4定义为输出P0DIR |= 0x02; //P0_1定义为输出RLED = 1;GLED = 1;YLED = 1;BLED = 1; //将4盏LED灯都打开}void InitKey(void)//初始化按键{P1SEL &= 0xFB; //定义为输入P1DIR &= 0xFB; //按钮s6的P1INP |= 0x06; //拉高电压P0SEL &= 0xFB; //定义为输入P0DIR &= 0xFB; //按钮s6的P0INP |= 0x06; //拉高电压}void keyScan(void){if(S6 == 0)times ++;//增加值while(S6 == 0);if(S2 == 0)times=0;//清空值while(S2 == 0 );}void main(void){times = 0;InitIO(); //初始化while(1) //死循环让循环内的代码不断执行{keyScan();if(times>4)times = 0;if(times == 0)//灯全灭{RLED = 0;GLED = 0;YLED = 0;BLED = 0;}if(times == 1)//亮一灯{RLED = 1;GLED = 0;YLED = 0;BLED = 0;}if(times == 2)//亮两个灯{RLED = 1;GLED = 1;YLED = 0;BLED = 0;}if(times == 3)//亮三个灯{RLED = 1;GLED = 1;YLED = 1;BLED = 0;}if(times == 4)//全亮{RLED = 1;GLED = 1;YLED = 1;BLED = 1;}}}来自:/j_evil/blog/static/163211317201161211362979/数据手册P0SEL(P1SEL相同):各个I/O口的功能选择,0为普通I/O功能,1为外设功能P2SEL:(D0到D2位)端口2 功能选择和端口1 外设优先级控制什么是外设优先级:当PERCFG分配两个外设到相同的引脚时,需要设置这两个外设的优先级,确定哪一个外设先被响应ERCFG:设置部分外设的I/O位置,0为默认I位置1,1为默认位置2P0DIR(P1DIR相同):设置各个I/O的方向,0为输入,1为输出P2DIR :D0~D4设置P2_0到P2_4的方向 D7、D6位作为端口0外设优先级的控制P0INP(P1INP意义相似) :设置各个I/O口的输入模式,0为上拉/下拉,1为三态模式需要注意的是:P1INP中,只有D7~D2分别设置对应I/O口的输入模式。

ZIGBEE学习笔记

ZIGBEE学习笔记

1、ZigBee协议栈:ZigBee协议是一系列的通信标准,通信双方需要共同按照这一标准进行正常的数据发射和接收。

协议栈是协议的具体实现形式,通俗点来理解就是协议栈是协议和用户之间的一个接口,开发人员通过使用协议栈来遵循和使用这个协议的,进而实现无线数据收发。

2、ZigBee无线网络协议层的架构:ZigBee协议分为两部分---IEEE 802.15.4和ZigBee,IEEE 802.15.4定义了PHY (物理层)和MAC(介质访问层)技术规范;ZigBee联盟定义了NWK(网络层)、APS(应用程序支持子层)、APL(应用层)技术规范。

ZigBee协议栈就是将各个层定义的协议都集合在一起,以函数的形式实现,并给用户提供API(应用层),用户可以直接调用---学习Zigbee就是熟悉API和学习如何使用对应函数。

3、用户实现简单的无线数据通信的一般步骤:---组网:调用协议栈的组网函数、加入网络函数,实现网络的建立与节点的加入。

---发送:发送节点调用协议栈的无线数据发送函数,实现无线数据发送。

---接收:接收节点调用协议栈的无线数据接收函数,实现无线数据接收。

4、Z-STACK协议栈工作原理:Z-stack可以看做是一个小型的操作系统(本质是大型的程序),用于实现底层和网络层的内容,Z-stack将复杂部分屏蔽掉。

用户通过API函数就可以轻易用ZigBee。

5、协调器、路由器、终端:Router----路由器Coodinator----协调器EndDevice----终端设备(1)协调器:(coordinator)每个zigbee网络只允许有一个zigbee的协调器,协调器首先选择一个信道和网络标识(PAN ID),然后开始这个网络.因为协调器是整个网络的开始,他具有网络的最高权限,是整个网络的维护者,还可以保持间接寻址用的表格绑定,同时还可以设计安全中心和执行其他动作,保持网络其他设备的通信。

飞比”Zigbee论坛CC2530开发板学习教程

飞比”Zigbee论坛CC2530开发板学习教程

“飞比”Zigbee论坛CC2530开发板学习教程(一)--前言“奥特曼Zigbee读书日记”已经写到第六部分了,首先非常感谢广大网友的支持与长期关注,此系列笔记会继续按照开源的方向进行深入的学习及更新。

同时,应广大网友的要求,也由于CC2530替代CC2430的强劲动力,经论坛管理团队讨论,最终决定在最近的一段时间内暂停“奥特曼Zigbee读书日记”的更新,而推出更偏向于应用,且更贴近市场的教程--“飞比”Zigbee论坛CC2530开发板学习教程。

本教程将着眼于TI公司的新一代 2.4G Zigbee IC-CC2530及最新的Zigbee协议-Zstack2007的应用学习。

所采用的硬件平台为CC2530的官方开发板-CC2530DK (SmartRF05EB)。

少一点炒作,多做一点实事--本站致力于营造一个“潜心学习、踏实做事”的氛围,希望广大Zigbee技术的爱好者、从业者积极参与,一起为中国的“无线单片机”技术献出自己的微薄之力。

[注:本文源自--“飞比”Zigbee论坛,为尊重劳动者成果,如需转载请保留此行,并通知作者]在这一章里,首先介绍下本套教程的整体思路及具体会涉及到的例程。

需要声明的一点是,本教程不是单片机的入门教程,需要读者对单片机及C语言有一定的基础,它关注的是Zigbee协议的基本概念及TI公司公开发行的免费Zigbee协议-Zstack 2007的应用。

首先着眼于TI公司提供的学习例程的讲解,这其中不但包括Zstack 2007的例程,同时会介绍TI的一些简化协议,如Basic RF/SimpliciTI等;然后会将“奥特曼Zigbee读书日记”中介绍的开源协议-MSSTATE LRWPAN,移植到CC2530DK中;最后,我们再来一起进入一个具体的应用领域-智能家居,学习一下TI的专用Zigbee遥控器协议RemoTI。

以下为具体采用的平台及相应的例程:(以下例程很多是CC2430及CC2530中共用的,本教程将同时适用)1、TI Basic RF----Light Switch----PER test2、Zstack 2007-----Sample App-----Generic App-----Home Automation-----Serial App-----Transmit App-----Simple App-----OAD/ENP/ESP等,待定3、MSSTATE LRWPAN ---- 平台移植及Ping Pong例程4、RemoTI声明:本教程中采用的源代码均来源于官方网站,并在此基础上进行修改,本站尊重原作者的劳动,将保留所有源文件的版权信息,并将标明本站进行的修改。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

已入门选手进一步学习的重点我发现最近群里很多人已经可以算是大致入门了,能够在原有例子的基础上进行一些简单工作,实现数据传输。

但是我也发现很多人开始把精力投入到钻研协议栈代码细节上面去了,实际上这种学习方式是有问题的。

第一:如果从应用的角度看,协议栈的一些实现细节是没有必要钻研的,这就好比是现在的PC机,已经有了Windows系统了,我们在这个系统之上实现自己应用程序的时候其实并不需要对Windows内部实现细节过多地关注,只要能够自由地在Windows下开发应用程序(其实就是调用大量的API函数)就可以了;第二:如果想从协议栈本身入手去做一些深入的工作,Zstack是不适合的,因为它不是完全开源,真想在路由算法、加密算法等方面做工作的话,目前TinyOS这样的开源协议栈才是首选。

所以,进一步学习的重点应该是:在什么时间什么地点调用什么函数的问题!那么如何来提高这方面的技能呢?1、浏览ZDP和ZDO相关代码,熟悉一下都有什么函数,这两个部分都做了什么,学习的过程中千万不要去钻研代码实现的细节,只要了解其流程以及都作了什么就可以了,否则你一定会迷失在那成千上万行的代码之中而不能自拔。

ZDP和ZDO的实现文件里面有大量的函数在以后具体应用中可以去调用。

2、典型例子中的ZDO消息使用其实只有那么几个例子,比如:ZDO_RegisterForZDOMsg(TaskID,End_Device_Bind_rsp)这样的,这是讲底层的一些事件消息引入到应用层的注册方法。

在深入应用的时候那么几个典型的消息注册是不够用的,比如我在一个应用中就注册了以下:ZDO_RegisterForZDOMsg( TaskID, End_Device_Bind_rsp ); // 我自己解析End_Device_Bind_rspZDO_RegisterForZDOMsg( TaskID, Match_Desc_rsp ); //我自己解析Match_Desc_rspZDO_RegisterForZDOMsg( TaskID, Device_annce); //我自己解析Device_annceZDO_RegisterForZDOMsg( TaskID, Active_EP_rsp); //我自己解析Active_EP_rspZDO_RegisterForZDOMsg( TaskID, Simple_Desc_rsp); //我自己解析Simple_Desc_rspZDO_RegisterForZDOMsg( TaskID, NWK_addr_rsp); //我自己解析NWK_addr_rsp在具体应用中,你会根据不同的网络需求去调用很多协议栈的设置好的req和处理rsp消息,那么协议栈都有那些req和rsp是你进一步学习所应该深入认识的。

3、在自己使用系统的req和rsp的时候,如果你不知道该如何处理,你最好去看看MT是如何实现的,在MT功能模块中,对协议栈的绝大多数req和rsp都有调用和实现的例子可以参考,虽然我们在自己的应用中很少回去使用MT,但是Mt 的实现代码却是最好的参考资料。

上面几点是我目前能够想到的一些事情,以后有想法再补充吧!最后我举个例子:比如你想实现节点入网后自动报告自己的长短地址,然后主控节点处理节点的报告,并且向这个节点要求其发回存在于其上的EP信息,我们应该这样做:1、在新节点的ZDO_STATE_CHANGE消息处理函数中调用:ZDP_DeviceAnnce( NLME_GetShortAddr(), NLME_GetExtAddr(), \ZDO_Config_Node_Descriptor.CapabilityFlags, 0 );这个函数会自动以广播方式报告自己的短地址和长地址,其余在网的节点都可以收到;你也可以采用按键策略,新节点入网后通过按键触发来报告自己的长短地址:2、在主控节点的初始化函数中添加:ZDO_RegisterForZDOMsg( TaskID, Device_annce); //我自己解析Device_annce这样,当新入网节点Annce的时候,主控节点收到这个消息,然后通知给你的任务(TaskID),你的任务则需要在case ZDO_CB_MSG:处理函数中添加处理这个annce的代码,如:case Device_annce: //device annouce process.ProcessDeviceAnnce(inMsg);break;在自己实现的ProcessDeviceAnnce函数中,你可以提取出新来节点的长短地址。

3、有了新节点的长短地址,其实什么都可以做了,我现在利用新节点的长短地址来请求其返回它的EP信息:在适当的地方调用ZDP_ActiveEPReq( &zDestAddr, shortAddr, SECURITY_FLAG);这是一个直接面向目标短地址的单播req,目标节点收到这个req之后,会自动处理的(代码协议栈已经实现了),Zstack协议栈实际上实现了绝大多数响应req的函数,然后返回一个rsp,这一部分其实你不用管,也就是说目标节点方面你一行代码都不用写,存在其上的所有EP信息就会被返回到主控节点;但是Zstack没有实现绝大多数rsp处理函数,因为rsp一般来将用户会有不同的想法,所以他也没办法实现;4、主控节点如果想处理返回的活动EP信息(比如EP号),那么需要在任务初始化的时候注册一下由任务处理这个返回消息:ZDO_RegisterForZDOMsg( TaskID, Active_EP_rsp);然后在ZDO_CB_MSG处理函数中添加自己的处理代码:case Active_EP_rsp://active ep response process.ProcessActiveEpRsp(inMsg);break;自己编写的ProcessActiveEpRsp函数就可以提取到目标节点上所有EP信息,比如我自己实现的一段代码就是这样的(注释解释):static void ProcessActiveEpRsp(zdoIncomingMsg_t *inMsg){uint8 *pData;uint8 i;ZDO_ActiveEndpointRsp_t *pRsp = ZDO_ParseEPListRsp( inMsg ); //调用ZDO_ParseEPListRsp函数(这个函数协议栈已经实现了,什么时间什么地点调//用什么函数问题的具体体现,即:在rsp处理的时候调用这个函数,不知道你理解没?//下面我处理经过Parse后的消息:uint8 cnt = pRsp->cnt;pData = (uint8 *)osal_mem_alloc(6 + cnt);//here, 3 is one for status, two for short address.one is cntif(pData){pData[0] = LO_UINT16(pRsp->nwkAddr);pData[1] = HI_UINT16(pRsp->nwkAddr);pData[2] = pRsp->status;pData[3] = pData[0];pData[4] = pData[1];pData[5] = cnt;for(i=0;i < cnt;i++)pData[6 + i] = pRsp->epList;osal_mem_free(pRsp);Uart_SendBack(pData,(6 + cnt)); //串口方式把获得的信息发给PC,你可以存起来,也可以进一步做别的;osal_mem_free(pData);}HalLedSet(HAL_LED_GREEN,HAL_LED_MODE_FLASH); //用闪灯方式表示收到了消息。

}//函数里面这段代码我实现的依据是什么?这你就的去找找看协议栈是如何处理这个req的了,看看ZDP_ActiveEPReq函数的协议栈实现,//#define ZDP_ActiveEPReq( dstAddr, NWKAddrOfInterest, SecurityEnable ) \ // ZDP_NWKAddrOfInterestReq( dstAddr, \// NWKAddrOfInterest, Active_EP_req, SecurityEnable ) //看到这里就够了,我们知道这个函数调用会发一个Active_EP_req给目标节点,至于怎么发出去的,没必要研究了。

//再去查查看协议栈是如何处理Active_EP_req的,找到了://{ Active_EP_req, ZDO_ProcessActiveEPReq },//这个函数的具体实现(协议栈中的)/*void ZDO_ProcessActiveEPReq( zdoIncomingMsg_t *inMsg ){byte cnt = 0;uint16 aoi;byte stat = ZDP_SUCCESS;aoi = BUILD_UINT16( inMsg->asdu[0], inMsg->asdu[1] );if ( aoi == NLME_GetShortAddr() ){cnt = afNumEndPoints() - 1; // -1 for ZDO endpoint descriptorafEndPoints( (uint8 *)ZDOBuildBuf, true );}else{stat = ZDP_INVALID_REQTYPE;}ZDP_ActiveEPRsp( inMsg->TransSeq, &(inMsg->srcAddr), stat,aoi, cnt, (uint8 *)ZDOBuildBuf, inMsg->SecurityUse );*///这个你要看懂了,实际上就是向你报告有几个活动EP,每个EP的号是多少。

例子大致说完了,如果不知道我在说什么,也不知道我说的这些函数怎么找的同学,那还得去好好入门入门,这篇文档不适合你!如果能大致领会意思,我想你就体会到了我们的学习重点在哪里,再说一遍:在什么时间、什么地点调用什么函数!而不是研究协议栈到底怎么实现的。

相关文档
最新文档