发送点击消息
This commit is contained in:
parent
6474edc27e
commit
625579e510
|
|
@ -0,0 +1,32 @@
|
||||||
|
// 定义密钥
|
||||||
|
List skey = [8, 1, 2, 5, 4];
|
||||||
|
|
||||||
|
// 单个字符异或运算
|
||||||
|
String makecodeChar(String c, int key, int key2) {
|
||||||
|
int charCode = c.codeUnitAt(0);
|
||||||
|
charCode = (((charCode + key) ^ key2) ^ key) + 1;
|
||||||
|
return String.fromCharCode(charCode);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 单个字符解密
|
||||||
|
String cutcodeChar(String c, int key, int key2) {
|
||||||
|
int charCode = c.codeUnitAt(0);
|
||||||
|
charCode = (((charCode - 1) ^ key) ^ key2) - key;
|
||||||
|
return String.fromCharCode(charCode);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 加密
|
||||||
|
String makecode(String pstr, List pkey) {
|
||||||
|
String pp = pstr;
|
||||||
|
for (int i = 0; i < pp.length; i++) {
|
||||||
|
pp = pp.replaceRange(i, i + 1, makecodeChar(pp[i], pkey[i % 5], pkey[(i + 18) % 5]));
|
||||||
|
}
|
||||||
|
return pp;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 解密
|
||||||
|
void cutecode(String pstr, List pkey) {
|
||||||
|
for (int i = 0; i < pstr.length; i++) {
|
||||||
|
pstr = pstr.replaceRange(i, i + 1, cutcodeChar(pstr[i], pkey[i % 5], pkey[(i + 18) % 5]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,73 @@
|
||||||
|
|
||||||
|
|
||||||
|
import 'dart:convert';
|
||||||
|
import 'dart:typed_data';
|
||||||
|
|
||||||
|
/// 添加小端序头
|
||||||
|
extension MapLittle on Map {
|
||||||
|
|
||||||
|
/// 在转成 Uint8List 的数据前面添加 小端序
|
||||||
|
Uint8List toLittle({dynamic value = 0, int length = 4}){
|
||||||
|
|
||||||
|
/// map 转 json
|
||||||
|
String mapJson = jsonEncode(this);
|
||||||
|
/// json 转 Uint8List
|
||||||
|
final mapData = utf8.encode(mapJson);
|
||||||
|
|
||||||
|
/// 添加小端序
|
||||||
|
final data = mapData.toLittle(value: value,length: length);
|
||||||
|
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
extension Uint8ListLittle on Uint8List {
|
||||||
|
|
||||||
|
/// 在转成 Uint8List 的数据前面添加 小端序
|
||||||
|
Uint8List toLittle({dynamic value = 0, int length = 4}){
|
||||||
|
|
||||||
|
var mapData = this;
|
||||||
|
|
||||||
|
/// 初始化 定义数据长度
|
||||||
|
final little = ByteData(length);
|
||||||
|
/// 设置小端序数据
|
||||||
|
little.setInt32(0, value,Endian.little);
|
||||||
|
/// 小端序 转 Uint8List
|
||||||
|
var littleData = little.buffer.asUint8List();
|
||||||
|
|
||||||
|
/// 初始化 Uint8List
|
||||||
|
Uint8List data = Uint8List(littleData.length + mapData.length );
|
||||||
|
|
||||||
|
/// 组装 map Uint8List 和 小端序 Uint8List
|
||||||
|
data.setRange(0, littleData.length, littleData);
|
||||||
|
data.setRange(littleData.length, mapData.length + littleData.length, mapData);
|
||||||
|
|
||||||
|
/// 返回组合数据
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Uint8List转int 从前4位转小端序
|
||||||
|
int? fromLittle({int start = 0,int length = 4}) {
|
||||||
|
if (this.length < length){
|
||||||
|
print('转小端序的数据长度不足');
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
final littleData = sublist(start,start + length);
|
||||||
|
// 创建ByteData
|
||||||
|
ByteData byteData = littleData.buffer.asByteData();
|
||||||
|
|
||||||
|
// 读取小端序的32位整数
|
||||||
|
int little = byteData.getInt32(0, Endian.little);
|
||||||
|
|
||||||
|
return little;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -0,0 +1,24 @@
|
||||||
|
|
||||||
|
import 'dart:math';
|
||||||
|
|
||||||
|
class NumberTool {
|
||||||
|
|
||||||
|
/// 生成随机数
|
||||||
|
/// @allNum: 随机数的和
|
||||||
|
/// @num: 随机数的数量
|
||||||
|
List<int> randomNum(int allNum, {int num = 10}) {
|
||||||
|
List<int> randomNumbers = [];
|
||||||
|
int remainingNum = allNum;
|
||||||
|
|
||||||
|
for (int i = 0; i < num - 1; i++) {
|
||||||
|
int randomNumber = Random().nextInt(remainingNum) + 1;
|
||||||
|
randomNumbers.add(randomNumber);
|
||||||
|
remainingNum -= randomNumber;
|
||||||
|
}
|
||||||
|
|
||||||
|
randomNumbers.add(allNum - randomNumbers.fold(0, (prev, element) => prev + element));
|
||||||
|
|
||||||
|
return randomNumbers;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -1,22 +1,77 @@
|
||||||
|
import 'dart:async';
|
||||||
|
import 'dart:convert';
|
||||||
import 'dart:io';
|
import 'dart:io';
|
||||||
|
import 'dart:typed_data';
|
||||||
|
import 'little_extension.dart';
|
||||||
|
import 'code.dart';
|
||||||
|
|
||||||
class SocketTool {
|
class SocketUtils extends Socket{
|
||||||
connect() {
|
// 私有构造函数
|
||||||
Socket.connect('127.0.0.1', 12345).then((socket) {
|
SocketUtils._();
|
||||||
print(
|
// 私有静态变量,保存类的唯一实例
|
||||||
'Connected to: ${socket.remoteAddress.address}:${socket.remotePort}');
|
static SocketUtils? _instance;
|
||||||
|
|
||||||
socket.write('GET / HTTP/1.1\r\nHost: example.com\r\nConnection: close\r\n\r\n');
|
// 公开的静态方法,返回类的唯一实例
|
||||||
|
static SocketUtils getInstance() {
|
||||||
|
_instance ??= SocketUtils._();
|
||||||
|
return _instance!;
|
||||||
|
}
|
||||||
|
|
||||||
socket.listen((data) {
|
}
|
||||||
print(String.fromCharCodes(data).trim());
|
|
||||||
print('消息');
|
class Socket {
|
||||||
}, onDone: () {
|
|
||||||
print('Connection closed');
|
static String url = '127.0.0.1';
|
||||||
socket.destroy();
|
static int port = 12345;
|
||||||
});
|
|
||||||
}).catchError((error) {
|
RawDatagramSocket? socket;
|
||||||
print('Error: $error');
|
|
||||||
|
connect() async {
|
||||||
|
socket = await RawDatagramSocket.bind('127.0.0.2', 1);
|
||||||
|
print('UDP Socket bound to ${socket?.address.address}:${socket?.port}');
|
||||||
|
|
||||||
|
// 监听来自网络的数据包
|
||||||
|
socket?.listen((RawSocketEvent e) {
|
||||||
|
Datagram? d = socket?.receive();
|
||||||
|
if (d == null) return;
|
||||||
|
|
||||||
|
// String message = String.fromCharCodes(d.data).trim();
|
||||||
|
// print('Datagram from ${d.address.address}:${d.port}: $message');
|
||||||
|
});
|
||||||
|
|
||||||
|
heartbeat();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// 发送消息
|
||||||
|
sendMessage(Map data){
|
||||||
|
socket?.send(dataMake(data), InternetAddress(url), port);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// 心跳
|
||||||
|
heartbeat(){
|
||||||
|
Timer timer = Timer(const Duration(seconds: 10), () {
|
||||||
|
Map data = {
|
||||||
|
"op": 1,
|
||||||
|
"IC": 0
|
||||||
|
};
|
||||||
|
socket?.send(dataMake(data), InternetAddress(url), port);
|
||||||
|
|
||||||
|
heartbeat();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// 发送数据的处理
|
||||||
|
List<int> dataMake(Map map){
|
||||||
|
// 将Map对象转换为JSON字符串
|
||||||
|
String json = jsonEncode(map);
|
||||||
|
// 加密
|
||||||
|
String ps = makecode(json, skey);
|
||||||
|
// 转成无符号整数数组
|
||||||
|
Uint8List uinData = Uint8List.fromList(ps.codeUnits);
|
||||||
|
// 在前面添加 4位 表示长度的小端序
|
||||||
|
uinData = uinData.toLittle(value: uinData.length);
|
||||||
|
return uinData.toList();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
|
|
||||||
import 'dart:ffi';
|
import 'dart:ffi';
|
||||||
|
|
||||||
|
import 'package:web_synchronization_tool/windows/socket_tool.dart';
|
||||||
import 'package:web_synchronization_tool/windows/windowsJs.dart';
|
import 'package:web_synchronization_tool/windows/windowsJs.dart';
|
||||||
import 'package:webview_windows/webview_windows.dart';
|
import 'package:webview_windows/webview_windows.dart';
|
||||||
|
|
||||||
|
|
@ -53,6 +54,7 @@ class SynchronizationWebTool{
|
||||||
double y = (click['y'] as int).toDouble();
|
double y = (click['y'] as int).toDouble();
|
||||||
|
|
||||||
clickSynchronization(x, y);
|
clickSynchronization(x, y);
|
||||||
|
SocketUtils.getInstance().sendMessage(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (event['scroll'] != null ) {
|
if (event['scroll'] != null ) {
|
||||||
|
|
@ -76,6 +78,7 @@ class SynchronizationWebTool{
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// 滚动同步
|
/// 滚动同步
|
||||||
scrollSynchronization(int y){
|
scrollSynchronization(int y){
|
||||||
for (var controller in childController) {
|
for (var controller in childController) {
|
||||||
|
|
@ -84,10 +87,10 @@ class SynchronizationWebTool{
|
||||||
}
|
}
|
||||||
|
|
||||||
/// 输入
|
/// 输入
|
||||||
input(int value){
|
input(List<int> values){
|
||||||
mainController.executeScript(WindowsJs.inputJs(value));
|
for (int i =0;i<childController.length;i++){
|
||||||
for (var controller in childController) {
|
WebviewController controller = childController[i];
|
||||||
controller.executeScript(WindowsJs.inputJs(value));
|
controller.executeScript(WindowsJs.inputJs(values[i]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:web_synchronization_tool/windows/show_animation_utils.dart';
|
import 'package:web_synchronization_tool/windows/number_tool.dart';
|
||||||
import 'package:web_synchronization_tool/windows/synchronization_web_tool.dart';
|
import 'package:web_synchronization_tool/windows/synchronization_web_tool.dart';
|
||||||
import 'package:web_synchronization_tool/windows/windowsJs.dart';
|
import 'package:web_synchronization_tool/windows/windowsJs.dart';
|
||||||
import 'package:webview_windows/webview_windows.dart';
|
import 'package:webview_windows/webview_windows.dart';
|
||||||
|
|
@ -116,6 +116,7 @@ class ShowWebWidget extends StatefulWidget {
|
||||||
class _ShowWebWidgetState extends State<ShowWebWidget> {
|
class _ShowWebWidgetState extends State<ShowWebWidget> {
|
||||||
|
|
||||||
TextEditingController textController = TextEditingController();
|
TextEditingController textController = TextEditingController();
|
||||||
|
TextEditingController numController = TextEditingController();
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void dispose() {
|
void dispose() {
|
||||||
|
|
@ -151,18 +152,29 @@ class _ShowWebWidgetState extends State<ShowWebWidget> {
|
||||||
widget.controller.openDevTools();
|
widget.controller.openDevTools();
|
||||||
},
|
},
|
||||||
child: const Text('开发者')),
|
child: const Text('开发者')),
|
||||||
TextButton(
|
Row(
|
||||||
onPressed: () {
|
children: [
|
||||||
widget.controller.executeScript(WindowsJs.inputJs(45));
|
SizedBox(width: 100, child: TextField(style: const TextStyle(fontSize: 14),controller: numController,)),
|
||||||
// controller.executeScript(WindowsJs.inputJs(45));
|
TextButton(
|
||||||
},
|
onPressed: () {
|
||||||
child: const Text('模拟输入测试')),
|
try{
|
||||||
TextButton(
|
int num = int.parse(numController.text);
|
||||||
onPressed: () {
|
if (num <= 10){
|
||||||
widget.controller.loadUrl('https://www.baidu.com/');
|
numController.text = '金额不能小于10';
|
||||||
},
|
return;
|
||||||
child: const Text('跳转首页')),
|
}
|
||||||
|
|
||||||
|
List<int> nums = NumberTool().randomNum(num,num: SynchronizationWebTool.getInstance().childController.length);
|
||||||
|
widget.controller.executeScript(WindowsJs.inputJs(nums.first));
|
||||||
|
nums.removeAt(0);
|
||||||
|
SynchronizationWebTool.getInstance().input(nums);
|
||||||
|
}catch(e){
|
||||||
|
numController.text = '请输入数字';
|
||||||
|
}
|
||||||
|
},
|
||||||
|
child: const Text('填入总金额')),
|
||||||
|
],
|
||||||
|
),
|
||||||
Row(
|
Row(
|
||||||
children: [
|
children: [
|
||||||
const Text('同步'),
|
const Text('同步'),
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,5 @@
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:web_synchronization_tool/windows/socket_tool.dart';
|
||||||
import 'package:web_synchronization_tool/windows/web_grid_view.dart';
|
import 'package:web_synchronization_tool/windows/web_grid_view.dart';
|
||||||
import 'package:webview_windows/webview_windows.dart';
|
import 'package:webview_windows/webview_windows.dart';
|
||||||
|
|
||||||
|
|
@ -41,7 +42,7 @@ class _WindowsPageState extends State<WindowsPage> {
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
|
|
||||||
// SocketTool().connect();
|
SocketUtils.getInstance().connect();
|
||||||
|
|
||||||
if (initDone == false) return Container();
|
if (initDone == false) return Container();
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue