前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >laravel实现利用RabbitMQ实现MQTT即时通讯

laravel实现利用RabbitMQ实现MQTT即时通讯

作者头像
憧憬博客
发布于 2021-01-03 12:23:06
发布于 2021-01-03 12:23:06
4.2K00
代码可运行
举报
文章被收录于专栏:憧憬博客分享憧憬博客分享
运行总次数:0
代码可运行

laravel实现利用RabbitMQ实现MQTT即时通讯

有时候我们的项目中会用到即时通讯功能,比如电商系统中的客服聊天功能,还有在支付过程中,当用户支付成功后,第三方支付服务会回调我们的回调接口,此时我们需要通知前端支付成功。而 RabbitMQ 可以很方便的实现即时通讯功能,如果你的业务只是少量地方使用即时通信,需要一个简易的消息系统,你可以直接考虑 MQ 的实现, MQ 有很高的吞吐率,具有持久化,还可以横向扩展,总之还不错,用就完了,奥利给!

本文需要安装好 rabbitMQlaravel ,没弄好环境的看我之前的文章 php laravel5.5使用rabbitmq消息队列

MQTT协议

MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的轻量级通讯协议,该协议构建于TCP/IP协议上。 MQTT 最大优点在于,可以以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。

MQTT相关概念

实际上还是 MQ 的那些东西,主要看 MQ 有没有实现 MQTT 模型,懂的随便看看,不懂的先去理解 MQ

  • 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):只有一次,确保消息只到达一次。

RabbitMQ启用MQTT功能

我们是采用 docker 安装的,直接进入容器一顿操作就行

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker exec -it rabbitmq bash
rabbitmq-plugins enable rabbitmq_mqtt

开启成功后,查看管理控制台,我们可以发现 MQTT 服务运行在 1883 端口上了。

MQTT客户端

我们可以使用 MQTT 客户端来测试 MQTT 的即时通讯功能,这里使用的是 MQTTBox 这个客户端工具。

首先下载并安装好 MQTTBox ,下载地址:http://workswithweb.com/mqttbox.html

点击 Create MQTT Client 按钮来创建一个 MQTT 客户端;

接下来对 MQTT 客户端进行配置,主要是配置好协议端口、连接用户名密码和QoS即可, 注意 Protocolmqtt/tcp

然后我们利用这个工具测试一下发布和订阅消息是否可用,一端向 TopicA 发送消息,另一端订阅 TopicA

可用看到效果已经出现了,那么我们如何让前端来订阅呢?

前端实现即时通讯

我们通过 html+javascript 实现一个简单的聊天功能,由于 RabbitMQWeb端 交互底层使用的是 WebSocket ,所以我们需要开启 RabbitMQMQTT WEB 支持,使用如下命令开启即可

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker exec -it rabbitmq bash
rabbitmq-plugins enable rabbitmq_web_mqtt

开启成功后,查看管理控制台,我们可以发现 MQTTWEB 服务运行在 15675 端口上了;

WEB端MQTT 服务进行通讯需要使用一个叫 MQTT.js 的库,项目地址:https://github.com/mqttjs/MQTT.js

实现的功能非常简单,一个单聊功能,需要注意的是配置好 MQTT 服务的访问地址为:ws://localhost:15675/ws

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Title</title>
</head>
<body>
<div>
	<label>目标Topic:<input id="targetTopicInput" type="text"></label><br>
	<label>发送消息:<input id="messageInput" type="text"></label><br>
	<button onclick="sendMessage()">发送</button>
	<button onclick="clearMessage()">清空</button>
	<div id="messageDiv"></div>
</div>
</body>
<script src="https://unpkg.com/mqtt/dist/mqtt.min.js"></script>
<script>
    //RabbitMQ的web-mqtt连接地址
    const url = 'ws://ip:15675/ws';
    //获取订阅的topic
    const topic = getQueryString("topic");
    //连接到消息队列
    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中获取参数
    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;
    }

    //在消息列表中展示消息
    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>

在Laravel中使用

需要保证 laravelrabbitmq 已经可以正常生产和发布消息了,保证没问题再进行以下操作

  • 安装mqtt包
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
composer require salmanzafar/laravel-mqtt
  • app.php
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/*
 * Application Service Providers...
 */
Salman\Mqtt\MqttServiceProvider::class,
  • MqttService
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php

namespace App\Service;

use Illuminate\Support\Facades\Auth;
use Salman\Mqtt\MqttClass\Mqtt;

class MqttService
{

    public static function SendMsgViaMqtt($topic, $message)
    {
        $mqtt = new Mqtt();
        $client_id = Auth::user()->id ?? 0;
        $output = $mqtt->ConnectAndPublish($topic, $message, $client_id);

        if ($output === true)
        {
            return "published";
        }

        return "Failed";
    }
}
  • laravel生产消息
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Route::get('/pub', function () {

    $data = [
        'name' => 'zhangsan',
        'age' => 18
    ];
    $res = \App\Service\MqttService::SendMsgViaMqtt('topicA', json_encode($data));
    dump($res);
});

请求路由测试

注意:通过url的queryString进行topic订阅

总结

消息中间件应用越来越广泛,不仅可以实现可靠的异步通信,还可以实现即时通讯,掌握一个消息中间件还是很有必要的。像普通的订单下了给后台一个推送等等,都可以选择采用 MQ 实现,方便好用!奥利给!!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
RabbitMQ实现即时通讯居然如此简单!连后端代码都省得写了?
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的轻量级通讯协议,该协议构建于TCP/IP协议上。MQTT最大优点在于,可以以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。
macrozheng
2020/10/28
2.3K0
RabbitMQ实现即时通讯居然如此简单!连后端代码都省得写了?
还在用WebSocket实现实时消息推送?试试MQTT吧,真香!
有时候我们的项目中会用到即时通讯功能,比如电商系统中的客服聊天功能,还有在支付过程中,当用户支付成功后,第三方支付服务会回调我们的回调接口,此时我们需要通知前端支付成功。最近发现RabbitMQ可以很方便的实现即时通讯功能,如果你没有特殊的业务需求,甚至可以不写后端代码,今天给大家讲讲如何使用RabbitMQ来实现即时通讯!
macrozheng
2024/05/29
2.7K0
还在用WebSocket实现实时消息推送?试试MQTT吧,真香!
零基础教你自建MQTT服务器并实现双向通讯
随着物联网技术的快速发展,MQTT(Message Queuing Telemetry Transport)消息队列遥测传输协议,作为一种轻量级的通讯协议,被广泛应用于物联网设备之间的通讯。
Tinywan
2024/06/04
1.9K0
零基础教你自建MQTT服务器并实现双向通讯
两款常用的 MQTT 调试工具
我们可以使用 MQTT 客户端来测试 MQTT 的通讯功能,这里介绍常用的两款工具 MQTTBox 和 MQTT.fx 。
高楼Zee
2021/07/14
13.5K0
springboot + rabbitmq 做智能家居,我也没想到会这么简单
前一段有幸参与到一个智能家居项目的开发,由于之前都没有过这方面的开发经验,所以对智能硬件的开发模式和技术栈都颇为好奇。
程序员小富
2020/06/21
2.5K1
springboot + rabbitmq 做智能家居,我也没想到会这么简单
常见MQTT服务器搭建与试用(亲测通过)[通俗易懂]
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个即时通讯协议,它比较适合于在低带宽、不可靠的网络的进行远程传感器和控制设备通讯等,正在日益成为物联网通信协议的重要组成部分。MQTT现在主要用于即时通讯,物联网M2M,物联网采集等。本文就社区上常见的开源MQTT服务器在常见操作系统上的搭建做详细介绍。目前一些开源MQTT服务中间件有:
全栈程序员站长
2022/08/26
10.6K0
常见MQTT服务器搭建与试用(亲测通过)[通俗易懂]
rabbitmq使用mqtt协议[通俗易懂]
在网上学习物联网,发现有人可以用 springboot + rabbitmq可以搭建物联网(IOT)平台,rabbitmq 不是消息队列吗,原来rabbitmq有两种协议,消息队列是用的AMQP协议,而用在智能硬件中的是MQTT协议。
全栈程序员站长
2022/11/09
3.8K0
Tsung MQTT协议简介及MQTT xml文档配置介绍
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的“轻量级”通讯协议,该协议构建于TCP/IP协议上。
授客
2019/09/11
2.2K0
Tsung MQTT协议简介及MQTT xml文档配置介绍
mqtt协议实战(一)
最近项目中用到了mqtt的协议,今天特地抽时间学习了一下,搭建了一个基于nodejs的mqtt的服务。现在写一篇文章记录,分享给大家。
拿我格子衫来
2022/01/24
1.2K0
mqtt协议实战(一)
uniapp使用WebSocket实现即时通讯
WebSocket是一种基于TCP协议的全双工通信协议,它可以在客户端和服务器之间建立一个持久性的连接,实现实时通信。在uniapp中,我们可以使用uni-socketio插件来实现WebSocket的功能。
超级小可爱
2023/10/18
4.4K0
MQTT 入门介绍
遥测(英文名称:telemetering)是将对象参量的近距离测量值传输至远距离的测量站来实现远距离测量的技术。遥测技术是一个集成性能好的,具有良好的跟踪性能、遥控性能的一种新型的技术,其应用很广泛。是利用传感技术、通信技术和数据处理技术,将对象参量的近距离测量值传输至远距离的测量站来实现远距离测量的一门综合性技术。卫星遥感过程中,通过遥测技术可获取卫星运行的参数
zhangjiqun
2024/12/17
3410
MQTT 入门介绍
使用 MQTTnet 实现 MQTT 通信示例
MQTT 开源库还有 MqttDotNet、nMQTT、M2MQTT 等,不过这几个里面,目前star最多的还是MQTTnet(编辑时间2018.5.9)。
全栈程序员站长
2022/09/12
1.8K0
单独对 websocket 抽象封装,支撑了公司不同业务的消息即时通讯!
公司之前很多涉及到后端需要主动与前端web交互的业务,代码耦合严重,新的业务场景需要即时通信的得重新接入websocket,花费很多时间和精力,因此需要将websocket(缩写为:ws)抽象为公司内部的通讯服务,可以解决业务不同需求,比如:
码猿技术专栏
2024/07/31
3561
单独对 websocket 抽象封装,支撑了公司不同业务的消息即时通讯!
一文搞懂MQTT,如何在SpringBoot中使用MQTT实现消息的订阅和发布
之前介绍了RabbitMQ以及如何在SpringBoot项目中整合使用RabbitMQ,看过的朋友都说写的比较详细,希望再总结一下目前比较流行的MQTT。所以接下来,就来介绍什么MQTT?它在IoT中有着怎样的作用?如何在项目中使用MQTT?
章为忠学架构
2023/10/06
21K2
一文搞懂MQTT,如何在SpringBoot中使用MQTT实现消息的订阅和发布
【HarmonyOS 5】鸿蒙中如何使用MQTT
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是一种轻量级、基于发布 / 订阅(Publish/Subscribe)模式的即时通讯协议,专为资源受限的物联网(IoT)设备和低带宽、高延迟或不可靠网络环境设计。
GeorgeGcs
2025/04/09
2530
【HarmonyOS 5】鸿蒙中如何使用MQTT
一文了解MQTT协议
我们之前已经说了这个SSL 和 TCP/IP 协议了,我们今天就来详细的说说这个 MQTT 协议,因为很多消息现在都是支持 MQTT 协议的,比如 RabbitMQ ,还有 Kafka 等,今天我们就来详细的介绍 MQTT 协议到底是个什么。
Java极客技术
2022/12/04
4.2K0
一文了解MQTT协议
基于WebSocket的网页端即时通讯技术
本博客介绍基于html5的Websocket网页即时通讯技术,前端开发采用ExtJS前端框架 JavaEE框架:Mybatis、SpringMVC 先去官网下载ExtJS框架的资料文件: https://www.sencha.com/products/extjs/evaluate/ 可以参考中文翻译过来的官网查看API: http://extjs-doc-cn.github.io/ext4api/ 下载集成的jar:
SmileNicky
2019/01/17
2.6K0
通讯协议与即时通讯[通俗易懂]
客户端不断的查询服务器,检索新内容。这种方式的缺点十分明显,如果轮询频率过快,会大量消耗网络带宽和电池;
全栈程序员站长
2022/08/05
2.4K0
Java使用EMQX实现MQTT通信
在上一篇文章 《Java使用modbus4j实现ModbusTCP通信》 中我们介绍了Java与Modbus协议的TCP通信,本文讲解一下如何用Java实现对当下最流行的物联网协议之一的MQTT协议进行通信。
Jensen_97
2023/07/20
1.6K0
Java使用EMQX实现MQTT通信
MQTT 协议快速体验
全球物联网正在高速发展,专门针对低带宽和不稳定网络环境的物联网应用设计的 MQTT 协议也因此得到广泛应用。
EMQ映云科技
2022/10/09
1.6K0
相关推荐
RabbitMQ实现即时通讯居然如此简单!连后端代码都省得写了?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验