🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
>[success] 导师视频讲解:[**去听课**](https://www.bilibili.com/video/BV1k34y1D7Vz?p=35) >[success] **技术支持说明:** >**1**.一般以自主学习为主 > **2**.可到官方问答社区中提问:[**去提问**](https://bbs.csdn.net/forums/zigbee) > **3**.工程师**会尽快**解答社区问题,但他们是一线开发,【**难以保证**】解答时效,解答辛苦,感谢理解! <br/> 上节课学习了BDB Commissioning Modes基本原理之后,本节课讲解怎么样实现设备之间的网络组建。 <br/> ## **裁剪应用层UI** 协议栈裁剪是开发者需要掌握的一项技术,因为 Z-Stack 3.0 包含了丰富的功能,但是在实际的开发过程中,部分功能可能是冗余的,甚至会影响到开发过程。 ### 打开本章节配套的工程代码,展开App层代码,如图所示。 ![](https://img.kancloud.cn/90/30/90302816b35d735710bcb1f60e371e15_426x342.png =300x) 红框中的两个文件是针对TI的评估板而设计的UI,在产品开发过程并不需要用到,而且还会影响其他的开发工作,因此需要把它们裁剪掉。右击文件,选择Remove,如图所示。 ![](https://img.kancloud.cn/d8/d7/d8d7dfc896e8e6bf6c72b4539ec3348c_1440x1558.png =300x) ### 裁剪后如图所示。 ![](https://img.kancloud.cn/80/dd/80ddedfc7e1252fcdb9dedb241f43731_428x192.png =300x) <br/> zcl\_samplesw.c文件中会调用到这些UI,也需要把其全部删除。点击Edit,然后选择Find and Replace→Find in Files...,如图所示。 ![](https://img.kancloud.cn/37/9e/379e81e8bf4d8aa906549c9d57e14351_782x564.png =500x) ### 在弹出的窗口中输入“UI\_”,然后点击Find按钮,如图所示。 ![](https://img.kancloud.cn/56/ab/56ab4c80e29cb420c089d573310cf814_740x618.png =350x) ### 最后,在文件zcl\_samplesw.c中根据搜索结果,一个一个地把带“UI\_”的地方删除,如图所示。 ![](https://img.kancloud.cn/17/da/17dad058cf317a823b2274c9f8d655df_696x298.png =600x) ### 正确删除完成后,工程代码是可以编译通过的。 <br/> ## **编写设备组网代码** 如同前面章节所述,设备组网代码非常简单: * 第一步,调用bdb\_StartCommissioning()让协调器创建网络。 * 第二步,还是调用bdb\_StartCommissioning(),让其他设备加入到网络。 ### **角色判断** 在编译工程的时候,可以选择让编译出来的程序工作在协调器中、路由器中或者终端中,即选择设备在ZigBee网络中的角色。在代码中,可以利用宏ZDO\_COORDINATOR来判断当前的工作模式,判断方法是如果宏ZDO\_COORDINATOR被定义了,那么说明程序工作在协调器环境中,否则就是工作在路由器或者终端环境中。 ### **编写代码** 在zcl\_samplesw.c的初始化函数zclSampleSw_Init()中添加如下代码: ``` #ifdef ZDO_COORDINATOR bdb_StartCommissioning( BDB_COMMISSIONING_MODE_NWK_FORMATION | BDB_COMMISSIONING_MODE_FINDING_BINDING ); NLME_PermitJoiningRequest(255); #else bdb_StartCommissioning( BDB_COMMISSIONING_MODE_NWK_STEERING | BDB_COMMISSIONING_MODE_FINDING_BINDING ); #endif ``` 代码比较简单,如果是协调器那么就让协调器创建网络,如果是路由器或者终端那么就加入到网络。 ### 其中的NLME\_PermitJoiningRequest(255)是允许其他设备加入到由本协调器创建的网络中,这一点在介绍Network Formation时也有讲述过,也就是设备要经过信任中心的同意才能加入到网络中。参数255表示一直允许,如果改为0则表示一直不允许;如果改为1~254表示在1~254秒内允许。 <br/> ## **处理设备入网失败** 然而,设备入网的过程可能会受到多种因素的影响,从而导致入网失败,例如在入网过程信号受到干扰等。开发者需要学会处理设备入网失败。一种简单而有效的办法就是在设备入网失败后,让设备自动重新尝试入网。 ### 在zcl\_samplesw.c文件中可以找到一个zclSampleSw\_ProcessCommissioningStatus()函数,这个函数的作用是处理Commissioning结果,例如协调器创建网络是否成功、设备是否成功加入到网络等。 ### 可以在这个函数中根据Commissioning的结果采取相应的处理,例如在设备入网失败后重新调用bdb_StartCommissioning()来再次入网。 ### 可以用事件的机制来实现这个过程,当设备入网失败后就启动一个事件,让程序在1s后重新尝试入网。Z-Stack 3.0的事件使用方法在前面的章节已经讲解过了,这里就不再讲了,而是直接使用。 ### 1.在头文件zcl\_samplesw.h定义一个用户事件,并且定义重新入网的时间间隔,代码如下: ``` /* 协调器 */ #ifdef ZDO_COORDINATOR /* 路由器或者终端 */ #else // 重新加入事件 #define SAMPLEAPP_REJOIN_EVT 0x0100 // 时间间隔:1000ms(1秒) #define SAMPLEAPP_REJOIN_PERIOD 1000 #endif ``` 由于设备入网是针对路由器或者终端类型的ZigBee设备的,因此同样地使用了宏来判断程序角色。 <br/> 2.在函数zclSampleSw\_ProcessCommissioningStatus中找到找到入网失败处理位置,如图所示。 ![](https://img.kancloud.cn/bf/0b/bf0b683a86940fb9f98ab3641ad049fc_2560x1282.png =500x) <br/> 3.在入网失败的位置添加如下代码: ``` /* 协调器 */ #ifdef ZDO_COORDINATOR /* 路由器或者终端 */ #else /* 启动重新加入事件 */ osal_start_timerEx(zclSampleSw_TaskID, SAMPLEAPP_REJOIN_EVT, SAMPLEAPP_REJOIN_PERIOD); #endif ``` 代码中,首先判断设备角色,然后启动刚才定义的事件。 开发者也可以在入网成功的位置添加一些代码,例如在显示器上显示入网成功的信息等。 <br/> 3.在应用层事件处理函数zclSampleSw_event_loop()中处理该事件,也就是重新启动入网,代码如下。 ``` #ifdef ZDO_COORDINATOR #else if ( events & SAMPLEAPP_REJOIN_EVT )//如果事件类型为重新加入网络事件 { /* 重新加入网络 */ bdb_StartCommissioning(BDB_COMMISSIONING_MODE_NWK_STEERING | BDB_COMMISSIONING_MODE_FINDING_BINDING ); return ( events ^ SAMPLEAPP_REJOIN_EVT ); } #endif ``` <br/> ## **编译下载** **角色选择** 前文中多次提及到设备的网络角色,其实在编译代码的时候可以选择不同的网络角色,从而编写不同角色的程序。 ### 在工程中单击选项卡,可以看到如图所示的选择框,可以选择待开发设备的对应的工作模式。 ![](https://img.kancloud.cn/df/4b/df4bd4269b483d554bbbc88de8915732_1440x1781.png =300x) ### 其中CoordinatorEB、RouterEB、EndDeviceEB的含义分别是: (1)CoordinatorEB:协调器角色设备。 (2)RouterEB:路由器角色设备。 (3)EndDeviceEB:终端角色设备。 ### 除了此之外,还有EndDeviceEB-OTAClient和RouterEB-OTAClient,其实这两个指的是带OTA功能的终端设备和带OTA功能的路由设备。 <br/> **使用角色** 首先选择CoordinatorEB,如图所示,编译完成后下载到其中一块开发板中,建议使用ZigBee Mini板。此开发板在ZigBee网络中会充当协调器角色设备。 ![](https://img.kancloud.cn/7f/fd/7ffd169fdc3f549752b4d07f77e15e9b_478x386.png =300x) ### 接着选择RouterEB,如图所示。同样编译完成后下载到另一个板子中,建议使用ZigBee标准板。此开发板ZigBee网络中即会充当路由器角色设备。 ![](https://img.kancloud.cn/08/e6/08e6c2096f30057246d337c92da612f5_474x246.png =300x) ### >[danger] 注意:切换工程后,同样需要在工程的预编译那里开启LED、串口、显示屏等功能,并且把屏幕的路径加入到工程中。 <br/> ## **仿真调试** 给协调器上电后,协调器会自动创建网络。创建网络成功后,在屏幕上可以看到网络ID(PanID),如图所示。 ![](https://img.kancloud.cn/5c/8d/5c8df5cbbf72eda8d22bffe7ee7ea853_308x194.png =200x) ### 接着给路由器或终端上电后,它会自动加入到由协调器创建的网络中,加入后可以在屏幕上看到被分配到的网络地址和父节点的网络地址,路由器或终端设备加入后如图所示。 * 路由器 ![](https://img.kancloud.cn/ac/b2/acb2d134a5a00513e2a4f0f7643cccfe_270x210.png =200x) ### * 终端 ![](https://img.kancloud.cn/d4/13/d413f7323a5bf5e5b111b21c46b26c2f_240x184.png =200x) <br/> <br/> ## **项目定制** * 如需项目定制开发,可扫码添加项目经理好友(注明“**项目定制**”) * 定制范围:**NB-IoT**、**CATn(4G)**、**WiFi**、**ZigBee**、**BLE Mesh**以及**STM32**、**嵌入式Linux**等IoT技术方案 * 善学坊官网:[www.sxf-iot.com](https://www.sxf-iot.com/) ![](https://img.kancloud.cn/ca/73/ca739f92cab220a3059378642e3bd502_430x430.png =200x) * 非项目定制**勿扰**,此处**非**技术支持