快速开发采用安全蜂窝连接的物联网应用

作者:Stephen Evanczuk

投稿人:DigiKey 北美编辑

得益于硬件制造商和蜂窝服务提供商的新兴解决方案,蜂窝技术为物联网连接提供的选择日益受到青睐。尽管蜂窝硬件模块的可获得性不断提升,但由于开发人员需设法应对低级握手协议和更高级别的服务协议,且同时要确保安全实现,物联网开发仍面临严重延迟。

本文简要回顾了蜂窝技术作为物联网应用的有效连接选项而兴起的背后因素,并讨论了其实现面临的挑战。然后会介绍 STMicroelectronics 提供的一个现成的蜂窝开发平台,并展示它如何用于解决实际连接问题,包括对物联网设备越来越重要的高级通信和安全性。

物联网的无线选择

无线连接已成为许多物联网应用的基本要求。尽管存在各种可用无线技术,但技术的选择通常主要取决于对数据速率和传输范围的要求(图 1)。

数据速率和传输范围要求示意图

图 1:蜂窝技术不仅提供所需的带宽和范围,而且随着 LTE 服务提供商覆盖范围的扩大,可用性也得到了大大提升。(图片来源:STMicroelectronics)

虽然蓝牙、Zigbee 和 Wi-Fi 继续在短距离通信中占据主导地位,但许多物联网应用需要达到的物理距离远非这些技术所能及。对于这些应用,新兴的低功耗广域网 (LPWAN) 技术(如 LoRaWAN,Sigfox 等)可满足范围要求,但通常无法支持更高的数据速率。

面向物联网的 LTE

商用蜂窝提供商通过扩充 LTE 网络迅速进军物联网领域,提供的带宽和范围远远超出其他常用无线连接选项。它们还具有使用许可频带的优势,这些频带不易受到干扰。随着第三代合作伙伴计划 (3GPP) LTE 版本 13 中定义的窄带 LTE 服务变得可用,即使对于功率受限的设备,蜂窝也已经成为可行的选择。

更为人所熟悉的 LTE 服务满足了对视频流所需的高带宽网络日益增长的需求,而包括 LTE CAT M1 和窄带物联网 (NB-IoT) 在内的窄带 LTE 服务对带宽和功能性的要求较为适中。这些更简单的要求进而使 LTE 收发器制造商能够构建出相应的解决方案,以满足物联网设计人员对更易于在资源受限型设计中集成的低功耗设备的需求。

LTE 收发器制造商提供了更有效的解决方案,而蜂窝提供商的 CAT M1 和 NB-IoT 服务则实现了更广泛的地理覆盖范围,这两者相结合,使得蜂窝连接成为物联网设计人员的可行选择。实际上,开发人员可以利用的窄带 LTE 模块选择越来越多,例如 u-blox 的 SARA-R410MLink LabsLL-LTE-M-VZN-SE,这些模块已通过运营商认证,可以为物联网设备和其他连接应用快速开发蜂窝连接。这些 CAT M1 和 NB-IoT 模块将嵌入式处理器与收发器和完整的 RF 信号路径结合在了一起,包括了输出功率放大器 (PA)、输入放大器、交换机和滤波器(图 2)。

u-blox SARA-R410M 高级 LTE 模块示意图

图 2:诸如 u-blox SARA-R410M 之类高级 LTE 模块提供了一个完整的 LTE 通信子系统,开发人员可使用标准串行接口选项,将其轻松集成到硬件设计中。(图片来源:u-blox)

对于开发人员而言,将这些高度集成的设备整合至定制设计中时,在硬件和软件层面都相对简单。这些模块通常支持一个或多个标准串行接口,并支持 GPIO、天线检测和 SIM 卡接口等。因此,开发人员只需添加合适的天线并将模块连接到主处理器的 SPI 或 I2C 总线,或使用基本的 UART 控制,即可快速完成硬件集成。

这些模块的软件控制要求也同样简单。与大多数收发器模块一样,自最早期的计算机调制解调器开始,窄带 LTE 模块就能响应所用的相同类型 AT 命令序列协议。但是,这些 LTE 模块的功能性获得了明显提升,允许开发人员使用单个 AT 命令执行更复杂的操作。使用 u-blox 的 SARA-R410M 模块,开发人员可以从主机发送 AT + USOCO = 0、“8.8.8.8”、1111 等命令,以建立与远程服务器的对等网络连接。在这种情况下,模块将完成在端口 1111 上与远程主机 8.8.8.8 建立连接(识别为套接字 0)所需的事务处理序列,自动执行 TCP 连接的握手协商。

虽然硬件和命令接口在基础级别很简单,但在更高级别的通信协议中使用它们时要复杂得多。物联网开发人员可能发现自己很难实现许多应用所需的高级协议和服务。但是,使用 STMicroelectronics 的 P-L496G-CELL02 开发套件和相关软件,开发人员可以更快速地在物联网设备中部署蜂窝连接。

蜂窝开发平台

P-L496G-CELL02 套件提供完整的蜂窝物联网开发平台,包括 MCU 主机板、LTE 模块扩展板、天线和 SIM 卡。作为 STMicro 的 Discovery 开发板系列的一员,主机板基于 STMicro STM32L496AGI6P MCU 构建而成,并提供板载调试器以及麦克风、LED 和用作基本用户界面功能的按钮。

虽然该开发板相对简单,但 STM32L496 MCU 可提供广泛的功能。MCU 基于带浮点单元 (FPU) 的 Arm® Cortex®-M4 32 位内核,集成了 1 MB 闪存和 320 KB SRAM。这为代码映像,甚至为固件更新过程中经常使用的多个代码映像提供了充足的容量。全套集成模拟和数字外设支持数据采集、电机控制等一系列典型的物联网应用需求。

为了满足 MCU 本身无法提供的要求,开发人员可以使用主机板的 Arduino 接口,通过各种可用的 Arduino 盾板所具备的功能来增强主机板。物联网应用中蜂窝连接的新兴应用之一是将本地物联网设备的小型网络连接到云端。对于这种使用场景,开发人员可以使用 P-L496G-CELL02 套件作为网关,通过蜂窝服务连接到云端,并通过 Arduino 盾板提供的短距离无线连接选项连接到本地设备。

例如,开发人员可以通过添加 Inventek SystemsISMART43340-C 盾板来支持 Wi-Fi 和蓝牙连接,或通过添加 DFRobotDFR0015 XBee 适配器盾板和 Digi International 带集成天线的 XBP24CZ7WIT-004 XBee 模块,来支持 Zigbee 连接。

当然,此类蜂窝网关的关键部分是蜂窝连接。借助 STMicro 的 P-L496G-CELL02 套件,开发人员只需将 LTE 模块扩展板插入主机板的 STMod+ 连接器,即可使用 LTE CAT M1 或 LTE NB-IoT 运营商服务支持蜂窝连接。为了补充此蜂窝硬件平台,STMicro 提供了一个广泛的软件环境,可演示蜂窝连接,并成为构建定制应用的基础。

软件环境

STMicro 的软件环境建立在其 STM32Cube 软件架构之上,该架构提供基于中间件组件的应用软件支持,包括实时操作系统、USB 支持、文件系统服务等。中间件层位于硬件抽象层 (HAL) 之上,可实现跨越不同 STMicro MCU 系列的可移植性。在开发期间,开发人员可使用 STMicro 的 STM32CubeMX 工具中的图形向导来指定配置,该工具可自动生成 C 语言初始化代码。

开发人员可在 STM32Cube 环境基准功能的基础之上,进一步添加扩展包,从而提供所需的库和软件示例以支持特定功能区域。值得一提的是,对于物联网开发人员来说,两个 STM32Cube 扩展包所支持的功能对任何连网的应用都很重要:STMicro X-CUBE-CLD-GEN 物联网云软件扩展和 STMicro X-CUBE-SBSFU(安全引导和安全固件更新)软件扩展。

为了支持通信,X-CUBE-CLD-GEN 软件包添加了全套中间件组件,包括 Eclipse Paho 项目的 MQTT 服务、mbed TLS 和 lwIP TCP/IP 堆栈(图 3)。该扩展包还提供样例应用程序,演示如何使用 MQTT 和 HTTP 协议连接到物联网云平台,包括 Eclipse Mosquitto、Litmus Automation 和 Ubidots。

STMicroelectronics X-CUBE-CLD-GEN 物联网云软件包的示意图

图 3:ST X-CUBE-CLD-GEN 物联网云软件包借助用于云连接的中间件组件以及演示其使用的样例应用程序,扩展了基准 STM32Cube 环境。(图片来源:STMicroelectronics)

包含在 X-CUBE-CLD-GEN 发行版中的 MQTT 样例应用程序 GenericMQTTXcubeSample.c 提供了实现基于 MQTT 的云连接所需代码的详细示例。除了各种辅助函数外,该模块还演示了打开 MQTT 连接、构建消息以及将消息发布到 MQTT 服务器所需的软件设计模式(列表 1)。

副本

        network.my_socket = socket;

        network.mqttread = (network_read);

        network.mqttwrite = (network_write);

 

        MQTTClientInit(&client, &network, MQTT_CMD_TIMEOUT,

           mqtt_send_buffer, MQTT_SEND_BUFFER_SIZE,

           mqtt_read_buffer, MQTT_READ_BUFFER_SIZE);

 

        /* MQTT connect */

        MQTTPacket_connectData options = MQTTPacket_connectData_initializer;

 

        options.clientID.cstring = device_config->MQClientId;

        options.username.cstring = device_config->MQUserName;

        options.password.cstring = device_config->MQUserPwd;

 

        ret = MQTTConnect(&client, &options);

        if (ret != 0)

        {

          msg_error("MQTTConnect() failed: %d\n", ret);

        }

        else

        {

          g_connection_needed_score = 0;

          b_mqtt_connected = true;

#ifdef LITMUS_LOOP

          snprintf(mqtt_subtopic, MQTT_TOPIC_BUFFER_SIZE, "loop/req/%s/json", device_config->LoopTopicId);

#elif defined(UBIDOTS_MQTT)

          snprintf(mqtt_subtopic, MQTT_TOPIC_BUFFER_SIZE, "/v1.6/devices/%s/ts/lv", device_config->MQClientId); /* Subscribe the timestamp latest value */

#else

          snprintf(mqtt_subtopic, MQTT_TOPIC_BUFFER_SIZE, "/devices/%s/control", device_config->MQClientId);

#endif /* LITMUS_LOOP */

         

          ret = MQTTSubscribe(&client, mqtt_subtopic, QOS0, (allpurposeMessageHandler));

        }

    .

    .

    .

        if ( (ret < 0) || (ret >= MQTT_MSG_BUFFER_SIZE) )

        {

          msg_error("Telemetry message formatting error.\n");

        }

        else

        {

          ret = stiot_publish(&client, mqtt_pubtopic, mqtt_msg); 

          if (ret == MQSUCCESS)

          {

            /* Visual notification of the telemetry publication: LED blink.*/

             Led_Blink(80, 40, 5);

             /* Restore the LED state */

             Led_SetState(status_data.LedOn);

             msg_info("#\n");

             msg_info("publication topic: %s \tpayload: %s\n", mqtt_pubtopic, mqtt_msg);

          }

          else

          {

            msg_error("Telemetry publication failed.\n");

            g_connection_needed_score++;

          }

        }

列表 1:ST X-CUBE-CLD-GEN 物联网云扩展提供了示例代码和完整的源代码,例如此代码片段演示了 MQTT 设置以及向不同 MQTT 服务(例如此处所示的 Litmus Automation)发布消息。(代码来源: STMicroelectronics)

STMicro 使设置基于 MQTT 的基础网络变得更加容易。P-L496G-CELL02 套件配有 EMnify 蜂窝 SIM 卡,并可免费订购 EMnify 网络三个月。使用此 SIM 卡,开发人员可以将 CELL02 套件连接到通过 EMnify 网络与应用服务器相连的虚拟专用网络 (VPN)。在此,可使用一个在开发环境中的实验室计算机上或生产环境中的公共网络主机上运行的 VPN 网关,通过 OpenVPN 隧道直接在连网设备和应用服务器之间进行数据交换(图 4)。通过配置 VPN 网关以重定向流量,这些连接可以直接在应用服务器和设备之间进行,而无需网络地址转换 (NAT)。

P-L496G-CELL02 套件和 ST X-CUBE-CLD-GEN 物联网云软件示意图

图 4:开发人员可使用 P-L496G-CELL02 套件和 ST X-CUBE-CLD-GEN 物联网云软件,通过 EMnify 网络快速构建虚拟专用网络,以连接物联网设备和主机。(图片来源:STMicroelectronics)

X-CUBE-CLD-GEN 扩展解决了物联网设备中云连接的基本要求,而 X-CUBE-SBSFU 软件扩展则可减轻与云连接相关的常见来源威胁。STMicro X-CUBE-SBSFU 扩展提供了所需的安全固件更新和安全引导功能,阻止意在用受损代码替换设备固件的攻击,这些代码可使物联网设备沦为进一步攻击物联网网络和应用的工具。

除样例应用程序外,X-CUBE-SBSFU 软件包还通过两个额外的中间件组件(安全引擎和加密库)扩展了 STM32Cube 环境(图 5)。安全引擎组件提供处理受保护代码和数据的服务,而加密库则提供用于固件验证和解密的基于软件的非对称和对称加密机制。

ST X-CUBE-SBSFU(安全引导和安全固件更新)软件包示意图

图 5:ST X-CUBE-SBSFU(安全引导和安全固件更新)软件包借助中间件组件和样例应用程序,扩展了基准 STM32Cube 环境,可为物联网应用中的安全固件更新和安全引导提供即时支持。(图片来源:STMicroelectronics)

在大多数系统中,基于软件的加密可能会为能够渗透底层机制的黑客提供攻击面。因此,安全专家通常建议使用基于硬件的机制来提高安全性。但是,对于 STMicro X-CUBE-SBSFU 软件包,其基于软件的机制会受到内置于 MCU 硬件的硬件式基本安全功能的保护。

STM32L496 MCU 具有多种基于硬件的存储器保护机制,其中包括存储器保护单元 (MPU),允许开发人员为不同的闪存和 SRAM 区域指定不同的访问权限。例如,SBSFU 代码会配置 MPU,以确保在执行 SBSFU 代码时不执行来自其他存储器区域的代码。举例来说,在执行用于固件验证或安全引导加载的代码之后,SBSFU 扩展会重新配置 MPU,以允许正常执行用户应用程序。

除了 MPU 功能外,STM32L496 MCU 还提供写保护机制,以保护受信任代码免受外部或内部来源的修改,包括意外或故意的运行代码尝试。此外,STM32L496 MCU 的专有代码读出保护 (PCRP) 机制允许开发人员将闪存区域定义为“仅执行”。该 PCRP 机制确保不能通过正常的读写操作访问此“仅执行”代码区域。

作为进一步的安全措施,STM32L496 MCU 包含一个内置防火墙机制,可保护受信任的代码和数据免受防火墙之外代码的任何访问。通过防火墙访问受保护区域仅能通过单个调用门进行,该调用门是位于代码段基址第二个字的单个入口点。调用门机制提供可访问受保护代码和数据的唯一途径,任何通过调用门之外的途径访问受保护存储器的尝试都会导致系统复位。

SBSFU 扩展使用这些硬件机制来保障基于软件的中间件,能够可靠地确保固件验证和安全引导。例如,要加载加密认证机制所需的密钥,SBSFU 代码使用调用门函数打开防火墙,并运行受 PCRP 保护的仅执行代码,该代码将密钥从闪存移动到受保护的 SRAM 区域,供库的加密算法使用(图 6)。

SBSFU 代码使用安全引擎 (SE) 调用门机制来访问受保护功能示意图

图 6:若要将用于加密操作的密钥加载至受保护的 SRAM,SBSFU 代码使用安全引擎 (SE) 调用门机制 (1) 来访问受保护功能 (2),将密钥移动到受保护的 SRAM (3)。(图片来源:STMicroelectronics)

开发人员使用 SBSFU 安全引擎 (SE) 应用编程接口 (API) 来激活这些均基于硬件的安全机制,以访问受保护的代码和数据。SE 接口本质上是此调用门机制的包装器,提供了一种相对简单的机制,以在应用中实现安全功能。要访问受保护的闪存,用户应用会调用 SE 接口,该接口可确保关于使用调用门、访问安全引擎、清理堆栈和恢复防火墙的正确操作顺序(图 7)。开发人员唯一的责任是确保在进入此受保护空间之前已禁用中断,并在退出时重新启用中断。

SBSFU 安全引擎 (SE) API 示意图

图 7:为了实现自定义安全软件功能,开发人员可以使用 SBSFU 安全引擎 (SE) API。它解决了调用门机制的复杂性,该机制用于通过 MCU 防火墙访问安全代码和数据。(图片来源:STMicroelectronics)

开发人员可以检查 X-CUBE-SBSFU 说明文档和源代码,以查找关键设计模式,包括使用调用门机制的基本方法。对受保护存储器区域的任何调用均以调用 SE 接口 SET_CALLGATE() 函数开始,该函数将指针设置为 CallGate 函数,然后调用 SE_EnterSecureMode() 以禁用系统中断。从这一点开始,对 SE 接口的后续调用使用调用门指针来访问受保护的代码和数据(列表 2)。最后,调用序列以对 SE_ExitSecureMode() 的调用来结束,其中至少包括启用系统中断。

副本

void SE_SVC_Handler(uint32_t * args)

{

  /* Set the CallGate function pointer */

  SET_CALLGATE();

 

  Enter Secure Mode*/

  SE_EnterSecureMode();

 

  switch (args[1]) /* main case for short operations that can be done under interrupts */

  {

    /* no extra parameters calls */

    case SE_LOCK_RESTRICT_SERVICES:

      *((SE_ErrorStatus *)args[0]) = (*SE_CallGatePtr)((SE_FunctionIDTypeDef)args[1],

                                                       (SE_StatusTypeDef *)args[2]);

      break;

 

    /* one extra parameters calls */

    case SE_BOOT_INFO_READ_ALL_ID:

    case SE_BOOT_INFO_WRITE_ALL_ID:

    case SE_CRYPTO_HL_AUTHENTICATE_METADATA:

    case SE_CRYPTO_LL_ENCRYPT_INIT_ID:

    case SE_CRYPTO_LL_DECRYPT_INIT_ID:

    case SE_CRYPTO_LL_AUTHENTICATE_FW_INIT_ID:

      *((SE_ErrorStatus *)args[0]) = (*SE_CallGatePtr)((SE_FunctionIDTypeDef)args[1],

                                                       (SE_StatusTypeDef *)args[2],

                                                       (((uint32_t *)args[3])[0]));

      .

      .

      .

     

    /* four extra parameters calls */

    case SE_CRYPTO_LL_ENCRYPT_APPEND_ID:

    case SE_CRYPTO_LL_DECRYPT_APPEND_ID:

    case SE_CRYPTO_LL_AUTHENTICATE_FW_APPEND_ID:

      *((SE_ErrorStatus *)args[0]) = (*SE_CallGatePtr)((SE_FunctionIDTypeDef)args[1],

                                                       (SE_StatusTypeDef *)args[2],

                                                       (void *)(((uint32_t *)args[3])[0]),

                                                       (void *)(((uint32_t *)args[3])[1]),

                                                       (void *)(((uint32_t *)args[3])[2]),

                                                       (void *)(((uint32_t *)args[3])[3]));

      break;

    default:

      *((SE_ErrorStatus *)args[0]) = SE_ERROR;

  }

  /*Exit Secure Mode*/

  SE_ExitSecureMode();

  /*

   * End of the privileged operation execution: switching to unprivileged mode automatically.

   */

}

列表 2:ST X-CUBE-SBSFU 包括样例应用程序和完整源代码,例如此代码片段演示了与使用调用门机制访问受保护代码和数据相关的基本设计模式。(代码来源: STMicroelectronics)

除了这些低级别机制外,X-CUBE-SBSFU 还包含更高级别的功能,旨在简化安全固件更新和安全引导的实现。开发人员可以利用这些相同的代码模式,使用 SE API 函数(如 SE_CRYPTO_Encrypt_Init,SE_CRYPTO_Decrypt_Init 和 SE_CRYPTO_AuthenticateFW_Init 及相关函数)实现自定义身份验证和加密功能。

总结

LTE 蜂窝技术正迅速成长为长距离、高可用性物联网连接的首选方案。尽管高级 LTE 模块简化了硬件设计,但实现更高级别的功能仍然是一项挑战。使用 ST P-L496G-CELL02 LTE 蜂窝开发套件和附带的软件,开发人员可以快速利用窄带 LTE 连接实现安全的物联网应用。

 

免责声明:各个作者和/或论坛参与者在本网站发表的观点、看法和意见不代表 DigiKey 的观点、看法和意见,也不代表 DigiKey 官方政策。

关于此作者

Stephen Evanczuk

Stephen Evanczuk 拥有 20 多年的电子行业编辑经验,主题涉猎广泛,涵盖硬件、软件、系统以及包括物联网在内的各种应用。他拥有神经网络领域的神经科学博士学位,曾经从事航空航天领域大规模分布式安全系统和算法加速方法方面的工作。目前,他不是在撰写技术和工程文章,就是在研究深度学习在识别和推荐系统方面的应用。

关于此出版商

DigiKey 北美编辑