相关系列文章
基于芯科Host-NCP解决方案的Zigbee 3.0 Gateway技术研究(-)-Z3GatewayHost应用搭建
基于芯科Host-NCP解决方案的Zigbee 3.0 Gateway技术研究(二)-使用gateway-management-ui
基于芯科Host-NCP解决方案的Zigbee 3.0 Gateway技术研究(三)-移植到ESP32平台(1)
基于芯科Host-NCP解决方案的Zigbee 3.0 Gateway技术研究(三)-移植到ESP32平台(2)
基于芯科Host-NCP解决方案的Zigbee 3.0 Gateway技术研究(四)-移植到STM32平台
概要
最近一段时间,因为需要开发一款包含zigbee 3.0功能的融合通讯网关,所以花费了一段较长的时间来研究Silicon Labs的Host-NCP应用框架。主要的工作包括Silicon Labs官方SDK中推荐的基于Ubuntu环境下的项目搭建、代码编译、功能验证等工作。
同时,为了兼顾在不同应用场景下的开发需求,也把对应的Host部分移植到了ESP32、STM32等嵌入式环境中,中间碰到了不少困难和问题,现把一些关键内容、操作过程、注意事项进行记录,为以后相关开发做一个指引和帮助。(一些关于Silicon Labs项目的基础概念、代码生成、插件配置就不做详细记录了,网上也有很多相关的文章可以参考)。
参考文档
Host-NCP的基本架构和基于Simplicity Studio软件的项目创建,请参考以下文章(感谢相关文章作者的分享,在此借以引用参考,如有涉及版权问题,请及时联系我)
1.作者GOING BRYOND LIMITS 关于EFR32xG21搭建网关的一系列文章(建议按顺序全部阅读一次)
1)《EFR32xG21搭建网关demo - 概览》:https://blog.csdn.net/xingzhibo/article/details/104535007
2)《EFR32xG21搭建网关demo - bootloader》https://blog.csdn.net/xingzhibo/article/details/107808462
3)《EFR32xG21搭建网关demo -ncp-uart-sw》https://blog.csdn.net/xingzhibo/article/details/107841658
4)《EFR32xG21搭建网关demo - Z3GatwayHost应用》 https://blog.csdn.net/xingzhibo/article/details/107907184
2.Silicon Labs官方的gateway开发指导手册:《ug129-zigbee-gateway-ref-design-guide.pdf》
3.Silicon Labs官方在B站上的视频教学(其中LCGW-Training-Day 3-1_Intro为gateway在freeRTOS中的移植介绍)https://space.bilibili.com/605447248/channel/detail?cid=154303
4.Silicon Labs官方在github上的教学资源https://github.com/MarkDing/IoT-Developer-Boot-Camp/wiki/Zigbee
开发工具和SDK
- 芯科EmberZNet SDK 6.7.5.0
- Simplicity Studio V4
Host软硬件环境
Host环境 | 型号 | 操作系统 | 编译工具链 | 包含功能 | 可用性 | 移植工作量 |
PC | 虚拟机:2核CPU,4G内存,50G硬盘 | Ubuntu18.04 | gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04) | 全部功能:设备入网、设备管理、命令行控制、设备绑定、OTA升级、mqtt对接等 | 非常稳定,可用性高。 | 无 |
ESP32 | ESP32-WROOM-32D Flash:8MB SRAM :536KB | freeRTOS | xtensa-esp32-elf-gcc gcc version 8.2.0 (crosstool-NG esp-2019r2) | 大部分功能:设备入网、设备管理、命令行控制、设备绑定、OTA升级、mqtt对接等 | 比较稳定,可用性高。 | 较小。 生成给ESP32调用的静态库,大概需要调整10几处 |
STM32 | STM32F407VGT6 核心版 Flash:1MB SRAM :192+4KB | freeRTOS | gcc version 10.2.1 20201103 (release) (GNU Arm Embedded Toolchain 10-2020-q4-major) | 部分功能:设备入网、设备管理、命令行控制、设备绑定、mqtt对接 | 不稳定,主要引发异常的地方是使用esp8266连接互联网、mqtt部分。 | 较多。 生成给STM32调用的静态库,大概需要调整20几处;如果需要连接mqtt,需要引入带mqtt功能的esp8266模块。 |
NCP软硬件环境
使用EFR32MG21A020F768IM32模组(某宝上购买)作为NCP
在Silicon Labs官方的开发指导文档中,操作过程一般都是基于他们的开发板来进行的;所以如果没有开发板,直接使用模组进行开发的,需要做以下调整
1)bootloader-uart-xmodem项目Plugin中的GPIO activation 需要配置BTL_BUTTON的管脚,否则可能编译时会出现错误信息,无法编译通过。(我这里是随便配的,只要和host-ncp的串口通讯管脚不冲突即可)
2)ncp-uart-sw项目Plugin中的NCP-Uart需要配置ncp通讯使用的uart端口和uart管脚。
配置uart通讯端口
配置uart管脚
备注:如果后续要把模组用于其他项目的测试,不再作为NCP使用;例如测试官方的Z3LightSoc、Z3SwitchSoc例子,记得要先重新烧录合适的bootloader进行替换,例如bootloader-storage-internal-single固件;否则可能出现模组没有响应,或Z3LightSoc、Z3SwitchSoc应用无法正常加载的情况。
Host工程配置注意事项
1.默认的Host工程生成后,是不带mqtt功能的,所以需要手工在plugin中增加以下组件
- Paho MQTT
- cJSON
- Gateway MQTT transport
- Gateway Relay Mqtt
- Device Table
- Command Relay
在Host的工程介绍里面有提到
2.mqtt服务器的地址和端口以及订阅主题前缀,可以在Gateway MQTT transport插件中配置,它们的宏定义在工程目录下的“Z3GatewayHost.h”
3.项目工程目录和SDK目录尽量放在相对较近的位置,如下图所示。因为芯科的SDK目录、文件较多,嵌套较深,在编译的时候相对路径较长,可能导致操作系统或者Simplicity Studio找不到对应的资源文件。
工程将以相对路径方式链接编译资源
Ubuntu环境的调整
按照前面的“参考文档”的步骤说明,在Ubuntu下进行项目编译,基本是没问题的,但为了后续更加方便地迁移到ESP32和STM32平台,也做了相关调整,记录如下:
1.采用虚拟机的方式快速搭建编译环境。
1)利用乐鑫开源的一个AT项目中提供的虚拟机,直接导入Ubuntu18.04环境,虚拟机中已经安装好标准的gcc环境、乐鑫交叉编译环境、esp-idf、esp8266 sdk等,省去很多编译环境安装工作。(后续编译esp32静态库、修改esp8266 at命令都比较简单)。
2)乐鑫开源项目esp-at地址如下:https://gitee.com/EspressifSystems/esp-at
3)虚拟机下载地址如下:http://download.espressif.com/esp_share/env/ubuntu1804.ova
虚拟机加载后,桌面背景有基本的使用说明
4)通过gcc –v命令可以看到虚拟机中gcc版本是7.5.0,因此后续的编译生成将是基于gcc 7.5.0进行。
2.调整Makefile文件
1)不使用readline库、ncurses库:查看Makefile 文件416行附近,可以看到项目默认会引用两个外部lib,“readline”和“ncurses”。因为大部分linux环境下默认都没有这两个lib(MCU环境更加没有),使用的话需要另外安装。但在测试的时候,可以不使用这两个lib,也能正常跑起来使用全部功能。所以,我们在Makefile的顶部,定义NO_READLINE宏NO_READLINE ?= 1,编译的时候不使用这两个库。
备注:“readline”和“ncurses”库的使用,主要在SDK的“protocol/zigbee/app/util/serial/linux-serial.c ”文件中体现,可以看到SDK已经预留不使用这两个库的功能实现。
以上为Ubuntu环境下host应用编译的注意事项和调整的地方,在其他Linux环境,如centOS 7环境,也是类似。
把项目文件和sdk复制到虚拟机中(保持项目目录和sdk目录的相对路径一致);然后进入工程目录。
使用make命令,编译项目。
项目成功编译后(虚拟机大概需要几分钟,编译的时候最好暂时关闭杀毒软件),在Z3GatewayHost项目目录下,生成了build/exe目录;里面有Z3GatewayHost的可执行文件。
进入exe目录,执行./Z3GatewayHost –help命令,可以看到程序的帮助说明。
至此,Z3GatewayHost程序生成成功。
Host应用简单测试
1.用USB-串口线,将已经烧录好bootloader、ncp程序的模组与电脑连接。(确保串口线的TX、RX接到正确的NCP管脚)
2.如果是采用ESP32虚拟机的,需要将USB映射到virtualBox虚拟机上,如下图所示:
3.进入Z3GatewayHost可执行目录,运行 sudo ./Z3GatewayHost -n 0 -p /dev/ttyUSB0 命令,启动网关应用。其中/dev/ttyUSB0 为串口线USB设备在linux中的名称(可在/dev目录下查询)。
4.启动后,看到以下信息,代表网关启动成功。
5.直接在命令行中输入info命令,会输出NCP相关的Zigbee信息(和芯科SOC应用一样,可以通过cli命令行来进行各种插件功能操作)
关于日志输出
1.可以在启动host应用的时候,通过-t参数指定不同的日志输出,如下图所示:
2.SDK中提供了将Host-NCP串口通讯的数据记录到文件的功能,但需要在代码级别打开此功能。具体是在"\protocol\zigbee\app\ezsp-host\ezsp-host-io.c"中,如下图所示
取消宏
//#define ENABLE_HOSTIO_DEBUG // must define to enable any debug option
//#define IO_LOG "ezspuart.log" // log serial data read or written to a file
的注释后,重新make编译项目,启动应用后,会在exe目录中生成ezspuart.log日志文件,里面会清晰记录host和NCP之间的通讯流程。
这个日志文件可以作为后续将网关移植到其他平台时,Host与NCP之间串口通讯数据传输正确与否的重要依据。
接下来,将记录如果通过cli命令行方式或芯科提供的gateway-management-ui(基于nodejs、reactui的web应用)方式,测试ZigBee主要功能。
gateway-management-ui也是一大堆坑,必须认真记录一下。