log.info("[{}] 开始解析马牙7026透传上报的属性信息数据,topic:{}", taskid, topic);
int code = IConst.CODE_SUCCESS;
String content = "";
String description = "";
try {
String[] topic_arr = topic.split("/");
// 设备ID
String device_id = topic_arr[2].trim();
String error_code = "";
boolean is_error = false;
Map<String, Object> mapinfo = new HashMap<String, Object>();
if (!message.getPayload().equals(null)) {
Map<String, Object> batteryKindParam = new HashMap<String, Object>();
batteryKindParam.put("battery_id", device_id);
List<Map<String, Object>> batteryKindResul = SqlUtils.queryInfo(taskid,
Config.getConfigBean().getDatasourcesBean().getDatasourceBean().get(0).getAlias(),
"getmy_battery_kind", batteryKindParam);
Integer batteryKind = batteryKindResul == null ? 2
: batteryKindResul.size() > 0 ? (Integer) batteryKindResul.get(0).get("battery_kind") : 2;
mapinfo.put("battery_kind", batteryKind);// 电池类型
// 数据解析
log.info("原始上报数据【{}】", message.getPayload());
ByteBuffer buffer = ByteBuffer.wrap(message.getPayload());
dataParse(buffer, mapinfo);
trackerParse(buffer, mapinfo);
}
if (!ObjectUtils.isEmpty(mapinfo.get("latitude")) && !ObjectUtils.isEmpty(mapinfo.get("longitude"))) {
// 1.经度
mapinfo.put("longitude_direction", "E"); // 默认是东经
// 2.纬度
mapinfo.put("latitude_direction", "N"); // 默认北纬
// 经纬度过滤逻辑
double currentLat = Double.parseDouble(mapinfo.get("latitude").toString());
double currentLon = Double.parseDouble(mapinfo.get("longitude").toString());
long currentTime = System.currentTimeMillis();
// === 判断当前坐标是否无效 ===
boolean isCurrentInvalid = (currentLat == 0.0 && currentLon == 0.0);
boolean isCoordOutOfRange = currentLat < -90 || currentLat > 90 || currentLon < -180
|| currentLon > 180;
GpsCache gpsCache = GpsCache.getInstance();
GpsCoordinate lastValid = gpsCache.getLastValid(device_id);
final double INVALID_THRESHOLD = 0.0001; // 容差范围
boolean isLastValidReal = lastValid != null && (Math.abs(lastValid.getLatitude()) > INVALID_THRESHOLD
|| Math.abs(lastValid.getLongitude()) > INVALID_THRESHOLD);
if (isCurrentInvalid || isCoordOutOfRange) {
// 当前坐标不合法,不能用于更新缓存,回退使用上一次
if (isLastValidReal) {
currentLat = lastValid.getLatitude();
currentLon = lastValid.getLongitude();
}
System.out.println("无效坐标 (0,0) 或越界,跳过缓存更新");
} else {
if (isLastValidReal) {
double distance = GpsUtils.calculateDistance(currentLat, currentLon, lastValid.getLatitude(),
lastValid.getLongitude());
if (distance > 5.0) {
// 计算与上次点之间的最大可接受距离 = 时间差 * 70km/h
long timeDiffMillis = currentTime - gpsCache.getLastValidTime(device_id);
double maxAllowedDistance = (timeDiffMillis / 3600000.0) * 70.0;
if (distance <= maxAllowedDistance) {
// 合理跳变,更新缓存
gpsCache.updateLastValid(device_id, currentLat, currentLon, currentTime);
} else {
// 过远跳变,回退使用上次位置
currentLat = lastValid.getLatitude();
currentLon = lastValid.getLongitude();
}
} else {
// 合理距离,直接更新
gpsCache.updateLastValid(device_id, currentLat, currentLon, currentTime);
}
} else {
// 第一次数据,直接记录
gpsCache.updateLastValid(device_id, currentLat, currentLon, currentTime);
}
}
// 最终用于入库
mapinfo.put("latitude", String.valueOf(currentLat));
mapinfo.put("longitude", String.valueOf(currentLon));
}
if (mapinfo != null && mapinfo.size() > 0) {
mapinfo.put("battery_id", device_id);
mapinfo.put("create_time", DateUtils.getCurrentDateTime());
mapinfo.put("flag", 1); // 1:设备主动请求或上报 2:平台主动推送或下指令 3:平台指令反馈的结果
try {
// 所属项目id
Map<String, Object> param_pro = new HashMap<String, Object>();
param_pro.put("device_id", device_id);
param_pro.put("client_id", device_id);
param_pro.put("username", topic_arr[1].trim());
List<Map<String, Object>> traidInfos = SqlUtils.queryInfo(taskid,
Config.getConfigBean().getDatasourcesBean().getDatasourceBean().get(0).getAlias(),
"getTriadInfos", param_pro);
if (traidInfos != null && traidInfos.size() > 0) {
// 获取项目id
int project_id = Integer.parseInt(String.valueOf(traidInfos.get(0).get("project_id")).trim());
mapinfo.put("project_id", project_id);
}
if (mapinfo.get("data_type").equals("1")) {
mapinfo.put("payload", "静态数据:" + bytesToHex(message.getPayload()));
}
// 更新最新记录库 my_battery_info_lastest
log.info("[{}] 电池编号:{} 更新最新记录库,解析设备主动透传上报消息入库表【my_battery_info_lastest】开始... ", taskid, device_id);
List<Map<String, Object>> my_battery_info_lastest_result = SqlUtils.queryInfo(taskid,
Config.getConfigBean().getDatasourcesBean().getDatasourceBean().get(0).getAlias(),
"getmy_battery_info_lastest_secretkey", param_pro);
String payload=null;
if (my_battery_info_lastest_result != null && my_battery_info_lastest_result.size() > 0) {// 存在,更新数据
payload = String.valueOf(my_battery_info_lastest_result.get(0).get("payload"));
String oldUploadTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(my_battery_info_lastest_result.get(0).get("upload_time"));
if(oldUploadTime.equals(mapinfo.get("upload_time"))){
log.error("时间戳重复");
return true;
}
SqlUtils.updateTable(
Config.getConfigBean().getDatasourcesBean().getDatasourceBean().get(0).getAlias(),
"updatemy_battery_info_lastest", mapinfo);
} else {
// 不存在,直接插入数据
insertMqttDatas(mapinfo, "insertmy_battery_info_lastest", taskid);
}
if (mapinfo.get("data_type").equals("0")&&org.apache.commons.lang3.StringUtils.isNotBlank(bytesToHex(message.getPayload()))) {
mapinfo.put("payload", payload + "动态数据 :" + bytesToHex(message.getPayload()));
}
log.info("[{}] 电池编号:{} 更新最新记录库,解析设备主动透传上报消息入库表【my_battery_info_lastest】完毕 ", taskid, device_id);
log.info("[{}] 电池编号:{}。解析设备主动透传上报消息入库表【my_battery_info】开始 ", taskid, device_id);
Map<String, Object> myBatteryInfoLastestParam = new HashMap<String, Object>();
myBatteryInfoLastestParam.put("battery_id", device_id);
List<Map<String, Object>> myBatteryInfoLastestResult = SqlUtils.queryInfo(taskid,
Config.getConfigBean().getDatasourcesBean().getDatasourceBean().get(0).getAlias(),
"getmy_battery_info_lastest", myBatteryInfoLastestParam);
if (myBatteryInfoLastestResult.size() > 0) {
if(Objects.isNull(mapinfo.get("empty_count"))){ mapinfo.put("empty_count", myBatteryInfoLastestResult.get(0).get("empty_count"));}
if(Objects.isNull(mapinfo.get("msg_delay_time"))){ mapinfo.put("msg_delay_time",myBatteryInfoLastestResult.get(0).get("msg_delay_time"));}
if(Objects.isNull(mapinfo.get("battery_soft_version"))){ mapinfo.put("battery_soft_version",myBatteryInfoLastestResult.get(0).get("battery_soft_version"));}
if(Objects.isNull(mapinfo.get("battery_hard_version"))){ mapinfo.put("battery_hard_version",myBatteryInfoLastestResult.get(0).get("battery_hard_version"));}
if(Objects.isNull(mapinfo.get("sn"))){ mapinfo.put("sn", myBatteryInfoLastestResult.get(0).get("sn"));}
if(Objects.isNull(mapinfo.get("charge_cycles_history"))){ mapinfo.put("charge_cycles_history",myBatteryInfoLastestResult.get(0).get("charge_cycles_history"));}
if(Objects.isNull(mapinfo.get("battery_cycle_times"))){ mapinfo.put("battery_cycle_times",myBatteryInfoLastestResult.get(0).get("battery_cycle_times"));}
if(Objects.isNull(mapinfo.get("soh"))){ mapinfo.put("soh", myBatteryInfoLastestResult.get(0).get("soh"));}
if(Objects.isNull(mapinfo.get("actual_soh"))){ mapinfo.put("actual_soh", myBatteryInfoLastestResult.get(0).get("actual_soh"));}
if(Objects.isNull(mapinfo.get("total_charge_energy"))){ mapinfo.put("total_charge_energy",myBatteryInfoLastestResult.get(0).get("total_charge_energy"));}
if(Objects.isNull(mapinfo.get("fcc"))){ mapinfo.put("fcc", myBatteryInfoLastestResult.get(0).get("fcc"));}
if(Objects.isNull(mapinfo.get("longitude"))){ mapinfo.put("longitude", myBatteryInfoLastestResult.get(0).get("longitude"));}
if(Objects.isNull(mapinfo.get("latitude"))){ mapinfo.put("latitude", myBatteryInfoLastestResult.get(0).get("latitude"));}
if(Objects.isNull(mapinfo.get("gps_speed"))){ mapinfo.put("gps_speed", myBatteryInfoLastestResult.get(0).get("gps_speed"));}
if(Objects.isNull(mapinfo.get("gps_cog"))){ mapinfo.put("gps_cog", myBatteryInfoLastestResult.get(0).get("gps_cog"));}
if(Objects.isNull(mapinfo.get("gps_signal"))){ mapinfo.put("gps_signal", myBatteryInfoLastestResult.get(0).get("gps_signal"));}
if(Objects.isNull(mapinfo.get("gps_max_signal"))){ mapinfo.put("gps_max_signal", myBatteryInfoLastestResult.get(0).get("gps_max_signal"));}
if(Objects.isNull(mapinfo.get("iccid"))){ mapinfo.put("iccid", myBatteryInfoLastestResult.get(0).get("iccid"));}
if(Objects.isNull(mapinfo.get("imei"))){ mapinfo.put("imei", myBatteryInfoLastestResult.get(0).get("imei"));}
if(Objects.isNull(mapinfo.get("tracker_software_version"))){ mapinfo.put("tracker_software_version",myBatteryInfoLastestResult.get(0).get("tracker_software_version"));}
if(Objects.isNull(mapinfo.get("cell_info"))){ mapinfo.put("cell_info", myBatteryInfoLastestResult.get(0).get("cell_info"));}
if(Objects.isNull(mapinfo.get("longitude_direction"))&&Objects.nonNull(mapinfo.get("longitude"))){ mapinfo.put("longitude_direction", "E");}
if(Objects.isNull(mapinfo.get("latitude_direction"))&&Objects.nonNull(mapinfo.get("latitude"))){ mapinfo.put("latitude_direction", "N");}
if(Objects.isNull(mapinfo.get("battery_soc"))){ mapinfo.put("battery_soc", myBatteryInfoLastestResult.get(0).get("battery_soc"));}
if(Objects.isNull(mapinfo.get("low_battery_warn"))){ mapinfo.put("low_battery_warn", myBatteryInfoLastestResult.get(0).get("low_battery_warn"));}
if(Objects.isNull(mapinfo.get("mos_temp"))){ mapinfo.put("mos_temp", myBatteryInfoLastestResult.get(0).get("mos_temp"));}
if(Objects.isNull(mapinfo.get("battery_voltage"))){ mapinfo.put("battery_voltage", myBatteryInfoLastestResult.get(0).get("battery_voltage"));}
if(Objects.isNull(mapinfo.get("battery_work_mode"))){ mapinfo.put("battery_work_mode", myBatteryInfoLastestResult.get(0).get("battery_work_mode"));}
if(Objects.isNull(mapinfo.get("mos_status"))){ mapinfo.put("mos_status", myBatteryInfoLastestResult.get(0).get("mos_status"));}
if(Objects.isNull(mapinfo.get("battery_current"))){ mapinfo.put("battery_current", myBatteryInfoLastestResult.get(0).get("battery_current"));}
if(Objects.isNull(mapinfo.get("battery_error_code"))){ mapinfo.put("battery_error_code", myBatteryInfoLastestResult.get(0).get("battery_error_code"));}
if(Objects.isNull(mapinfo.get("charge_mode"))){ mapinfo.put("charge_mode", myBatteryInfoLastestResult.get(0).get("charge_mode"));}
if(Objects.isNull(mapinfo.get("charge_current_max"))){ mapinfo.put("charge_current_max", myBatteryInfoLastestResult.get(0).get("charge_current_max"));}
if(Objects.isNull(mapinfo.get("discharge_current_max"))){ mapinfo.put("discharge_current_max", myBatteryInfoLastestResult.get(0).get("discharge_current_max"));}
if(Objects.isNull(mapinfo.get("charge_current_avg"))){ mapinfo.put("charge_current_avg", myBatteryInfoLastestResult.get(0).get("charge_current_avg"));}
if(Objects.isNull(mapinfo.get("discharge_current_avg"))){ mapinfo.put("discharge_current_avg", myBatteryInfoLastestResult.get(0).get("discharge_current_avg"));}
if(Objects.isNull(mapinfo.get("cell_voltage"))){ mapinfo.put("cell_voltage", myBatteryInfoLastestResult.get(0).get("cell_voltage"));}
if(Objects.isNull(mapinfo.get("battery_voltage_max"))){ mapinfo.put("battery_voltage_max", myBatteryInfoLastestResult.get(0).get("battery_voltage_max"));}
if(Objects.isNull(mapinfo.get("battery_voltage_min"))){ mapinfo.put("battery_voltage_min", myBatteryInfoLastestResult.get(0).get("battery_voltage_min"));}
if(Objects.isNull(mapinfo.get("charge_capacity_history"))){ mapinfo.put("charge_capacity_history", myBatteryInfoLastestResult.get(0).get("charge_capacity_history"));}
if(Objects.isNull(mapinfo.get("discharge_capacity_history"))){ mapinfo.put("discharge_capacity_history", myBatteryInfoLastestResult.get(0).get("discharge_capacity_history"));}
if(Objects.isNull(mapinfo.get("ntc1"))){ mapinfo.put("ntc1", myBatteryInfoLastestResult.get(0).get("ntc1"));}
if(Objects.isNull(mapinfo.get("ntc2"))){ mapinfo.put("ntc2", myBatteryInfoLastestResult.get(0).get("ntc2"));}
if(Objects.isNull(mapinfo.get("ntc3"))){ mapinfo.put("ntc3", myBatteryInfoLastestResult.get(0).get("ntc3"));}
if(Objects.isNull(mapinfo.get("ntc4"))){ mapinfo.put("ntc4", myBatteryInfoLastestResult.get(0).get("ntc4"));}
if(Objects.isNull(mapinfo.get("battery_temperature_max"))){ mapinfo.put("battery_temperature_max", myBatteryInfoLastestResult.get(0).get("battery_temperature_max"));}
if(Objects.isNull(mapinfo.get("battery_temperature_min"))){ mapinfo.put("battery_temperature_min", myBatteryInfoLastestResult.get(0).get("battery_temperature_min"));}
if(Objects.isNull(mapinfo.get("battery_temperature_avg"))){ mapinfo.put("battery_temperature_avg", myBatteryInfoLastestResult.get(0).get("battery_temperature_avg"));}
if(Objects.isNull(mapinfo.get("tracker_communication_status"))){ mapinfo.put("tracker_communication_status", myBatteryInfoLastestResult.get(0).get("tracker_communication_status"));}
if(Objects.isNull(mapinfo.get("dsoc"))){ mapinfo.put("dsoc", myBatteryInfoLastestResult.get(0).get("dsoc"));}
if(Objects.isNull(mapinfo.get("correction_rate"))){ mapinfo.put("correction_rate", myBatteryInfoLastestResult.get(0).get("correction_rate"));}
if(Objects.isNull(mapinfo.get("tsoc"))){ mapinfo.put("tsoc", myBatteryInfoLastestResult.get(0).get("tsoc"));}
if(Objects.isNull(mapinfo.get("bsoc"))){ mapinfo.put("bsoc", myBatteryInfoLastestResult.get(0).get("bsoc"));}
if(Objects.isNull(mapinfo.get("charge_sop"))){ mapinfo.put("charge_sop", myBatteryInfoLastestResult.get(0).get("charging_sop"));}
if(Objects.isNull(mapinfo.get("discharge_sop"))){ mapinfo.put("discharge_sop", myBatteryInfoLastestResult.get(0).get("discharging_sop"));}
}
insertMqttDatas(mapinfo, "insertmy_battery_info", taskid);
log.info("[{}] 电池编号:{}。解析设备主动透传上报消息入库表【my_battery_info】完毕 ", taskid, device_id);
// 判断是否有故障,有则更新数据到故障表
// 记录告警信息
if ((StringUtils.isNotBlank(error_code) && is_error)) {// 有告警,则入库
log.info("[{}] 电池编号:{} 更新最新记录库,解析设备主动透传上报消息的告警入库表【my_battery_info_alarm】开始... ", taskid,
device_id);
insertMqttDatas(mapinfo, "insertmy_battery_info_alarm", taskid);
log.info("[{}] 电池编号:{} 更新最新记录库,解析设备主动透传上报消息告警入库表【my_battery_info_alarm】完毕 ", taskid, device_id);
}
// --gps信息--
Map<String, Object> mapinfo_gps = new HashMap<String, Object>();
mapinfo_gps.put("battery_id", device_id);
mapinfo_gps.put("longitude", mapinfo.get("longitude"));
mapinfo_gps.put("longitude_direction", "E");
mapinfo_gps.put("latitude", mapinfo.get("latitude"));
mapinfo_gps.put("latitude_direction", "N");
if (mapinfo.get("gps_speed") != null) {
mapinfo_gps.put("gps_speed", mapinfo.get("gps_speed") != null ? mapinfo.get("gps_speed") : 0);
}
if (mapinfo.get("gps_cog") != null) {
mapinfo_gps.put("gps_cog", mapinfo.get("gps_cog"));
}
mapinfo_gps.put("gps_signal", mapinfo.get("gps_signal"));
mapinfo_gps.put("upload_time", mapinfo.get("upload_time"));
mapinfo_gps.put("create_time", DateUtils.getCurrentDateTime());
// 此协议电池的gps经纬度为wgs84原始经纬度,要在百度地图上显示需要转换
if ((mapinfo.get("longitude") != null
&& Double.parseDouble(String.valueOf(mapinfo.get("longitude")).trim()) > 0)
|| (mapinfo.get("latitude") != null
&& Double.parseDouble(String.valueOf(mapinfo.get("latitude")).trim()) > 0)) {
Map<String, Object> baidugps = new HashMap<>();
if (Config.getConfigBean().getWgs84Tobd09() == 0) {
// 调用百度api
baidugps = wgs84Format2Baidu(
Double.parseDouble(mapinfo.get("longitude").toString().trim()) + "",
String.valueOf(Double.parseDouble(String.valueOf(mapinfo.get("latitude")).trim())));
} else {
// 本地接口
baidugps = CoordinateTransformUtil.wgs84Format2Baidu(
Double.parseDouble(mapinfo.get("longitude").toString().trim()) + "",
String.valueOf(Double.parseDouble(String.valueOf(mapinfo.get("latitude")).trim())));
}
mapinfo_gps.put("baidu_longitude", String.valueOf(baidugps.get("x")));
mapinfo_gps.put("baidu_latitude", String.valueOf(baidugps.get("y")));
}
// 这里处理每一张相关表都入库这个字段
mapinfo_gps.put("needAck", 0);
mapinfo_gps.put("businessMode", "");
try {
insert(mapinfo_gps, "insertmy_gpslocationinfo", taskid);
log.info("[{}] 透传设备主动上报消息入库表【my_gpslocationinfo】完成。 ", taskid);
} catch (Exception e) {
e.printStackTrace();
log.error("[{}] 透传设备主动上报消息入库表【my_gpslocationinfo】异常。 err:{} ", taskid, e.getStackTrace());
description = "入库表【my_gpslocationinfo】异常";
throw e;
}
} catch (Exception e) {
e.printStackTrace();
log.error(
"[{}] 解析设备主动透传上报消息入库表【my_gpslocationinfo】【my_battery_info】【my_battery_info_lastest】【my_battery_info_alarm】异常。 err:{} ",
taskid, e.getStackTrace());
description = "入库表【my_gpslocationinfo】【my_battery_info】【my_battery_info_lastest】【my_battery_info_alarm】异常";
throw e;
}
// 入库到美团S47,供搜索查询-
Map<String, Object> mapinfo_tr = new HashMap<String, Object>();
mapinfo_tr.put("thing_id", device_id);
// 新版把以下信息转移至电池信息中
mapinfo_tr.put("trackerHardwareVersion", "-");
mapinfo_tr.put("trackerSoftwareVersion", mapinfo.get("tracker_software_version"));
mapinfo_tr.put("upload_time", mapinfo.get("upload_time"));
mapinfo_tr.put("create_time", DateUtils.getCurrentDateTime());
// 这里处理每一张相关表都入库这个字段
mapinfo_tr.put("needAck", 0);
mapinfo_tr.put("businessMode", "");
try {
insert(mapinfo_tr, "insertmt_trackerinfo", taskid);
log.info("[{}] 设备透传主动上报消息入库表【mt_trackerinfo】完成。 ", taskid);
} catch (Exception e) {
e.printStackTrace();
log.error("[{}] 设备透传主动上报消息入库表【mt_trackerinfo】异常。 err:{} ", taskid, e.getStackTrace());
description = "入库表【mt_trackerinfo】异常";
throw e;
}
// --电池基础信息--
Map<String, Object> mapinfo_bt = new HashMap<String, Object>();
mapinfo_bt.put("thing_id", device_id);
mapinfo_bt.put("batteryId", device_id);
mapinfo_bt.put("batteryVoltage", mapinfo.get("battery_voltage"));
mapinfo_bt.put("batteryCurrent", mapinfo.get("battery_current"));
mapinfo_bt.put("batterySoc", mapinfo.get("battery_soc"));
mapinfo_bt.put("batteryHardVersion", "-");
mapinfo_bt.put("batterySoftVersion", mapinfo.get("battery_soft_version"));
mapinfo_bt.put("batteryWorkMode", mapinfo.get("battery_work_mode"));
mapinfo_bt.put("batteryTemperatureMax", mapinfo.get("battery_temperature_max"));
mapinfo_bt.put("batteryVoltageMax", mapinfo.get("battery_voltage_max"));
mapinfo_bt.put("batteryVoltageMin", mapinfo.get("battery_voltage_min"));
mapinfo_bt.put("mosStatus", mapinfo.get("mos_status"));
mapinfo_bt.put("chargeCycleTime", mapinfo.get("battery_cycle_times"));
mapinfo_bt.put("upload_time", mapinfo.get("upload_time"));
mapinfo_bt.put("create_time", DateUtils.getCurrentDateTime());
// 新版把以下信息转移至电池信息中
mapinfo_bt.put("imei", mapinfo.get("imei"));
mapinfo_bt.put("mobile", mapinfo.get("iccid"));
// 这里处理每一张相关表都入库这个字段
mapinfo_bt.put("needAck", 0);
mapinfo_bt.put("businessMode", "");
try {
insert(mapinfo_bt, "insertmt_batteryinfo", taskid);
log.info("[{}] 透传设备主动上报消息入库表【mt_batteryinfo】完成。 ", taskid);
} catch (Exception e) {
e.printStackTrace();
log.error("[{}] 透传设备主动上报消息入库表【mt_batteryinfo】异常。 err:{} ", taskid, e.getStackTrace());
description = "入库表【mt_batteryinfo】异常";
throw e;
}
// --gps信息--
Map<String, Object> mapinfo_gps = new HashMap<String, Object>();
mapinfo_gps.put("thing_id", device_id);
mapinfo_gps.put("reportReason", 1);
mapinfo_gps.put("detStatus", 0);
mapinfo_gps.put("networkType", 0);
mapinfo_gps.put("locationMode", 1);
mapinfo_gps.put("longitude", mapinfo.get("longitude"));
mapinfo_gps.put("longitudeDirection", 1);
mapinfo_gps.put("latitude", mapinfo.get("latitude"));
mapinfo_gps.put("latitudeDirection", 1);
mapinfo_gps.put("gpsSpeed", 0);
mapinfo_gps.put("gpsSignal", mapinfo.get("gps_signal"));
mapinfo_gps.put("upload_time", mapinfo.get("upload_time"));
mapinfo_gps.put("create_time", DateUtils.getCurrentDateTime());
// 此协议电池的gps经纬度为wgs84原始经纬度,要在百度地图上显示需要转换
if ((mapinfo.get("longitude") != null
&& Double.parseDouble(String.valueOf(mapinfo.get("longitude")).trim()) > 0)
|| (mapinfo.get("latitude") != null
&& Double.parseDouble(String.valueOf(mapinfo.get("latitude")).trim()) > 0)) {
Map<String, Object> baidugps = new HashMap<>();
if (Config.getConfigBean().getWgs84Tobd09() == 0) {
// 调用百度api
baidugps = wgs84Format2Baidu(
Double.parseDouble(mapinfo.get("longitude").toString().trim()) + "",
String.valueOf(Double.parseDouble(String.valueOf(mapinfo.get("latitude")).trim())));
} else {
// 本地接口
baidugps = CoordinateTransformUtil.wgs84Format2Baidu(
Double.parseDouble(mapinfo.get("longitude").toString().trim()) + "",
String.valueOf(Double.parseDouble(String.valueOf(mapinfo.get("latitude")).trim())));
}
mapinfo_gps.put("baidu_longitude", String.valueOf(baidugps.get("x")));
mapinfo_gps.put("baidu_latitude", String.valueOf(baidugps.get("y")));
}
// 这里处理每一张相关表都入库这个字段
mapinfo_gps.put("needAck", 0);
mapinfo_gps.put("businessMode", "");
try {
insert(mapinfo_gps, "insertmt_gpslocationinfo", taskid);
log.info("[{}] 透传设备主动上报消息入库表【mt_gpslocationinfo】完成。 ", taskid);
} catch (Exception e) {
e.printStackTrace();
log.error("[{}] 透传设备主动上报消息入库表【mt_gpslocationinfo】异常。 err:{} ", taskid, e.getStackTrace());
description = "入库表【mt_gpslocationinfo】异常";
throw e;
}
// mqtt解析后入库运行历史数据
log.info("[{}] 电池编号:{}。解析透传设备主动上报消息入库表【bms_run_history】开始... ", taskid, device_id);
Map<String, Object> mapudpinfo = new HashMap<String, Object>();
// 当前时间
String currenttime = DateUtils.getCurrentDateTime();
mapudpinfo.put("project_id", mapinfo.get("project_id"));
mapudpinfo.put("hwid", device_id);
mapudpinfo.put("imei", mapinfo.get("imei"));
mapudpinfo.put("iccid", mapinfo.get("iccid"));
mapudpinfo.put("bms_version", mapinfo.get("battery_soft_version"));
mapudpinfo.put("commun_board_version", mapinfo.get("tracker_software_version"));
mapudpinfo.put("soc", mapinfo.get("battery_soc"));
mapudpinfo.put("bms_circles", mapinfo.get("battery_cycle_times"));
mapudpinfo.put("cell_high_temp", mapinfo.get("battery_temperature_max"));
mapudpinfo.put("cell_low_temp", mapinfo.get("battery_temperature_min"));
mapudpinfo.put("cell_temp_region",
Long.parseLong(mapinfo.get("battery_temperature_max").toString().trim())
- Long.parseLong(mapinfo.get("battery_temperature_min").toString().trim()));
mapudpinfo.put("mos_temp", mapinfo.get("mos_temp"));
mapudpinfo.put("package_voltage", mapinfo.get("battery_voltage"));
mapudpinfo.put("single_high_voltage", mapinfo.get("battery_voltage_max"));
mapudpinfo.put("single_low_voltage", mapinfo.get("battery_voltage_min"));
mapudpinfo.put("single_voltage_region",
(Integer.parseInt(String.valueOf(mapinfo.get("battery_voltage_max")).trim())
- Integer.parseInt(String.valueOf(mapinfo.get("battery_voltage_min")).trim())));
// 1 充电,2 放电,3 搁置,4 空载
// 0x01(1):放电模式 0x10(16):充电模式 0x21(33):保护模式 0x30(48):待机无输出模式
// 0x31(49):待机预放电模式 0xFF(255):故障需返厂
int battery_status = 1;
int work_mode = Integer.parseInt(String.valueOf(mapinfo.get("battery_work_mode")).trim());
if (work_mode == 1) {
battery_status = 2;
} else if (work_mode == 16) {
battery_status = 1;
} else if (work_mode == 33 || work_mode == 48 || work_mode == 49) {
battery_status = 3;
}
mapudpinfo.put("battery_status", battery_status);
mapudpinfo.put("discharge_mos_status", mapinfo.get("mos_status"));
mapudpinfo.put("charge_mos_status", mapinfo.get("mos_status"));
mapudpinfo.put("discharge_currnet", mapinfo.get("battery_current"));
mapudpinfo.put("charge_currnet", mapinfo.get("battery_current"));
mapudpinfo.put("create_time", currenttime);
mapudpinfo.put("modify_time", currenttime);
mapudpinfo.put("upload_time", mapinfo.get("upload_time"));
// 入库mt_batteryinfo_lastest记录的数据
Map<String, Object> mapinfo_lastest = new HashMap<String, Object>();
mapinfo_lastest.put("project_id", mapinfo.get("project_id"));
mapinfo_lastest.put("thing_id", device_id);
mapinfo_lastest.put("batteryId", device_id);
mapinfo_lastest.put("batteryVoltage", mapinfo.get("battery_voltage"));
mapinfo_lastest.put("batteryCurrent", mapinfo.get("battery_current"));
mapinfo_lastest.put("batterySoc", mapinfo.get("battery_soc"));
mapinfo_lastest.put("batterySoftVersion", mapinfo.get("battery_soft_version"));
mapinfo_lastest.put("batteryWorkMode", mapinfo.get("battery_work_mode"));
mapinfo_lastest.put("batteryTemperatureMax", mapinfo.get("battery_temperature_max"));
mapinfo_lastest.put("batteryVoltageMax", mapinfo.get("battery_voltage_max"));
mapinfo_lastest.put("batteryVoltageMin", mapinfo.get("battery_voltage_min"));
mapinfo_lastest.put("mosStatus", mapinfo.get("mos_status"));
mapinfo_lastest.put("chargeCycleTime", mapinfo.get("battery_cycle_times"));
mapinfo_lastest.put("upload_time", mapinfo.get("upload_time"));
mapinfo_lastest.put("create_time", DateUtils.getCurrentDateTime());
// 新版把以下信息转移至电池信息中
mapinfo_lastest.put("imei", mapinfo.get("imei"));
mapinfo_lastest.put("mobile", mapinfo.get("iccid"));
mapinfo_lastest.put("businessMode", "");
mapinfo_lastest.put("trackerSoftwareVersion",
mapinfo.get("tracker_software_version") != null ? mapinfo.get("tracker_software_version") : "");
log.info("[{}] 电池编号:{}。解析设备主动上报消息入库表【bms_run_history】,有GPS信息 ", taskid, device_id);
Map<String, Object> baidugps = new HashMap<>();
if ((mapinfo.get("longitude") != null
&& Double.parseDouble(String.valueOf(mapinfo.get("longitude")).trim()) > 0)
|| (mapinfo.get("latitude") != null
&& Double.parseDouble(String.valueOf(mapinfo.get("latitude")).trim()) > 0)) {
if (Config.getConfigBean().getWgs84Tobd09() == 0) {
// 调用百度api
baidugps = wgs84Format2Baidu(
Double.parseDouble(mapinfo.get("longitude").toString().trim()) + "",
String.valueOf(Double.parseDouble(String.valueOf(mapinfo.get("latitude")).trim())));
} else {
// 本地接口
baidugps = CoordinateTransformUtil.wgs84Format2Baidu(
Double.parseDouble(mapinfo.get("longitude").toString().trim()) + "",
String.valueOf(Double.parseDouble(String.valueOf(mapinfo.get("latitude")).trim())));
}
}
mapudpinfo.put("longitude_mark", "E");
mapudpinfo.put("longitude",
(baidugps != null && baidugps.size() > 0) ? String.valueOf(baidugps.get("x")) : "0.000000");
mapudpinfo.put("latitude_mark", "N");
mapudpinfo.put("latitude",
(baidugps != null && baidugps.size() > 0) ? String.valueOf(baidugps.get("y")) : "0.000000");
mapudpinfo.put("speed", 0);
mapudpinfo.put("signal", mapinfo.get("gps_signal"));
mapinfo_lastest.put("networkType", 0);
mapinfo_lastest.put("locationMode", 1);
mapinfo_lastest.put("longitude", mapinfo.get("longitude"));
mapinfo_lastest.put("longitudeDirection", 1);
mapinfo_lastest.put("latitude", mapinfo.get("latitude"));
mapinfo_lastest.put("latitudeDirection", 1);
mapinfo_lastest.put("gpsSpeed", 0);
mapinfo_lastest.put("gpsSignal", mapinfo.get("gps_signal"));
// 解析入库操作,运行历史、故障历史等
MTDataAnalysis.anaylsismqttinfo2db(mapudpinfo, mapinfo_lastest, taskid);
// 马牙:运行历史、故障历史等。之后为统一使用
mapinfo_lastest.put("batteryErrorCode", mapinfo.get("battery_error_code"));
anaylsisInfo2HistoryDb(mapudpinfo, mapinfo_lastest, taskid);
log.info("[{}] 电池编号:{}。解析设备主动上报消息入库表【bms_run_history】完毕。 ", taskid, device_id);
// 将经纬度信息更新到udp_receiveinfo_lastestrecord
log.info("[{}] 电池编号:{}。解析设备主动上报消息的经纬度信息入库表【udp_receiveinfo_lastestrecord】开始... ", taskid, device_id);
mapudpinfo.put("package_voltage", (new BigDecimal(mapinfo.get("battery_voltage").toString()))
.divide(new BigDecimal(1000), 3, BigDecimal.ROUND_CEILING));
insertMqttDatas(mapudpinfo, "mtudp_receiveinfo_lastestrecord", taskid);
log.info("[{}] 电池编号:{}。解析设备主动上报消息的经纬度信息入库表【udp_receiveinfo_lastestrecord】完毕 ", taskid, device_id);
// 更新最新记录库 updatemt_batteryinfo_lastest
log.info("[{}] 电池编号:{} 更新最新记录库,解析设备主动上报消息入库表【mt_batteryinfo_lastest】开始... ", taskid, device_id);
insertMqttDatas(mapinfo_lastest, "updatemt_batteryinfo_lastest", taskid);
log.info("[{}] 电池编号:{} 更新最新记录库,解析设备主动上报消息入库表【mt_batteryinfo_lastest】完毕 ", taskid, device_id);
// 记录告警信息
if (mapinfo_lastest.get("batteryErrorCode") != null && is_error) {// 有告警,则入库
log.info("[{}] 电池编号:{} 更新最新记录库,解析设备主动上报消息的告警入库表【mt_batteryinfo_alarm】开始... ", taskid, device_id);
insertMqttDatas(mapinfo_lastest, "insertmt_batteryinfo_alarm", taskid);
log.info("[{}] 电池编号:{} 更新最新记录库,解析设备主动上报消息告警入库表【mt_batteryinfo_alarm】完毕 ", taskid, device_id);
}
}
} catch (Exception e) {
code = IConst.CODE_INTERNAL_ERR;
e.printStackTrace();
// 异常入库 错误类型:1:设备上报属性 2:设备主动请求配置 3:平台主动推送配置的响应 4:设备上报事件 5:设备服务调用应答
// 6:OTA升级响应
insertMqttErr(topic, message, content, e, description, 1, taskid);
return false;
} finally {
log.info("[{}] 定时透传上报属性信息,无需平台回复消息,topic:{},code:{}", taskid, topic, code); // topic+"_reply"
}
log.info("当前批次马牙上报的属性信息数据解析并入库完成");
return true;
分析一下这样可以解决upload_time重复的问题了吗
最新发布