Skip to content

AWS IoT Core 桥接

AWS IoT Core 是在欧美广泛使用的公有云 IoT 服务之一。但由于其与标准 MQTT 协议多有不同,且不支持 QoS 2 消息,因此许多使用标准 MQTT SDK 的客户端设备无法无缝兼容。

NanoMQ 现已内置 AWS IoT Core 桥接功能,帮助用户解决兼容性问题。NanoMQ 负责将接收到的指定 topic 的数据转发到远端 AWS IoT MQTT Broker,同时也从该 Broker 订阅特定 topic,以便接收数据并转发到本地。

由于 AWS IoT SDK 与 NanoMQ 的 QUIC 依赖项-MsQUIC 在 OpenSSL 引用版本上冲突,故 NanoMQ 并未将此桥接功能默认开启和打包进入标准发行包。如希望启用 AWS IoT Core 桥接,请通过编译方式安装 NanoMQ,本部分文档将介绍如何启用 AWS IoT Core、通过配置文件 nanomq.conf 进行配置以及对新建桥接进行测试。

安装 AWS IoT Core 桥接

首先,在开发环境中安装 AWS 的 IoT Device SDK。

安装 AWS SDK

awk
## 下载源码
wget https://github.com/aws/aws-iot-device-sdk-embedded-C/releases/download/202108.00/aws-iot-device-sdk-embedded-C-202108.00.zip

## 解压
unzip aws-iot-device-sdk-embedded-C-202108.00.zip

## 编译
cd aws-iot-device-sdk-embedded-C
mkdir build && cd build
cmake -G Ninja -DBUILD_DEMOS=OFF -DCMAKE_C_STANDARD=99 -DINSTALL_TO_SYSTEM=ON ..
ninja

## 安装到系统
sudo ninja install 
sudo cp ../demos/logging-stack/logging_*.h  /usr/local/include/aws/
sudo ldconfig

关于 AWS SDK 的更多信息请参考 GitHub 页面

编译安装 NanoMQ

bash
git clone https://github.com/emqx/nanomq.git 
## 拉取 NanoNNG submodule,可以不拉取 MsQUIC
cd nanomq git submodule update --init --recursive
mkdir build && cd build 
## 编译选项支持AWS桥接 (需确保关闭QUIC桥接)
cmake -G Ninja -DENABLE_AWS_BRIDGE=ON -DNNG_ENABLE_QUIC=OFF .. 
sudo ninja install

配置 AWS IoT Core

此处介绍如何在 AWS IoT Core 侧进行相关配置。注意:配置信息可能由于 AWS 服务的更新和修改而失效。详细配置方式请参考官方页面

  1. 管理 -> 所有设备 -> 物品 界面创建您的物品组和物品,以及对应的证书/主题/设备影子等等。

    Create_Object

  2. 安全性 -> 证书 处下载相关的 CRT 证书,并将策略附加到证书上,证书附加到物品上。

    Certification

  3. 安全性-> 策略 处创建对应的 MQTT 客户端行为鉴权策略,此处需要定义 NanoMQ 桥接所需要的客户端标识和发布/订阅的主题。

    Policy

配置 NanoMQ MQTT 桥接

启动 AWS IoT Core 桥接功能模块后,您需要在配置文件中修改桥接功能和对应的参数和主题,例如,在下面的配置文件中,我们定义了 AWS IoT Core 桥接的服务器域名、连接凭证、连接参数、消息转发规则、订阅主题和队列长度等内容。注意:在配置文件中的 MQTT ClientID,证书文件和订阅/发布主题需要与在 AWS IoT Core 侧定义的策略定义相匹配,否则会出现数据不通和连接被拒绝的情况。

TIP

不同于标准 MQTT Broker,AWS IoT Core 强制要求开启 SSL/TLS 加密验证,且证书和客户端标识符需与云端配置对应。

关键配置项:

  • aws.bridge.mqtt.aws.host:远端 AWS IoT Core 服务URL,需从 AWS IoT Core Dashboard 获取。

  • aws.bridge.mqtt.aws.clientid:桥接客户端的标识符,需要与安全性策略中的 iot:Connect 里规定的 client 相匹配。

  • 当你在 NanoMQ 中设置发布/订阅的 Topic 和 QoS 时,要确保它们与你在 AWS IoT 安全策略中设定的 iot:Subscribeiot:Publishiot:Receiveiot:RetainPublish 一致。否则,可能会因为权限不匹配,而导致消息不能正常发送或接收,相关配置项如下:

    • 发布主题:aws.bridge.mqtt.aws.forwards.1.remote_topic
    • 远端主题对应的本地主题:aws.bridge.mqtt.aws.forwards.1.local_topic
    • 订阅主题:aws.bridge.mqtt.aws.subscription.1.remote_topic
    • 远端主题对应的本地主题:aws.bridge.mqtt.aws.subscription.1.local_topic
    • 消息 QoS:aws.bridge.mqtt.aws.subscription.1.qos
  • 当你在 NanoMQ 中配置 SSL/TLS 证书时,需要保证这些证书文件与在 AWS IoT Core Dashboard 中创建的物品类型所需要的证书相匹配,相关配置项如下:

    • aws.bridge.mqtt.aws.tls.keyfile
    • aws.bridge.mqtt.aws.tls.certfile
    • aws.bridge.mqtt.aws.tls.cacertfile

启动 NanoMQ 开始桥接

启动 NanoMQ 时使用 --conf 指定配置文件路径(若配置文件已放置于系统路径 etc 则无需在命令行指定)。

测试桥接

用户可以在 AWS IoT Core 的 MQTT 测试客户端工具上验证桥接是否成功。

如在本地向 NanoMQ 的桥接主题 topic1发布一条消息 hello

bash
$ ./nanomq_cli pub -h "local.broker.address"  -t "topic1" -m "hello" -q 1

即可在AWS 界面看到:

Dashboard

NanoMQ 相关运行 Log:

bash
establish_mqtt_session: MQTT connection successfully established with broker.
subscribe_to_topic: SUBSCRIBE to broker successfully.
event_cb: Subscribed to the topic successfully.