import 'dart:typed_data'; import 'package:flutter/material.dart'; import '../connect/bluetooth_page.dart'; import '../connect/config/SocketSetting.dart'; import '../connect/config/app_config.dart'; import '../connect/config/blueParams.dart'; import '../connect/config/connect_type.dart'; import 'coor_trans.dart'; class Connect { SocketSetting socket = SocketSetting(); BlueSetting blueSetting = BlueSetting(); Config config = Config(); init() async { await AppConfig.load(); config = Config.fromJson(AppConfig.config); if (config.connectType != null) { // if (config.connectType == "wifi") { // config.connectType = ConnectType.wifi; // } else { // config.connectType = ConnectType.bluetooth; // } blueToothController.connectedType.value = config.connectType ?? ConnectType.none; if (config.connectType == ConnectType.wifi) { if (config.ip != null) { socket.ip = config.ip ?? "192.168.4.1"; socket.port = config.port ?? 6000; await socket.connect(); } } else { if (config.deviceId != "") { blueToothController.connectedDeviceID.value = config.deviceId!; //蓝牙 await blueSetting.connect(config.deviceId!); } } } } disconnect(ConnectType type) { if (type == ConnectType.wifi) { socket.disConnect(); } else { blueSetting.disConnect(blueToothController.connectedDeviceID.value); } } // 实时读写 write(Uint8List value) { if (blueToothController.connectedType.value == ConnectType.wifi) { socket.write(value); } else if (blueToothController.connectedType.value == ConnectType.bluetooth) { blueSetting.write(blueToothController.connectedDeviceID.value, value); } else { print("暂无连接"); } } writeCoorTransValue(String deviceId, CoorTransModel coorTrans) { Uint8List bytes = Uint8List(20); ByteData data = ByteData.view(bytes.buffer); // 0xF0 + 2字节地址 + 1字节数据长度(以字节为单位)+ 数据 data.setInt8(0, 0xF0); data.setInt16(1, 608, Endian.little); data.setInt8(3, 16); // data.setFloat64(4, coorTrans.L0); // 椭球基准 601 2 sendData( bytes, 601, 2, [toCoordString(coorTrans.dstEllipsoid).index], deviceId); // L0,elevation 608 16 Future.delayed(const Duration(milliseconds: 2000), () { sendData( bytes, 608, 16, [(coorTrans.L0 * 1e8).toInt(), (coorTrans.elevation * 1000).toInt()], deviceId); }); // x 616 16 Future.delayed(const Duration(milliseconds: 3000), () { sendData( bytes, 616, 16, [(coorTrans.dx * 1000).toInt(), (coorTrans.wx * 1000).toInt()], deviceId); }); // y 624 16 Future.delayed(const Duration(milliseconds: 4000), () { sendData( bytes, 624, 16, [(coorTrans.dy * 1000).toInt(), (coorTrans.wy * 1000).toInt()], deviceId); }); // z 632 16 Future.delayed(const Duration(milliseconds: 4000), () { sendData( bytes, 632, 16, [(coorTrans.dz * 1000).toInt(), (coorTrans.wz * 1000).toInt()], deviceId); }); // k 640 8 Future.delayed(const Duration(milliseconds: 5000), () { ByteData data = ByteData.view(bytes.buffer); data.setInt8(0, 0xF0); data.setInt16(1, 640, Endian.little); data.setInt8(3, 8); data.setInt64(4, (coorTrans.k * 1000).toInt(), Endian.little); write(bytes); }); Future.delayed(const Duration(milliseconds: 7000), () { save(deviceId, bytes, data); }); } void sendData(Uint8List bytes, int code, int length, List values, String deviceId) { ByteData data = ByteData.view(bytes.buffer); data.setInt8(0, 0xF0); data.setInt16(1, code, Endian.little); data.setInt8(3, length); for (int i = 0; i < values.length; i++) { data.setInt64(4 + i * 8, (values[i] * 1000).toInt(), Endian.little); } write(bytes); } save(String deviceId, Uint8List bytes, ByteData data) { // 采用 0X55BB 600 2 data.setInt16(1, 600, Endian.little); data.setInt8(3, 2); data.setUint16(4, 0x55AA, Endian.little); write(bytes); } Coord toCoordString(String coord) { switch (coord) { case "BJ54": return Coord.BJ54; case "XA80": return Coord.XA80; case "WGS84": return Coord.WGS84; case "WGS2000": return Coord.WGS2000; default: return Coord.WGS2000; } } writeAntenna(Offset center, Offset right, String deviceId) { Uint8List bytes = Uint8List(20); ByteData data = ByteData.view(bytes.buffer); // 604 8 X0右侧天线 X1 中心点 data.setInt8(0, 0xF0); data.setInt16(1, 604, Endian.little); data.setInt8(3, 8); data.setInt16(4, (right.dx * 1000).toInt(), Endian.little); data.setInt16(6, (right.dy * 1000).toInt(), Endian.little); data.setInt16(8, (center.dx * 1000).toInt(), Endian.little); data.setInt16(10, (center.dy * 1000).toInt(), Endian.little); write(bytes); Future.delayed(const Duration(milliseconds: 1000), () { save(deviceId, bytes, data); }); } }