AiWork实现的websocket例子,支持autojs、autoX、EasyClick、AScript、Cheese等自动化测试框架

前言

去年写了一个ios端的EasyClick脱机免越狱客户端,需要用到websocket和后台进行长连接通信。

后台使用php开发,分为管理员后台和用户后台。
整个socket业务分为4块:websocket服务端、管理员后台(客户端)、用户后台(客户端)、ios免越狱被控端(客户端)。

要实现这4块的即时通信和数据同步,逻辑上是比较复杂的。
经过一番折腾,最后还是实现了。

整套系统的socket即时通信主要包含以下功能:

  • 实时显示设备在线状态:ios端的程序启动或关闭以后,websocket服务端收到消息,将消息转发给当前在线的管理员后台和设备所在的用户后台。两个后台实时刷新设备的在线状态
  • 创建任务:用户后台给ios设备下发即时任务,设备收到后按照任务参数去执行
  • 停止任务:用户后台可以立即远程停止选中设备的任务
  • 请求任务:ios设备执行完当前任务后,主动向socket服务端请求任务
  • 实时显示用户的在线状态:管理员后台显示所有管理员和用户的在线状态,显示所有用户设备的在线状态;用户后台显示自己账号上所有ios设备的在线状态

管理员在线情况

file

用户的设备在线情况

file

遇到的问题

Websocket双向通信,对比http单向通信的优势是显而易见的。

WebSocket是一种全双工、双向通信协议,基于TCP协议实现。通过WebSocket协议,可以在Web端与服务器端建立一条持久连接,进行实时通信。
与HTTP协议相比,WebSocket协议在连接状态下,客户端和服务器可以实时发送和接收数据,无需像HTTP协议一样每次发送请求都要在服务器端重新建立连接。这种特性使得WebSocket协议非常适合于实时通信场景。

项目上线后,找了一位设备多的用户去内测。

测试中遇到了一个致命的问题:
刚开始设备都在线,后台也显示在线。
过一段时间,在后台有部分设备就显示离线了。
而ios客户端的代码内,设置的有自动重连机制。
但是自动重连在某些情况下,并没有起作用。

仔细检查了服务端的代码和客户端的代码,并没有发现问题出在哪里。
怎么办呢?
好在立项的时候,就已经设计了同时支持长连接和短连接的模式。
暂时让用户不要开启UI界面上的长连接,使用短连接方式,就可以跑业务了。
这个问题一直没有得到彻底解决,后来的版本升级,去掉了UI界面上的长连接选项。
用户再也不会误操作了。

转机

由于无障碍的脚本在市场上横行了很多年,导致越来越多的App厂商,开始关注到这一块。并采取了严厉的风控措施。
这样一来,基于无障碍服务开发的脚本,工作效率越来越低。
可以预见在不久的将来 ,基于无障碍的脚本,对主流应用的可操作性会越来越低,直到慢慢退出历史的舞台。
而Autojs的作者,在去年关闭了软件和官网,更加速了无障碍的消退。

你有穿云箭,我有过墙梯。
最近几年,基于外置硬件的一些脚本开发平台,越来越多了。
无论是andriod,还是ios,你都可以找到这方面的应用。

经过测试和考察,加上项目需要,飞云最近一直在使用AiWork的硬件进行安卓平台的全分辨率脚本开发。

闲暇之余,翻阅了一些websocket的资料,终于找到了正确实现断线重连的重要线索。
再次检查以前编写的前后台代码,果然发现了一些逻辑错误。
正是这些错误,导致了某些情况线下不能断线重连的问题。

有了思路以后,开始用AiWork进行客户端的重构和测试。

实现

先来看AiWork官方文档的websocket例子

//新建一个webSocket
var ws=new websocket();
//添加事件
ws.event(
    //连接成功
    function onConnected(){

    }, 
    //收到消息
    function onTextMessage(msg){
      printl(msg)

    },
    //连接失败
    function onConnectError(){

    },
    //断开连接
    function onDisconnected(){

    }
)
//连接
ws.connet("ws://127.0.0.1:8888");

//发送
ws.send('hello AI')

例子比较简单。其实autojs、autoX、EasyClick、AScript、Cheese等平台,websocket的创建和事件回调,都大同小异。

首先定义几个全局变量

var ws;
var wsUrl = "ws://服务端地址"

var isAllowReConnect = true; // 是否允许自动重连
var isInfiniteReConnect = true; // 是否无限重连。为true时,忽略retries的数值
let reConnectMaxTimes = 10;  // 最大重试次数
let reConnectTimes = 0;  // 重试计数
let connectDelay = 3 * 1000; // 首次重试等待时间(毫秒)
let multiplier = 2; // 延迟倍增因子
let interval = 50 * 1000;  //客户端定时心跳(毫秒)

接下来进行websocket客户端的创建和事件回调处理。
这里面,最容易犯的一个错误,就是客户端或者服务端掉线以后,虽然能重新连接,但是相关的事件却无法挂接。
导致后续的消息无法处理。

怎么避坑呢?
如何处理断线自动重连后,所有的事件能完整挂接?
如何避免掉线导致的雪崩?
具体可以下载附件来查看和学习。

附件说明

附件提供AiWork的完整例子。
只需要修改你后端的websocket地址,就可以进行简单的消息收发。

该例子提供了以下功能:

  • websocket客户端的创建
  • 握手事件、服务端消息监听、连接失败事件、断开事件的监听
  • 握手成功后,将设备信息发给服务端
  • 握手成功后,定时向服务端发送心跳消息
  • 监听到服务端的文本消息后,进行解析和处理
  • 连接失败,通常是服务端没开启。这种情况下自动重连
  • 连接断开,自动重连
  • 为了避免雪崩,重连时采用了指数退避算法进行延时连接
  • 自定义封装读写本地缓存的3个方法

代码总共有280行左右,包含详细的注释。

部分代码展示

file

同一的消息传递格式

不管是服务端,还是客户端,约定统一采用json格式的字符串进行消息传递。
例如服务端发给客户端的握手消息:

{
  "type": "SERVER_INIT",
  "client_id": "7f0000010b5400000006",
  "msg": "服务端:握手成功",
  "ip": "192.168.2.10",
  "timestamp": 1724934259
}
  • type:消息类型
  • client_id:客户端id
  • msg:消息内容
  • ip:发送端的局域网ip地址
  • timestamp:发送时的时间戳

其中,消息类型type,内部约定多种前缀。供前后端开发参考:

前缀 说明
SERVER_ 服务端消息
PORTAL_ 用户后台发送的消息
MANAGE_ 管理后台发送的消息
CLIENT_ 客户端发送的消息

其中,客户端可能是用不同的平台开发的。
如果你的后台管理系统对接了多个平台的脚本,那么客户端消息体中,就需要加一个参数来区分。
例如,客户端的心跳包消息:

{
                type: 'CLIENT_HEARTBEAT',
                imei: device.getIMEI(),
                platform: 'AiWork',  // 开发平台
}

websocket后端

后端用什么语言实现并不重要。
断线重连的核心逻辑,都是在客户端实现的。
你可以使用php、golang、nodejs、python、java等后端开发语言,甚至易语言,来编写websocket服务端。

其他平台

现在大部分脚本开发平台,都是基于javascript语言的。
那么websocket客户端的创建和事件挂接,实现方式基本都差不多。

你可以根据附件中提供的AiWork实现的websocket例子,举一反三,去编写autojs、autoX、EasyClick、AScript、Cheese等基于javascript的自动化测试框架通信前后端代码。

1. 官方交流QQ群,添加多个不批。建议使用安卓手机或电脑申请。
Auto.js学习交流③群:286635606
Auto.js学习交流②群:712194666(满员)
IOS免越狱自动化测试群:691997586
EasyClick学习交流①群:737066890
2. 盗版,破解有损他人权益和违法作为,请各位会员支持正版。
3. 本站部分资源来源于用户上传和网络搜集,如有侵权请提供版权证明并联系站长删除。
4.如未特别申明,本站的技术性文章均为原创,未经授权,禁止转载/搬运等侵权行为。
5.全站所有付费服务均为虚拟商品,购买后自动发货。售出后概不接受任何理由的退、换。注册即为接受此条款。
6.如果站内内容侵犯了您的权益,请联系站长删除。
飞云脚本 » AiWork实现的websocket例子,支持autojs、autoX、EasyClick、AScript、Cheese等自动化测试框架

企业级大数据智能营销管理系统

了解详情