Zigbee网络设备启动流程—终端(自启动模式)

合集下载

Zigbee操作说明

Zigbee操作说明

一.Android软件安装配置,导入项目安装pad驱动测试对应源码是否成功使用无线路由器组建局域网,并将摄像头配置进来ZIGBEE用万用表测出2,3,5口:具体使用:将万用表的开关拨到箭头的地方,然后测线路是否通,如果有响声,即是联通的。

串口线和ZIGBEE连接时对应的点:2口:tx; 3口:rx 5口:GND继电器Vin1连接12伏电源GND2连接地D+5连接智能终端的RS485的左边D-6连接智能终端的RS485的右边使用智能终端的使用:1) 连接电源:PWR:左黑右红,红为5伏电源,黑为底线2)串口线连接PC,进行配置查询: AT+AA_BASE_ADDRESS=1返回结果,0,硬件地址设置地址: AT+AA_BASE_ADDRESS=0,A1108 注意:1108为自己设定的硬件地址(0——F)查询:AT+R_AA_Z_NODE返回结果AT+AA_Z_NODE=C 注:C为协调器设置信道:AT+AA_Z_CHANNEL=11 注:11为自行设定的信道(值为11-26)设组网地址:AT+AA_Z_PAN_ID=1105 注:1105为自行设定的组网地址自此,智能终端设置完成设置ZIGBEE连接电源连接串口线,设置235,黑的是5,黄的是2,绿的是3通过串口线连接PC,进行设置:查询硬件地址:AT+AZ_BASE_ADDRESS=1返回结果0,Z硬件地址设置硬件地址:AT+AZ_BASE_ADDRESS=0,Z1109 注:1109为自行设定的硬件地址(这个地址必须区别于智能终端的硬件地址)设置工作模式:AT+AZ_BASE_WORKMODE=0,2设置为路由器:AT+AZ_Z_NODE=R设置信道:AT+AZ_Z_CHANNEL=11 注:11为上述设置的信道AT+AZ_Z_PAN_ID=1105 注:1105为上述设置的组网地址设置工作模式:AT+AZ_BASE_WORKMODE=0,2将门磁连上:门磁的两头分别连接ZIGBEE的GND和IN两口关于继电器1)继电器就是一个开关2)一个继电器有四对:第一队:AG,A1,A2,;第二队:10,11,12;第三队:13,14,15;第四对:16,17,18。

ZigBee智能开关的连接网络教程

ZigBee智能开关的连接网络教程

ZigBee智能开关的连接网络教程
步骤一:添加网关,若已经添加本步骤可忽略
手机在华为市场或应用宝中下载并安装对应的APP,打开并登陆后点击的右上角的“+”键添加设备,选择“网关中控”,根据网关类型在右侧区域找到“无线网关(ZigBee)”、“有线网关(ZigBee)”等类型,点击后进入WiFi配置界面。

手机要确保连接对应房间的2.4G 无线wifi网络。

步骤二:添加成功后可在对应的APP“我的家”页面查看该设备,点击新增的ZigBee网关名称,进入设备页面。

该页面的右上角可设置属性,修改设备名称。

点击页面正下方的“添加子设备”,或在“我的家”页面点击的右上角的“+”键添加设备,选择“电工”,点击“开关(ZigBee)”(根据开关类型不同选择。


步骤三:长按开关按键7-10秒左右,开关指示灯出现闪烁状态,然后勾选app界面下方的“确认指示灯在快闪”,点击“下一步” ,等待App添加设备完成。

步骤四:成功找到设备后会进入“添加成功”界面,在该界面可以点击设备名称进行重命名,之后点击完成。

配网完成后可在app中查看或控制设备状态。

zigbee网络建立过程简介

zigbee网络建立过程简介

星形网络和树型网络可以看成是网状网络的一个特殊子集,所以接下来分析如何组建一个Zigbee网状网络。

组建一个完整的Zigbee网络分为两步:第一步是协调器初始化一个网络;第二步是路由器或终端加入网络。

加入网络又有两种方法,一种是子设备通过使用MAC层的连接进程加入网络,另一种是子设备通过与一个先前指定的父设备直接加入网络。

一、协调器初始化网络协调器建立一个新网络的流程如图1所示。

图1 协调器建立一个新网络1、检测协调器建立一个新的网络是通过原语发起的,但发起原语的节点必须具备两个条件,一是这个节点具有ZigBee协调器功能,二是这个节点没有加入到其它网络中。

任何不满足这两个条件的节点发起建立一个新网络的进程都会被网络层管理实体终止,网络层管理实体将通过参数值为INVALID_REQUEST的的原语来通知上层这是一个非法请求。

2、信道扫描协调器发起建立一个新网络的进程后,网络层管理实体将请求MAC子层对信道进行扫描。

信道扫描包括能量扫描和主动扫描两个过程。

首先对用户指定的信道或物理层所有默认的信道进行一个能量扫描,以排除干扰。

网络层管理实体将根据信道能量测量值对信道进行一个递增排序,并且抛弃能量值超过了可允许能量值的信道,保留可允许能量值内的信道等待进一步处理。

接着在可允许能量值内的信道执行主动扫描,网络层管理实体通过审查返回的PAN描述符列表,确定一个用于建立新网络的信道,该信道中现有的网络数目是最少的,网络层管理实体将优先选择没有网络的信道。

如果没有扫描到一个合适的信道,进程将被终止,网络层管理实体通过参数仠为STARTUP_FAILURE的的原语来通知上层初始化启动网络失败。

3、配置网络参数如果扫描到一个合适的信道,网络层管理实体将为新网络选择一个PAN描述符,该PAN描述符可以是由设备随机选择的,也可以是在里指定的,但必须满足PAN描述符小于或等于0x3fff,不等于0xffff,并且在所选信道内是唯一的PAN描述符,没有任何其它PAN描述符与之是重复的。

ZigBee设备入网流程之关联方式

ZigBee设备入网流程之关联方式

ZigBee设备⼊⽹流程之关联⽅式ZigBee设备⼊⽹流程ZigBee设备⼊⽹有关联⽅式和直接⽅式两种,我所熟悉的是关联⽅式,这也是最常⽤的⽅式。

关联⽅式step1 设备发出Beacon Request设备会在预先设置的⼏个信道⾥⾯按照指定的顺序逐信道发出这个包,看到Dest PAN ID,Dest Address都是0xFFFF,说明这是个⼴播包,在这些信道⾥⾯的⽹络都会收到它。

step2 route节点发出Beacon回复这个回复⾥⾯有五个关键的值Source PAN ID :回复Beacon的这个设备所处⽹络的PAN IDSource Address:回复Beacon的这个设备所处⽹络的短地址Association Permit:关联许可是否开放Router Capacity:可否接⼊Route节点End Device Capacity:可否接⼊End Device能收到⼊⽹设备发出的Beacon Request的⽹络都会回复Beacon,并且同⼀个⽹络⾥⾯能收到⼊⽹设备Beacon Request的FFD设备都会回复Beacon。

这样⼀来,⼀般⼊⽹设备会受到多个Beacon回复。

那么它会按照下列的顺序,并且结合这帧Beacon的Link Quality来进⾏下⼀步动作:1. ⼊⽹设备⾸先判断Association Permit是否开放,这个是需要协调器发出全⽹⼴播,通知所有route节点这个许可开放了。

2. 如果关联许可是开放的,再根据⾃⼰所属的设备类型来判断Router Capacity、End Device Capacity。

3. 如果可以接⼊,再筛选最佳Link Quality的设备发出Association Request,这个时候就需要⽤Beacon⾥⾯的Source PAN ID和SourceAddress发出⼀个MAC层的单播包。

step3 设备发出Association Requeststep4 route发出Association Responsestep5 秘钥传输step5 Device AnnounceDevice Announce的⼴播数据主要是通知全⽹相关节点有⼀个新设备进来了,给⼤家做个⾃我介绍,⼤家刷新下路由表这类的信息。

zigbee入门指导

zigbee入门指导

Zigbee入门指导(二)——运行Zigbee例程在Zigbee入门指导(一)中讲解了基于CC2430的Zigbee 开发环境的搭建,安装完Ti的协议栈后,里面有多个例程,帮助用户入门及作为自己工程的基本框架。

在Zigbee入门指导(二)中,我们将通过演示执行相关的例程,了解Zigbee应用的启动流程(不是Zigbee网络的启动流程),了解运行一个自定义Zigbee工程所要作的软件方面的改动和工程选项的配置。

所用的开发套件为无线龙的套件。

一、修改HALHAL及所谓的Hardware Abstration Layer,通俗的了解即为开发板的硬件驱动,由于所用的是无线龙的开发板,与Ti的原装开发板有差异,需要对协议栈自带的HAL进行修改。

HAL文件存放在目录<Components/hal>中,里面有<common>、<include>、<target>三个目录,<common>中定义的与外设无关的硬件操作,<include>存放的是头文件,而<target>存放的是目标文件,里面根据目标板的不同分为<CC2430BB>、<CC2430DB>、<CC2430EB>。

所用的无线龙的开发板和CC2430EB最为相似,故修改<CC2430EB>中的内容。

按键操作几乎在每个例程中都会用到,故此处以按键驱动的修改为例,演示HAL的修改。

先了解下Ti和无线龙扩展板的不同之处。

Ti的CC2430EB 原理图在Ti文档SWRU133.pdf(位于SWRU133.zip中)。

Page29是按键电路的原理图,如图1图1(左上角是元件图)CC2430EB的按键其实是摇杆,上下左右四个方向和电阻网络相连,通过放大电路送到CC2430的P0.6脚,经AD采样后判断摇杆摆向哪个方向,按键编号为SW1~SW4摇杆也可像普通按键一样按下,产生一个直流电平变化,接到P0.5脚,按键编号为SW5。

实验之前请先设置协调器和终端节点的通道及panid号。由于本套实验

实验之前请先设置协调器和终端节点的通道及panid号。由于本套实验

实验之前请先设臵协调器和终端节点的通道及PANID号。

由于本套实验中没有涉及到ZIGBEE协议栈和IAR开发环境的使用,所以在实验箱配臵的时候就已经设定每个实验箱的终端节点的通道和PANID,只要将协调器的参数设臵与终端节点一致即可。

理论上每个实验箱配臵的终端节点以上两个参数不完全相同(也就是至少一个参数不一样)。

一、ZIGBEE组网实验1、硬件环境搭建硬件设备:短距离无线通信实验平台1台、PC1台、ZIGBEE协调器模块1个(板载)、ZIGBEE终端节点1个、2.4G天线1根;硬件连接:首先连接实验设备电源:9V/2A,让实验设备正常启动。

检查确认ZIGBEE协调器模块正常,模块开关拨到ON位臵连接串口调试线2、设臵ZIGBEE协调器参数当系统正常启动后进入WXL-zigbee界面设臵ZIGBEE通道和PANID 备注:由于本套实验中没有涉及到ZIGBEE协议栈和IAR开发环境的使用,所以在实验箱配臵的时候就已经设定每个实验箱的终端节点的通道和PANID,只要将协调器的参数设臵与终端节点一致即可。

理论上每个实验箱配臵的终端节点以上两个参数不完全相同(也就是至少一个参数不一样)。

这里通道设臵为0x0B,PANID为0x0001.3、下载Zigbeenet组网应用程序到LINUX首先检查串口调试线的虚拟串口号:打开超级终端保证嵌入式板子已经正常启动,同时保证各连接线正常。

此时可以再超级终端中按回车建,如果有:出现,表示各方面运行正常。

否则需要检查以上各步骤。

如果是第一次使用ZIGBEE功能,那么此时输入ls命令可以查看各应用程序。

可以看出里面没有ZIGBEE应用程序。

此时在超级终端菜单上选择“传送---发送文件”浏览目录\zigbee-cc2530\net到我们编译后的文件:点击发送即可发送完毕可以通过ls命令查看。

可以看到已经有zigbeenet的应用程序在其中了。

4、实验项目进入ZIGBEE组网应用程序:ls查看应用程序进入ZIGBEE应用程序只需要在超级终端中连续输入以下两行命令即可chmod 775 zigbeenet./ zigbeenet此时会自动去格式化并建立网络,建立网路后ZIGBEE协调器模块的红色LED 会被点亮:ZIGBEE网络启动命令为:对应LINUX代码如下:上电终端节点当模块红色LED被点亮时,表示加入网络成功,此时可以在超级终端上看到加入节点信息。

Zigbee网络设备启动—基本问题说明

Zigbee网络设备启动—基本问题说明

记录几个问题:***********************************1、有关设备的启动模式选项:(有待完善):非自动启动模式HOLD_AUTO_START:HOLD_AUTO_START is a compile option that will surpres s ZDApp from starting the device and wait for the application to start the device.不通过ZDApp(具体讲是ZDOInitDevice())而是等待应用程序来开启设备并初始化建立/加入网络.软启动模式SOFT_START:SOFT_START is a compile option that allows the device to start as a c oordinator if one isn't found. Otherwise, the device will start as a router.如果没有协调器则作为协调器启动,有则作为路由器启动.自动启动模式:个人认为就是自动通过ZDApp(具体讲是ZDOInitDevice())来开启设备并初始化建立/加入网络,设备的逻辑类型由所携带的配置文件来决定.**********************************************************************2、三种逻辑类型节点的配置文件协调器:f8wCoord.cfg配置文件中同时编译了路由功能RTR_NWK和协调器功能ZDO_COORDINATOR/* Common To All Applications */-DCPU32MHZ // CC2430s Run at 32MHz-DFORCE_MAC_NEAR // MAC code in NEAR-DROOT=__near_func // MAC/ZMAC code in NEAR-DMAC_CFG_APP_PENDING_QUEUE=TRUE/* Coordinator Settings */-DZDO_COORDINATOR // Coordinator Functions-DRTR_NWK // Router Functions/* Optional Settings */-DBLINK_LEDS // LED Blink Functions/* Compiler keywords */-DCONST="const __code"-DGENERIC=__generic // Ptr declaration路由器:f8wRouter.cfg配置文件中编译了路由功能RTR_NWK/* Common To All Applications */-DCPU32MHZ // CC2430s Run at 32MHz-DFORCE_MAC_NEAR // MAC code in NEAR-DROOT=__near_func // MAC/ZMAC code in NEAR-DMAC_CFG_APP_PENDING_QUEUE=TRUE/* Router Settings */-DRTR_NWK // Router Functions/* Optional Settings */-DBLINK_LEDS // LED Blink Functions/* Compiler keywords */-DCONST="const __code"-DGENERIC=__generic // Ptr declaration终端:f8wEdev.cfg配置文件中没有编译这两个功能./* Common To All Applications */-DCPU32MHZ // CC2430s Run at 32MHz-DFORCE_MAC_NEAR // MAC code in NEAR-DROOT=__near_func // MAC/ZMAC code in NEAR/* Optional Settings */-DMAC_OPT_FFD=0 // ZigBee RFD-DBLINK_LEDS // LED Blink Functions/* Compiler keywords */-DCONST="const __code"-DGENERIC=__generic // Ptr declaration协调器的配置文件只比路由器配置文件多编译了个-DZDO_COORDINATOR // Coordinator Functions 如果同时编译非自动启动模式HOLD_AUTO_START和软启动模式SOFT_START,设备可以通过应用程序来选择成为路由器或协调器.当然这个设备所带的配置文件应为f8wCoord.cfg.对于设备携带的是何种配置文件,可以打开project->options->c/c++compiler->extraOptions选项查看.比如SampleApp中的DemoEB,同时编译了SOFT_START和HOLD_AUTO_START,貌似下载进去后通过外部跳线来选择是当协调器还是路由器,不过这部分程序已经被注销了.当然的,DemoEB所带的配置文件应该是同时编译了路由功能和协调器功能的f8wCoord.cfg,即编译了RTR_NWK和ZDO_COORDINAT OR.再比如SimpleApp中两个实验中的灯与开关实验.开关设备SimpleSwitchEB无论按K1还是K2都是作为终端设备的,其预编译选项只有HOLD_AUTO_START而没有SOFT_START,配置文件为f8wEndev.cfg,没有协调器和路由功能;而灯设备SimpleControllerEB按键K1则作为协调器,按K2则作为路由器,其预编译选项同时编译了SOFT_START和HOLD_AUTO_START,配置文件为f8wCoord.cfg,即编译了RTR _NWK和ZDO_COORDINATOR. SimpleApp中传感器实验也一样,只能作为终端设备的SimpleSensorEB 预编译了HOLD_AUTO_START,配置文件为f8wEndev.cfg;而SimpleCollectorEB按K1作为协调器按K2作为路由器,预编译了SOFT_START和HOLD_AUTO_START,配置文件f8wCoord.cfg. 可以通过project ->options->c/c++compiler->extraOptions选项查看,也可由workspace看出,如下:作为终端的开关节点与作为协调器/路由器的灯节点:空白的文件表示没有包含在这个workspace中.作为终端的传感器节点与作为协调器、路由器的中心收集节点:空白的文件表示没有包含在这个workspace 中.**********************************************************************3、有两种方式来设置非自动启动模式:Hold Auto Start(1)、手工方式:在ZDApp_Init()函数中有个ZDAppCheckForHoldKey();(// Check for manual(手工的) "Hold Auto Star t").来看下这个函数:********************void ZDAppCheckForHoldKey( void ){#if (defined HAL_KEY) && (HAL_KEY == TRUE)//直接通过读取按键来判断是否需要采用HOLD_AUTO_START 模式,如果发现//SW_1处于按下(普通按键?)/向上(Joystick up)状态,则设置devState 为DEV_HOLD;// Get Keypad directly to see if a HOLD_START is needed.// Hold down the SW_BYPASS_START key (see OnBoard.h)// while booting to avoid starting up the device.if ( HalKeyRead () == SW_BYPASS_START) //HAL_KEY_SW_1{// Change the device state to HOLD on start updevState = DEV_HOLD;}#endif // HAL_KEY}*********************可以看到如果手工使HAL_KEY_SW_1置位状态,则会设置devState = DEV_HOLD.这里HAL_KEY的初始化见hal_board_cfg.h:#ifndef HAL_KEY#define HAL_KEY TRUE#endif而对SW_BYPASS_START的初始化见OnBoard.h:// These Key definitions are unique to this development system.// They are used to bypass functions when starting up the device.//这些键的定义仅适用于本应用例子,可以在设备启动时避开一些功能://避开网络层的NV存储和避开网络初始化#define SW_BYPASS_NV HAL_KEY_SW_5 // Bypass Network layer NV restore#define SW_BYPASS_START HAL_KEY_SW_1 // Bypass Network initialization因此避开网络层NV存储也可以通过手工方式来完成.(2)、预编译方式:project->options->c/c++compiler->preprocessor->defined symbols下编译选项:HOLD_AUTO_START SimpleApp例子里四种节点都预编译了HOLD_AUTO_START:非自动启动模式在ZDApp.c中:#if defined( HOLD_AUTO_START )devStates_t devState = DEV_HOLD;#elsedevStates_t devState = DEV_INIT;#endif把devState初始化为DEV_HOLD.以上两种方式最终都会设置devState = DEV_HOLD // Initialized - not started automatically********************************************************************************4、devStartMode和devState的初始化,ZDApp.c中:devStartMode:#if defined( ZDO_COORDINATOR ) && !defined( SOFT_START )// Set the default to coodinatordevStartModes_t devStartMode = MODE_HARD;#elsedevStartModes_t devStartMode = MODE_JOIN; // Assume joining//devStartModes_t devStartMode = MODE_RESUME; // if already "directly joined"// to parent. Set to make the device do an Orphan scan.#endif编译了ZDO_COORDINATOR并且没有编译SOFT_START,则初始化devStartMode = MODE_HARD;其他情况初始化devStartMode = MODE_RESUME;比如SampleApp三种逻辑类型节点.devState:#if defined( HOLD_AUTO_START )devStates_t devState = DEV_HOLD;// Initialized - not started automatically#elsedevStates_t devState = DEV_INIT;// Initialized - not connected to anything#endif预编译了HOLD_AUTO_START,则devState = DEV_HOLD;否则devState = DEV_INIT;********************************************************************************5、存储设备逻辑类型的NV条目ZCD_NV_LOGICAL_TYPE:(1)在ZGlobals.c下的NV条目表ZGlobal Item Table有这么一个条目:static CONST zgItem_t zgItemTable[ ] ={#if defined ( NV_INIT ){ZCD_NV_LOGICAL_TYPE, sizeof(zgDeviceLogicalType), &zgDeviceLogicalType},…………}zgItem_t结构体如下:typedef struct zgItem{uint16 id;uint16 len;void *buf;} zgItem_t;ZDO全局变量zgDeviceLogicalType被初始化为uint8 zgDeviceLogicalType = DEVICE_LOGICAL_TYP E;因此这里全局变量zgDeviceLogicalType的值为NV条目ZCD_NV_LOGICAL_TYPE的值,buf指向zgD eviceLogicalType.如果在应用程序中改变了设备逻辑类型并写入NV条目ZCD_NV_LOGICAL_TYPE中,这时即全局变量zgDeviceLogicalType的值改变了(卡在这步上近两天,因为找不着改变的逻辑状态与设备开启时选择的逻辑状态之间的关系).(2)NV条目ZCD_NV_LOGICAL_TYPE的值有哪些?// Device Logical Type//NV条目ZCD_NV_LOGICAL_TYPE的值包括:(即zgDeviceLogicalType的值)// Values for ZCD_NV_LOGICAL_TYPE (zgDeviceLogicalType)#define ZG_DEVICETYPE_COORDINATOR 0x00#define ZG_DEVICETYPE_ROUTER 0x01#define ZG_DEVICETYPE_ENDDEVICE 0x02#define ZG_DEVICETYPE_SOFT 0x03(3)对于DEVICE_LOGICAL_TYPE的值各逻辑类型设备初始化如下:// Device Logical Type//zgDeviceLogicalType = DEVICE_LOGICAL_TYPE#if defined ( SOFT_START )#define DEVICE_LOGICAL_TYPE ZG_DEVICETYPE_SOFT //可选择类型#elif defined( ZDO_COORDINATOR )#define DEVICE_LOGICAL_TYPE ZG_DEVICETYPE_COORDINATOR //协调器#elif defined (RTR_NWK)#define DEVICE_LOGICAL_TYPE ZG_DEVICETYPE_ROUTER //路由器#else#define DEVICE_LOGICAL_TYPE ZG_DEVICETYPE_ENDDEVICE //终端#endif如果编译了SOFT_START,则初始化DEVICE_LOGICAL_TYPE=ZG_DEVICETYPE_SOFT,即zgDevice LogicalType = ZG_DEVICETYPE_SOFT;如果没有编译SOFT_START但编译了ZDO_COORDINATOR,则初始DEVICE_LOGICAL_TYPE = ZG_DEVICETYPE_COORDINATOR,即zgDeviceLogicalType=Z G_DEVICETYPE_COORDINATOR;路由器和终端类似.********************************************************************************6、启动设备都要通过ZDApp_event_loop()函数调用ZDO_StartDevice()对ZDO_NETWORK_INIT事件的处理:ZDO_StartDevice( (uint8)ZDO_Config_Node_Descriptor.LogicalType, devStartMode,DEFAULT_BEACON_ORDER, DEFAULT_SUPERFRAME_ORDER );这里对于设备逻辑类型的传递参数ZDO_Config_Node_Descriptor.LogicalType,ZDConfig.c中初始化是这样的:NodeDescriptorFormat_t ZDO_Config_Node_Descriptor ={#if defined( ZDO_COORDINATOR ) && !defined( SOFT_START )NODETYPE_COORDINATOR,//协调器#elif defined (RTR_NWK)NODETYPE_ROUTER, //路由器#elseNODETYPE_DEVICE, //终端设备// Logical Type#endif…………}如果编译了ZDO_COORDINATOR且没有编译SOFT_START,则ZDO_Config_Node_Descriptor.Logical Type的值为NODETYPE_COORDINATOR; 如果没有编译ZDO_COORDINATOR或者编译了SOFT_S TART,且编译了了RTR_NWK,则ZDO_Config_Node_Descriptor.LogicalType的值为NODETYPE_ROU TER(比如simpleApp中灯节点和中心收集节点就是这种情况,因此它俩的ZDO_Config_Node_Descriptor. LogicalType被初始化为NODETYPE_ROUTER,当然当通过外部按键选择设备逻辑类型为协调器时,会通过内部程序把这个值改为NODETYPE_COORDINATOR,这点后面再作记录);剩下情况为NODETYPE_D EVICE.********************************************************************************7、simpleApp中的按键完成两个功能:设置设备的逻辑类型(ZC/ZR/ED) 和设置设备的启动方式(ZCD_STARTOPT_AUTO_START),然后写入相应的NV条目ZCD_NV_LOGICAL_TYPE和ZCD_NV_STARTUP_OPTION.ZDApp_Init()是先于应用任务如SampleApp_Init()初始化的.ZCD_NV_STARTUP_OPTION值包括:// These are bit weighted - you can OR these together.// Setting one of these bits will set their associated NV items// to code initialized values.#define ZCD_STARTOPT_DEFAULT_CONFIG_STATE 0x01 //默认配置#define ZCD_STARTOPT_DEFAULT_NETWORK_STATE 0x02 //默认网络状态#define ZCD_STARTOPT_AUTO_START 0x04 //自动启动#define ZCD_STARTOPT_CLEAR_CONFIG ZCD_STARTOPT_DEFAULT_CONFIG_STATE //清除配置=默认配置#define ZCD_STARTOPT_CLEAR_STATE ZCD_STARTOPT_DEFAULT_NETWORK_STATE //清除状态=默认网络状态ZCD_NV_LOGICAL_TYPE值参见4.******************************************************************************8、网络状态的类型://设备的网络状态为恢复的网络状态#define ZDO_INITDEV_RESTORED_NETWORK_STATE 0x00//网络状态初始化,即设备的网络状态为新的网络状态.可能意味着ZCD_NV_STARTUP_OPTION不能恢复,或没有任何网络状态恢复#define ZDO_INITDEV_NEW_NETWORK_STATE 0x01//复位前,网络重返选项为TRUE,因此该设备在网络中没有启动(仅一次),下次调用该函数将启动.#define ZDO_INITDEV_LEAVE_NOT_STARTED 0x02********************************************************************************9、NV条目ZCD_NV_STARTUP_OPTION初始化******************************************************************************** ******************************************************************************** ********************************************************************************分析一:(错误,见分析二;暂不删除)NV条目的初始化在zgInit()中.main()函数中:***************// Initialize basic NV items/*初始化NV条目*/zgInit();***************************************** @fn zgInit** @brief** Initialize the Z-Stack Globals. If an item doesn't exist in* NV memory, write the system default into NV memory. But if* it exists, set the item to the value stored in NV memory.** NOTE: The Startup Options (ZCD_NV_STARTUP_OPTION) indicate* that the Config state items (zgItemTable) need to be* set to defaults (ZCD_STARTOPT_DEFAULT_CONFIG_STATE). The*** @param none** @return ZSUCCESS if successful, NV_ITEM_UNINIT if item did not* exist in NV, NV_OPER_FAILED if failure.*/uint8 zgInit( void ){uint8 i = 0;uint8 setDefault = FALSE;// Do we want to default the Config state valuesif ( zgReadStartupOptions() & ZCD_STARTOPT_DEFAULT_CONFIG_STATE )// 0x01 {setDefault = TRUE;}#if 0 //正常情况下被禁止来节省NV空间// Enable this section if you need to track the number of resets// This section is normally disabled to minimize "wear" on NV memory…………#endif// Initialize the Extended PAN ID as my own extended address//扩展地址ZMacGetReq( ZMacExtAddr, zgExtendedPANID );#ifndef NONWK// Initialize the Pre-Configured Key to the default keyosal_memcpy( zgPreConfigKey, defaultKey, SEC_KEY_LEN ); // Do NOT Change!!!#endif // NONWK//----------------------------------初始化各NV配置状态条目值//初始化NV条目表zgItemTable[ ].如果setDefault=TRUE,则设置为默认//值;否则读取原先存储在里面的值.while ( zgItemTable[i].id != 0x00 ){// Initialize the itemzgItemInit( zgItemTable[i].id, zgItemTable[i].len, zgItemTable[i].buf, setDefault );// Move on to the next itemi++;}//----------------------------------// Clear the Config State default//如果NV条目ZCD_NV_STARTUP_OPTION的ZCD_STARTOPT_DEFAULT_CONFIG_STATE标致位为1if ( setDefault ){//把ZCD_STARTOPT_DEFAULT_CONFIG_STATE标致位清0zgWriteStartupOptions( ZG_STARTUP_CLEAR, ZCD_STARTOPT_DEFAULT_CONFIG_STATE ); }return ( ZSUCCESS );}****************************************NOTE: The Startup Options (ZCD_NV_STARTUP_OPTION) indicatethat the Config state items (zgItemTable) need to beset to defaults (ZCD_STARTOPT_DEFAULT_CONFIG_STATE).开启选项表明了各NV配置状态条目(zgItemTable表中的即为NV配置状态条目)需要被设置为默认值. setDefault的值取决于zgReadStartupOptions(),而这个函数记取的正是ZCD_NV_STARTUP_OPTION的值.****************************************// Reads the ZCD_NV_STARTUP_OPTION NV Item.uint8 zgReadStartupOptions( void ){// Default to Use Config State and Use Network Stateuint8 startupOption = 0;// This should have been done in ZMain.c, but just in case.if ( osal_nv_item_init( ZCD_NV_STARTUP_OPTION,sizeof(startupOption),&startupOption ) == ZSUCCESS ){// Read saved startup control//NV条目ZCD_NV_STARTUP_OPTION值读到startupOptionosal_nv_read( ZCD_NV_STARTUP_OPTION,0,sizeof( startupOption ),&startupOption);}return ( startupOption );}********************************************************************************* @fn zgItemInit()** Initialize a global item. If the item doesn't exist in NV memory,* write the system default (value passed in) into NV memory. But if* it exists, set the item to the value stored in NV memory.** Also, if setDefault is TRUE and the item exists, we will write* the default value to NV space.** @param id - item id* @param len - item len* @param buf - pointer to the item* @param setDefault - TRUE to set default, not read* TRUE则设置为默认值而不读取原先的值* @return ZSUCCESS if successful, NV_ITEM_UNINIT if item did not * exist in NV, NV_OPER_FAILED if failure.*/static uint8 zgItemInit( uint16 id, uint16 len, void *buf, uint8 setDefault ) {uint8 status;// If the item doesn't exist in NV memory, create and initialize// it with the value passed in.status = osal_nv_item_init( id, len, buf ); //NV条目读写前要进行条目的初始化if ( status == ZSUCCESS ){if ( setDefault ) //条目存在,setDefault=TRUE,设置为默认值{// Write the default value back to NVstatus = osal_nv_write( id, 0, len, buf );}else//条目存在,setDefault=FALSE,读取原先存储的值{// The item exists in NV memory, read it from NV memorystatus = osal_nv_read( id, 0, len, buf );}}return (status);}****************************************zgReadStartupOptions()中:Default to Use Config State and Use Network State说明采用默认的配置和网络状态,那设备初始启动时ZCD_NV_STARTUP_OPTION值应该是默认配置标志位和默认网络标志位都置1,两者相或0x03(见7),但还没能找到究竟哪里进行过初始化.回到zgInit():(1)setDefault = FALSE;(2)读取ZCD_NV_STARTUP_OPTION值如果ZCD_STARTOPT_D EFAULT_CONFIG_STATE标志位为1,设置setDefault = TRUE;(3)初始化NV配置状态条目表zgItemTa ble[ ]中各条目为默认值(4)清除ZCD_STARTOPT_DEFAULT_CONFIG_STATE标志位.至于清除ZCD_STARTOPT_DEFAULT_CONFIG_STATE标志位,我想如果用户不改变ZCD_NV_STAR TUP_OPTION条目的值,设备每次重启都会将NV条目表中各项初始化为默认值:比如SampleApp例子,每次设备重启配置状态都为默认值.而如果用户改变了ZCD_NV_STARTUP_OPTION的值,比如SimpleApp 中:zb_ReadConfiguration( ZCD_NV_STARTUP_OPTION, sizeof(uint8), &startOptions );startOptions = ZCD_STARTOPT_AUTO_START;zb_WriteConfiguration( ZCD_NV_STARTUP_OPTION, sizeof(uint8), &startOptions );zb_SystemReset();每次按键后都会先把设备逻辑状态写入NV中(准备下次启动设备时以保存在这个NV条目里的逻辑类型来启动),然后把ZCD_NV_STARTUP_OPTION设为ZCD_STARTOPT_AUTO_START 0x04,则下面两个标志位都为0.ZCD_STARTOPT_DEFAULT_CONFIG_STATE 0x01 //默认配置状态:存储配置信息ZCD_STARTOPT_DEFAULT_NETWORK_STATE 0x02 //默认网络状态:存储网络信息这样系统重启进入zgInit()后:if ( zgReadStartupOptions() & ZCD_STARTOPT_DEFAULT_CONFIG_STATE )// 0x01{setDefault = TRUE;}ZCD_STARTOPT_DEFAULT_CONFIG_STATE标志位不为1,setDefault保持FALSE,因而进入NV配置状态条目初始化zgItemInit()时,执行的是:else //条目存在,setDefault=FALSE,读取原先存储的值{// The item exists in NV memory, read it from NV memorystatus = osal_nv_read( id, 0, len, buf );}这样把上次存储在NV条目ZCD_NV_LOGICAL_TYPE中的设备逻辑类型值读出作为此次NV条目ZCD _NV_LOGICAL_TYPE的值.问题是,还未确定开启选项ZCD_NV_STARTUP_OPTION的值初始化的地方.纠结中,待解决……************************************************************************************************************************************************************************************************************************************************分析二:@@@ZCD_NV_STARTUP_OPTION最开始在osal_nv_item_init()中初始化,初始化为0***************************************** @fn zgInit** @brief** Initialize the Z-Stack Globals. If an item doesn't exist in* NV memory, write the system default into NV memory. But if* it exists, set the item to the value stored in NV memory.** NOTE: The Startup Options (ZCD_NV_STARTUP_OPTION) indicate* that the Config state items (zgItemTable) need to be* set to defaults (ZCD_STARTOPT_DEFAULT_CONFIG_STATE). The*** @param none** @return ZSUCCESS if successful, NV_ITEM_UNINIT if item did not* exist in NV, NV_OPER_FAILED if failure.*/uint8 zgInit( void ){uint8 i = 0;uint8 setDefault = FALSE;// Do we want to default the Config state valuesif ( zgReadStartupOptions() & ZCD_STARTOPT_DEFAULT_CONFIG_STATE ) // 0x01{setDefault = TRUE;}#if 0 //正常情况下被禁止来节省NV空间// Enable this section if you need to track the number of resets// This section is normally disabled to minimize "wear" on NV memory…………#endif// Initialize the Extended PAN ID as my own extended address//扩展地址ZMacGetReq( ZMacExtAddr, zgExtendedPANID );#ifndef NONWK// Initialize the Pre-Configured Key to the default keyosal_memcpy( zgPreConfigKey, defaultKey, SEC_KEY_LEN ); // Do NOT Change!!!#endif// NONWK//----------------------------------初始化各NV配置状态条目值//初始化NV条目表zgItemTable[ ].如果setDefault=TRUE,则设置为系统默认//值;否则设置为原先存储在里面的值.while ( zgItemTable[i].id != 0x00 ){// Initialize the itemzgItemInit( zgItemTable[i].id, zgItemTable[i].len, zgItemTable[i].buf, setDefault );// Move on to the next itemi++;}//----------------------------------// Clear the Config State default//如果NV条目ZCD_NV_STARTUP_OPTION的ZCD_STARTOPT_DEFAULT_CONFIG_STATE标致位为1if ( setDefault ){ //把ZCD_STARTOPT_DEFAULT_CONFIG_STATE标致位清0zgWriteStartupOptions( ZG_STARTUP_CLEAR, ZCD_STARTOPT_DEFAULT_CONFIG_STATE ); }return ( ZSUCCESS );}****************************************首先来看下zgReadStartupOptions():****************************************// Reads the ZCD_NV_STARTUP_OPTION NV Item.uint8 zgReadStartupOptions( void ){// Default to Use Config State and Use Network Stateuint8 startupOption = 0;// This should have been done in ZMain.c, but just in case.//能返回ZSUCCESS,说明条目已经存在;当然,如果不存在,还是在osal_nv_item_init //中创建条目并设置为startupOption的值.if ( osal_nv_item_init( ZCD_NV_STARTUP_OPTION,sizeof(startupOption),&startupOption ) == ZSUCCESS ){// Read saved startup control//NV条目ZCD_NV_STARTUP_OPTION值读到startupOptionosal_nv_read( ZCD_NV_STARTUP_OPTION,0,sizeof( startupOption ),&startupOption);}return ( startupOption );}****************************************这里读取ZCD_NV_STARTUP_OPTION NV值,再来看下osal_nv_item_init(): ***************************************** @fn osal_nv_item_init** @brief If the NV item does not already exist, it is created and* initialized with the data passed to the function, if any.* This function must be called before calling osal_nv_read() or* osal_nv_write().如果条目不存在,则创建并初始化为传递过来的值.如果存在,直接返回ZSUCCESS.这个必须在read和write之前调用.** @param id - Valid NV item Id.* @param len - Item length.* @param *buf - Pointer to item initalization data. Set to NULL if none.* 条目初始化时的值.* @return NV_ITEM_UNINIT - Id did not exist and was created successfully. * ZSUCCESS - Id already existed, no action taken.* NV_OPER_FAILED - Failure to find or create Id.*/uint8 osal_nv_item_init( uint16 id, uint16 len, void *buf )/* Global fail flag for fail due to low bus voltage has less impact on code* size than passing back a return value all the way from the lowest level.*/failF = FALSE;// ZCD_NV_EXTADDR is maintained without an osalNvHdr_t, so it is always alreadyinitialized.//条目已经存在,则直接返回ZSUCCESSif ( (id == ZCD_NV_EXTADDR) || (findItem( id ) != OSAL_NV_ITEM_NULL) ){return ZSUCCESS; //只有条目已经存在了,才会返回ZSUCCESS}//条目不存在,则通过initItem创建条目并初始化为buf传递过来的值else if ( initItem( TRUE, id, len, buf ) ){if ( failF ){(void)initNV(); // See comment at the declaration of failF.return NV_OPER_FAILED;}else{return NV_ITEM_UNINIT;}}else{return NV_OPER_FAILED;}}****************************************在zgReadStartupOptions()中调用了osal_nv_item_init( ZCD_NV_STARTUP_OPTION,sizeof(startupOpti on),&startupOption );其中startupOption = 0;一开始并不存在ZCD_NV_STARTUP_OPTION这个NV 条目,因而这里会创建NV条目ZCD_NV_STARTUP_OPTION并初始化为startupOption传递过来的值0.成功则返回NV_ITEM_UNINIT,因而不会调用zgReadStartupOptions()的osal_nv_read( ZCD_NV_STAR TUP_OPTION,0,sizeof( startupOption ),&startupOption),最后返回startupOption=0.回到zgInit(),setDefa ult = FALSE保持不变,然后进入NV配置状态条目初始化zgItemInit( zgItemTable[i].id, zgItemTable[i]. len, zgItemTable[i].buf, setDefault ),注意此时传递进去的值zgItemTable[i].buf已经定义为系统默认值(可以查看ZGlobals.c的NWK GLOBAL VARIABLES栏).看下zgItemInit():***************************************** @fn zgItemInit()** @brief* Initialize a global item. If the item doesn't exist in NV memory,* write the system default (value passed in) into NV memory. But if* it exists, set the item to the value stored in NV memory.* 条目不存在,创建并设置为传递过来的值;存在则设置为原存储的值.* Also, if setDefault is TRUE and the item exists, we will write* the default value to NV space.** @param id - item id* @param len - item len* @param buf - pointer to the item* @param setDefault - TRUE to set default, not read** @return ZSUCCESS if successful, NV_ITEM_UNINIT if item did not* exist in NV, NV_OPER_FAILED if failure.*/static uint8 zgItemInit( uint16 id, uint16 len, void *buf, uint8 setDefault ){uint8 status;// If the item doesn't exist in NV memory, create and initialize// it with the value passed in.status = osal_nv_item_init( id, len, buf );//NV条目读写前都要进行条目的初始化//这里是要status == ZSUCCESS才会执行里面的内容,说明//此NV条目是已经存在的,这样才会返回ZSUCCESSif ( status == ZSUCCESS ){if ( setDefault ) //条目存在,设置为默认值{// Write the default value back to NVstatus = osal_nv_write( id, 0, len, buf );}else //条目存在,读取原先存储的值{// The item exists in NV memory, read it from NV memorystatus = osal_nv_read( id, 0, len, buf );}}return (status);}****************************************可以看到同样调用了osal_nv_item_init( id, len, buf ),如果条目不存在则创建并设置为buf传递过来的值,如果存在则直接返回ZSUCCESS.一开始各NV配置状态条目不存在,因而这里创建各条目并设置为buf传递过来的值(系统定义的默认值).回到zgInit(),各NV配置状态条目初始化完成后,返回ZSUCCESS.因为此时setDefault保持FALSE不变,因而不会执行zgWriteStartupOptions( ZG_STARTUP_CLEAR, ZCD_ST ARTOPT_DEFAULT_CONFIG_STATE );以上为NV条目的初始化流程.初始化时ZCD_NV_STARTUP_OPTION=0,即把各NV条目初始化为系统默认的值.想到zgReadStartupOptions()开头那句话:// Default to Use Config State and Use Network Stateuint8 startupOption = 0;startupOption即为ZCD_NV_STARTUP_OPTION的初始化值.(###)如果,这样初始化完成后,又在应用程序中改变ZCD_NV_STARTUP_OPTION的值,改为ZCD_START OPT_DEFAULT_CONFIG_STATE.然后zb_SystemReset()重启系统.进入zgInit(),首先设置setDefault = FALSE,然后同样进入判断:if ( zgReadStartupOptions() & ZCD_STARTOPT_DEFAULT_CONFIG_STATE )// 0x01{setDefault = TRUE;}调用:zgReadStartupOptions()->osal_nv_item_init(),因为此时NV条目ZCD_NV_STARTUP_OPTION已经存在,所以osal_nv_item_init()不会再创建条目并设置为传递过来的值startupOption = 0,而是直接返回ZS UCCESS,因而这时在zgReadStartupOptions()里会调用osal_nv_read( ZCD_NV_STARTUP_OPTION,0,s izeof( startupOption ),&startupOption)读取先前已经存储在条目ZCD_NV_STARTUP_OPTION里的值: ZCD_STARTOPT_DEFAULT_CONFIG_STATE!所以这里设置setDefault = TRUE.然后进入各NV配置状态条目初始化:zgItemInit( zgItemTable[i].id, zgItemTable[i].len, zgItemTable[i].buf, setDefault );进入zgItemInit(),同样先调用了osal_nv_item_init( id, len, buf ),因为各NV配置状态条目已经存在,所以不再创建而是直接返回ZSUCCESS,所以这次会调用:if ( status == ZSUCCESS ){if ( setDefault ) //条目存在,设置为默认值{// Write the default value back to NVstatus = osal_nv_write( id, 0, len, buf );}else//条目存在,设置为原先存储的值{// The item exists in NV memory, read it from NV memorystatus = osal_nv_read( id, 0, len, buf );}}因为setDefault = TRUE,所以重新设置各NV配置状态条目为系统默认值.然后回到zgInit(),最终调用if ( setDefault ){ //把ZCD_STARTOPT_DEFAULT_CONFIG_STATE这位清0zgWriteStartupOptions( ZG_STARTUP_CLEAR, ZCD_STARTOPT_DEFAULT_CONFIG_STATE ); }这里把ZCD_NV_STARTUP_OPTION条目值重新清0(我上面只假设ZCD_NV_STARTUP_OPTION的值为ZCD_STARTOPT_DEFAULT_CONFIG_STATE 0x01).(###)当然,如果像SampleApp例子没有在应用程序中修改过ZCD_NV_STARTUP_OPTION,最开始启动设备时会创建条目并初始化为0(startupOption = 0),然后创建各NV配置状态条目并初始化为系统默认值.以后的每次设备启动,ZCD_NV_STARTUP_OPTION值为0,setDefault = FALSE,各NV配置状态条目初始化执行的是:else//条目存在,设置为原先存储的值{// The item exists in NV memory, read it from NV memorystatus = osal_nv_read( id, 0, len, buf );}读取此前的配置状态.(###)再比如SimpleApp例子,应用程序通过按键改变NV条目ZCD_NV_STARTUP_OPTION以及NV配置状态条目ZCD_NV_LOGICAL_TYPE的值,通过zb_WriteConfiguration()写入NV中,然后zb_SystemRe set()重启系统.进入zgInit(),通过zgReadStartupOptions()读出的ZCD_NV_STARTUP_OPTION值不为ZC D_STARTOPT_DEFAULT_CONFIG_STATE,因而setDefault = FALSE.再进入zgItemInit(),因为条目存在且setDefault = FALSE,所以执行// The item exists in NV memory, read it from NV memorystatus = osal_nv_read( id, 0, len, buf );把条目的值设置为先前存储的值.即在SampleApp例子中,把上次存储在NV条目ZCD_NV_LOGICAL_TY PE中的设备逻辑类型值读出作为此次NV条目ZCD_NV_LOGICAL_TYPE的值.(1)初始ZCD_NV_STARTUP_OPTION=0.如果设备是首次启动,则调用status = osal_nv_item_init( id, len, buf )创建各NV配置状态条目并初始化为系统默认值;如果设备不是首次启动,则调用osal_nv_read( id, 0, len, buf )读取各NV配置状态条目先前存储的值作为本次的值.(2)设置ZCD_NV_STARTUP_OPTION=ZCD_STARTOPT_DEFAULT_CONFIG_STATE.NV条目ZCD_ NV_STARTUP_OPTION已经存在,调用osal_nv_write( id, 0, len, buf )设置各NV配置状态条目为系统默认值.最后把这位清0.(3)设置ZCD_NV_STARTUP_OPTION=ZCD_STARTOPT_AUTO_START.NV条目ZCD_NV_STARTUP _OPTION已经存在,调用osal_nv_read( id, 0, len, buf )读取各NV配置状态条目先前存储的值作为本次的值.********************************************************************************************************************************************************************************************************************************************************************************************************************************。

zigbee数传电台快速建立zigbee网络的入门教程

zigbee数传电台快速建立zigbee网络的入门教程

zigbee数传电台快速建立zigbee网络的入门教程
为了让用户能快速熟悉基于zigbee3.0技术的zigbee数传电台,本文将引导用户结合上位机进行经过简单配置搭建一个ZigBee网络,包括节点类型配置、PANID设置、信道设置、发射功率设置。

1、快速入门建立一个ZigBee网络
结合上位机软件快速简单的建立一个ZigBee网络,具体步骤如下:
(1)将电台连接电脑,打开上位机软件“亿佰特ZigBee3.0上位机”,选择设备类型,选择串口号,选择串口波特率(默认115200kbps),点击打开串口。

(2)模组出厂为HEX指令配置模式,E180-DTU如果处于AT指令模式,需要切换至HEX指令模式,点击“读取参数”,消息框提示“读取参数成功”,主要的网络参数包括:长地址,电台类型默认为协调器(如果不是请设置成协调器),网络状态是"not have"(如果不是需要退出网络或恢复出厂)。

如果读取参数无效,有可能模组当前为传输模式,需要点击“进入配置模式”,消息框提示“进入配置状态成功”。

(3)点击“开始配网”,协调建立一个开放网络,协调器新建网络后会持续180秒开放网络,LINK灯1Hz闪烁,路由器和终端可以在这个时间内加入网络。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
return ( networkStateNV ); }
************************************** 分两种情况: (1)如果终端预编译了 NV_RESTORE,且函数 ZDApp_ReadNetworkRestoreState()返回值为 ZDO_INITDEV_RESTORED_NETWORK_STATE,则进入 ZDApp_RestoreNetworkState(),因为这是终端,因此只是设 置 devStartMode = MODE_RESUME. **************** uint8 ZDApp_RestoreNetworkState( void ) { ………… // Are we a coordinator //设备的网络状态为恢复的网络状态.则进入这个函数进行恢复 //先判断如果短地址为 0 则设置设备逻辑类型为协调器且 devStartMode = MODE_RESUME //否则设置 devStartMode = MODE_RESUME ZDAppNwkAddr.addr.shortAddr = NLME_GetShortAddr(); if ( ZDAppNwkAddr.addr.shortAddr == 0 ) //如果短地址是 0,即协调器 { ZDO_Config_Node_Descriptor.LogicalType = NODETYPE_COORDINATOR; //!!!!! } devStartMode = MODE_RESUME; //MODE_RESUME!!!!!!!! ………… } **************** (2)如果终端没有预编译 NV_RESTORE,networkStateNV ==ZDO_INITDEV_NEW_NETWORK_STATE,但由于终端没 有编译 SOFT_START,因此 ZDAppDetermineDeviceType()不起作用.因此 ZDO_Config_Node_Descriptor.LogicalType 和 devStartMode 这两个关键参数保持初始化时的值: ZDO_Config_Node_Descriptor.LogicalType = NODETYPE_DEVICE(见基本问题说明 6) devStartMode = MODE_JOIN(见基本问题说明 4)
2、具体流程 main()->osal_init_system()->osalInitTasks()->ZDApp_Init() 进入 ZDApp_Init()函数: ************************************** ************************************** void ZDApp_Init( byte task_id ) { uint8 capabilities;
//如果设备的网络状态为恢复的网络状态 if ( networkStateNV == ZDO_INITDEV_RESTORED_NETWORK_STATE ) { //恢复先前网络状态并把 devStartMode = MODE_RESUME!!!! networkStateNV = ZDApp_RestoreNetworkState(); } else //如果设备的网络状态为新的网络状态,在下面进行处理 { // Wipe out(清除) the network state in NV NLME_InitNV(); NLME_SetDefaultNV(); //设置默认 NV 条目 } #endif
+ (osal_rand() & EXTENDED_JOINING_RANDOM_MASK)); }
// Initialize device security ZDApp_SecIபைடு நூலகம்it( networkStateNV );
// Trigger the network start ZDApp_NetworkInit( extendedDelay );
使用的协议栈版本信息: ZigBee2006\ZStack-1.4.3-1.2.1
Zigbee 网络设备启动流程—终端(自启动模式)—以 SampleApp 的终端为例.
1、终端预编译信息 通过 project->options->c/c++compiler->extraOptions 可以看到终端所带的配置文件为: -f $PROJ_DIR$\..\..\..\Tools\CC2430DB\f8wEndev.cfg -f $PROJ_DIR$\..\..\..\Tools\CC2430DB\f8wConfig.cfg RFD 设备,没有编译 ZDO_COORDINATOR 和 RTR_NWK.
// Start the device? if ( devState != DEV_HOLD ) { ZDOInitDevice( 0 ); } /*如果 devState=DEV_HOLD,则不会调用 ZDOInitDevice()来初始化网络 即不组网也不进网.LED4 闪烁等待应用程序来开启设备并初始化网络 */ else { // Blink LED to indicate HOLD_START HalLedBlink ( HAL_LED_4, 0, 50, 500 ); }
// Save the task ID ZDAppTaskID = task_id;
// Initialize the ZDO global device short address storage ZDAppNwkAddr.addrMode = Addr16Bit; ZDAppNwkAddr.addr.shortAddr = INVALID_NODE_ADDR; //0xFFFE (void)NLME_GetExtAddr(); // Load the saveExtAddr pointer.
// Check for manual"Hold Auto Start" //检测到有手工设置 SW_1 则会设置 devState = DEV_HOLD,从而避开网络初始化 ZDAppCheckForHoldKey();
// Initialize ZDO items and setup the device - type of device to create. ZDO_Init(); //通过判断预编译来开启一些函数功能
通过 project->options->c/c++compiler->Preprocessor->Defined symbols 可以看到终端预编译包含了: CC2430EB;NWK_AUTO_POLL;ZTOOL_P1;MT_TASK;LCD_SUPPORTED=DEBUG 没有编译 HOLD_AUTO_START 和 SOFT_START.
对于终端,这两种情况最终都是确定两个关键设备网络状态参数的值.对本例的 SampleApp 的终端,没有编 译 NV_RESTORE,因此属于情况(2). 然后调用 ZDApp_NetworkInit()启动网络: **************** void ZDApp_NetworkInit( uint16 delay )
else { // Determine if NV should be restored //函数返回的设备网络状态要么是新的网络状态;要么是恢复的网络状态;以此 //来确定要不要读取 NV 里相应条目来恢复网络先前状态 networkStateNV = ZDApp_ReadNetworkRestoreState(); }
devState = DEV_INIT; // Remove the Hold state
// Initialize leave control logic //函数读取 NV 项目 ZCD_NV_LEAVE_CTRL 的值,ZDApp_LeaveCtrl 指向这个值 ZDApp_LeaveCtrlInit();
#if defined ( NV_RESTORE ) // Get Keypad directly to see if a reset nv is needed. // Hold down the SW_BYPASS_NV key (defined in OnBoard.h) // while booting(引导) to skip past NV Restore. if ( HalKeyRead() == SW_BYPASS_NV ) //SW_BYPASS_NV 按键处于按下状态时,则避开网络层的 NV 存储 networkStateNV = ZDO_INITDEV_NEW_NETWORK_STATE; //设备网络状态为新的网络状态
// Register the endpoint description with the AF // This task doesn't have a Simple description, but we still need // to register the endpoint. afRegister( (endPointDesc_t *)&ZDApp_epDesc );
//如果设备的网络状态为新的网络状态 if ( networkStateNV == ZDO_INITDEV_NEW_NETWORK_STATE ) { //根据预编译来设置设备新的网络状态参数 ZDAppDetermineDeviceType(); /*!!!!*/
// Only delay if joining network - not restoring network state extendedDelay = (uint16)((NWK_START_DELAY + startDelay)
// Check leave control reset settings ZDApp_LeaveCtrlStartup( &devState, &startDelay );
相关文档
最新文档