MQTT-TCP接入说明

本文为您介绍如何使用MQTT-TCP接入物联网平台。

前提条件

  • 启用TCP接入:

    • 2023年10月后创建的实例:设备使用TCP接入的安全风险非常高,新建的企业版实例默认关闭TCP接入方式。

    • 2023年10月前创建的实例:保持兼容,默认启用TCP接入。

  • 获取C Link SDK。在SDK定制页面的连接物联网平台协议区域,选中MQTT 3.1.1复选框。

  • 已获取设备认证信息。设备使用物联网平台颁发的设备证书进行认证,具体操作,请参见获取设备认证信息

背景信息

  • (推荐)使用MQTT-TLS方式将设备接入物联网平台,可以保证数据传输的安全。

  • (不推荐)使用MQTT-TCP接入物联网平台。对于部分资源受限的设备使用TLS接入会导致资源消耗增加,因此只能使用TCP方式接入。但使用TCP方式接入,会导致非常大的安全风险,而且不支持使用动态注册、设备分发、安全隧道、远程登录等功能,您需要自行承担MQTT-TCP接入的风险和后果。

  • LinkSDK的移植与是否开启TCP接入无关,移植步骤请参见SDK移植参考

  • 对于资源受限设备的OTA升级,建议使用MQTT-OTA方式,使用方法请参见示例三:MQTT协议下载单个文件的OTA升级

操作步骤

  1. 裁剪TLS库

    1. 裁剪mbedtls库:在LinkSDK根目录,执行以下命令,删除external/mbedtls库。

      rm -rf external/mbedtls/
    2. 关闭TLS库调用:打开core/sysdep/core_adapter.c文件,将#define CORE_ADAPTER_MBEDTLS_ENABLED注释。

      /*
       *  CORE_ADAPTER_MBEDTLS_ENABLED 不是一个用户需要关心的编译开关
       *
       *  大多数情况下, 就保持它如下的设置即可
       *  只有少数时候, SDK的用户关心对接层代码的ROM尺寸, 并且也没有选择用TLS连接服务器
       *  那时才会出现, 将 CORE_ADAPTER_MBEDTLS_ENABLED 宏定义关闭的改动, 以减小对接尺寸
       *
       *  我们不建议去掉 #define CORE_ADAPTER_MBEDTLS_ENABLED 这行代码
       *  虽然物联网平台接收TCP方式的连接, 但我们不推荐这样做, TLS是更安全的通信方式
       *
       */
      //#define CORE_ADAPTER_MBEDTLS_ENABLED
  2. 应用说明

    以MQTT基础接入示例(mqtt_basic_demo.c)为例介绍使用方法,其它示例与该示例修改方法相同。

    1. 替换设备信息

      /* TODO: 替换为自己的设备证书 */
      char *product_key       = "${YourProductKey}";
      char *device_name       = "${YourDeviceName}";
      char *device_secret     = "${YourDeviceSecret}";
    2. 替换接入点信息

      char  *mqtt_host = "${YourInstanceId}.mqtt.iothub.aliyuncs.com";
    3. 使用TCP接入

        /* TODO: 如果以下代码不被注释, 则例程会用TCP而不是TLS连接阿里云物联网平台 */
        /*
        {
            memset(&cred, 0, sizeof(aiot_sysdep_network_cred_t));
            cred.option = AIOT_SYSDEP_NETWORK_CRED_NONE;
        }
        */

运行日志

  • 编译&运行

    make -j
    ./output/mqtt-basic-demo
  • TCP建连

    establish tcp connection with server(host='iot-********.mqtt.iothub.aliyuncs.com', port=[443])
    success to establish tcp, fd=5
    local port: 54461
  • MQTT建连

    [1695887193.832][LK-0313] MQTT connect success in 137 ms
    AIOT_MQTTEVT_CONNECT