186 lines
5.2 KiB
Dart
186 lines
5.2 KiB
Dart
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<int> 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);
|
||
});
|
||
}
|
||
}
|