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

news/2024/9/20 3:56:59/ 标签: 小程序, websocket, 网络协议

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

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 = falsethis.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 = falsethis.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 : 165this.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.ppmy.cn/news/1514368.html

相关文章

Android Studio(3) 使用 Kotlin DSL和 Gradle 8.7 打包远程库到 AAR 的自定义方法

背景介绍 在 Gradle 7.3 及更早版本中,通常使用 com.kezong.fat-aar 插件来打包远程库到 AAR 中,随着 Gradle 的不断升级,尤其是到 8.7 版本后,Kotlin DSL开发逐渐成为主流,fat-aar 社区没有更新,插件的兼容性问题逐渐显现。我探索一种新的自定义方法,能够在 Kotlin DS…

08.TMS570LC43入门指南——RTI模块

08.TMS570LC43入门指南——RTI模块 文章目录 08.TMS570LC43入门指南——RTI模块一、简介二、认识 RTI2.1 特性2.2 总体模块介绍2.3 计数操作介绍2.4 中断/DMA 请求 三、项目实现3.1 硬件部分3.2 软件部分3.2.1 HALCoGen 配置3.2.2 CCS 配置3.2.3 运行结果 五、写在最后 ​ 一、…

老品新生机,新品快速上位:测评在维护亚马逊产品排名中的作用

亚马逊平台高度重视用户体验&#xff0c;用户评论在平台算法中占据重要权重&#xff0c;直接影响产品的排名和销量。因此&#xff0c;产品测评对于亚马逊卖家来说至关重要&#xff0c;不仅有助于新品上架时提升排名和转化率&#xff0c;还能维护老产品的Listing排名。为了安全有…

【C++二分查找 贪心】2576. 求出最多标记下标

本文涉及的基础知识点 C二分查找 贪心&#xff1a;决策包容性 LeetCode2576. 求出最多标记下标 给你一个下标从 0 开始的整数数组 nums 。 一开始&#xff0c;所有下标都没有被标记。你可以执行以下操作任意次&#xff1a; 选择两个 互不相同且未标记 的下标 i 和 j &#x…

2025计算机毕设50条小众好做的Java题目【计算机毕设选题推荐】

随着2025年的到来&#xff0c;计算机专业的学生们又迎来了毕业设计的关键时刻。对于大多数学生来说&#xff0c;选择一个合适的毕业设计题目往往是一项艰巨的任务。本文旨在为那些正在为毕业设计题目烦恼的同学们提供一些灵感和建议&#xff0c;特别是针对使用Java技术栈的同学…

centos 部署 scrapy 爬虫详细教程

部署流程 参考环境安装 pyenv安装依赖安装 pyenv配置环境变量root 用户~/.bashrc~/.profile~/.bash_profileZsh 用户重启 shell 使用 pyenv 安装 Python 3.9.1安装Scrapyd-Client安装Scrapysystemd添加服务文件 参考 【华为仓库】 【pyenv 多版本的Python管理工具】 【pyenv-v…

.NET系列 定时器

net一共&#xff14;种定时器 System.Windows.Forms.Timer 类型 》》WinForm专用System.Windows.Threading.DispatcherTime类型》》WPF专用System.Threading.Timer类型》》》它使用 ThreadPool 线程来执行定时操作System.Timers.Timer类型 》》这种很老了。 它使用基于底层计时…

每天一个数据分析题(四百九十七)- 序列模式挖掘

序列模式挖掘 (sequence pattern mining &#xff09;是指挖掘相对时间或其他模式出现频率高的模式&#xff0c;典型的应用还是限于离散型的序列。下列哪个选项不属于序列模式的时限约束&#xff1f; A. 最大跨度约束 B. 主键约束 C. 最小间隔和最大间隔约束 D. 窗口大小约…

vue3 img标签动态加载图片

<img :src"getImgUrl(item.name)" alt"">//组合式下 methods里方法 getImgUrl(name){let url new URL(../../../assets/images/bigscreen/${name}.png, import.meta.url).hrefreturn url},

【微信小程序】自定义组件 - 数据、方法和属性

1. data 数据 2. methods 方法 在小程序组件中&#xff0c;事件处理函数和自定义方法需要定义到 methods 节点中&#xff0c;示例代码如下&#xff1a; 3. properties 属性 在小程序组件中&#xff0c;properties 是组件的对外属性&#xff0c;用来接收外界传递到组件中的数…

IDEA工具设置默认使用maven的settings.xml文件

第一步&#xff1a;打开idea工具&#xff0c;选中 File ——> New Projects Setup ——> Settings for New Projects 第二步&#xff1a;先设置下自动构建项目这个选项 第三步&#xff1a;选中 Build Tools ——> Maven&#xff0c;让后就可以设置自己安转的maven和se…

Modbus初学者教程,第六章:Modbus 答疑

第六章&#xff1a;Modbus 答疑 平时调试Modbus设备&#xff0c;或者学习Modbus协议&#xff0c;推荐一款Modbus主从站模拟器&#xff1a; 主站下载地址&#xff1a;Modbus从站模拟器 从站下载地址&#xff1a;Modbus主站模拟器 我从哪里开始与我的 Modbus 设备通信&#xff1f…

无人机:航拍书籍推荐

写在前面 学习航拍&#xff0c;整理一些书籍分享理解不足小伙伴帮忙指正 &#x1f603;,生活加油 99%的焦虑都来自于虚度时间和没有好好做事&#xff0c;所以唯一的解决办法就是行动起来&#xff0c;认真做完事情&#xff0c;战胜焦虑&#xff0c;战胜那些心里空荡荡的时刻&…

克服编程挫折:从Bug的迷宫中寻找出口与面对算法保持冷静的策略

在编程学习的道路上&#xff0c;挫折感无疑是每个学习者都必须面对的挑战之一。它们仿佛是一座座高墙&#xff0c;阻挡我们前进的步伐。然而&#xff0c;正如许多有经验的编程高手所证明的那样&#xff0c;挫折并不是终点&#xff0c;而是成长和进步的催化剂。本文将分享一些有…

【实战场景】如何优雅实现分页

【实战场景】如何优雅实现分页 开篇词&#xff1a;干货篇&#xff1a;1.添加PageHelper依赖2.添加PageHelper配置3.使用 PageHelper4.自定义Pageable注解 总结&#xff1a;1.执行查询2.处理分页结果3.注意事项 我是杰叔叔&#xff0c;一名沪漂的码农&#xff0c;下期再会&#…

数据仓库ETL开发

在企业数字化转型的过程中&#xff0c;数据仓库已经成为了企业管理和决策的重要工具。数据仓库ETL开发是构建数据仓库的关键步骤之一&#xff0c;它可以帮助企业从源系统中抽取、清洗、转换和整合数据&#xff0c;方便企业进行管理和分析。本文将介绍如何高效实现数据仓库ETL开…

Notepad--文本编辑工具 for Mac教程【苹果电脑-简单轻松上手-免费Mac软件推荐】

Mac分享吧 文章目录 效果一、下载软件二、开始安装1、双击运行软件&#xff0c;将其拖入应用程序中&#xff0c;等待安装完毕2、应用程序显示软件图标&#xff0c;表示安装成功 三、运行测试解决“软件已损坏&#xff0c;无法打开”问题&#xff0c;若没有该问题&#xff0c;可…

Vue3 指令 6

Vue3 指令&#xff08;Directive&#xff09;是 Vue3 中的一种特殊的语法&#xff0c;用于在模板中添加自定义的行为。指令可以用来修改 DOM、监听事件、绑定数据等。下面是 Vue3 指令的主要类型&#xff1a; 1. v-binding v-binding 指令用于绑定数据到 HTML 属性上。例如&a…

深入理解SQL中的INNER JOIN操作

本文介绍了INNER JOIN的定义、使用场景、计算方法及与其他JOIN的比较。INNER JOIN是关系数据库中常用的操作&#xff0c;用于返回两个表中匹配的行&#xff0c;只有在连接条件满足时才返回数据。本文详细解释了INNER JOIN的语法及其在一对多、多对多关系中的应用&#xff0c;通…

【论文阅读】Enhance Model Stealing Attack via Label Refining(2022)

摘要 With machine learning models(机器学习模型) being increasingly(越来越多) deployed(部署), model stealing attacks(模型窃取攻击) have raised an increasing interest. Extracting decision-based models(基于决策的模型窃取) is a more challenging task…