You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

树莓派上通过Paho MQTT在443端口连接AWS IoT的实现疑问

我之前在树莓派上折腾Paho MQTT连AWS IoT 443端口的时候,也卡在了ALPN扩展的配置上,其实只要找对地方加配置就行,下面分Python和C两个常用版本给你讲具体实现:

Python版本实现

Paho Python客户端从1.5.0版本开始支持ALPN配置,所以先确保你的库是最新的:

pip install --upgrade paho-mqtt

然后在建立TLS连接时,通过tls_set方法的alpn_protocols参数指定x-amzn-mqtt-ca协议,完整示例代码如下:

import paho.mqtt.client as mqtt

# 连接成功回调
def on_connect(client, userdata, flags, rc):
    print(f"Connected with result code {rc}")
    # 订阅设备影子更新成功的主题(示例)
    client.subscribe("$aws/things/your-thing-name/shadow/update/accepted")

# 初始化客户端
client = mqtt.Client(client_id="your-unique-client-id")

# 配置TLS及ALPN扩展
client.tls_set(
    ca_certs="/home/pi/aws_certs/AmazonRootCA1.pem",  # AWS根CA路径
    certfile="/home/pi/aws_certs/device-cert.pem.crt",  # 设备证书路径
    keyfile="/home/pi/aws_certs/device-private.pem.key",  # 设备私钥路径
    alpn_protocols=["x-amzn-mqtt-ca"]  # 关键:指定ALPN协议
)

# 连接AWS IoT端点(替换成你的实际端点)
client.connect("your-aws-iot-endpoint.iot.us-east-1.amazonaws.com", 443, 60)

# 保持连接循环
client.loop_forever()
C版本实现

如果你用的是Paho C库,需要在SSL选项里设置ALPN协议字符串,注意Paho C 1.3.10+版本才支持这个配置。

示例代码片段:

#include <stdio.h>
#include <stdlib.h>
#include "mqtt_client.h"

// 替换成你的实际配置
#define AWS_IOT_ENDPOINT "your-aws-iot-endpoint.iot.us-east-1.amazonaws.com"
#define PORT 443
#define CA_PATH "/home/pi/aws_certs/AmazonRootCA1.pem"
#define CERT_PATH "/home/pi/aws_certs/device-cert.pem.crt"
#define KEY_PATH "/home/pi/aws_certs/device-private.pem.key"

int main(int argc, char* argv[]) {
    MQTTClient client;
    MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer;
    MQTTClient_SSLOptions ssl_opts = MQTTClient_SSLOptions_initializer;
    int rc;

    // 配置SSL选项
    ssl_opts.enableServerCertAuth = 1;
    ssl_opts.trustStore = CA_PATH;
    ssl_opts.keyStore = CERT_PATH;
    ssl_opts.privateKey = KEY_PATH;
    ssl_opts.alpnProtocols = "x-amzn-mqtt-ca";  // 关键:设置ALPN协议

    // 配置连接选项
    conn_opts.ssl = &ssl_opts;
    conn_opts.port = PORT;
    conn_opts.clientID = "your-unique-client-id";
    conn_opts.keepAliveInterval = 60;
    conn_opts.cleansession = 1;

    // 创建客户端实例
    MQTTClient_create(&client, AWS_IOT_ENDPOINT, conn_opts.clientID, 
                      MQTTCLIENT_PERSISTENCE_NONE, NULL);

    // 发起连接
    if ((rc = MQTTClient_connect(client, &conn_opts)) != MQTTCLIENT_SUCCESS) {
        printf("Failed to connect, return code %d\n", rc);
        exit(EXIT_FAILURE);
    }

    printf("Connected to AWS IoT successfully!\n");

    // 这里可以添加订阅、发布消息的逻辑...

    // 断开连接并清理资源
    MQTTClient_disconnect(client, 10000);
    MQTTClient_destroy(&client);
    return rc;
}

编译的时候要链接OpenSSL和Paho C库:

gcc -o aws_mqtt_client aws_mqtt_client.c -lpaho-mqtt3cs -lssl -lcrypto
注意事项
  • 确保树莓派上的OpenSSL版本在1.0.2及以上(ALPN扩展需要这个版本支持),可以用openssl version命令检查,版本低的话通过sudo apt update && sudo apt install openssl升级。
  • 证书文件的权限要正确,设备私钥建议设置为600权限(chmod 600 device-private.pem.key),避免其他用户读取。
  • AWS IoT端点可以在AWS控制台的IoT Core -> 设置 -> 设备数据端点中找到。

内容的提问来源于stack exchange,提问作者Phong Vu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 10:17:14