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);
|
|||
|
});
|
|||
|
}
|
|||
|
}
|