在WebSocket中使用mqtt

本文深入探讨了WebSocket协议的特性,特别是其如何实现浏览器与服务器间的全双工通信,以及当MQTT协议通过WebSocket传输时所需满足的条件。文章强调了数据帧的正确使用、子协议的选择和URI对MQTT协议的影响。

文章目录

WebSocket协议

WebSocket协议是基于TCP的一种应用层网络协议。它实现了浏览器与服务器全双工(full-duplex)通信——允许服务器主动发送信息给客户端。取代了网页和服务器采用HTTP轮询进行双向通讯的机制。

如果mqtt在WebSocket连接上传输,必须满足以下条件:

  • mqtt控制报文必须使用WebSocket二进制数据帧发送,如果收到任何其它类型的数据帧,接收者必须关闭网络连接
  • 单个WebSocket数据帧可以包含多个或者部分mqtt报文,接收者不能假设mqtt控制报文按WebSocket帧边界对齐
  • 客户端必须将字符串 mqtt 包含在它提供的WebSocket子协议列表里
  • 服务端选择和返回的WebSocket子协议名必须是 mqtt
  • 用于连接客户端和服务器的WebSocket URI对MQTT协议没有任何影响

未完待续。。。。

在 C 语言中实现 WebSocket 连接到 MQTT Broker,需要使用两个库: 1. **WebSocket 客户端库**:如 [libwebsockets](https://libwebsockets.org/)。 2. **MQTT 客户端库**:如 [Eclipse Paho-MQTT-C](https://github.com/eclipse/paho.mqtt.c)。 目前,Paho-MQTT-C 支持通过 TCP 或 SSL/TLS 连接 MQTT Broker,也支持通过 WebSocket 连接,但需要与 `libwebsockets` 集成。 --- ## ✅ 实现步骤概览 | 步骤 | 内容 | |------|------| | 1 | 安装 libwebsockets 和 paho-mqtt-c | | 2 | 配置 MQTT 客户端使用 WebSocket | | 3 | 连接到 MQTT Broker | | 4 | 订阅和发布消息 | --- ## ✅ 示例:C 语言使用 WebSocket 连接 MQTT Broker ### 1. 安装依赖库(Linux 环境) ```bash # 安装 libwebsockets sudo apt-get update sudo apt-get install libwebsockets-dev # 下载并编译 Paho-MQTT-C 支持 WebSocket 的版本 git clone https://github.com/eclipse/paho.mqtt.c.git cd paho.mqtt.c git checkout v1.3.9 cmake -DPAHO_WITH_WEBSOCKETS=ON -Bbuild -H. cd build make sudo make install ``` --- ### 2. 示例代码:`mqtt_websocket_client.c` ```c #include "MQTTClient.h" #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #define ADDRESS "ws://broker.hivemq.com:8000/mqtt" #define CLIENTID "CWebsocketClient" #define TOPIC "test/topic" #define PAYLOAD "Hello from C WebSocket MQTT Client" #define QOS 1 #define TIMEOUT 10000L void on_message(MQTTClient client, void* context, MQTTClient_message* message) { char* payload = (char*)message->payload; printf("收到消息来自主题: %s, 内容: %.*s\n", message->topicName, message->payloadlen, payload); MQTTClient_freeMessage(&message); MQTTClient_freeTopicName(&message->topicName); } int main(int argc, char* argv[]) { MQTTClient client; MQTTClient_connectOptions options = MQTTClient_connectOptions_initializer; MQTTClient_SSLOptions ssl_opts = MQTTClient_SSLOptions_initializer; int rc; // 创建客户端实例(使用 WebSocketMQTTClient_create(&client, ADDRESS, CLIENTID, MQTTCLIENT_PERSISTENCE_NONE, NULL); // 设置连接选项 options.keepAliveInterval = 20; options.cleansession = 1; // 设置消息到达回调 MQTTClient_setCallbacks(client, NULL, NULL, on_message, NULL); // 连接到 Broker printf("正在连接到 MQTT Broker: %s\n", ADDRESS); if ((rc = MQTTClient_connect(client, &options)) != MQTTCLIENT_SUCCESS) { fprintf(stderr, "连接失败,错误码: %d\n", rc); return rc; } // 订阅主题 printf("订阅主题: %s\n", TOPIC); MQTTClient_subscribe(client, TOPIC, QOS); // 发布消息 MQTTClient_message pubmsg = MQTTClient_message_initializer; pubmsg.payload = (void*)PAYLOAD; pubmsg.payloadlen = strlen(PAYLOAD); pubmsg.qos = QOS; pubmsg.retained = 0; MQTTClient_deliveryToken token; MQTTClient_publishMessage(client, TOPIC, &pubmsg, &token); printf("消息已发布: %s\n", PAYLOAD); // 等待接收消息 printf("等待消息...\n"); sleep(10); // 等待接收消息 // 断开连接并清理 MQTTClient_disconnect(client, 10000); MQTTClient_destroy(&client); return 0; } ``` --- ## ✅ 编译与运行 ```bash gcc mqtt_websocket_client.c -o mqtt_websocket_client -lpaho-mqtt3cs -lwebsockets -pthread ./mqtt_websocket_client ``` --- ## ✅ 代码说明 | 模块 | 功能 | |------|------| | `MQTTClient_create` | 创建 MQTT 客户端实例,地址使用 `ws://` 表示 WebSocket | | `MQTTClient_connect` | 使用 WebSocket 连接到 MQTT Broker | | `MQTTClient_subscribe` | 订阅某个主题 | | `MQTTClient_publishMessage` | 向指定主题发布消息 | | `MQTTClient_setCallbacks` | 设置消息到达回调函数 | --- ## ✅ 依赖说明 - `libwebsockets`:提供 WebSocket 支持。 - `paho-mqtt-c`:提供 MQTT 客户端功能,支持 WebSocket 模式(需编译时启用)。 --- ## ✅ 注意事项 - 确保 Broker 支持 WebSocket(如 Mosquitto、EMQX、HiveMQ)。 - WebSocket 地址格式为:`ws://host:port/mqtt` 或 `wss://`(加密)。 - 如果使用自签名证书,需配置 `MQTTClient_SSLOptions`。 --- ## ✅ 可用 MQTT Broker 测试地址 | Broker | WebSocket 地址 | |--------|----------------| | HiveMQ 公共 Broker | `ws://broker.hivemq.com:8000/mqtt` | | EMQX 公共 Broker | `ws://broker.emqx.io:8083/mqtt` | | Mosquitto(需配置) | 自建服务,配置 `listener 8000` 并启用 `websockets` | --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值