Juanjuancaier 2025-02-26 18:52 采纳率: 0%
浏览 53

MQTT error [-1]: socket error

cpp程序通过wss协议连接mqtt时连接失败,错误信息:
Error: MQTT error [-1]: socket error
Reason code: 0
请问该怎么办?
链接做了保密处理。我自己ping是可以的。

// 初始化
bool Init() {
    string NameStr = "drive_9450648910578_" + GetUuid();

    // 创建 MQTT 客户端
    mqtt::async_client client("wss://链接.com:443/connect", NameStr);

    // 设置回调
    MQTTcallback cb;
    client.set_callback(cb);

    // 设置 SSL/TLS 选项
    mqtt::ssl_options sslOpts;
    sslOpts.set_enable_server_cert_auth(0); // False选项启用服务器证书的验证

    // 设置连接选项
    mqtt::connect_options connOpts;
    connOpts.set_keep_alive_interval(60);  // KeepAlive 时间
    connOpts.set_clean_session(true);
    connOpts.set_user_name(NameStr);
    connOpts.set_password("123456");
    connOpts.set_connect_timeout(10); // 设置连接超时时间
    connOpts.set_automatic_reconnect(true, 4); // 设置自动重连,重连间隔为 4 秒
    connOpts.set_ssl(sslOpts);

    try {
        // 连接到服务器
        client.connect(connOpts)->wait();

        // 订阅主题
        client.subscribe("bf1_servertools_drive/#", 1)->wait();

        // 保持连接
        while (true) {
            this_thread::sleep_for(chrono::seconds(1));
        }

        // 断开连接
        client.disconnect()->wait();
    }
    catch (const mqtt::exception& exc) {
        cout << "Error: " << exc.what() << endl;
        cout << "Reason code: " << exc.get_reason_code() << endl; // 输出 MQTT 错误码
        return 0;
    }

    return 1;
}

  • 写回答

4条回答 默认 最新

  • 阿里嘎多学长 2025-02-26 18:52
    关注

    阿里嘎多学长整理AIGC生成,因移动端显示问题导致当前答案未能完全显示,请使用PC端查看更加详细的解答过程

    MQTT连接失败解决方案

    你遇到的问题是 MQTT 连接失败,错误信息为 MQTT error [-1]: socket error,Reason code: 0。这个错误通常是由于 socket 连接失败导致的。

    在使用 WSS 协议连接 MQTT 服务器时,可能会遇到以下几种情况:

    1. 证书问题:WSS 协议需要使用 SSL/TLS 证书进行加密,可能是证书配置不正确或证书文件路径错误导致连接失败。
    2. 网络问题:网络连接问题可能会导致 socket 连接失败,例如 firewall 阻塞或网络延迟。
    3. 服务器问题:MQTT 服务器可能存在问题,例如服务器未启动或服务器配置错误。

    解决方案:

    1. 检查证书配置:确保证书文件路径正确,并检查证书是否正确配置。
    2. 检查网络连接:检查网络连接是否正常,确保 firewall 不阻塞 WSS 连接。
    3. 检查 MQTT 服务器:检查 MQTT 服务器是否启动,并检查服务器配置是否正确。

    代码示例:

    #include <iostream>
    #include <string>
    #include <boost/asio.hpp>
    #include <boost/beast.hpp>
    
    int main() {
        // 证书文件路径
        std::string cert_file = "path/to/cert.pem";
        std::string key_file = "path/to/key.pem";
    
        // MQTT 服务器地址
        std::string host = "mqtt.example.com";
        int port = 8883;
    
        // 创建 SSL 上下文
        boost::asio::ssl::context ctx(boost::asio::ssl::context::sslv23_client);
        ctx.set_verify_mode(boost::asio::ssl::verify_none);
        ctx.load_verify_file(cert_file);
        ctx.set_default_verify_paths();
    
        // 创建 TCP 连接
        boost::asio::io_context io_ctx;
        boost::asio::ip::tcp::socket sock(io_ctx);
        sock.connect(boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), port));
    
        // 创建 SSL 连接
        boost::asio::ssl::stream<boost::asio::ip::tcp::socket> ssl_sock(sock);
        ssl_sock.handshake(boost::asio::ssl::stream_base::client);
    
        // 发送 MQTT 消息
        std::string topic = "example/topic";
        std::string message = "Hello, MQTT!";
        boost::beast::http::request<boost::beast::http::string_body> req;
        req.version(11);
        req.method(boost::beast::http::verb::publish);
        req.target(topic);
        req.body() = message;
        req.prepare_payload();
    
        // 发送 MQTT 消息
        boost::beast::http::response<boost::beast::http::string_body> res;
        boost::beast::http::send(req, ssl_sock, res);
    
        // 关闭连接
        ssl_sock.next_layer().shutdown(boost::asio::ip::tcp::socket::shutdown_send);
        ssl_sock.next_layer().close();
        return 0;
    }
    

    在上面的代码示例中,我们使用 Boost.Asio 和 Boost.Beast 库来实现 WSS 连接和 MQTT 消息发送。我们首先创建 SSL 上下文,然后创建 TCP 连接和 SSL 连接,最后发送 MQTT 消息。

    评论

报告相同问题?

问题事件

  • 创建了问题 2月26日