运行RTOS系统的设备通过AT指令驱动通信模组接入物联网平台,实现数据采集上报。

前提条件

在进行本示例配置前,您需要完成以下准备工作:

背景信息

有大量的工业自动化设备、数据采集设备、实时控制设备、家电等,原来使用的是搭载实时操作系统(RTOS)的微控制单元(MCU)。在对此类设备进行物联网改造时,可以使用阿里云物联网平台提供的C语言设备端SDK。将MCU与通信模组相连,MCU与通信模组间通过AT指令进行连接和通信。在通信模组上,使用C语言设备端SDK实现与物联网平台的连接和通信。
图 1. 整体架构图
整体架构图

创建产品和设备

在物联网平台注册产品和设备,获取设备证书信息(ProductKey、DeviceName和DeviceSecret)。设备证书信息需配置到设备端SDK中。当设备请求连接物联网平台时,物联网平台会根据设备证书信息进行设备身份验证。

  1. 登录物联网平台控制台
  2. 创建产品。
    1. 在左侧导航栏,选择设备管理>产品
    2. 产品管理页,单击创建产品
    3. 填入产品信息,单击确定。完成产品创建。新建产品
  3. 创建设备。
    1. 在左侧导航栏,选择设备
    2. 设备管理页,单击添加设备
    3. 选择刚创建的产品,输入设备名称和备注名称,单击确定。完成设备创建。
      设备创建成功后,会弹出设备证书信息。您也可以在设备管理页,单击设备对应的查看按钮,进入设备详情页查看设备证书信息。

开发设备端

将MCU与通信模组开发板相连,搭建软件开发环境,创建工程项目,导入SDK,完成SDK配置。本示例中使用了以下两个开发板:
  • 开发板NUCLEO-F103RB。NUCLEO-F103RB引脚示意图如下。引脚示意图
  • MCU是SIM800C mini v2.0。SIM800C mini v2.0引脚示意图和说明如下。引脚示意图
    引脚 说明
    PWR 开关机引脚。默认为自动开机。
    STA 状态监测引脚。
    GND 电源接地引脚。
    RXD 接收串口引脚。
    TXD 发送串口引脚。
    EN 电源使能引脚。
    VIN 5~18V电源输入。
  1. 连接硬件。
    将两个开发板的接收和发送串口连接,作为AT指令通道,如下图所示。连接接收和发送串口
  2. 搭建软件环境。
    1. 打开ST-cubemx,新建Project。
    2. Board Seletor中,选择NUCLEO-F103RB开发板
    3. Connectivity菜单中,添加串口USART1作为MCU与模组通信的端口,并进行以下配置。
      • ConnectivityUSARTx
      • USART1(AT端口)的interrupt设置为enable配置串口USART1
    4. Middleware菜单中,选择FREERTOS,并配置为使用计数信号量和堆大小(用于给每个线程分配栈)。配置FREERTOS
    5. 单击Apply>OK
    6. 单击CubemxProject选项中的Generate Code,并进行设置。
      • Toolchain/IDE选择为 IAR™
      • Heap/Satck size按需进行配置。设置Generate Code
    7. 单击OK生成代码工程。
  3. 配置设备端SDK。
    本示例使用的设备端C语言SDK版本为3.0.1。
    1. 点击下载SDK
    2. 从下载包中提取SDK代码。本文以Linux系统操作为例。
      1. 运行make menuconfig。
      2. 选中ATM Configurations,单击Select。选择ATM Configurations
      3. 选中AT HAL Configurations,单击Select。选择AT HAL Configurations
      4. 配置如下项目。
        FEATURE_PLATFORM_HAS_STDINT=y
        FEATURE_PLATFORM_HAS_OS=y
        FEATURE_INFRA_STRING=y
        FEATURE_INFRA_NET=y
        FEATURE_INFRA_LIST=y
        FEATURE_INFRA_LOG=y
        FEATURE_INFRA_LOG_ALL_MUTED=y
        FEATURE_INFRA_LOG_MUTE_FLW=y
        FEATURE_INFRA_LOG_MUTE_DBG=y
        FEATURE_INFRA_LOG_MUTE_INF=y
        FEATURE_INFRA_LOG_MUTE_WRN=y
        FEATURE_INFRA_LOG_MUTE_ERR=y
        FEATURE_INFRA_LOG_MUTE_CRT=y
        FEATURE_INFRA_TIMER=y
        FEATURE_INFRA_SHA256=y
        FEATURE_INFRA_REPORT=y
        FEATURE_INFRA_COMPAT=y
        FEATURE_DEV_SIGN=y
        FEATURE_MQTT_COMM_ENABLED=y
        FEATURE_MQTT_DEFAULT_IMPL=y
        FEATURE_MQTT_DIRECT=y
        FEATURE_DEVICE_MODEL_CLASSIC=y
        FEATURE_ATM_ENABLED=y
        FEATURE_AT_TCP_ENABLED=y
        FEATURE_AT_PARSER_ENABLED=y
        FEATURE_AT_TCP_HAL_SIM800=y
      5. 配置完成后,在Linux中运行./extract.sh提取代码。 提取代码

        提取的代码位于output/eng目录。

        output/eng目录

        其中,各子目录分别包含的代码如下表。

        目录 代码内容
        atm AT指令收发模块
        dev_sign 设备身份认证模块
        infra 内部实现模块
        mqtt MQTT协议模块
        wrappers HAL对接模块
    3. wrappers目录下,新建文件wrappers.c,该文件中的代码需实现以下HAL函数。
      int32_t HAL_AT_Uart_Deinit(uart_dev_t *uart)
      int32_t HAL_AT_Uart_Init(uart_dev_t *uart)
      int32_t HAL_AT_Uart_Recv(uart_dev_t *uart, void *data, uint32_t expect_size, 
      uint32_t *recv_size, uint32_t timeout)
      int32_t HAL_AT_Uart_Send(uart_dev_t *uart, const void *data, uint32_t size, 
      uint32_t timeout) 
      
      int HAL_GetDeviceName(char device_name[IOTX_DEVICE_NAME_LEN])
      int HAL_GetDeviceSecret(char device_secret[IOTX_DEVICE_SECRET_LEN])
      int HAL_GetFirmwareVersion(char *version)
      int HAL_GetProductKey(char product_key[IOTX_PRODUCT_KEY_LEN]) 
      
      void *HAL_Malloc(uint32_t size)
      void HAL_Free(void *ptr) 
      
      void *HAL_MutexCreate(void)
      void HAL_MutexDestroy(void *mutex)
      void HAL_MutexLock(void *mutex)
      void HAL_MutexUnlock(void *mutex) 
      
      void *HAL_SemaphoreCreate(void)
      void HAL_SemaphoreDestroy(void *sem)
      void HAL_SemaphorePost(void *sem)
      int HAL_SemaphoreWait(void *sem, uint32_t timeout_ms)
      int HAL_ThreadCreate(void **thread_handle,
                           void *(*work_routine)(void *),
                           void *arg,
                           hal_os_thread_param_t *hal_os_thread_param,
                           int *stack_used)
      
      void HAL_SleepMs(uint32_t ms)
      void HAL_Printf(const char *fmt, ...)
      int HAL_Snprintf(char *str, const int len, const char *fmt, ...)
      uint64_t HAL_UptimeMs(void)
      点击下载wrappers.c文件的代码Demo。在代码Demo中,替换设备证书信息为您的设备证书信息。替换设备证书信息
      说明 如果您不是使用NUCLEO-F103RB通信模组开发板,需在配置时设置:
      FEATURE_AT_TCP_HAL_SIM800=n
      wrappers.c文件中的代码需实现以下HAL函数。
      int HAL_AT_CONN_Close(int fd, int32_t remote_port)
      int HAL_AT_CONN_Deinit(void)
      int HAL_AT_CONN_DomainToIp(char *domain, char ip[16])
      int HAL_AT_CONN_Init(void)
      int HAL_AT_CONN_Send(int fd, uint8_t *data, uint32_t len, char remote_ip[16],
      int32_t remote_port, int32_t timeout)
      int HAL_AT_CONN_Start(at_conn_t *conn) 
      
      int32_t HAL_AT_Uart_Deinit(uart_dev_t *uart)
      int32_t HAL_AT_Uart_Init(uart_dev_t *uart)
      int32_t HAL_AT_Uart_Recv(uart_dev_t *uart, void *data, uint32_t expect_size, 
      uint32_t *recv_size, uint32_t timeout)
      int32_t HAL_AT_Uart_Send(uart_dev_t *uart, const void *data, uint32_t size, 
      uint32_t timeout) 
      
      int HAL_GetDeviceName(char device_name[IOTX_DEVICE_NAME_LEN])
      int HAL_GetDeviceSecret(char device_secret[IOTX_DEVICE_SECRET_LEN])
      int HAL_GetFirmwareVersion(char *version)
      int HAL_GetProductKey(char product_key[IOTX_PRODUCT_KEY_LEN]) 
      
      void *HAL_Malloc(uint32_t size)
      void HAL_Free(void *ptr) 
      
      void *HAL_MutexCreate(void)
      void HAL_MutexDestroy(void *mutex)
      void HAL_MutexLock(void *mutex)void 
      HAL_MutexUnlock(void *mutex) 
      
      void *HAL_SemaphoreCreate(void)
      void HAL_SemaphoreDestroy(void *sem)
      void HAL_SemaphorePost(void *sem)
      int HAL_SemaphoreWait(void *sem, uint32_t timeout_ms)
      int HAL_ThreadCreate(void **thread_handle,
                           void *(*work_routine)(void *),
                           void *arg,
                           hal_os_thread_param_t *hal_os_thread_param,
                           int *stack_used)  
      void HAL_SleepMs(uint32_t ms)
      void HAL_Printf(const char *fmt, ...)
      int HAL_Snprintf(char *str, const int len, const char *fmt, ...)
      uint64_t HAL_UptimeMs(void)

整合SDK

  1. 将SDK整合到IAR工程。
    如下图所示。将SDK整合到IAR工程中
  2. 运行SDK。
    运行成功后,设备端本地日志如下图。设备端本地日志在物联网平台控制台,监控运维>日志服务中,也可以查看设备上报数据到云端的日志。查看云端日志

名词解释

  • MCU

    微控制单元(Microcontroller Unit) ,又称单片机。

  • RTOS

    实时操作系统(Real Time Operating System),用于快速接收和处理数据,实时完成任务。

  • 设备端SDK

    阿里云物联网平台提供的Link Kit SDK即设备端SDK,用于设备端开发。设备需要支持TCP/IP协议栈才能集成Link Kit SDK。设备厂商将设备端SDK集成到设备上,设备便可通过该SDK安全地接入到阿里云物联网平台。目前,物联网平台提供六种设备端SDK:C SDK、Java SDK、Python SDK、Node.js SDK、Android SDK和iOS SDK。本示例使用的是C SDK。下载设备端SDK和查看使用说明书

  • 设备证书

    设备证书指ProductKey、DeviceName和DeviceSecret,是阿里云物联网平台认证设备的标识。设备证书信息不可泄露。

  • ProductKey

    物联网平台为产品颁发的全局唯一标识。

  • DeviceName

    在注册设备时,自定义的或系统自动生成的设备名称,具备产品维度内的唯一性。

  • DeviceSecret

    物联网平台为设备颁发的设备密钥。

更多最佳实践

点击查看更多阿里云最佳实践