package gecaoji; import baseStation.BaseStation; import set.Setsys; import zhuye.MowerLocationData; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.nio.charset.StandardCharsets; import java.util.Locale; import java.util.Properties; /** * 设备信息类 */ public class Device { static Device gecaoji=new Device(); public static Device getGecaoji() { return gecaoji; } public static void setGecaoji(Device gecaoji) { Device.gecaoji = gecaoji; } static { String id=Setsys.getPropertyValue("mowerId"); gecaoji.setMowerNumber(id); } // 用户标识 private String mowerName; // 割草机名称 private String mowerModel; // 割草机型号 private String mowerNumber; // 割草机设备编号(唯一) private String mowingWidth; // 割草宽度,单位厘米 private String mowingHeight; // 割草高度,单位厘米 private String baseStationNumber; // 差分基站编号 private String baseStationCardNumber; // 差分基站卡号 private String baseStationCoordinates; // 差分基站坐标 private String deviceCardnumber; // 设备卡号 private String createTime; // 创建时间 private String GupdateTime; // 割草机数据更新时间 private String BupdateTime; // 基准站数据更新时间 private String realtimeLatitude; // 实时纬度(度分) private String realtimeLongitude; // 实时经度(度分) private String realtimeAltitude; // 实时高程(米) private String realtimeX; // 实时X坐标(米) private String realtimeY; // 实时Y坐标(米) private String realtimeSpeed; // 实时速度 private String heading; // 航向角 private String pitch; // 俯仰角 private String roll; // 横滚角 角度 private String yaw; // 偏航角 角度 private String battery_level; // 电池电量百分比 private String battery_voltage; // 电池电压 private String operation_mode; // 操作模式:manual, auto, emergency_stop private String motor_status; // 电机状态:stopped, running, error private String blade_status; // 刀片状态:stopped, rotating private String path_id_saved; // 存储的路径ID private String error_code; // 错误代码 private String error_message; // 错误信息 private String positioningStatus; // 定位状态 private String satelliteCount; // 卫星可数 private String differentialAge; // 差分时间 private String self_check_status = "-1"; // 新增自检状态:1-完成,0-未完成 // 割草机自检状态 private String mowerStartStatus = "-1"; // 割草机启动状态:1开启,0熄火,-1未知 private String mowerLightStatus = "-1"; // 割草机灯开关状态:1开启,0关闭,-1未知 private String blade_height = "-1"; // 刀盘高度 厘米 // 割草机刀盘高度:-1未知 private String mowerWidth; // 割草机宽度,单位米 private String mowerLength; // 割草机长度,单位米 private String mowingSafetyDistance; // 割草安全距离,单位米 private static final double METERS_PER_DEGREE_LAT = 111320.0d; /** * 初始化方法 - 从device.properties文件加载数据 */ public void initFromProperties() { // 从属性文件初始化设备数据 Properties properties = new Properties(); try (FileInputStream input = new FileInputStream("device.properties")) { // 从根目录加载device.properties文件 properties.load(input); loadPropertiesInto(this, properties); loadPropertiesInto(gecaoji, properties); // 保持共享实例同步 } catch (IOException e) { // 如果文件不存在或读取失败,将所有属性设置为-1 System.err.println("无法读取device.properties文件: " + e.getMessage()); setDefaultValues(); } } /** * 设置默认值-1 */ private void setDefaultValues() { // 设置默认字段值 applyDefaults(this); applyDefaults(gecaoji); } /** * 保存所有属性到device.properties文件 */ public void saveToProperties() { Properties properties = new Properties(); // 加载现有属性(保留其他属性) try (FileInputStream input = new FileInputStream("device.properties")) { properties.load(input); } catch (IOException e) { // 如果文件不存在,继续创建新文件 } // 设置所有设备属性 if (mowerName != null) properties.setProperty("mowerName", mowerName); if (mowerModel != null) properties.setProperty("mowerModel", mowerModel); if (mowerNumber != null) properties.setProperty("mowerNumber", mowerNumber); if (mowingWidth != null) properties.setProperty("mowingWidth", mowingWidth); if (mowingHeight != null) properties.setProperty("mowingHeight", mowingHeight); if (baseStationNumber != null) properties.setProperty("baseStationNumber", baseStationNumber); if (baseStationCardNumber != null) properties.setProperty("baseStationCardNumber", baseStationCardNumber); if (baseStationCoordinates != null) properties.setProperty("baseStationCoordinates", baseStationCoordinates); if (deviceCardnumber != null) properties.setProperty("deviceCardnumber", deviceCardnumber); if (createTime != null) properties.setProperty("createTime", createTime); if (GupdateTime != null) properties.setProperty("GupdateTime", GupdateTime); if (BupdateTime != null) properties.setProperty("BupdateTime", BupdateTime); if (realtimeLatitude != null) properties.setProperty("realtimeLatitude", realtimeLatitude); if (realtimeLongitude != null) properties.setProperty("realtimeLongitude", realtimeLongitude); if (realtimeAltitude != null) properties.setProperty("realtimeAltitude", realtimeAltitude); if (realtimeX != null) properties.setProperty("realtimeX", realtimeX); if (realtimeY != null) properties.setProperty("realtimeY", realtimeY); if (realtimeSpeed != null) properties.setProperty("realtimeSpeed", realtimeSpeed); if (heading != null) properties.setProperty("heading", heading); if (pitch != null) properties.setProperty("pitch", pitch); if (roll != null) properties.setProperty("roll", roll); if (yaw != null) properties.setProperty("yaw", yaw); if (battery_level != null) properties.setProperty("battery_level", battery_level); if (battery_voltage != null) properties.setProperty("battery_voltage", battery_voltage); if (operation_mode != null) properties.setProperty("operation_mode", operation_mode); if (motor_status != null) properties.setProperty("motor_status", motor_status); if (blade_status != null) properties.setProperty("blade_status", blade_status); if (path_id_saved != null) properties.setProperty("path_id_saved", path_id_saved); if (error_code != null) properties.setProperty("error_code", error_code); if (error_message != null) properties.setProperty("error_message", error_message); if (positioningStatus != null) properties.setProperty("positioningStatus", positioningStatus); if (satelliteCount != null) properties.setProperty("satelliteCount", satelliteCount); if (differentialAge != null) properties.setProperty("differentialAge", differentialAge); if (self_check_status != null) properties.setProperty("self_check_status", self_check_status); if (mowerStartStatus != null) properties.setProperty("mowerStartStatus", mowerStartStatus); if (mowerLightStatus != null) properties.setProperty("mowerLightStatus", mowerLightStatus); if (blade_height != null) properties.setProperty("blade_height", blade_height); if (mowerWidth != null) properties.setProperty("mowerWidth", mowerWidth); if (mowerLength != null) properties.setProperty("mowerLength", mowerLength); if (mowingSafetyDistance != null) properties.setProperty("mowingSafetyDistance", mowingSafetyDistance); // 保存到文件 try (FileOutputStream output = new FileOutputStream("device.properties"); OutputStreamWriter writer = new OutputStreamWriter(output, StandardCharsets.UTF_8)) { properties.store(writer, "Updated device properties"); } catch (IOException ex) { System.err.println("无法保存 device.properties: " + ex.getMessage()); } } private void loadPropertiesInto(Device target, Properties properties) { if (target == null) { return; } target.mowerName = properties.getProperty("mowerName", "-1"); target.mowerModel = properties.getProperty("mowerModel", "-1"); target.mowerNumber = properties.getProperty("mowerNumber", "-1"); target.mowingWidth = properties.getProperty("mowingWidth", "-1"); target.mowingHeight = properties.getProperty("mowingHeight", "-1"); target.baseStationNumber = properties.getProperty("baseStationNumber", "-1"); target.baseStationCardNumber = properties.getProperty("baseStationCardNumber", "-1"); target.baseStationCoordinates = properties.getProperty("baseStationCoordinates", "-1"); target.deviceCardnumber = properties.getProperty("deviceCardnumber", "-1"); target.createTime = properties.getProperty("createTime", "-1"); target.GupdateTime = properties.getProperty("GupdateTime", "-1"); target.BupdateTime = properties.getProperty("BupdateTime", "-1"); target.realtimeLatitude = properties.getProperty("realtimeLatitude", "-1"); target.realtimeLongitude = properties.getProperty("realtimeLongitude", "-1"); target.realtimeAltitude = properties.getProperty("realtimeAltitude", "-1"); target.realtimeX = properties.getProperty("realtimeX", "-1"); target.realtimeY = properties.getProperty("realtimeY", "-1"); target.realtimeSpeed = properties.getProperty("realtimeSpeed", "-1"); target.heading = properties.getProperty("heading", "-1"); target.pitch = properties.getProperty("pitch", "-1"); target.roll = properties.getProperty("roll", "-1"); target.yaw = properties.getProperty("yaw", "-1"); target.battery_level = properties.getProperty("battery_level", "-1"); target.battery_voltage = properties.getProperty("battery_voltage", "-1"); target.operation_mode = properties.getProperty("operation_mode", "-1"); target.motor_status = properties.getProperty("motor_status", "-1"); target.blade_status = properties.getProperty("blade_status", "-1"); target.path_id_saved = properties.getProperty("path_id_saved", "-1"); target.error_code = properties.getProperty("error_code", "-1"); target.error_message = properties.getProperty("error_message", "-1"); target.positioningStatus = properties.getProperty("positioningStatus", "-1"); target.satelliteCount = properties.getProperty("satelliteCount", "-1"); target.differentialAge = properties.getProperty("differentialAge", "-1"); target.self_check_status = properties.getProperty("self_check_status", "-1"); target.mowerStartStatus = properties.getProperty("mowerStartStatus", "-1"); target.mowerLightStatus = properties.getProperty("mowerLightStatus", "-1"); target.blade_height = properties.getProperty("blade_height", "-1"); target.mowerWidth = properties.getProperty("mowerWidth", "-1"); target.mowerLength = properties.getProperty("mowerLength", "-1"); target.mowingSafetyDistance = properties.getProperty("mowingSafetyDistance", "-1"); } private void applyDefaults(Device target) { if (target == null) { return; } target.mowerName = "-1"; target.mowerModel = "-1"; target.mowerNumber = "-1"; target.mowingWidth = "-1"; target.mowingHeight = "-1"; target.baseStationNumber = "-1"; target.baseStationCardNumber = "-1"; target.baseStationCoordinates = "-1"; target.deviceCardnumber = "-1"; target.createTime = "-1"; target.GupdateTime = "-1"; target.BupdateTime = "-1"; target.realtimeLatitude = "-1"; target.realtimeLongitude = "-1"; target.realtimeAltitude = "-1"; target.realtimeX = "-1"; target.realtimeY = "-1"; target.realtimeSpeed = "-1"; target.heading = "-1"; target.pitch = "-1"; target.roll = "-1"; target.yaw = "-1"; target.battery_level = "-1"; target.battery_voltage = "-1"; target.operation_mode = "-1"; target.motor_status = "-1"; target.blade_status = "-1"; target.path_id_saved = "-1"; target.error_code = "-1"; target.error_message = "-1"; target.positioningStatus = "-1"; target.satelliteCount = "-1"; target.differentialAge = "-1"; target.self_check_status = "-1"; target.mowerStartStatus = "-1"; target.mowerLightStatus = "-1"; target.blade_height = "-1"; target.mowerWidth = "-1"; target.mowerLength = "-1"; target.mowingSafetyDistance = "-1"; } public static synchronized Device initializeActiveDevice(String mowerId) { // 根据设备ID初始化活跃设备 Device device = new Device(); gecaoji = device; device.initFromProperties(); if (!isInvalidValue(mowerId)) { device.setMowerNumber(mowerId.trim()); } return device; } public static Device getActiveDevice() { // 获取当前活跃设备 return gecaoji; } /** * 更新字段值 * @param fieldName 字段名 * @param value 新值 * @return 是否更新成功 */ public boolean updateField(String fieldName, String value) { // 按字段更新属性值 switch (fieldName) { case "mowerName": this.mowerName = value; return true; case "mowerModel": this.mowerModel = value; return true; case "mowerNumber": this.mowerNumber = value; return true; case "mowingWidth": this.mowingWidth = value; return true; case "mowingHeight": this.mowingHeight = value; return true; case "baseStationNumber": this.baseStationNumber = value; return true; case "baseStationCardNumber": this.baseStationCardNumber = value; return true; case "baseStationCoordinates": this.baseStationCoordinates = value; return true; case "deviceCardnumber": this.deviceCardnumber = value; return true; case "createTime": this.createTime = value; return true; case "GupdateTime": this.GupdateTime = value; return true; case "BupdateTime": this.BupdateTime = value; return true; case "realtimeLatitude": this.realtimeLatitude = value; return true; case "realtimeLongitude": this.realtimeLongitude = value; return true; case "realtimeAltitude": this.realtimeAltitude = value; return true; case "realtimeX": this.realtimeX = value; return true; case "realtimeY": this.realtimeY = value; return true; case "realtimeSpeed": this.realtimeSpeed = value; return true; case "heading": this.heading = value; return true; case "pitch": this.pitch = value; return true; case "roll": this.roll = value; return true; case "yaw": this.yaw = value; return true; case "battery_level": this.battery_level = value; return true; case "battery_voltage": this.battery_voltage = value; return true; case "operation_mode": this.operation_mode = value; return true; case "motor_status": this.motor_status = value; return true; case "blade_status": this.blade_status = value; return true; case "path_id_saved": this.path_id_saved = value; return true; case "error_code": this.error_code = value; return true; case "error_message": this.error_message = value; return true; case "positioningStatus": this.positioningStatus = value; return true; case "satelliteCount": this.satelliteCount = value; return true; case "differentialAge": this.differentialAge = value; return true; case "self_check_status": this.self_check_status = value; return true; case "mowerStartStatus": this.mowerStartStatus = value; return true; case "mowerLightStatus": this.mowerLightStatus = value; return true; case "blade_height": this.blade_height = value; return true; case "mowerWidth": this.mowerWidth = value; return true; case "mowerLength": this.mowerLength = value; return true; case "mowingSafetyDistance": this.mowingSafetyDistance = value; return true; default: System.err.println("未知字段: " + fieldName); return false; } } public static synchronized void updateFromGNGGA(String gnggaData, String deviceId) { // 静态解析GNGGA数据更新设备 Device device = gecaoji; if (device == null) { return; } device.applyGNGGAUpdate(gnggaData, deviceId); } public static synchronized void updateFromSerialGNGGA(String gnggaData) { // 串口数据更新路径(无需设备编号匹配) Device device = gecaoji; if (device == null) { return; } device.chuankouGNGGAUpdate(gnggaData); } private void applyGNGGAUpdate(String gnggaData, String deviceId) { // 执行GNGGA更新逻辑 if (gnggaData == null) { return; } String trimmed = gnggaData.trim(); if (trimmed.isEmpty() || !trimmed.startsWith("$GNGGA")) { return; } String[] fields = trimmed.split(","); if (fields.length < 21) { System.err.println("GNGGA字段数量不足: " + fields.length); return; } String sanitizedExpectedId = hasMeaningfulValue(deviceId) ? deviceId.trim() : null; String incomingDeviceId = sanitizeField(fields, 15); if (sanitizedExpectedId != null) { if (!hasMeaningfulValue(incomingDeviceId) || !sanitizedExpectedId.equals(incomingDeviceId)) { return; } } if (hasMeaningfulValue(incomingDeviceId) && !incomingDeviceId.equals(mowerNumber)) { mowerNumber = incomingDeviceId; } // 检查是否正在导航预览模式 boolean isNavigating = checkIfNavigating(); String latitudeValue = sanitizeField(fields, 2); String latitudeHemisphere = sanitizeField(fields, 3); String longitudeValue = sanitizeField(fields, 4); String longitudeHemisphere = sanitizeField(fields, 5); // 只有在非导航预览模式下才更新位置相关数据 if (!isNavigating) { String combinedLatitude = combineCoordinate(latitudeValue, latitudeHemisphere); if (hasMeaningfulValue(combinedLatitude)) { realtimeLatitude = combinedLatitude; } String combinedLongitude = combineCoordinate(longitudeValue, longitudeHemisphere); if (hasMeaningfulValue(combinedLongitude)) { realtimeLongitude = combinedLongitude; } String altitudeValue = sanitizeField(fields, 9); if (hasMeaningfulValue(altitudeValue)) { realtimeAltitude = altitudeValue; } // 更新位置坐标 updateRelativeCoordinates(latitudeValue, latitudeHemisphere, longitudeValue, longitudeHemisphere); // 更新航向角(位置相关) heading = defaultIfEmpty(sanitizeField(fields, 19)); } // 其他数据(电量、卫星数等)始终更新 positioningStatus = defaultIfEmpty(sanitizeField(fields, 6)); // 同步到绘制模块的数据源,保证往返绘制定时器能识别定位质量 try { MowerLocationData.updateProperty("positioningQuality", positioningStatus); } catch (Throwable ignored) { // 防御式:即使更新失败也不影响设备数据处理 } satelliteCount = defaultIfEmpty(sanitizeField(fields, 7)); differentialAge = defaultIfEmpty(sanitizeField(fields, 13)); battery_level = defaultIfEmpty(sanitizeField(fields, 16)); pitch = defaultIfEmpty(sanitizeField(fields, 17)); realtimeSpeed = defaultIfEmpty(sanitizeField(fields, 18)); GupdateTime = String.valueOf(System.currentTimeMillis()); } /**串口更新GNGGA数据*/ private void chuankouGNGGAUpdate(String gnggaData) { // 执行GNGGA更新逻辑 if (gnggaData == null) { return; } String trimmed = gnggaData.trim(); if (trimmed.isEmpty() || !trimmed.startsWith("$GNGGA")) { return; } String[] fields = trimmed.split(","); if (fields.length < 15) { System.err.println("GNGGA字段数量不足: " + fields.length); return; } // 检查是否正在导航预览模式 boolean isNavigating = checkIfNavigating(); String latitudeValue = sanitizeField(fields, 2); String latitudeHemisphere = sanitizeField(fields, 3); String longitudeValue = sanitizeField(fields, 4); String longitudeHemisphere = sanitizeField(fields, 5); // 只有在非导航预览模式下才更新位置相关数据 if (!isNavigating) { String combinedLatitude = combineCoordinate(latitudeValue, latitudeHemisphere); if (hasMeaningfulValue(combinedLatitude)) { realtimeLatitude = combinedLatitude; } String combinedLongitude = combineCoordinate(longitudeValue, longitudeHemisphere); if (hasMeaningfulValue(combinedLongitude)) { realtimeLongitude = combinedLongitude; } String altitudeValue = sanitizeField(fields, 9); if (hasMeaningfulValue(altitudeValue)) { realtimeAltitude = altitudeValue; } // 更新位置坐标 updateRelativeCoordinates(latitudeValue, latitudeHemisphere, longitudeValue, longitudeHemisphere); // 串口收到GNGGA数据后,触发拖尾更新 notifyMowerTrailUpdate(); } // 其他数据(电量、卫星数等)始终更新 positioningStatus = defaultIfEmpty(sanitizeField(fields, 6)); // 同步到绘制模块的数据源,保证往返绘制定时器能识别定位质量 try { MowerLocationData.updateProperty("positioningQuality", positioningStatus); } catch (Throwable ignored) { // 防御式:即使更新失败也不影响设备数据处理 } satelliteCount = defaultIfEmpty(sanitizeField(fields, 7)); differentialAge = defaultIfEmpty(sanitizeField(fields, 13)); realtimeSpeed ="0"; GupdateTime = String.valueOf(System.currentTimeMillis()); } /** * 通知地图渲染器更新割草机拖尾 * 当串口收到GNGGA数据并更新位置后调用 */ /** * 检查是否正在导航预览模式 * @return 如果正在导航预览返回true,否则返回false */ private boolean checkIfNavigating() { try { dikuai.daohangyulan nav = dikuai.daohangyulan.getInstance(); if (nav != null) { return nav.isNavigating(); } } catch (Exception e) { // 如果获取导航实例失败,返回false(不影响主要功能) } return false; } private void notifyMowerTrailUpdate() { try { // 通过Shouye.getInstance()获取实例,避免循环依赖 zhuye.Shouye shouye = zhuye.Shouye.getInstance(); if (shouye != null) { zhuye.MapRenderer mapRenderer = shouye.getMapRenderer(); if (mapRenderer != null) { // 调用更新拖尾方法 mapRenderer.forceUpdateIdleMowerTrail(); } } } catch (Exception e) { // 如果调用失败,静默处理(不影响主要功能) // System.err.println("通知拖尾更新失败: " + e.getMessage()); } } private void updateRelativeCoordinates(String latValue, String latHemisphere, String lonValue, String lonHemisphere) { // 计算相对坐标 if (!hasMeaningfulValue(latValue) || !hasMeaningfulValue(lonValue) || !hasMeaningfulValue(latHemisphere) || !hasMeaningfulValue(lonHemisphere)) { return; } double mowerLat = toDecimalDegrees(latValue, latHemisphere); double mowerLon = toDecimalDegrees(lonValue, lonHemisphere); if (Double.isNaN(mowerLat) || Double.isNaN(mowerLon)) { return; } double[] baseLatLon = resolveBaseStationLatLon(); if (baseLatLon == null) { return; } double meanLatRad = Math.toRadians((baseLatLon[0] + mowerLat) / 2.0d); double deltaLatDeg = mowerLat - baseLatLon[0]; double deltaLonDeg = mowerLon - baseLatLon[1]; double metersPerLon = METERS_PER_DEGREE_LAT * Math.cos(meanLatRad); double eastMeters = deltaLonDeg * metersPerLon; double northMeters = deltaLatDeg * METERS_PER_DEGREE_LAT; if (Double.isFinite(eastMeters) && Double.isFinite(northMeters)) { realtimeX = formatMeters(eastMeters); realtimeY = formatMeters(northMeters); // 保存坐标到工具类 lujing.SavaXyZuobiao.addCoordinate(eastMeters, northMeters); } } private double[] resolveBaseStationLatLon() { // 解析基站经纬度 String coords = baseStationCoordinates; if (isInvalidValue(coords)) { BaseStation baseStation = new BaseStation(); baseStation.load(); coords = baseStation.getInstallationCoordinates(); if (!isInvalidValue(coords)) { baseStationCoordinates = coords; } } if (isInvalidValue(coords)) { return null; } String[] parts = coords.split(","); if (parts.length < 4) { return null; } double baseLat = toDecimalDegrees(parts[0].trim(), parts[1].trim()); double baseLon = toDecimalDegrees(parts[2].trim(), parts[3].trim()); if (Double.isNaN(baseLat) || Double.isNaN(baseLon)) { return null; } return new double[]{baseLat, baseLon}; } private double toDecimalDegrees(String value, String hemisphere) { // 经纬度转换为十进制度 if (!hasMeaningfulValue(value)) { return Double.NaN; } try { double raw = Double.parseDouble(value); double degrees = Math.floor(raw / 100d); double minutes = raw - degrees * 100d; double decimal = degrees + minutes / 60d; if ("S".equalsIgnoreCase(hemisphere) || "W".equalsIgnoreCase(hemisphere)) { return -decimal; } return decimal; } catch (NumberFormatException ex) { return Double.NaN; } } private String combineCoordinate(String value, String hemisphere) { // 拼接坐标与方向标识 if (!hasMeaningfulValue(value)) { return "-1"; } if (hasMeaningfulValue(hemisphere)) { return value + "," + hemisphere; } return value; } private String sanitizeField(String[] fields, int index) { // 清洗字段数据 if (fields == null || index < 0 || index >= fields.length) { return ""; } String value = fields[index]; return value == null ? "" : value.trim(); } private String defaultIfEmpty(String value) { // 空值返还默认值 return hasMeaningfulValue(value) ? value : "-1"; } private static boolean hasMeaningfulValue(String value) { // 判断值是否有效 return value != null && !value.trim().isEmpty() && !"-1".equals(value.trim()); } private static boolean isInvalidValue(String value) { // 判断值是否无效 return value == null || value.trim().isEmpty() || "-1".equals(value.trim()); } private String formatMeters(double value) { // 格式化米制数值 if (Double.isNaN(value) || Double.isInfinite(value)) { return "-1"; } return String.format(Locale.US, "%.3f", value); } // Getter 和 Setter 方法 public String getMowerName() { // 获取割草机名称 return mowerName; } public void setMowerName(String mowerName) { // 设置割草机名称 this.mowerName = mowerName; } public String getMowerModel() { // 获取割草机型号 return mowerModel; } public void setMowerModel(String mowerModel) { // 设置割草机型号 this.mowerModel = mowerModel; } public String getMowerNumber() { // 获取割草机编号 return mowerNumber; } public void setMowerNumber(String mowerNumber) { // 设置割草机编号 this.mowerNumber = mowerNumber; } public String getMowingWidth() { // 获取割草宽度 return mowingWidth; } public void setMowingWidth(String mowingWidth) { // 设置割草宽度 this.mowingWidth = mowingWidth; } public String getMowingHeight() { // 获取割草高度 return mowingHeight; } public void setMowingHeight(String mowingHeight) { // 设置割草高度 this.mowingHeight = mowingHeight; } public String getBaseStationNumber() { // 获取基站编号 return baseStationNumber; } public void setBaseStationNumber(String baseStationNumber) { // 设置基站编号 this.baseStationNumber = baseStationNumber; } public String getBaseStationCardNumber() { // 获取基站卡号 return baseStationCardNumber; } public void setBaseStationCardNumber(String baseStationCardNumber) { // 设置基站卡号 this.baseStationCardNumber = baseStationCardNumber; } public String getBaseStationCoordinates() { // 获取基站坐标 return baseStationCoordinates; } public void setBaseStationCoordinates(String baseStationCoordinates) { // 设置基站坐标 this.baseStationCoordinates = baseStationCoordinates; } public String getDeviceCardnumber() { // 获取设备卡号 return deviceCardnumber; } public void setDeviceCardnumber(String deviceCardnumber) { // 设置设备卡号 this.deviceCardnumber = deviceCardnumber; } public String getCreateTime() { // 获取创建时间 return createTime; } public void setCreateTime(String createTime) { // 设置创建时间 this.createTime = createTime; } public String getGupdateTime() { // 获取割草机更新时间 return GupdateTime; } public void setGupdateTime(String gupdateTime) { // 设置割草机更新时间 GupdateTime = gupdateTime; } public String getBupdateTime() { // 获取基站更新时间 return BupdateTime; } public void setBupdateTime(String bupdateTime) { // 设置基站更新时间 BupdateTime = bupdateTime; } public String getRealtimeLatitude() { // 获取实时纬度 return realtimeLatitude; } public void setRealtimeLatitude(String realtimeLatitude) { // 设置实时纬度 this.realtimeLatitude = realtimeLatitude; } public String getRealtimeLongitude() { // 获取实时经度 return realtimeLongitude; } public void setRealtimeLongitude(String realtimeLongitude) { // 设置实时经度 this.realtimeLongitude = realtimeLongitude; } public String getRealtimeAltitude() { // 获取实时高程 return realtimeAltitude; } public void setRealtimeAltitude(String realtimeAltitude) { // 设置实时高程 this.realtimeAltitude = realtimeAltitude; } public String getRealtimeX() { // 获取实时X坐标 return realtimeX; } public void setRealtimeX(String realtimeX) { // 设置实时X坐标 this.realtimeX = realtimeX; } public String getRealtimeY() { // 获取实时Y坐标 return realtimeY; } public void setRealtimeY(String realtimeY) { // 设置实时Y坐标 this.realtimeY = realtimeY; } public String getRealtimeSpeed() { // 获取实时速度 return realtimeSpeed; } public void setRealtimeSpeed(String realtimeSpeed) { // 设置实时速度 this.realtimeSpeed = realtimeSpeed; } public String getHeading() { // 获取航向角 return heading; } public void setHeading(String heading) { // 设置航向角 this.heading = heading; } public String getPitch() { // 获取俯仰角 return pitch; } public void setPitch(String pitch) { // 设置俯仰角 this.pitch = pitch; } public String getRoll() { return roll; } public void setRoll(String roll) { this.roll = roll; } public String getYaw() { return yaw; } public void setYaw(String yaw) { this.yaw = yaw; } public String getBattery_level() { return battery_level; } public void setBattery_level(String battery_level) { this.battery_level = battery_level; } public String getBattery_voltage() { return battery_voltage; } public void setBattery_voltage(String battery_voltage) { this.battery_voltage = battery_voltage; } public String getOperation_mode() { return operation_mode; } public void setOperation_mode(String operation_mode) { this.operation_mode = operation_mode; } public String getMotor_status() { return motor_status; } public void setMotor_status(String motor_status) { this.motor_status = motor_status; } public String getBlade_status() { return blade_status; } public void setBlade_status(String blade_status) { this.blade_status = blade_status; } public String getPath_id_saved() { return path_id_saved; } public void setPath_id_saved(String path_id_saved) { this.path_id_saved = path_id_saved; } public String getError_code() { return error_code; } public void setError_code(String error_code) { this.error_code = error_code; } public String getError_message() { return error_message; } public void setError_message(String error_message) { this.error_message = error_message; } public String getPositioningStatus() { // 获取定位状态 return positioningStatus; } public void setPositioningStatus(String positioningStatus) { // 设置定位状态 this.positioningStatus = positioningStatus; } public String getSatelliteCount() { // 获取卫星数量 return satelliteCount; } public void setSatelliteCount(String satelliteCount) { // 设置卫星数量 this.satelliteCount = satelliteCount; } public String getDifferentialAge() { // 获取差分时间 return differentialAge; } public void setDifferentialAge(String differentialAge) { // 设置差分时间 this.differentialAge = differentialAge; } public String getSelf_check_status() { // 获取自检状态 return self_check_status; } public void setSelf_check_status(String self_check_status) { // 设置自检状态 this.self_check_status = self_check_status; } public String getMowerStartStatus() { // 获取割草机启动状态 return mowerStartStatus; } public void setMowerStartStatus(String mowerStartStatus) { // 设置割草机启动状态 this.mowerStartStatus = mowerStartStatus; } public String getMowerLightStatus() { // 获取割草机灯开关状态 return mowerLightStatus; } public void setMowerLightStatus(String mowerLightStatus) { // 设置割草机灯开关状态 this.mowerLightStatus = mowerLightStatus; } public String getBlade_height() { // 获取割草机刀盘高度 return blade_height; } public void setBlade_height(String blade_height) { // 设置割草机刀盘高度 this.blade_height = blade_height; } public String getMowerWidth() { // 获取割草机宽度 return mowerWidth; } public void setMowerWidth(String mowerWidth) { // 设置割草机宽度 this.mowerWidth = mowerWidth; } public String getMowerLength() { // 获取割草机长度 return mowerLength; } public void setMowerLength(String mowerLength) { // 设置割草机长度 this.mowerLength = mowerLength; } public String getMowingSafetyDistance() { // 获取割草安全距离 return mowingSafetyDistance; } public void setMowingSafetyDistance(String mowingSafetyDistance) { // 设置割草安全距离 this.mowingSafetyDistance = mowingSafetyDistance; } @Override public String toString() { // 输出对象信息 return "Device{" + "mowerName='" + mowerName + '\'' + ", mowerModel='" + mowerModel + '\'' + ", mowerNumber='" + mowerNumber + '\'' + ", mowingWidth='" + mowingWidth + '\'' + ", mowingHeight='" + mowingHeight + '\'' + ", baseStationNumber='" + baseStationNumber + '\'' + ", baseStationCardNumber='" + baseStationCardNumber + '\'' + ", baseStationCoordinates='" + baseStationCoordinates + '\'' + ", deviceCardnumber='" + deviceCardnumber + '\'' + ", createTime='" + createTime + '\'' + ", GupdateTime='" + GupdateTime + '\'' + ", BupdateTime='" + BupdateTime + '\'' + ", realtimeLatitude='" + realtimeLatitude + '\'' + ", realtimeLongitude='" + realtimeLongitude + '\'' + ", realtimeAltitude='" + realtimeAltitude + '\'' + ", realtimeX='" + realtimeX + '\'' + ", realtimeY='" + realtimeY + '\'' + ", realtimeSpeed='" + realtimeSpeed + '\'' + ", heading='" + heading + '\'' + ", pitch='" + pitch + '\'' + ", roll='" + roll + '\'' + ", yaw='" + yaw + '\'' + ", battery_level='" + battery_level + '\'' + ", battery_voltage='" + battery_voltage + '\'' + ", operation_mode='" + operation_mode + '\'' + ", motor_status='" + motor_status + '\'' + ", blade_status='" + blade_status + '\'' + ", path_id_saved='" + path_id_saved + '\'' + ", error_code='" + error_code + '\'' + ", error_message='" + error_message + '\'' + ", positioningStatus='" + positioningStatus + '\'' + ", satelliteCount='" + satelliteCount + '\'' + ", differentialAge='" + differentialAge + '\'' + ", self_check_status='" + self_check_status + '\'' + ", mowerStartStatus='" + mowerStartStatus + '\'' + ", mowerLightStatus='" + mowerLightStatus + '\'' + ", blade_height='" + blade_height + '\'' + ", mowerWidth='" + mowerWidth + '\'' + ", mowerLength='" + mowerLength + '\'' + ", mowingSafetyDistance='" + mowingSafetyDistance + '\'' + '}'; } }