您现在的位置是:系统运维 >>正文
零基础教你自建MQTT服务器并实现双向通讯
系统运维85893人已围观
简介概述随着物联网技术的快速发展,MQTTMessage Queuing Telemetry Transport)消息队列遥测传输协议,作为一种轻量级的通讯协议,被广泛应用于物联网设备之间的通讯。MQTT ...
概述
随着物联网技术的零基快速发展 ,MQTT(Message Queuing Telemetry Transport)消息队列遥测传输协议,础教作为一种轻量级的自建通讯协议,被广泛应用于物联网设备之间的服务通讯。
MQTT 是器并一种基于发布/订阅(publish/subscribe)模式的轻量级通讯协议,该协议构建于TCP/IP协议上 。实现双MQTT最大优点在于,通讯可以以极少的零基代码和有限的带宽,为连接远程设备提供实时可靠的础教消息服务 。源码库
图片
本次教程中 ,自建将探讨如何基于EMQX平台自建MQTT服务器 ,服务并实现设备之间的器并高效通讯。无论是实现双在工业控制、智能家居还是通讯智能城市等领域,搭建自己的零基MQTT服务器都能为我们带来更大的灵活性和可扩展性 。让我们一起深入了解这个过程 ,为物联网应用打下坚实的基础。
MQTT通信的架构
图片
上面架构图来自EMQX官网 ,建站模板其中中间绿色部分即我们要搭建的MQTT Broker ,MQTT服务器搭建完成后,我们可以通过各种编程语言类库对服务器发起连接请求 ,以及主题发布和订阅。而编程语言类库中我们就可以使用workerman的mqtt扩展库与服务器进行通信。
MQTT概念
Publisher(发布者) :消息的发出者 ,负责发送消息 。Subscriber(订阅者) :消息的订阅者 ,负责接收并处理消息。Broker(代理) :消息代理,位于消息发布者和订阅者之间,各类支持MQTT协议的源码下载消息中间件都可以充当 。Topic(主题) :可以理解为消息队列中的路由,订阅者订阅了主题之后,就可以收到发送到该主题的消息。Payload(负载);可以理解为发送消息的内容 。QoS(消息质量):全称 Quality of Service,即消息的发送质量,主要有QoS 0 、QoS 1、QoS 2三个等级,下面分别介绍下:QoS 0(Almost Once):至多一次,只发送一次,模板下载会发生消息丢失或重复;
QoS 1(Atleast Once) :至少一次,确保消息到达 ,但消息重复可能会发生;
QoS 2(Exactly Once):只有一次 ,确保消息只到达一次。
EMQX
EMQX平台作为一款开源的MQTT消息服务器 ,提供了稳定可靠的消息传输服务 。本次教程中,我们将探讨如何基于EMQX平台自建MQTT服务器 ,并实现设备之间的高效通讯 。无论是在工业控制、智能家居还是智能城市等领域 ,高防服务器搭建自己的MQTT服务器都能为我们带来更大的灵活性和可扩展性 。
EMQX 官网 :https://www.emqx.io
图片
安装 MQTTX 服务端
本次教程中,我们将使用 Docker 部署,使用 Docker 指令直接部署,可以使用以下命令
获取 Docker 镜像
复制docker pull emqx/emqx1.
图片
启动 Docker 容器
复制docker run -d --name emqx -p 1883:1883 -p 8083:8083 -p 8084:8084 -p 8883:8883 -p 18083:18083 emqx/emqx:latest1.访问仪表板
安装完成后 ,打开浏览器,并在地址栏中输入 http://localhost:18083以访问 EMQX 仪表板 ,您可以从那里连接到客户端或检查运行状态 。
图片
进入 EMQX 管理页面 :
图片
安装 MQTTX 客户端
MQTTX 客户端我们选用workerman的mqtt扩展库与服务器进行通信 。workerman/mqtt 是一个基于workerman的异步mqtt 客户端库 ,可用于接收或者发送mqtt协议的亿华云消息 。支持QoS 0、QoS 1 、QoS 2。支持MQTT、3.1 、3.1.1 、5版本 。
安装
复制composer require workerman/mqtt1.订阅客户端
subscribe.php 代码 :
复制<?php /** * @desc Subscriber(订阅者):消息的订阅者,负责接收并处理消息。 * @author Tinywan(ShaoBo Wan) * @date 2024/5/30 20:35 */ declare(strict_types=1); require_once __DIR__ . /../vendor/autoload.php; use Workerman\Worker; $worker = new Worker(); $worker->onWorkerStart = function () { $options = [ username => Tinywan, password => 123456, ]; $mqtt = new Workerman\Mqtt\Client(mqtt://192.168.13.168:1883, $options); $mqtt->onConnect = function ($mqtt) { // 主题 Topic 可以理解为消息队列中的路由,订阅者订阅了主题之后,就可以收到发送到该主题的消息。 $topic = resty; $mqtt->subscribe($topic); }; $mqtt->onMessage = function ($topic, $content) { echo [订阅者][收到主题]: . $topic . PHP_EOL; echo [订阅者][收到内容] : . $content . PHP_EOL; }; $mqtt->connect(); }; Worker::runAll();1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.命令行运行 php subscribe.php start 启动:
图片
启动成功后,即可看到设备已经成功连接到服务器 。我们在 EMQX 服务器中的客户端页面中可以查看到设备的连接状态 。
图片
客户端发布
接下来,我们测试发布和订阅主题是否正常。
publish.php 代码:
复制<?php /** * @desc Publisher(发布者):消息的发出者,负责发送消息。 * @author Tinywan(ShaoBo Wan) * @date 2024/5/30 20:46 */ declare(strict_types=1); require_once __DIR__ . /../vendor/autoload.php; use Workerman\Worker; $worker = new Worker(); $worker->onWorkerStart = function () { $mqtt = new Workerman\Mqtt\Client(mqtt://192.168.13.168:1883); $mqtt->onConnect = function ($mqtt) { // 主题 Topic $topic = resty; // 负载 Payload 可以理解为发送消息的内容 $payload = Hello Tinywan mqtt; $mqtt->publish($topic, $payload); }; $mqtt->connect(); }; Worker::runAll();1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.命令行运行 php publish.php start 发布消息。
以下是 订阅客户端 subscribe.php收到的消息 :
图片
至此 ,我们已经成功实现了 客户端 与 EMQX 服务器之间的通讯 。
主题订阅
图片
主题监控
图片
Websocket 工具
订阅消息
图片
发布消息
通过websocket发布消息 :
图片
MQTT客户端订阅消息:

使用 MQTT.js 库
MQTT.js 是一个开源的 MQTT 协议的客户端库,使用 JavaScript 编写,主要用于 Node.js 和 浏览器环境中。是JavaScript 环境下的 MQTT 客户端库 。可以用于微信小程序、支付宝小程序等定制浏览器环境。
可以直接在HTML文件中进行调用:
复制<script src="https://unpkg.com/mqtt/dist/mqtt.min.js"></script>1.实现简单功能,EMQX websocket 连接服务地址
复制ws://localhost:8083/mqtt1.MQTT.html 案例代码
复制<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>开源技术小栈</title> </head> <body> <h3>零基础教你自建MQTT服务器并实现通讯</h3> <div style="height: 800px;"> <label>【客户端】【目标Topic】 :<input id="targetTopicInput" type="text"></label><br> <label>【客户端】【发送的消息】 :<input id="messageInput" type="text"></label><br> <button notallow="sendMessage()">发送</button> <button notallow="clearMessage()">清空</button> <div id="messageDiv"></div> </div> </body> <script src="https://unpkg.com/mqtt/dist/mqtt.min.js"></script> <script> /** * EMQX websocket 连接地址 * @type { string} */ const url = ws://localhost:8083/mqtt; /** * 订阅的topic * @type { string} */ const topic = resty; /** * 连接到消息队列 */ let client = mqtt.connect(url); client.on(connect, function () { /** * 连接成功后订阅topic */ client.subscribe(topic, function (err) { if (!err) { showMessage("[订阅者][Topic主题]:" + topic + "成功!"); } }); }); /** * 获取订阅topic中的消息 */ client.on(message, function (topic, message) { showMessage("[订阅者][收到消息]:" + message.toString()); }); /** * 发送消息 */ function sendMessage() { let targetTopic = document.getElementById("targetTopicInput").value; let message = document.getElementById("messageInput").value; // 向目标topic中发送消息 client.publish(targetTopic, message); showMessage("[发送消息给]" + targetTopic + "的消息 :" + message); } /** * 从URL中获取参数 * @param name * @returns { null|string} */ function getQueryString(name) { let reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i"); let r = window.location.search.substr(1).match(reg); if (r != null) { return decodeURIComponent(r[2]); } return null; } /** * 在消息列表中展示消息 * @param message */ function showMessage(message) { let messageDiv = document.getElementById("messageDiv"); let messageEle = document.createElement("div"); messageEle.innerText = message; messageDiv.appendChild(messageEle); } /** * 清空消息列表 */ function clearMessage() { let messageDiv = document.getElementById("messageDiv"); messageDiv.innerHTML = ""; } </script> </html>1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.44.45.46.47.48.49.50.51.52.53.54.55.56.57.58.59.60.61.62.63.64.65.66.67.68.69.70.71.72.73.74.75.76.77.78.79.80.81.82.83.84.85.86.87.88.89.90.91.92.93.94.95.96.发送消息:
图片
接受消息:
图片
小结
根据官方文档我们知道publish和subscribe流程如何实现。对于subscribe由于需要实时获取来自硬件方面的数据或其他客户端的数据,因此subscribe需要以cli模式守护运行在系统后台 。但是publish消息一般跟系统内的业务逻辑相关 。可以通过MQTT客户端和Websocket客户端发送消息。
Tags:
转载:欢迎各位朋友分享到网络,但转载请说明文章出处“商站动力”。http://www.noorid.com/html/761f9099148.html
相关文章
集体暴雷!自动化攻击可一分钟内越狱主流大语言模型
系统运维大语言模型应用面临的两大安全威胁是训练数据泄漏和模型滥用被应用于网络犯罪、信息操弄、制作危险品等违法活动)。本周内,这两大安全威胁相继“暴雷”。本周一,GoUpSec曾报道研究人员成功利用新的数据提取 ...
【系统运维】
阅读更多HS11静音耳机带来卓越听觉体验(领先科技和出色设计的完美融合,助您沉浸音乐世界)
系统运维现代人生活快节奏,音乐成为了放松身心的最佳良药。为了能够更好地享受音乐,舒适、便携且高品质的耳机成为了必备的装备。而HS11静音耳机凭借卓越的品质和出色的设计,无疑成为了音乐爱好者的首选。1.高端音质 ...
【系统运维】
阅读更多电视机视距不够,对眼睛有何影响?(近距离看电视,眼睛易受损伤)
系统运维在现代社会,电视机已经成为人们生活中不可或缺的娱乐方式之一。然而,由于种种原因,有些人在使用电视时往往忽视了与电视的适当距离,长时间近距离观看电视会给眼睛带来哪些潜在的问题呢?一、过度接触电磁辐射,有 ...
【系统运维】
阅读更多
热门文章
最新文章
友情链接
- 手机安装APP提示解析错误怎么办
- 探索IPF671的优势及应用前景(解析IPF671的性能特点和市场竞争力)
- nova2plus(性能卓越,拍摄出色)
- 13年索尼笔记本装系统教程(从备份数据到安装系统,打造属于你的全新电脑体验)
- Excel表格将多个表格快速合并汇总成一个的方法教
- 了解120gPro(性能出众、拍照优秀、续航强大,让你畅快体验智能科技的魅力)
- 华硕插座(华硕插座品质可靠,稳定供电保障)
- 精仿苹果X——打造全球最强智能手机(超越苹果X的出色表现及最佳购买选择)
- 荣耀畅玩平板LTE(高性能配置,超长续航,LTE网络支持,满足多场景需求)
- 磁盘扫描程序(使用磁盘扫描程序对C盘进行扫描修复的方法与技巧) 云服务器香港物理机网站建设源码库亿华云企业服务器b2b信息平台