小程序mqtt实现聊天功能

article/2025/8/25 20:01:42

mqtt是什么?

MQTT是一个轻量级传输协议,它被设计用于轻量级的发布/订阅式消息传输,MQTT协议针对低带宽网络,低计算能力的设备,做了特殊的优化。是一种简单、稳定、开放、轻量级易于实现的消息协议,在物联网的应用下的信息采集工业控制智能家居等方面具有广泛的适用性。

发布,谁订阅

MQTT服务器类似一个公告栏,里面张贴了各种广告。张三跑过来说,凡是涉及足球的(/public/TEST/Soccer)的都发给自己(订阅)第二天,李四过来贴广告了,主题是(/public/TEST/Soccer),发布的内容是“30号有比赛”此时,公告栏会自动发短信给张三,发送的信息为 “30号有比赛”张三:APP端;李四:设备端;公告栏:云端的MQTT服务器

在这里插入图片描述

mqtt优点?

1、MQTT更加简单:

MQTT是一种消息队列协议,使用发布/订阅消息模式,提供一对多的消息发布,解除应用程序耦合,相对于其他协议,开发更简单;

2、MQTT网络更加稳定

工作在TCP/IP协议上;由TCP/IP协议提供稳定的网络连接;

3、轻量级

小型传输,开销很小(固定长度的头部是 2 字节),协议交换最小化,以降低网络流量;适合低带宽,数据量较小的应用;

MQTT和Websocket的区别是什么?

  • MQTT是为了物联网场景设计的基于TCP的Pub/Sub协议,有许多为物联网优化的特性,比如适应不同网络的QoS、层级主题、遗言等等。

  • WebSocket是为了HTML5应用方便与服务器双向通讯而设计的协议,HTTP握手然后转TCP协议,用于取代之前的Server Push、Comet、长轮询等老旧实现。两者之所有有交集,是因为一个应用场景:如何通过HTML5应用来作为MQTT的客户端,以便接受设备消息或者向设备发送信息,那么MQTT over WebSocket自然成了最合理的途径了。

如何适用mqtt去实现聊天功能?

  1. 首先我们从前端布局样式开始

为了时时滚动到最新消息我们使用 scroll-view 标签包裹 使用它的scroll-into-view属性我们绑定一个自定义id

如图:

在这里插入图片描述

我们在创建的元素上绑定一个 id属性,scroll-view 即可自动滚动到其对应位置。

在这里插入图片描述

以上就是几种不同消息类型的展示,我们先不考虑类型的样式,我们先来实现聊天左右分布的布局

推荐大家使用 flex 布局去实现

左侧医生:display: flex;justify-content: flex-start; (默认属性)

右侧患者:display: flex;justify-content: flex-end;(尾部对齐)

样式方面主要也就是这两个属性,其他消息类型的,也是在这基础上做修改即可。

2.连接 mqtt

首先我们要引入依赖

var Paho = require('./utils/paho-mqtt-wx.js')

var Paho = require('./utils/paho-mqtt-wx.js')/*** 连接 mqtt*/
connectMqtt() {// let t = '异常断线';var t = {}t.i = this.globalData.connectParams.msgTopicNamet.c = 0t.t = 3// console.log(t, 98)const message = new Paho.Message(JSON.stringify(t))this.connectOptions = {}//连接mqtt用户名this.connectOptions.userName = api.mqttuser //连接mqtt密码this.connectOptions.password = api.mqttpass //遗嘱消息 当客户端断开连接时,发送给相关的订阅者的遗嘱消息this.connectOptions.willMessage = message //心跳保持时间 是一种用于MQTT 的 长连接机制。this.connectOptions.keepAliveInterval = 10 //断开连接时是否要清除sessionthis.connectOptions.cleanSession = this.globalData.connectParams.cleanSession//设置如果连接丢失,客户端是否自动尝试重新连接到服务器this.connectOptions.reconnect = false //连接成功回调this.connectOptions.onSuccess = this.onConnect //连接失败回调this.connectOptions.onFailure = this.failConnect this.client = new Paho.Client('wss://' + this.globalData.connectParams.dnHost + '/mqtt', this.globalData.connectParams.clientId)//当客户端失去连接时调用this.client.onConnectionLost = this.onConnectionLost this.client.onMessageArrived = this.onMessageArrived//与服务器建立连接this.client.connect(this.connectOptions)
},
onConnect(){console.log('连接成功 - onSuccess')//订阅this.client.subscribe(this.globalData.connectParams.msgTopicName) //订阅// var t = '上线';var t = {}t.i = this.globalData.connectParams.msgTopicNamet.c = 0t.t = 0const message = new Paho.Message(JSON.stringify(t))message.destinationName = this.globalData.connectParams.statusTopicName //发送上线消息this.client.send(message)
}
failConnect(){// 从新连接console.log('连接失败 - onFailure')
}
onMessageArrived(message){console.log('mqtt消息到达 - onMessageArrived:', message)
}
onConnectionLost(response){// 从新连接console.log('mqtt失去连接 - responseObject:', response)
}

以上我们完成mqtt连接操作,以及一些事件监听。

发送消息以及聊天记录缓存处理?

在这里插入图片描述

到这里就已经是聊天功能的核心了

首先是消息分组,消息按发送时间段去缓存分组,实现起来的思路大概就是,当我们发送或者收到消息的时候
我们只需要拿当前你要发送或者你接受的消息发送时间(endTime)去与我们本地缓存记录的最新一条消息去做对比


//举个栗子
//最新消息的发送时间
let newEndtime = 1624418176356,//本地缓存最新消息发送时间
oldEndtime = 1624418212889 //120000(毫秒)2分钟newEndtime - oldEndtime <= 120000 ?  创建新分组 : 当前分组添加消息

时间分组的实现思路就是这样,我们只需要根据消息发送时间去计算,判断是不是两分钟内的消息,如果是我们直接在当前消息分组(messageArr[messageArr.length-1].messages.Push)一条新消息,如果大于两分钟了,我们就直接从新创建一个分组,也就是messageArr.Push,Push过在把最新消息更新到本地历史消息即可。

历史消息上拉加载?

本地存储数据与服务端数据混合加载,因小程序本地存储限制我们前端只存100条聊天数据,本地的数据加载完以后,在上拉我们就要调用分页去获取历史消息了,

注意了:历史消息的分页,会有一个分页参数就是我们messageArr消息记录最后一条消息的endTime(发送时间),然后把服务端返回历史消息合并到我们messageArr里,消息加载总体就这些逻辑,

以上步骤我们就可以实现一个基本的聊天功能了 思路大体就是这样 有疑问的同学可以私信我

在这里插入图片描述

喜欢下方小程序的私信送源码

http://chatgpt.dhexx.cn/article/wd32rEH7.shtml

相关文章

微信小程序接入腾讯IM即时通讯,实现在线聊天

最近在帮朋友写一个二手交易平台&#xff0c;买卖双方在线沟通的功能(类似于某鱼&#xff09; 先上传做完的效果图&#xff0c;后续再更新源码&#xff0c;目前实现了消息列表显示未读数量&#xff0c;显示最后一条信息内容&#xff0c;收到信息后刷新列表。聊天页面 不要吐槽…

应用实战|微信小程序开发示例--多人聊天互动空间

“超能力”数据库&#xff5e;拿来即用&#xff0c;应用开发人员再也不用为撰写API而发愁。MemFire Cloud 为开发者提供了简单易用的云数据库&#xff08;表编辑器、自动生成API、SQL编辑器、备份恢复、托管运维&#xff09;&#xff0c;很大地降低开发者的使用门槛。 本示例是…

微信小程序实现websocket及单人聊天功能

一、什么是websocket&#xff1a; WebSocket是HTML5下一种新的协议&#xff08;websocket协议本质上是一个基于tcp的协议&#xff09;它实现了浏览器与服务器全双工通信&#xff0c;能更好的节省服务器资源和带宽并达到实时通讯的目的Websocket是一个持久化的协议 二、websoc…

uni-app+websocket实现语音聊天小程序

uni-appwebsocket 开发语音聊天咨询小程序

微信小程序中百分百实现聊天界面

众所周知,全网来看,微信的聊天界面看着就是舒服,那能否在微信小程序中实现该功能,同时可以实现输入文本和语音功能,而且在输入文本时,键盘可以弹起。话不多说,上界面看看。 wxml实现如下: <view> <scroll-view scroll-y scroll-into-view={{toView}} style=h…

图灵聊天机器人小程序

历时半年整理出了十多万字的学习笔记&#xff0c;目前依旧在更新 欢迎点赞和支持&#xff5e;&#x1f973;&#x1f973;&#x1f973; 博客 项目描述&#xff1a; 根据图灵API向聊天机器人发送聊天信息&#xff0c;并渲染返回的数据。具有清空聊天记录的按钮。本来是想上线…

微信小程序-模仿绘制聊天界面

参考文章 1、小程序模仿微信聊天界面 2、微信小程序实现仿微信聊天界面(各种细节处理) 3、微信小程序之页面中关于聊天框三角形的制作和使用 4、仿微信聊天记录时间显示 5、微信小程序-同时获取麦克风、相机权限、获取多个权限 6、【uni-app】模仿微信实现简易发送/取发语音功…

微信聊天小程序——(二、账号的注册与登录)

具体效果&#xff1a; 目录 二、账号的注册与登录 步骤一、获取用户信息 步骤二、用户输入账号密码&#xff08;在注册页面中&#xff09; 步骤三、将获取到的值放到我们的数据库中&#xff08;在注册页面中&#xff09; 步骤四、登录的页面逻辑 步骤五、登录页面的实现 …

微信聊天小程序——(三、获取好友列表)

三、获取好友列表 步骤一、展示所有好友的推荐列表&#xff08;friends页面&#xff09; 具体效果&#xff1a; 实现思路&#xff1a; 我们有我们的用户数据库表即&#xff1a;uers循环我们的数据库用户表&#xff0c;达到所有的用户信息&#xff0c;即&#xff1a;userLi…

微信聊天小程序——(五、添加好友)

五、添加好友 步骤一、通过搜索添加好友 具体效果&#xff1a; 思路&#xff1a; 本质上来讲&#xff0c;就是通过输入框得到好友账号信息&#xff0c;之后再数据库中查询&#xff0c;最后返回并渲染查询结果。首先&#xff0c;得到输入框的值&#xff0c;并传递到我们的页面…

支付宝小程序平台的IM聊天插件

文章目录 前言一、用户端1.基本展示2.难处理的点二、另一用户端1.前端websocket的整合2.手机息屏websocket断线问题2.websocket服务端配置3.后端整合websocket作为服务端&#xff0c;传输消息给前端 总结 前言 最近工作需求来了个项目&#xff0c;前景为在支付宝平台上发布一个…

使用 Python 编写一个聊天小程序

欢迎关注 “小白玩转Python”&#xff0c;发现更多 “有趣” 本篇文章分享如何用相当简洁的 Python 代码制作一个简单的聊天应用程序。更重要的是&#xff0c;我已经实现了没有任何第三方依赖的代码&#xff01; 首先&#xff0c;我创建了一个聊天服务器&#xff0c;通过它可以…

小米手机解BL锁教程

1.找到设置&#xff0c;找到我的设备 2.点击全部参数&#xff0c;多点几下miui版本&#xff0c;直到弹出开发者模式提醒。 3.返回&#xff0c;找到更多设置 4.找到开发者选项 5.找到设备定状态 6.绑定账号和设备&#xff0c;关机&#xff0c;按开键加音量减&#xff0c;进去fas…

安卓搞机玩机-什么是“锁 ” BL锁 屏幕锁 账号锁 设备锁等分析

相信把玩安卓机型的友友们都大概了解机型的锁是什么概念。但有些友友可能还分不清楚具体锁的概念。今天这个帖子由浅入深的带你了解安卓机型中各种“锁”的概念.这类话题比较敏感。只是大概带你分清楚锁的分类和基本对应的解锁方式. 一.屏幕锁【 图案锁 指纹锁 数字锁 人…

万能小米手机解锁,刷机,默认破解BL锁

写在第一条:下载之前请注意 本软件不支持最新机型,只支持4代和4代以前的机型,请注意 早就想给自己的小米手机刷机了&#xff0c;奈何一直没有门&#xff0c;最后还在求助了万能的淘宝&#xff0c;刚刚在淘宝花了 30大洋买的刷机工具&#xff0c;刷机成功之后&#xff0c;才反…

xiaomi 小米 红米redmi 秒解锁BL锁,不用等,在线秒解锁BL工具介绍

xiaomi 小米 红米redmi 秒解锁BL锁,不用等&#xff0c;在线秒解锁BL Xlaomi Redmi K40 Gaming Xlaomt Poco F3 GT Gaming Xaoml Poco X3 GT Xaoml Redmi Note9 5G Xlaomi Redml Note 10 Pro 5G Xlaoml Redmi Note 10 5G Xlaoml Redml Note 10T 5G Xlaoml Poco M3 Pro 5G Xaoml…

小米手机解BL锁、线刷详细教程,适用于小米全系列手机

[教程] 小米手机解BL锁、线刷详细教程&#xff0c;适用于小米全系列手机 这几天看到论坛里很多人在问怎么线刷&#xff0c;下面我就做个详细的线教程大家看一下高手别喷我哈 此教程只适合刷官方MIUI包 进入正题。 第一步&#xff1a;解BL锁 1.浏览器打开申请解锁小米手机点击立…

android@解bl锁@twrp的刷入和使用问题

文章目录 解bl锁步骤 附:MIUI线刷工具待线刷设备扫面和检查使用方式线刷工具卡住的关闭方法 第三方recoverytwrp解密datadata decrypt清除data后用twrp中刷入文件刷入面具 如何找到合适的TWRP rec ref 解bl锁 不是所有android设备都支持解锁下面是以最为典型的MIUI android设备…

02_Lock锁

首先看一下JUC的重磅武器——锁&#xff08;Lock&#xff09; 相比同步锁&#xff0c;JUC包中的Lock锁的功能更加强大&#xff0c;它提供了各种各样的锁&#xff08;公平锁&#xff0c;非公平锁&#xff0c;共享锁&#xff0c;独占锁……&#xff09;&#xff0c;所以使用起来…

红米note10 pro机型解除“账号锁”的一些操作案例 mtk机型强解bl锁

前言。操作解除锁类案例只限于自己的机型&#xff0c; 因手机号长期不用或者忘记密码导致账号锁出现的问题 机型哦 我经常在csdn网站分享一些玩机中的实测资源和玩机常识。遇到很多玩机的友友&#xff0c;其中我分享的一个资源&#xff0c;这个粉丝朋友下载后在网吧操作不了。…