【消息中间件】原生PHP对接Uni H5、APP、微信小程序实时通讯消息服务

简介: 【消息中间件】原生PHP对接Uni H5、APP、微信小程序实时通讯消息服务

视频演示效果

【uniapp】实现买定离手小游戏


前言

Mqtt不同环境问题太多,新手可以看下

  1. 《【MQTT】Esp32数据上传采集:最新mqtt插件(支持掉线、真机调试错误等问题》
  2. 《一篇就够:uniapp-Mqtt系列问题详细攻略(解决掉线、真机调试错误等问题)》
  3. 《解决微信小程序MQTT真机连接问题与合法域名配置SSL问题》
  4. 《解决微信小程序MQTT通讯真机调试失败的问题附加可用代码》
  5. 《Esp8266-01s、51单片机实现连接MQTT踩坑:附加烧录安信可固件+宝塔搭建MQTT服务器 全套攻略》

以上的就是我所有的Mqtt踩坑记录,相信看完应该能解决了,今天这一篇文章,主要是记录升级Mqtt5.0以及如何适配安卓端,如果不想看,也可以直接去下载插件:【uniapp】【5.0协议】最完整Mqtt示例代码(解决掉线、真机调试错误等问题)

注意:插件代码不含如果要用在app端,请留意评论区的消息,换协议


一、分析

将原APP接入实时通讯,采用MQTT,有很多优点,这里就不列举了。这次对接的是我的打卡平台,

分为三个端:H5、APP、微信小程序

要保证三个端都通,我这里也不绕圈子了,协议我会放在本节底部,通过uniapp中的app.vue文件,将mqtt连接为全局状态,无论哪个页面都不会掉线,那么如何一对一接收呢?这里我做的思路是将客户端的订阅号订阅名改为自己的登陆账号,也就是说,用户未登录时不连接,检测到用户登录后将账户结合一些制定字符串作为onTopic,服务端指定发送过去即可,分析完之后我们开始实现客户端的连接。

连接案例:

var hosts = '';
// #ifdef APP-PLUS
hosts = 'wx://' + that.globalData.serve.host + ':443/mqtt';
// #endif
// #ifdef H5
hosts = 'wss://' + that.globalData.serve.host + ':443/mqtt';
// hosts = 'wss://' + that.globalData.serve.host + ':443/mqtt';
// hosts = 'tcp://' + this.globalData.serve.host + ':' + this.globalData.serve.wsport + this.globalData.serve.path;
//#endif
// #ifdef MP-WEIXIN
// wx仅仅可以使用体验版
hosts = 'wxs://' + that.globalData.serve.host + ':443/mqtt';
//#endif

二、全局注入MQTT连接

1.引入库

import mqtt from '@/utils/mqtt3.0.0.js'; // 导入MQTT库

库直接在插件中下载即可用:

【uniapp】【5.0协议】最完整Mqtt示例代码(解决掉线、真机调试错误等问题)

2.写入全局连接代码

App.vue是uni-app的主组件,所有页面都是在App.vue下进行切换的,是页面入口文件。但App.vue本身不是页面,这里不能编写视图元素,也就是没有。

这个文件的作用包括:调用应用生命周期函数、配置全局样式、配置全局的存储globalData

<script>  
    export default {  
        globalData: {  
            text: 'text'  
        }
    }  
</script>

所以我们的代码:

<script>
  import mqtt from '@/utils/mqtt3.0.0.js'; // 导入MQTT库
    export default {
       globalData: {  
           serve: {
            host: 'mqtt.taila.club',
            wsport: '8083',
            wssport:'443',
            path: 'mqtt',
           },
           onTopic: '',//订阅发送来的消息
           onSub: '',//
           Qos: 2,
           sendMassage: '',
           time:0,
           receiveMessage: '',
           client: null,
           //MQTT连接的配置
           options: {
            wsOptions: {},
            protocolVersion: 5, //MQTT连接协议版本
            clientId: '',
            keepalive: 60,
            clean: false,
            username: '',
            password: '',
            reconnectPeriod: 1000, //1000毫秒,两次重新连接之间的间隔
            connectTimeout: 30 * 1000, //1000毫秒,两次重新连接之间的间隔
            resubscribe: true //如果连接断开并重新连接,则会再次自动订阅已订阅的主题(默认true)
           },
              },
      onLaunch: function() {
         let that=this;
         console.log('======'+that.globalData.Qos)
         // console.log('======'+that.globalData.Qos)
        // 先断开
        that.unconnect();
        console.log('App Launch')
        //版本检查
        //调用示例 配置参数, 默认如下,其中api是接口地址,必须填写
        // #ifdef APP-PLUS
        //
        //版本检查
        //mqtt
        // 检查本地存储是否存在登录状态的信息
        that.check_account_mqtt_connect();
      },
      methods: {
        subscribe: function() {
            // 判断是否已成功连接
            if (!this.globalData.client || !this.globalData.client.connected) {
              this.showToast('客户端未连接', 1000)
              return;
            }
            this.globalData.client.subscribe(this.globalData.onTopic, {
              qos: this.globalData.Qos
            }, error => {
              if (!error) {
                this.showToast('订阅成功', 1000, 'success')
                console.log('订阅成功');
              }
            });
          },
          publish: function() {
            // 判断是否已成功连接
            if (!this.globalData.client || !this.globalData.client.connected) {
              this.showToast('客户端未连接', 1000)
              return;
            }
            if (this.globalData.sendMassage != '') {
              // var send = '{"code": 200, "msg": "发送打1111指令", "data": "2.doc"}';
               // 定义JSON对象
                const messageq = {
                  code: 200,
                  msg: '发送打印指令',
                  data: '2.doc'
                }
                // 将JSON对象转换为JSON字符串
                const message1 = JSON.stringify(messageq)
              this.globalData.client.publish(this.globalData.onSub,message1, error => {
                console.log(error || '消息发布成功');
                this.showToast('消息发布成功', 1000, 'success')
              });
            } else {
              this.showToast('发布消息为空', 1000)
            }
          },
          unsubscribe: function() {
            this.globalData.client.unsubscribe(
              this.globalData.onTopic,
              err => {
                console.log(err || '取消订阅成功');
                this.showToast('取消订阅成功', 1000, 'success')
              }
            );
          },
          unconnect: function() {
            if (!this.globalData.client || !this.globalData.client.connected) {
              this.showToast('客户端未连接', 1000)
              return;
            }
            this.client.end();
            this.client = null
            this.showToast('成功断开连接', 1000, 'success')
            console.log('断开连接');
          },
          showToast: function(title, time, icon = 'none') {
            uni.showToast({
              title: title,
              icon: icon,
            });
            setTimeout(function() {
              uni.hideToast();
            }, time);
          },
        check_account_mqtt_connect:function(){
          let that=this;
          const openid = uni.getStorageSync('openid');
           if (openid=='') {
            uni.showToast({
              title:'订阅消息连接失败',
            icon:'none'
            })
           }else{
             // 如果存在登录状态的信息,直接进行MQTT连接
             //构造必要数据
             let clientId = "mqtt_" + Math.random().toString(16).substr(2, 8)+openid;
             console.log("生成的随机clientId为:" + clientId);
              this.globalData.options.clientId=clientId;
             this.globalData.onTopic=openid;//定义订阅消息
             that.connect();
           }
        },
      connect: function() {
        let that = this;
        var hosts = '';
        // #ifdef APP-PLUS
      hosts = 'wx://' + that.globalData.serve.host + ':443/mqtt';
        // #endif
        // #ifdef H5
        hosts = 'wss://' + that.globalData.serve.host + ':443/mqtt';
        // hosts = 'wss://' + that.globalData.serve.host + ':443/mqtt';
         // hosts = 'tcp://' + this.globalData.serve.host + ':' + this.globalData.serve.wsport + this.globalData.serve.path;
        //#endif
        // #ifdef MP-WEIXIN
        // wx仅仅可以使用体验版
      hosts = 'wxs://' + that.globalData.serve.host + ':443/mqtt';
        //#endif
        console.log(hosts);
        if (that.globalData.client == null || that.globalData.client.connented == false) {
          uni.showLoading({
            title: '连接中···'
          });
          that.globalData.client = mqtt.connect(
            hosts,
            that.globalData.options
          );
          that.globalData.client.on('connect', () => {
            uni.hideLoading();
            that.showToast('连接成功', 1000, 'success');
            that.subscribe();
          });
          that.globalData.client.on('message', (topic, message) => {
            console.log('收到来自' + topic + '的消息' + message.toString());
            uni.showToast({
              title:'收到一条消息:请在主页查收',
          duration:4000,
          icon:'none'
            })
            // 在收到消息时调用onMessageArrived回调函数进行处理
          });
        }
        that.globalData.client.on('reconnect', error => {
          uni.hideLoading();
          that.showToast('正在重连···', 1000);
        });
        that.globalData.client.on('error', error => {
          uni.hideLoading();
          that.showToast('连接失败!', 1000);
        });
      },
      },
      onShow: function() {
        console.log('App Show')
      },
      onHide: function() {
        console.log('App Hide')
      }
    }
</script>
<style lang="scss">
  /* ==== App.vue 文件 ==== */
    /* 为了避免电脑浏览器中的滚动条影响到布局,可在 style 标记中添加如下 CSS 代码*/
    /* 条件编译,仅在H5平台生效 */
    // #ifdef H5
    body::-webkit-scrollbar,html::-webkit-scrollbar {
        display: none;
    }
    // #endif
      /*每个页面公共css */
      @import "@/uni_modules/b-ui/css/main.bundle.scss";
</style>

注意:

App.vue和其他页面不一样,我也是弄了好久才弄清楚,另外使用了全局globalData才编译成小程序时最新版本会报错,获取不到,应该时BUG,我当时用的是基础组件2.33版本就解决了

二、PHP环境建立

下载文章顶部的配套资源到服务器

修改封装的代码里面的连接信息,以及数据持久化

<?php
require_once("php_mqtt/mqtt.class.php");//基础组件
function send_mqtt_message($receiver, $content,$conn,$type)
{
    $server = "mqtt.taila.club";  // 服务代理地址(mqtt服务端地址)
    $port = 1883;                // 通信端口
    $username = "";              // 用户名(如果需要)
    $password = "";              // 密码(如果需要)
    $client_id = "clientx9293670xxctr_492344"; // 设置你的连接客户端id
    $mqtt = new Mqtt($server, $port, $client_id); // 实例化MQTT类
    if ($mqtt->connect(true, NULL, $username, $password)) {
        // 如果创建链接成功
        $message = array(
            'message_id' => uniqid(), // 使用uniqid生成唯一的消息ID
            'sender' => '153***9', // 消息的发送者,可以是用户ID或用户名
            'receiver' => $receiver, // 消息的接收者,可以是用户ID或用户名
            'content' => $content, // 消息的内容,可以是文本、图片、文件等
            'timestamp' => time(), // 消息的时间戳,记录消息的发送时间
            'type' => $type, // 消息的类型,用于区分不同类型的消息0系统消息
            'status' => '0'//0未读1已读
        );
        $json_message = json_encode($message); // 将PHP数组转换为JSON字符串
        $mqtt->publish("$receiver", $json_message, 2); // 发送JSON消息到主题 "gg"
        //持久化
       // $sql="INSERT INTO `message` (`message_id`, `sender`, `receiver`, `content`, `type`, `status`, `create_time`) VALUES (NULL, '15368666279', '$receiver', '$content', '$type', '0', CURRENT_TIMESTAMP)";
       // $conn->query($sql);
        $mqtt->close(); // 发送后关闭链接
    } else {
        echo "Time out!\n";
    }
}
?>

调用方式非常简单,新建index.php

<?php
include '../../api/conn.php';//连接数据库根据你情况来定
require_once("../../api/Message_push/mqtt_sender.php");
//消息发送
$receiver = $_GET["openid"];//发送手机号
$content = $_GET["msg"];//发送的消息
send_mqtt_message($receiver, $content,$conn,'1');
?>

总结

以上就是今天要讲的内容,本文仅仅简单介绍了【MQTT5】原生PHP对接Uni H5、APP、微信小程序实时通讯消息服务的使用

相关实践学习
消息队列+Serverless+Tablestore:实现高弹性的电商订单系统
基于消息队列以及函数计算,快速部署一个高弹性的商品订单系统,能够应对抢购场景下的高并发情况。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
8天前
|
人工智能 搜索推荐 数据挖掘
原生鸿蒙版小艺APP接入DeepSeek-R1,为HarmonyOS应用开发注入新活力
原生鸿蒙版小艺APP成功接入DeepSeek-R1,为HarmonyOS用户带来更智能高效的交互体验。通过此次升级,用户在编程、学习和工作中的问题可迅速获得专业解答。同时,此举为HarmonyOS应用开发者提供了新的技术参考,激发了更多创新应用场景的开发,助力打造差异化竞争优势,推动HarmonyOS生态繁荣发展。
134 68
原生鸿蒙版小艺APP接入DeepSeek-R1,为HarmonyOS应用开发注入新活力
|
2月前
|
运维 小程序 前端开发
结合圈层营销策略,打造稳定可靠的圈子app系统,圈子小程序!
圈子系统是一种社交平台,用户可按兴趣、职业等创建或加入“圈子”,进行内容发布、讨论和资源共享。开发时需考虑需求分析、技术选型(如PHP、MySQL)、页面设计、功能实现(注册、登录、发布、评论等)、测试优化及运维管理。圈层营销则通过精准化、高端化的方式传递品牌信息,增强客户归属感。圈子小程序基于微信等平台,具备跨平台、便捷性和社交性,开发过程中需明确需求、选择技术框架、设计页面并确保稳定性和流畅性。
|
8天前
|
安全 JavaScript 前端开发
小游戏源码开发之可跨app软件对接是如何设计和开发的
小游戏开发团队常需应对跨平台需求,为此设计了成熟的解决方案。流程涵盖游戏设计、技术选型、接口设计等。首先明确游戏功能与特性,选择合适的技术架构和引擎(如Unity或Cocos2d-x)。接着设计通用接口,确保与不同App的无缝对接,并制定接口规范。开发过程中实现游戏逻辑和界面,完成登录、分享及数据对接功能。最后进行测试优化,确保兼容性和性能,发布后持续维护更新。
|
30天前
|
JSON 小程序 UED
微信小程序 app.json 配置文件解析与应用
本文介绍了微信小程序中 `app.json` 配置文件的详细
137 12
|
1月前
|
存储 监控 小程序
TP6+Uni-app框架下,圈子系统小程序的快速上线开发步骤
社交圈子系统多端运营级应用,融合了推荐匹配、语音聊天、IM即时通讯、动态发布、一键约聊、同城交友、附近的人、充值提现、邀请推广等功能,为平台运营提供更多的盈利变现方式。程序源码开源,支持二次开发,根据客户不同应用场景需求,定制个性化解决方案。
56 9
|
1月前
|
移动开发 开发框架 小程序
轻松搭建婚恋交友系统源码,H5/小程序/APP自动适配,智能匹配恋爱交友平台快速落地
婚恋交友系统涵盖在线交友、线下活动、专业服务、社交娱乐等,满足用户多样化需求。系统设计简洁易用,提供实名认证、多注册方式及安全保护,确保用户隐私和数据安全。功能丰富,支持图文展示、筛选匹配、聊天互动、虚拟礼物等,提升互动趣味性。平台可分类管理用户、审核信息、智能推荐,优化用户体验。基于TP6+Uni-app框架,实现跨平台同步,支持二次开发,适应不同市场需求。 [了解更多](https://gitee.com/multi-customer-software/jy)
|
1月前
|
小程序 IDE PHP
圈子源码如何打包生成App小程序/开发一个圈子系统软件所需要的费用体现在哪里?
将PHP源码打包成App的过程涉及多个步骤和技术选择。以圈子源码为例,首先明确需求,确定App功能和目标用户群体,并根据需求开发小程序页面,如用户注册、圈子列表等。源码准备阶段确保源码适用于小程序开发,环境配置需安装IDE(如微信开发者工具)及依赖库。最后在IDE中打包小程序并上传至管理平台,通过审核后发布。费用方面,模板开发成本较低,定制开发则更高,具体取决于需求复杂度和第三方服务费用。
74 0
|
2月前
|
开发框架 小程序 前端开发
圈子社交app前端+后端源码,uniapp社交兴趣圈子开发,框架php圈子小程序安装搭建
本文介绍了圈子社交APP的源码获取、分析与定制,PHP实现的圈子框架设计及代码编写,以及圈子小程序的安装搭建。涵盖环境配置、数据库设计、前后端开发与接口对接等内容,确保平台的安全性、性能和功能完整性。通过详细指导,帮助开发者快速搭建稳定可靠的圈子社交平台。
|
30天前
|
移动开发 小程序
thinkphp+uniapp开发的多端商城系统源码/H5/小程序/APP支持DIY模板直播分销
thinkphp+uniapp开发的多端商城系统源码/H5/小程序/APP支持DIY模板直播分销
27 0
|
2月前
|
小程序 安全 网络安全
清晰易懂!陪玩系统源码搭建的核心功能,陪玩小程序、陪玩app的搭建步骤!
陪玩系统源码包含多种约单方式、实时语音互动、直播间与聊天室、大神申请与抢单、动态互动与社交及在线支付与评价等核心功能。搭建步骤包括环境准备、源码上传与解压、数据库配置、域名与SSL证书绑定、伪静态配置及后台管理。注意事项涵盖源码安全性、二次开发、合规性和技术支持。确保平台安全、合规并提供良好用户体验是关键。

热门文章

最新文章

  • 1
    MNN-LLM App:在手机上离线运行大模型,阿里巴巴开源基于 MNN-LLM 框架开发的手机 AI 助手应用
  • 2
    【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
  • 3
    【Azure App Service】基于Linux创建的App Service是否可以主动升级内置的Nginx版本呢?
  • 4
    原生鸿蒙版小艺APP接入DeepSeek-R1,为HarmonyOS应用开发注入新活力
  • 5
    【05】flutter完成注册页面完善样式bug-增加自定义可复用组件widgets-严格规划文件和目录结构-规范入口文件-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
  • 6
    【Azure Function】Function App出现System.IO.FileNotFoundException异常
  • 7
    【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
  • 8
    【Azure Logic App】使用MySQL 新增行触发器遇见错误 :“Unknown column 'created_at' in 'order clause'”
  • 9
    阿里云APP备案流程图以及备案所需材料整理,跟着教程一步步操作
  • 10
    【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程