支付宝小程序websocket长连接(心跳版本)

news2024/11/26 0:45:27

注意点:
关闭连接一定要把那些开下来的监听全部关闭掉

1.开启连接

			/*长连接*/
connectWebSocket() {
				let that = this;
				my.connectSocket({
					url: `ws://192.xx.8.xx:7780/charger-service-netty/websocket/${uni.getStorageSync('chargePointId')}`,
					header: {
						AccessType: 'alipay-mini-program',
						Authorization: uni.getStorageSync("token")
					},
					success: (res) => {
						console.log("创建socket连接成功" + JSON.stringify(res));
						console.log('1111111')

					},
					fail: (error) => {
						console.error('创建连接失败: ', JSON.stringify(error));
					},
				});
				// 连接建立时的事件监听器
				my.onSocketOpen(function(res) {
					console.log('2222222')
					console.log('WebSocket 连接已打开!', JSON.stringify(res));
				});
				// 监听长连接消息回调
				my.onSocketMessage((res) => {
					console.log('3333333')
					console.log('onSocketMessage 接收到了消息', JSON.parse(res.data));
					let resp = JSON.parse(res.data)
					if (resp.action == 'ConnectedSuccess') { // 连接成功标识
						that.webSocketFlag = true;

					}
					if (resp.action == 'RemoteStartTransaction') { // 开始充电失败
						if (resp.success == 1) { // 失败
							uni.showToast({
								title: resp.message
							})
							this.loadingFlag = false
						}
					}
					if (resp.action == 'RemoteStopTransaction') { // 停止充电失败
						if (resp.success == 1) { // 失败
							uni.showToast({
								title: resp.message
							})
							this.loadingFlag = false
						}
					}
					if (resp.action == 'StartTransaction') { //开始充电成功
						if (resp.success == 0) { // 充电成功
							this.loadingFlag = false
							this.chargingFlag = true;
							uni.showToast({
								title: '已开始充电'
							})
							uni.setStorageSync('chargingFlag', true)
						} else {
							uni.showToast({
								title: resp.message
							})
							this.loadingFlag = false
						}
					}
					if (resp.action == 'StopTransaction') { //停止充电成功
						if (resp.success == 0) { // 充电成功
							this.loadingFlag = false
							this.chargingFlag = false;
							uni.showToast({
								title: '已停止充电'
							})
							uni.setStorageSync('chargingFlag', false)
						} else {
							uni.showToast({
								title: resp.message
							})
							this.loadingFlag = false
						}
					}
					if (resp.action == 'StatusNotification') { // 上报桩状态
						if (resp.success == 0) {
							this.guntStatus = resp.payload.connectorStatusCode // 枪状态
						}
					}
					if (resp.action == 'MeterValues') {
						if (resp.success == 0) {
							this.currentData = resp.payload
							// 格式化充电时间
							if (this.currentData.chargeDuration == 0) {
								this.currentData.chargeDurationStr = '- -'
							} else if (this.currentData.chargeDuration > 0 && this.currentData.chargeDuration <
								3600) {
								this.currentData.chargeDurationStr = Math.floor(this.currentData.chargeDuration /
									60) + 'min'
							} else {
								let hours = Math.floor(this.currentData.chargeDuration / 3600);
								let min = Math.floor((this.currentData.chargeDuration % 3600) / 60);
								this.currentData.chargeDurationStr = hours + 'h' + min + 'min'
							}
							
							// 格式化蚂蚁能量
							if (this.currentData.greenEnergyPer != '') {
								let perCount = parseFloat(this.currentData.greenEnergyPer)
								let baseHeight = perCount == 100 ? 168 : 165
								this.energyHeight = -(perCount * 0.35 + baseHeight) //计算小球波浪的高度
							}
						}
					}
				});
				// 连接错误时的事件监听器
				my.onSocketError(function(res) {
					console.log('onSocketError' + JSON.parse(res.data))
					that.restConnect()
				});

				// 连接关闭时的事件监听器
				my.onSocketClose(function(res) {
					console.log('onSocketClose' + JSON.parse(res.data))
					that.webSocketFlag = false;
					that.restConnect()
				})
			},

2.心跳

			// webSocket 发送心跳
			heartStart() {
				console.log('准备开始发送心跳')
				let that = this;
				if (this.webSocketFlag) {
					my.sendSocketMessage({
						data: JSON.stringify({
							heartbeat: 1,
						}),
						fail: (error) => {
							console.error('sendSocketMessage failed: ', JSON.stringify(error));
							that.restConnect()
						},
						success: (res) => {
							console.log('心跳指令下发成功')
							console.log(res)
							that.webSocketTimer = setTimeout(() => {
								that.heartStart()
							}, 30000)
						}
					})
				} else {
					if (that.webSocketTimer != null) {
						clearTimeout(that.webSocketTimer)
						that.webSocketTimer = null;
					}
				}
			},

3.重新连接

		/*重新连接*/
			restConnect() {
				console.log('开始重新连接了')
				let that = this;
				that.webSocketFlag = false;
				clearTimeout(that.webSocketTimer)
				that.webSocketTimer = null;
				that.closeWebsocket()
				let timer = setTimeout(() => {
					that.connectWebSocket()
					clearTimeout(timer)
					timer = null;
					console.log('长连接断开了,开始重新连接')
				}, 2000)
			},

4.离开页面关闭连接

	// 关闭websocket连接
			closeWebsocket() {
				let that = this;
				my.offSocketMessage(); // 取消监听 WebSocket 接收到服务器的消息事件。
				my.offSocketOpen() // 取消监听 WebSocket 连接打开事件
				// 监听 WebSocket 连接关闭事件
				my.onSocketClose(function(res) {
					console.log('socket 连接已关闭!')
				});

				// 关闭 socket 连接
				my.closeSocket({
					success: () => {
						console.log('socket++关闭成功');
						that.webSocketFlag = false;
					}
				})
			},

5.效果
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2063379.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

三种相机模型总结(针孔、鱼眼、全景)

相机标定 文章目录 相机标定前言 前言 我们最常见的投影模型Perspective Projection Model描述的就是针孔相机的成像原理。从上面的图根据相似三角形可以得出 参考链接 https://zhuanlan.zhihu.com/p/540969207 相机标定之张正友标定法数学原理详解&#xff08;含python源码&a…

楼宇智慧公厕系统实时卫生状况一目了然

在科技飞速发展的今日&#xff0c;楼宇智慧公厕系统如一颗璀璨的新星&#xff0c;悄然改变着我们的生活。它以先进的技术手段&#xff0c;让公厕的实时卫生状况一目了然&#xff0c;为人们带来了全新的如厕体验。 当我们步入一栋现代化的楼宇&#xff0c;对公厕的期待不再仅仅是…

JVM 内存结构了解吗,每个区域都存放什么数据?

Java 程序是运行在 JVM 之中的&#xff0c;所有对象的创建和分配都在 JVM 中。 内存结构&#xff1a; 方法区&#xff1a;各线程共享&#xff0c;主要存放类信息、常量、静态变量 虚拟机栈&#xff1a;线程私有&#xff0c;主要存放基本数据类型&#xff08;int、char、float……

Blazor开发框架Known-V2.0.9

V2.0.9 Known是基于Blazor的企业级快速开发框架&#xff0c;低代码&#xff0c;跨平台&#xff0c;开箱即用&#xff0c;一处代码&#xff0c;多处运行。本次版本主要是修复一些BUG和表格页面功能增强。 官网&#xff1a;http://known.pumantech.comGitee&#xff1a; https:…

什么是蒙太奇谎言

蒙太奇谎言&#xff0c;可以理解为不表述全部事实&#xff0c;而是进表达部分事实&#xff0c;让听众形成错误的观点。 比如&#xff0c;某X国家队水平很差&#xff0c;从来没进入过世界杯。 可以这样说&#xff1a;世界足球强国巴西&#xff0c;从来没在世界大赛上赢过X国家队…

C++构造数据类型|枚举类型

C构造数据类型|枚举类型 1. 枚举类型1.1 函数重载的定义1.2 枚举类型的声明1.3 例1&#xff1a;1.4 例2&#xff1a; 2. 枚举类型的定义说明3. 枚举类型的使用3.1 枚举变量的赋值3.2 枚举变量的运算3.3 枚举变量的输入3.4 注意事项 4 示例代码 1. 枚举类型 1.1 函数重载的定义…

cdr工具介绍之刻刀工具

在日常的生活当中&#xff0c;在很多时候我们会遇到各种各样的难题&#xff0c;但软件cdr他就是一个神奇的存在&#xff0c;因为他能帮助我们解决很多专业方面的的知识。尽管他的内容相比较其他的一些设计软件而言相对于较为少&#xff0c;但是他确实一个非常适合于平常的工作学…

arthas源码刨析:arthas-core (2)

文章目录 attach JVMagent**ArthasBootstrap** arthas-core的启动可以从上一篇做参考 参考 pom&#xff0c;即启动是调用的 Arthas 的 main 方法 attach JVM JVM提供了 Java Attach 功能&#xff0c;能够让客户端与目标JVM进行通讯从而获取JVM运行时的数据&#xff0c;甚至可以…

算法-矩阵置零(73)

leetcode题目链接 这道题因为要求在O&#xff08;1&#xff09;的空间复杂度下面完成&#xff0c;所以最好的情况就是利用矩阵本身有的元素进行代码编写&#xff0c;而不另外开辟空间。 所以思路如下&#xff1a; 1.遍历第一行第一列&#xff0c;观察是否需要置0&#xff0c…

【面试实战】2024-08-22-面试总结

文章目录 1. 讲讲内存管理2. 什么是智能指针&#xff1f;有哪些种类&#xff1f;分别应用于哪些场景&#xff1f; 1. 讲讲内存管理 栈和堆的区别&#xff1a; ①栈和堆都是用来存储程序数据的内存区域。栈上的内存区域是有限的&#xff0c;栈用来存储局部变量和函数的调用信息。…

史上最强座舱AI芯登场,座舱「百模大战」爆发前夜

作者 |张马也 编辑 |德新 一场座舱大模型的竞赛&#xff0c;正在拉开序幕。 8月&#xff0c;英特尔在深圳举办AI座舱产品暨车载独立显卡发布会上。 会上&#xff0c;其发布了首款锐炫车载独立显卡ARC A760-A&#xff0c;这在已经高度内卷的座舱市场&#xff0c;又投下一颗重…

微软发布 Phi-3.5 系列模型,涵盖端侧、多模态、MOE;字节 Seed-ASR:自动识别多语言丨 RTE 开发者日报

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE&#xff08;Real-Time Engagement&#xff09; 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文…

DatePicker 两个日期选择框的时间范围设置不可选日期

思路 截至时间的不可选择日期&#xff0c;通过监听开始时间&#xff0c;生成

tp5php7.4配置sqlserver问题汇总

先修改database.php文件 查看php版本选择sqlserver扩展 通过百度网盘分享的文件&#xff1a;sqlserver 链接&#xff1a;https://pan.baidu.com/s/1zrIV8VWQZM9miLpyH01Aww?pwdxdgx 提取码&#xff1a;xdgx 通过我的分享链接复制自己需要的dll到php的ext下 在php.ini里添加扩…

电子看板助力线缆工厂生产数字化改善

在当今数字化时代&#xff0c;线缆工厂面临着日益激烈的市场竞争和不断提高的客户需求。为了提高生产效率、降低成本、提升产品质量&#xff0c;越来越多的线缆工厂开始引入电子看板系统&#xff0c;实现生产数字化改善。 一、线缆工厂生产面临的挑战 1、生产过程复杂 线缆生产…

【与C++的邂逅】--- 类和对象(中)

Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏&#xff1a; 与C的邂逅 本篇博客我们将学习类和对象中&#xff0c;认识类的六个默认成员函数以及实现日期类。下图为本节思维导图。 &#x1f3e0; 类的6个默认成员函…

云渲染助力:轻松应对UE5的高电脑配置需求

UE5以其革命性的图形和模拟技术&#xff0c;不断推动游戏和视觉艺术的边界&#xff0c;但对高端硬件的依赖往往成为创意实现的瓶颈。幸运的是&#xff0c;云渲染的出现打破了这一限制。通过云端的强大计算资源&#xff0c;云渲染为艺术家和开发者提供了灵活、可扩展的解决方案&…

个人理解—uboot启动过程(2)BL1低级初始化

lowlevel_init看名字就知道是关于初级方面的初始化&#xff0c;其中可用将其干的事情分为11个步骤&#xff1a; &#xff08;1&#xff09;push {lr} 也就是lr压栈。 &#xff08;2&#xff09;检测复位状态&#xff1a;如冷上电、热启动、睡眠等。冷上电要初始化DDR后才能使用…

无线电子产品前端射频设计注意事项

1 引言 1.1 编写目的 整理带无线的产品RF部分对外壳及PCBA设计注意事项&#xff0c;主要目的是为设计者提供一些参考&#xff0c;提高无线产品的设计质量和效率、保证可生产性。 1.2 背景 RF布局是射频电路设计极为重要的步骤和环节&#xff0c;关系到射频信号能否有效的工…

房产系统架构开发小程序分析

房产系统架构开发小程序在当前市场中具有显著的优势和潜力。以下是对房产小程序的分析&#xff1a; 用户需求满足&#xff1a;房产小程序通过提供楼盘信息查询、VR看房体验、购房流程指南等功能&#xff0c;满足用户对房产信息的需求&#xff0c;并提供更加便捷的用户体验 。…