设备说明:

  • 设备的硬件由一个MCU加上一个通信模组构成, 设备的产品逻辑运行在MCU上
  • 模组上支持了TCP但是并不支持MQTT, MCU通过模组提供的AT指令来控制模组何时连接云端服务以及收发数据

对于这样的场景, 设备厂商需要将SDK集成并运行在MCU上, 让SDK通过通信模组连接到阿里云物联网平台

  • MCU: NXP MKL26Z(运行FreeRTOS操作系统)
  • TCP模组: SIM800C(提供TCP层面的AT指令)

准备工作

本移植实践中使用了以下工具和材料

  • 硬件: NXP MKL26Z 开发板, SIM800C TCP模组
  • 宿主机OS: macOS
  • NXP MKL26Z SDK
  • ARM GCC 交叉编译工具链
  • SEGGER J-Link 烧写器
  • minicom 串口工具

搭建开发环境

在搭建开发环境前, 需要准备好硬件, 即NXP MKL26Z 开发板以及SIM800C TCP 模组.

由于演示中用J-Link进行MCU固件的烧写, 需按照NXP MKL26Z的官方文档升级开发板上的OpenSDA固件以支持J-Link, 该文档位于下载的NXP MKL26Z SDK中

安装必要的软件

  • 前往MCUXpresso SDK Builder, 选择对应NXP MKL26Z 开发板, 点击右侧的Build MCUXpresso SDK, 即可进入SDK下载页面

  • 由于演示的宿主机是macOS, 在SDK下载页面中, Toolchain/IDE选择GCC ARM Embedded, Host OS选择macOS
  • 在下方的组件中, 选中FreeRTOS, 选择完成后, 点击Download SDK即可将此MCU的SDK下载至本地

  • 安装SEGGER J-Link烧写工具, 前往SEGGER官网进行下载, 这里选择macOS版本

下载完成后安装即可

  • 由于需要连接NXP MKL26Z 开发板查看运行日志, 安装minicom串口工具

$ brew install minicom

  • 编译NXP MKL26Z SDK的固件.
  • 进入之前下载完成的SDK, 切换到SDK_2.2.0_FRDM-KL26Z/boards/frdmkl26z/rtos_examples/freertos_hello/armgcc目录
  • 打开build_debug.sh文件
  • 添加交叉编译工具链路径以及hex文件生成脚本, 修改内容如下:

#!/bin/sh
export ARMGCC_DIR=/opt/gcc-arm-none-eabi-5_4-2016q3
cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Debug  .
make -j4
${ARMGCC_DIR}/bin/arm-none-eabi-objcopy -Oihex debug/freertos_hello.elf debug/freertos_hello.hex

修改完成后, 保存退出, 执行build_debug.sh脚本, 开始编译代码

编译完成后, 在SDK_2.2.0_FRDM-KL26Z/boards/frdmkl26z/rtos_examples/freertos_hello/armgcc/debug目录下会产生一个freertos_hello.hex固件

这个固件可以通过SEGGER J-Link烧写到MCU中

  • 烧写固件

NXP MKL26Z 开发板连接至mac, 打开安装好的J-FlashLite, Device选择MKL26Z128XX4, 点击OK即可进入烧写界面

在烧写界面中Data File选择刚才编译出来的固件freertos_hello.hex, 点击Program Device即可烧写固件至NXP MKL26Z 开发板

  • 查看日志

查看/dev目录下的tty文件, 确认NXP MKL26Z 开发板的串口设备文件, 使用minicom打开它

$ minicom -b 115200 -D /dev/tty.usbmodem0000001234561

此时按下NXP MKL26Z 开发板上的复位键重跑固件, 即可看到日志

至此, 开发环境准备就绪, 编译烧写固件流程已调试完成, 接下来就可以移植SDK4.0了

移植SDK4.0

SDK4.0 在MCU+TCP模组的场景下提供基于FreeRTOS MCU的适配, 在MCU侧您需要自己实现AT模组相关AT指令的组装和解析

  • 在SDK需要连接网络/发送数据/断开网络时, 会组装好相关数据, 由您将这些数据组装成模组的AT指令发出
  • 在SDK需要从模组接收数据时, 由您对模组的AT指令进行解析, 将解析好的数据输入给SDK

在演示中, 我们已经针对SIM800C完成了上述工作, 如果您的模组不是SIM800C, 您可以参考我们针对SIM800C模组AT指令的对接代码完成上述工作

接下来, 将讲述整个对接流程, 对接流程完成后的源代码点此下载

  • SDK_2.2.0_FRDM-KL26Z/boards/frdmkl26z/rtos_examples目录下新建一个freertos_linkkit目录
  • 可以将freertos_hello中的所有文件复制到freertos_linkkit中作为一个修改基础
  • 下载SDK4.0.0, 将SDK的文件夹拷贝至freertos_linkkit目录
  • 修改freertos_linkkit/armgcc/CMakeLists.txt, 将SDK下需要的目录和源码加入编译
  • 需要注意的是, 在SDK根目录的Portfiles文件夹中, 仅需要加入freertos_tcp_modem目录中的下面3个文件即可

  • freertos_linkkit目录中, 编写主程序代码, 包括对接SIM800C的AT指令, MCU的初始化, SDK的相关API调用等

完成上述对接工作后, 编译并烧写固件至MCU中, 日志如下

Welcome to minicom 2.7.1

OPTIONS:
Compiled on Aug 20 2018, 10:22:42.
Port /dev/tty.usbmodem0000001234561, 11:06:35

Press Meta-Z for help on special keys

main
sim800c send: AT

sim800c resp: OK
sim800c send: ATE0

sim800c resp: OK
sim800c send: AT+IPR=115200

sim800c resp: OK
sim800c send: AT+IFC=0,0

sim800c resp: OK
sim800c send: AT&W

sim800c resp: OK
sim800c send: AT+CPIN?

sim800c resp: +CPIN: READY

OK
sim800c send: AT+CSQ

sim800c resp: +CSQ: 27,0

OK
sim800c send: AT+CREG?

sim800c resp: +CREG: 0,1

OK
sim800c send: AT+CGATT?

sim800c resp: +CGATT: 1

OK
sim800c send: AT+CIPSHUT

sim800c resp: SHUT OK
sim800c send: AT+CIPMUX=1

sim800c resp: OK
sim800c send: AT+CIPSPRT=0

sim800c resp: OK
sim800c send: AT+CIPSRIP=1

sim800c resp: OK
sim800c send: AT+CSTT

sim800c resp: OK
sim800c send: AT+CIICR

sim800c resp: OK
sim800c send: AT+CIFSR

sim800c resp: 10.52.141.163
sim800c_network_ready: 0
[5.888][LK-0313] MQTT user calls aiot_mqtt_connect api, connect
[5.888][LK-0317] mqtt_basic_demo&a13FN5TplKq
[5.888][LK-0318] 4780A5F17990D8DC4CCAD392683ED80160C4C2A1FFA649425CD0E2666A8593EB
[5.888][LK-0319] a13FN5TplKq.mqtt_basic_demo|timestamp=2524608000000,_ss=1,_v=sdk-c-4.0.0,securemode=3,signmethod=hmacsha256,ext=1,|
[6.888][LK-0313] MQTT connect success in 983 ms
AIOT_MQTTEVT_CONNECT
aiot_mqtt_connect res: 0
heartbeat response