1. 项目概述从零构建一个连接AWS IoT的嵌入式节点如果你正在寻找一个能跑在RL78这类资源受限MCU上又能稳定连接AWS云服务并且支持远程固件更新的完整方案那么瑞萨官方提供的这个iot-reference-rl78参考项目无疑是一个极佳的起点。它基于RL78/G23-128p快速原型板FPB和DA16600超低功耗Wi-Fi模块在FreeRTOS实时操作系统的调度下实现了与AWS IoT Core的安全连接、MQTT数据发布订阅以及完整的OTA固件更新流程。这个项目的价值在于它不是一个简单的“点灯”Demo而是一个经过验证的、可直接用于产品原型开发的参考设计。它帮你解决了嵌入式设备上云中最棘手的那部分如何在有限的Flash和RAM资源里集成TLS/SSL加密、MQTT协议栈、Wi-Fi驱动、OTA升级逻辑以及任务管理。对于从事工业传感器、智能家居控制器、便携式医疗设备等开发的工程师来说这意味着你可以跳过底层协议栈的艰难移植和调试直接聚焦于你自己的应用逻辑。整个方案的核心架构非常清晰RL78/G23作为主控负责应用逻辑和系统调度DA16600模块作为通信协处理器通过UART与主控连接处理所有复杂的Wi-Fi连接和TCP/IP协议栈FreeRTOS负责管理多个任务如MQTT代理任务、OTA任务、用户应用任务最终通过AWS IoT提供的MQTT和Jobs服务实现设备与云端的双向通信与固件管理。接下来我将带你深入这个方案的每一个环节从硬件连接到代码配置再到云端操作分享我在复现这个项目过程中积累的实操细节和避坑经验。2. 硬件平台深度解析与连接要点2.1 核心硬件选型背后的逻辑为什么是RL78/G23和DA16600这个组合这背后是低功耗与高集成度的平衡考量。RL78/G23是瑞萨RL78家族中的高性能低功耗成员R7F100GSN型号拥有768KB Flash和48KB RAM主频可达32MHz。在物联网边缘节点中这样的资源对于运行一个轻量级RTOS和复杂应用逻辑是足够的。它的低功耗特性在HALT模式下可低至0.35μA使得设备在电池供电场景下能拥有极长的待机时间。而DA16600模块则是一个“交钥匙”式的无线解决方案。它内部集成了Wi-Fi 4、蓝牙5.2 LE射频、ARM Cortex-M33应用处理器、加密引擎和完整的TCP/IP协议栈。最关键的是它提供了一个基于AT命令或集成SDK的串口透传接口。这意味着主控MCURL78/G23无需处理复杂的Wi-Fi驱动和TCP/IP协议只需通过简单的UART发送数据模块就能帮你完成从连接到AWS IoT TLS加密通信的所有网络层工作。这种架构极大地降低了主MCU的负载和开发难度是快速上市项目的明智之选。2.2 硬件连接实战与“坑点”记录根据指南硬件连接看起来很简单但有几个细节一旦忽略就会导致无法通信或供电异常。以下是按步骤拆解的关键点步骤一DA16600模块与主板连接将DA16600的Pmod板插入RL78/G23-128p开发板的PMOD1接口。这里要注意方向Pmod接口有防呆设计对准缺口插入即可。连接后务必用手轻按模块两端确保所有引脚接触牢固。我曾遇到过因接触不良导致的间歇性通信失败排查了很久。步骤二USB-UART转换板连接这是用于输出调试日志和进行串口烧录的关键。你需要用三根杜邦线进行连接MCU板的P13 (TxD2)连接至USB-UART板的RX。MCU板的P14 (RxD2)连接至USB-UART板的TX。MCU板的GND连接至USB-UART板的GND。注意这里最容易搞混的就是TX和RX的交叉连接。记住一个原则发送端TX必须连接接收端RX。MCU的TxD2发送要接到转换板的RX接收MCU的RxD2接收要接到转换板的TX发送。接反了终端上将看不到任何输出。步骤三电源跳线设置这是另一个关键点。RL78/G23-128p板可以通过USB口J20或外部电源J19供电。为了简化我们使用USB供电。你需要找到板上的电源选择跳线帽J15 J16 J19。将J20旁边的跳线帽设置为连接2-3引脚Short这选择了3.3V USB电源。务必确认否则MCU可能无法上电或电压不稳。步骤四COM端口确认与驱动用USB线连接MCU板和电脑再连接USB-UART板到电脑。在Windows设备管理器中你应该会看到两个新增的COM端口。一个对应MCU板的调试串口通过USB-UART板转换另一个可能对应板载的EZ-CUBE调试器。记下USB-UART板对应的COM口编号如COM5后续的终端软件和烧录工具都需要用到它。如果看不到端口可能需要安装CP210x或CH340等USB转串口芯片的驱动。3. 软件开发环境搭建与项目导入3.1 工具链的安装与版本协同官方文档列出了详细的工具列表但直接按图索骥可能会遇到版本兼容性问题。以下是我梳理后的安装顺序和版本建议集成开发环境IDEe² studio。建议直接从瑞萨官网下载并安装最新版本。安装时务必勾选包含“CC-RL Compiler”的选项否则你需要单独安装编译器。e² studio基于Eclipse对RL78系列的支持最完善。编译器CC-RL V1.15.01。如果IDE安装包内包含则无需单独操作。编译器的版本与运行时库RTL紧密相关使用文档指定的版本可以避免链接时出现未定义符号的错误。烧录工具Renesas Flash Programmer (RFP) V3.20.00。这是一个独立的图形化工具用于将生成的.mot或.hex文件烧录到MCU的Flash中。注意在烧录前需要根据你使用的调试工具如EZ-CUBE或E2 Lite在RFP中正确选择连接方式和端口。Python与OpenSSL主要用于OTA演示中的签名密钥生成。安装Python 3.9后需要通过pip install pycryptodome安装加密库。OpenSSL用于生成ECC密钥对建议使用文档中提到的3.4.0版本不同版本的命令参数可能有细微差别。DA16600 SDK固件这是一个容易被忽略但至关重要的部分。DA16600模块本身需要运行其固件。你需要从瑞萨官网下载DA16200/DA16600 SDK V3.3.0.0并根据其文档将编译好的固件镜像烧录到DA16600模块中。通常你购买的评估板上的DA16600模块已经预烧了正确固件。如果不确定可以尝试连接如果AT命令有响应则一般无需再次烧录。3.2 克隆与导入项目解决子模块依赖项目的获取不是简单的git clone因为它包含了FreeRTOS及其他AWS库作为子模块submodule。# 正确的克隆命令必须带上 --recurse-submodules 参数 git clone https://github.com/renesas/iot-reference-rl78.git --recurse-submodules如果你已经用普通方式克隆了可以进入项目目录后执行以下命令来更新子模块git submodule update --init --recursive项目导入e² studio时有一个关键选择不要勾选“Copy projects into workspace”。这是因为项目文件结构复杂包含大量的相对路径链接。如果复制到工作空间这些链接可能会断裂导致编译时找不到头文件或源文件。正确的做法是直接引用原位置的项目。导入后在“Project Explorer”视图中你应该能看到aws_da16600_rl78g23-fpb这个项目。右键点击项目选择“Build Configurations” - “Set Active” - “HardwareDebug”。这个配置针对实际的硬件调试环境优化了编译选项。4. 核心配置详解连接AWS IoT的三把钥匙要让设备成功连接AWS IoT你需要配置三个核心信息Wi-Fi凭证、AWS终端节点Endpoint和设备证书。这些配置集中在几个头文件中。4.1 Wi-Fi网络配置配置位于iot-reference-rl78\Projects\rl78g23-fpb\modules\r_config\r_wifi_da16xxx_config.h这个文件主要配置DA16600模块的底层参数大部分内容保持默认即可但需要确认国家代码#define WIFI_CFG_COUNTRY_CODE “CN” // 根据你所在国家/地区设置如CN US JP等 #define WIFI_CFG_TLS_SUPPORT 1 // 必须为1启用TLS加密证书名称宏WIFI_CFG_TLS_CERT_CA_NAME等定义了模块内部存储证书的标签名与AWS配置无关通常无需修改。真正的Wi-Fi SSID和密码在另一个文件iot-reference-rl78\Demos\include\aws_clientcredential.h#define clientcredentialWIFI_SSID “Your_WiFi_SSID” #define clientcredentialWIFI_PASSWORD “Your_WiFi_Password” #define clientcredentialWIFI_SECURITY eWiFiSecurityWPA2 // 根据你的网络安全类型修改实操心得如果你的网络是WPA2-Personal就选择eWiFiSecurityWPA2。如果连接开放网络极不推荐则选择eWiFiSecurityOpen。确保你的2.4GHz Wi-Fi网络信道在DA16600支持范围内通常1-13信道。4.2 AWS IoT连接信息配置同样在aws_clientcredential.h文件中配置AWS IoT的核心参数#define clientcredentialMQTT_BROKER_ENDPOINT “xxxxxxxxxxxxx-ats.iot.region.amazonaws.com” #define clientcredentialIOT_THING_NAME “MyRL78Thing”Endpoint在AWS IoT控制台进入“设置”Settings页面即可找到你的“设备数据端点”。注意现代账户通常使用-ats结尾的端点它指向AWS的证书信任存储简化了证书管理。Thing Name你在AWS IoT Core中创建的“事物”Thing的名称。这个名称需要与设备证书的策略Policy关联起来。4.3 设备证书与私钥配置这是安全连接中最关键的一步配置位于aws_clientcredential_keys.h。你需要将你在AWS IoT Core注册设备时生成的设备证书X.509证书和私钥以PEM格式粘贴到对应的宏中。#define keyCLIENT_CERTIFICATE_PEM \ “-----BEGIN CERTIFICATE-----\n”\ “MIIDWTCCAkGgAwIBAgIUF…完整的证书内容每行末尾加\n\n”\ “-----END CERTIFICATE-----\n” #define keyCLIENT_PRIVATE_KEY_PEM \ “-----BEGIN RSA PRIVATE KEY-----\n”\ “MIIEowIBAAKCAQEA3Fb7O7j…完整的私钥内容每行末尾加\n\n”\ “-----END RSA PRIVATE KEY-----\n”致命细节与避坑指南格式必须严格必须包含-----BEGIN CERTIFICATE-----和-----END CERTIFICATE-----这样的头尾标识。每行末尾必须添加\n换行符和反斜杠\用于连接字符串。最后一个\n”之后没有反斜杠。证书链通常keyCLIENT_CERTIFICATE_PEM只需要设备证书本身不需要包含根CA证书和中间CA证书。AWS IoT服务信任其自己的CA。私钥类型如果你的私钥是RSA格式头尾标识是RSA PRIVATE KEY如果是ECC密钥则是EC PRIVATE KEY。务必与生成时的一致。本项目示例使用的是RSA密钥。策略Policy附加在AWS IoT控制台为你刚创建的证书附加一个策略Policy。这个策略需要定义设备的权限例如连接到IoT Core、发布/订阅特定主题等。一个最小化的策略文档如下{ “Version”: “2012-10-17”, “Statement”: [{ “Effect”: “Allow”, “Action”: “iot:Connect”, “Resource”: “arn:aws:iot:region:account:client/${iot:Connection.Thing.ThingName}” }, { “Effect”: “Allow”, “Action”: “iot:Publish”, “Resource”: “arn:aws:iot:region:account:topic/*” }, { “Effect”: “Allow”, “Action”: “iot:Subscribe”, “Resource”: “arn:aws:iot:region:account:topicfilter/*” }, { “Effect”: “Allow”, “Action”: “iot:Receive”, “Resource”: “arn:aws:iot:region:account:topic/*” }] }将region、account替换为你的实际信息。这个策略允许设备以自身事物名连接并向任何主题发布/订阅消息。完成以上三步配置后设备端连接AWS的准备工作就基本就绪了。编译项目如果一切顺利你应该能得到一个.mot文件。5. MQTT数据发布PubSub演示全流程实操5.1 代码结构与运行逻辑解析PubSub演示项目位于Demos/SimplePubSub目录下。它的核心逻辑非常清晰系统初始化初始化硬件平台、FreeRTOS内核、Wi-Fi模块。网络连接任务prvSimplePubSubDemoTask启动后首先连接配置的Wi-Fi网络。TLS连接建立通过DA16600模块内置的TLS引擎与AWS IoT Endpoint建立安全的MQTT连接。这个过程完全由模块处理RL78主控只负责触发和等待结果。MQTT会话管理使用FreeRTOS的coreMQTT-Agent库。这是一个“代理”任务它管理底层的MQTT网络连接并为其他应用任务提供线程安全的API来发布和订阅消息。这种设计避免了多个任务直接操作套接字带来的复杂性。数据发布演示中创建了两个任务Task0和Task1它们以不同的时间间隔例如2秒和5秒通过MQTT代理向主题pubsub_demo/task0和pubsub_demo/task1发布JSON格式的模拟数据如计数器、温度值。订阅与接收同时演示也订阅了pubsub_demo/control主题。你可以从AWS IoT控制台的MQTT测试客户端向这个主题发送消息设备会收到并打印出来。5.2 编译、烧录与验证编译在e² studio中确保HardwareDebug配置为激活状态然后点击构建项目。编译成功后在项目目录下的HardwareDebug文件夹里会生成aws_da16600_rl78g23-fpb.mot文件。烧录打开Renesas Flash Programmer。选择正确的“Microcontroller Family” (RL78)。在“Communication”选项卡选择你使用的调试工具如E2 Lite或EZ-CUBE和对应的COM端口。点击“Connect”连接目标板。在“Programming”选项卡选择生成的.mot文件然后点击“Start”开始烧录。烧录完成后点击“Reset”或给板子重新上电。观察日志打开串口终端软件如Tera Term、Putty或SecureCRT配置波特率为115200数据位8停止位1无校验位无流控。连接对应的COM口。复位板子后你应该能看到类似以下的启动日志[INFO] [WiFi] Initializing WiFi module... [INFO] [WiFi] Connecting to SSID: Your_WiFi_SSID... [INFO] [WiFi] Connected. [INFO] [MQTT] Establishing TLS connection to xxxxxx.iot.region.amazonaws.com:8883... [INFO] [MQTT] Connected. [INFO] [PubSub Demo] Task0 started. [INFO] [PubSub Demo] Task1 started. [INFO] [PubSub Demo Task0] Published: {“count”: 1, “temp”: 23.5} [INFO] [PubSub Demo Task1] Published: {“count”: 1, “sensor”: “accel”}云端验证登录AWS IoT控制台进入“测试”Test - “MQTT测试客户端”MQTT test client。在“订阅主题”标签页订阅主题pubsub_demo/##是通配符可以收到所有以pubsub_demo/开头的消息。稍等片刻你就能看到从设备端发来的两条主题的消息交替出现。在“发布到主题”标签页向主题pubsub_demo/control发布一条消息例如{“command”: “led_on”}。在设备的串口日志中你应该能看到接收到的消息内容。常见问题排查问题串口无任何输出。排查检查USB-UART板连接是否正确TX/RX是否交叉终端软件波特率是否为115200COM口选择是否正确。检查MCU板供电跳线J20 2-3短接。问题Wi-Fi连接失败。排查检查aws_clientcredential.h中的SSID和密码是否正确安全类型是否匹配。确认DA16600模块固件支持该地区的Wi-Fi信道。用手机或电脑确认该Wi-Fi网络可正常连接。问题MQTT连接失败TLS握手错误。排查这是最常见的问题。首先检查aws_clientcredential_keys.h中的证书和私钥格式是否正确每行\n和结尾反斜杠。其次在AWS IoT控制台确认设备证书是否已激活状态为“Active”并且是否附加了正确的策略Policy。最后检查Endpoint地址是否正确没有多余空格或换行。6. OTA固件更新实现深度剖析OTA演示是此项目的进阶功能它展示了如何通过AWS IoT Jobs服务安全地远程更新RL78/G23的固件。其实现比PubSub复杂涉及引导加载程序Bootloader、固件签名验证和AWS Jobs工作流。6.1 OTA系统架构与内存布局RL78/G23的OTA采用了一种“双区交换”Bank Swap或“缓冲区更新”的策略具体取决于Flash布局。根据文档中的内存映射图项目将Flash划分为几个关键区域引导加载程序区Bootloader位于Flash起始地址如0x00000。它负责上电初始化、检查主应用程序区的有效性、以及处理来自UART或Wi-Fi通过MQTT的固件更新请求。Bootloader本身非常小约22KB不包含复杂的网络协议。主应用程序区Main Application即我们通常编译运行的aws_da16600_rl78g23-fpb项目。它包含完整的FreeRTOS、Wi-Fi驱动、MQTT客户端和OTA更新代理逻辑。在OTA过程中它是“当前运行”的固件。下载缓冲区Download Buffer在Flash中预留的一块区域用于临时存储从云端下载的新固件映像。由于RL78/G23的Flash不支持同时读写RWW新固件需要先下载到这个缓冲区。备份区/交换区在一些设计中会有一个与主应用程序区大小相同的备份区。更新时新固件被写入备份区验证成功后通过修改启动地址或进行区交换来切换到新固件。文档中提到的“部分更新方法buffer side is internal flash”更倾向于使用下载缓冲区然后由Bootloader负责将缓冲区内容编程到主应用程序区。更新流程简述设备主应用程序通过MQTT连接到AWS IoT并订阅其专属的Jobs主题。在AWS IoT控制台创建一个OTA更新作业Job指向存储在Amazon S3桶中的新固件映像文件.mot或.bin格式。AWS IoT Jobs服务通过MQTT向设备下发作业通知。设备上的OTA代理任务收到通知后从S3桶下载固件到内部的下载缓冲区。下载完成后设备使用预先烧录在安全存储区或与固件一起分发的公钥对下载的固件进行签名验证例如ECDSA签名。这是安全OTA的核心防止恶意固件被刷入。验证通过后设备跳转到Bootloader并将控制权以及新固件在缓冲区的位置信息传递给Bootloader。Bootloader将缓冲区的新固件编程到主应用程序区然后复位系统启动新固件。6.2 OTA演示配置与密钥管理OTA演示的准备工作比PubSub繁琐主要集中在密钥生成和AWS服务配置上。6.2.1 生成签名密钥对使用OpenSSL生成用于固件签名的ECC密钥对secp256r1曲线和CA证书。文档中给出了详细的命令。这里强调几个要点私钥安全生成的secp256r1.privatekey是绝密必须妥善保管绝不能泄露或放入设备中。它用于在服务器端对固件进行签名。公钥部署生成的secp256r1.publickey需要被编译到设备的Bootloader和主应用程序中。设备使用这个公钥来验证下载固件的签名。通常公钥会以字节数组的形式硬编码在代码中或存储在Flash的特定安全区域。密钥格式转换OpenSSL生成的PEM格式公钥需要转换成C语言数组。可以使用xxd -i secp256r1.publickey命令或者编写一个小脚本提取Base64解码后的DER格式字节。6.2.2 AWS服务端配置这是云端的工作流设置步骤较多但逻辑清晰创建S3存储桶用于存放新版本的固件映像文件。必须启用版本控制Versioning这样每次上传同名文件都会生成一个新版本IDOTA作业可以指定具体的版本ID确保一致性。创建IAM角色这个角色将被OTA服务所扮演Assume Role它需要权限去访问S3桶获取固件文件和操作IoT Jobs。按照文档创建角色时选择“AWS service” - “IoT”并附加AWSIoTLoggingAWSIoTRuleActionsAWSIoTThingsRegistration策略。附加内联策略需要为上述角色附加两个内联策略S3策略允许对特定S3桶的GetObjectPutObject等操作。IAM策略允许iam:PassRole这样OTA服务才能将角色传递给其他服务如S3来执行操作。创建并上传签名证书将之前生成的CA证书ca.crt上传到AWS IoT Core的“设置” - “CA证书”页面并激活它。然后用这个CA证书为你的“事物”Thing注册一个设备证书与MQTT连接用的可以是同一个也可以是不同的。OTA服务会使用这个CA证书链来验证固件签名。配置OTA更新角色在AWS IoT控制台的“设置”页面找到“OTA更新设置”指定你刚刚创建的IAM角色的ARN。6.3 创建与执行OTA作业准备新固件修改你的应用程序代码例如改变LED闪烁频率或打印信息重新编译生成新的.mot文件。签名固件使用Renesas Image Generator工具和你的私钥对新生成的.mot文件进行签名生成一个带签名的固件映像文件如firmware_v2.signed.bin。上传到S3将签名后的固件文件上传到之前创建的S3桶中。记录下文件的S3 URI例如s3://your-bucket-name/firmware_v2.signed.bin和文件版本ID在S3对象属性中查看。创建OTA作业在AWS IoT控制台“管理” - “作业” - “创建作业”。作业类型选择“远程操作OTA” - “固件更新”。选择目标选择你要更新的设备事物或设备组。签署固件选择你之前上传的CA证书。固件映像位置输入S3 URI和文件版本ID。IAM角色选择你创建的OTA IAM角色。其他设置可以配置重试次数、超时时间等。监控作业执行创建作业后设备会通过MQTT收到通知。你可以在AWS控制台查看作业状态“排队中”、“进行中”、“成功”、“失败”也可以在设备的串口日志中看到详细的OTA进度如下载进度、签名验证、重启等。OTA实操中的关键陷阱内存不足OTA过程需要缓冲区来存储下载的固件。务必在链接脚本.lcf文件中为下载缓冲区预留足够且地址正确的Flash空间。如果缓冲区太小下载会失败。签名验证失败确保设备端嵌入的公钥与用于签名的私钥是配对的。确保签名工具Renesas Image Generator使用的私钥和算法如ECDSA with SHA256与设备端验证代码完全一致。Bootloader兼容性Bootloader和主应用程序之间需要有明确的通信协议如通过共享内存或特定Flash标志位。确保主应用程序在触发更新时能正确设置这些标志并将新固件信息传递给Bootloader。Bootloader的版本也需要与主应用程序的OTA代理逻辑兼容。网络中断处理固件下载可能耗时较长需要实现断点续传或至少是失败重试机制。AWS IoT Jobs SDK通常已经包含了这部分逻辑但需要合理配置超时和重试参数。7. 项目调试技巧与高级主题7.1 高效的调试方法在资源受限的嵌入式系统上调试网络应用日志是最重要的武器。本项目已经集成了日志系统但你可以让它更强大动态日志级别修改logging_stack.h中的配置可以动态调整不同模块的日志级别如LOG_ERROR LOG_WARN LOG_INFO LOG_DEBUG。在开发初期将LOG_LEVEL设为LOG_DEBUG可以获取最详细的信息。在产品发布前将其改为LOG_ERROR以减小代码体积并隐藏敏感信息。使用Segger RTT如果你有J-Link调试器强烈建议启用Segger RTTReal Time Transfer功能。它通过调试接口输出日志不占用串口速度极快且可以在MCU暂停时继续接收日志。在e² studio中可以集成J-Link RTT Viewer工具。FreeRTOS任务状态监控在串口日志中可以定期打印所有任务的状态、堆栈使用情况通过uxTaskGetStackHighWaterMark。这有助于发现任务堆栈溢出——一个非常常见且难以排查的问题。内存泄漏检测FreeRTOS提供了heap_4.c内存管理方案并可以开启configUSE_MALLOC_FAILED_HOOK和configCHECK_FOR_STACK_OVERFLOW钩子函数在内存分配失败或堆栈溢出时触发断点或记录错误。7.2 功耗优化考量RL78/G23和DA16600都以低功耗见长但不当的软件设计会白白消耗电量。MCU睡眠模式在MQTT消息发布的间隔期如果没有其他任务需要运行可以让MCU进入STOP或HALT模式。你需要配置一个定时器如TAU在指定时间后唤醒MCU。在FreeRTOS中这意味着你需要挂起所有任务然后调用MCU特定的低功耗入口函数最后在中断服务程序ISR中恢复任务调度。DA16600模块的DTIM间隔Wi-Fi模块在保持连接时会周期性地醒来监听来自路由器的信号DTIM。你可以通过AT命令如果使用AT模式或SDK API调整这个间隔。更长的间隔意味着更低的功耗但可能会略微增加网络延迟。关闭调试接口在最终产品中确保关闭所有未使用的硬件模块时钟通过系统时钟控制寄存器并将用于调试的IO口设置为输出低电平或输入带上拉以减少漏电流。7.3 扩展应用思路这个参考项目为你搭建了一个坚固的基石你可以在此基础上构建真正的应用传感器集成RL78/G23-128p板载了用户按钮和LED。你可以轻松扩展温湿度传感器如SHTC3 via I2C、加速度计via SPI等。将采集到的数据封装成JSON格式通过已有的MQTT代理任务发布到云端。自定义MQTT主题和消息格式修改SimplePubSub演示中的主题和消息负载使其符合你的业务逻辑。例如发布到device/{thing_name}/sensor/data订阅device/{thing_name}/config/update。利用AWS IoT Device Shadow实现设备状态同步。Shadow是一个JSON文档用于存储设备的期望状态和报告状态。即使设备离线云端也可以更新Shadow的“期望”部分设备上线后会自动同步并执行。FreeRTOS库中包含了Device Shadow的客户端实现。本地规则引擎对于需要快速响应的场景如按键触发紧急上报可以在设备端实现简单的规则判断而不是将所有数据都上报到云端再做决策。整个项目走下来最大的体会是在嵌入式物联网开发中“分层解耦”和“利用成熟组件”是提升成功率和开发效率的关键。RL78/G23负责实时控制和低功耗管理DA16600处理复杂的网络协议FreeRTOS提供可靠的多任务框架而AWS IoT则提供了企业级的设备管理、安全和数据分析后台。这个参考设计的价值就在于它把这四层有效地整合在了一起并提供了经过验证的代码。你需要做的就是在这个坚实的框架上砌上属于你自己应用的那一面墙。