山推添加机械设备定位-实时和报警数据信息

This commit is contained in:
guoshengxiong 2025-12-19 15:09:17 +08:00
parent a2acbda018
commit ac84197676
6 changed files with 219 additions and 0 deletions

View File

@ -23,6 +23,7 @@ import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.MapUtils;
import org.simpleframework.xml.core.Validate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Lazy;
import org.springframework.web.bind.annotation.*;
import springfox.documentation.annotations.ApiIgnore;
@ -48,6 +49,8 @@ public class MechanicalEquipmentPositionDataController {
@Lazy
@Autowired
private IMockMechanicalEquipmentPositionDataConfigService mockMechanicalEquipmentPositionDataConfigService;
@Value("${shantuiAesSecret:}")
private String shantuiAesSecret;
/**
* 分页列表查询
@ -239,4 +242,5 @@ public class MechanicalEquipmentPositionDataController {
return Result.ok();
}
}

View File

@ -0,0 +1,60 @@
package com.zhgd.xmgl.modules.mechanicalequipmentposition.controller;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.zhgd.xmgl.modules.mechanicalequipmentposition.entity.MechanicalEquipmentPositionData;
import com.zhgd.xmgl.modules.mechanicalequipmentposition.entity.dto.ShantuiMechanicalEquipmentMsg;
import com.zhgd.xmgl.modules.mechanicalequipmentposition.service.IMechanicalEquipmentPositionDataService;
import com.zhgd.xmgl.util.shantui.AESUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.MapUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import springfox.documentation.annotations.ApiIgnore;
import java.util.HashMap;
import java.util.Objects;
@RestController
@RequestMapping("/")
@Slf4j
@Api(tags = "山推相关Api")
public class ShantuiController {
@Autowired
private IMechanicalEquipmentPositionDataService mechanicalEquipmentPositionDataService;
@Value("${shantuiAesSecret:}")
private String shantuiAesSecret;
@ApiOperation(value = "山推添加机械设备定位-实时和报警数据信息", notes = "山推添加机械设备定位-实时和报警数据信息", httpMethod = "POST")
@PostMapping(value = "/notice/push")
public String addDataBySt(@ApiIgnore @RequestBody HashMap<String, Object> param) {
log.debug("山推添加机械设备定位-实时和报警数据信息:{}", JSON.toJSONString(param));
try {
String cipher = MapUtils.getString(param, "cipher");
String decrypt = AESUtil.decrypt(cipher, shantuiAesSecret);
ShantuiMechanicalEquipmentMsg equipmentMsg = JSONObject.parseObject(decrypt, ShantuiMechanicalEquipmentMsg.class);
ShantuiMechanicalEquipmentMsg.StaticAttr staticAttr = equipmentMsg.getStaticAttr();
MechanicalEquipmentPositionData positionData = new MechanicalEquipmentPositionData();
positionData.setDevSn(staticAttr.getDeviceCode());
ShantuiMechanicalEquipmentMsg.DynamicAttr dynamicAttr = equipmentMsg.getDynamicAttr();
positionData.setLatitude(Convert.toDouble(dynamicAttr.getLatitude()));
positionData.setLongitude(Convert.toDouble(dynamicAttr.getLongitude()));
positionData.setUploadTime(DateUtil.parse(equipmentMsg.getTimedetail(), "yyyyMMddHHmmssSSS"));
positionData.setSpeed(Convert.toDouble(dynamicAttr.getGps_speed()));
positionData.setWorkStatus(Objects.equals(dynamicAttr.getAcc_flag(), "0") ? 2 : 1);
positionData.setMileage(Convert.toDouble(dynamicAttr.getTotal_miles()));
mechanicalEquipmentPositionDataService.add(positionData);
} catch (Exception e) {
return "{\"code\":1, \"msg\":\"" + e.getMessage() + "\"}";
}
return "{\"code\":0, \"msg\":\"success\"}";
}
}

View File

@ -0,0 +1,79 @@
package com.zhgd.xmgl.modules.mechanicalequipmentposition.entity.dto;
import lombok.Data;
import java.util.List;
@Data
public class ShantuiMechanicalEquipmentMsg {
private String tid;
private String protocolCode;
private String cmdCode;
private String commSign;
private String transactionID;
private String version;
private String timedetail;
private Integer did;
private StaticAttr staticAttr;
private DynamicAttr dynamicAttr;
@Data
public static class StaticAttr {
private String deviceType;
private String terminalNo;
private String productId;
private String commSign;
private String deviceCode;
private String deviceName;
private String tid;
private String iccid;
private String createTime;
private String deviceSeries;
private String deviceModel;
private String id;
private String simNo;
private String dataSource;
private String did;
}
@Data
public static class DynamicAttr {
private String timedetail;
private String serial_no;
private String subversion;
private String hardware_version;
private String out_sensor_oil_height_real;
private String out_sensor_oil_height;
private String gps_valid_flag;
private String gps_lat_flag;
private String gps_long_flag;
private String gps_connect_flag;
private String longitude;
private String latitude;
private String acc_flag;
private String out_voltage;
private String inner_voltage;
private String gps_speed;
private String gps_direction;
private String gps_height_mm;
private String today_hours;
private String total_hours;
private String today_miles;
private String total_miles;
private String engine_working_hours;
private String today_fuel_consume;
private String wake_up_flag;
private String row_vibrate_data;
private String column_vibrate_data;
private String rtk_positioning_mode;
private String g_sensor_temperature;
private String acceleration_x;
private String acceleration_y;
private String acceleration_z;
private String fuel_select_canid_count;
private List<Object> fuel_select_canid_list;
private String hour_select_canid_count;
private List<Object> hour_select_canid_list;
private String firmware_version_full;
}
}

View File

@ -78,6 +78,7 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
http.authorizeRequests()
//请求路径允许访问
.antMatchers("/notice/push").permitAll()
.antMatchers("/xmgl/electricalData/addByJj").permitAll()
.antMatchers("/xmgl/cache/clearAll").permitAll()
.antMatchers("/xmgl/videoScreenshot/captureScreenshotSync").permitAll()

View File

@ -0,0 +1,74 @@
package com.zhgd.xmgl.util.shantui;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
public class AESUtil {
private static final String KEY_AES = "AES";
public static String encrypt(String src, String key) throws Exception {
if (key == null || key.length() != 16) {
throw new Exception("key不满足条件");
}
byte[] raw = key.getBytes();
SecretKeySpec skeySpec = new SecretKeySpec(raw, KEY_AES);
Cipher cipher = Cipher.getInstance(KEY_AES);
cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
byte[] encrypted = cipher.doFinal(src.getBytes());
return byte2hex(encrypted);
}
public static String decrypt(String src, String key) throws Exception {
if (key == null || key.length() != 16) {
throw new Exception("key不满足条件");
}
byte[] raw = key.getBytes();
SecretKeySpec skeySpec = new SecretKeySpec(raw, KEY_AES);
Cipher cipher = Cipher.getInstance(KEY_AES);
cipher.init(Cipher.DECRYPT_MODE, skeySpec);
byte[] encrypted1 = hex2byte(src);
byte[] original = cipher.doFinal(encrypted1);
String originalString = new String(original);
return originalString;
}
public static byte[] hex2byte(String strhex) {
if (strhex == null) {
return null;
}
int l = strhex.length();
if (l % 2 == 1) {
return null;
}
byte[] b = new byte[l / 2];
for (int i = 0; i != l / 2; i++) {
b[i] = (byte) Integer.parseInt(strhex.substring(i * 2, i * 2 + 2),
16);
}
return b;
}
public static String byte2hex(byte[] b) {
String hs = "";
String stmp = "";
for (int n = 0; n < b.length; n++) {
stmp = (java.lang.Integer.toHexString(b[n] & 0XFF));
if (stmp.length() == 1) {
hs = hs + "0" + stmp;
} else {
hs = hs + stmp;
}
}
return hs.toUpperCase();
}
public static void main(String[] args) {
try {
String decrypt = decrypt("69C96AE281AECBBBEC4926B60B9C7A0823025CA88C7B60AE0A861FC2D00DC8D762A7E6642EF2D8444B4C587D3F631A02BEE64E60469F413B3552900A46230BCA00C8D89713616977C8C0271FA212F4E353B40AF8F0DFDCFD46BE7A88B36D8FB4C5177C123ADF8DCB317C61CF5695B525C3449524D73FED10604BC285B536EEF02BA5172CC558BBA2CB8B889F0F1C8486FF897D76915C19C537A4F1B2ABAAE726F80406C884F349571D86ACEF5CC6E5B7C012858D6AB36FF858D196EDCD8B5203236213647E33A963F030E804A180C65A1B1DE78E519E5B4357BCBAAFD3A6D24C398C4D8E765F749DCE845336BDC4D8CD39DA072769821FA7715520F1B1ADE8AAC76A0758162D5E2B88C02624697524A67CBE5633064FEFBC9A7DD0E2C66166EA00C8D89713616977C8C0271FA212F4E3E87569470435CF48B00A2000CA22F33E4B2C110A13797B529B7D32E11569FDD2C067ACCBB0CC275F6E5846F576316FE1DE0CCF4E39E83C7B7CA98E80A41C3EE432023EBB3390439DD7C6CAD865F3436885193F700FA92BFEB47CF731E9020019815634DA5D0BBC1E831CED045DF882A81ED51B48F74416FBEF1C9703AAC276A7858BF905E48A671DAC0CC23BF4CE298FB412EEC384C741EC679D2EFA320676785B051072582F2C06ACD49AC2A48E051E33087C1A1FE6C938B20E79E0AAC71B048CE8CB6C86A482FF0931C8D8E26C985F9C7E2B79B6801A0A191B88D0C0942CA8FCE8DAC5AD0BFB52CFB2C481094B133EB1CC1C20E647CFBF10AC14D337068820DC5E5D1313D0C311F72345926BB0C211DF583521FEE56CD878008BFB80BBE21A04A6FD181C37231A265FDDE1B32EDAA0A4D5F21AE4D75AA3667C34193F578EF602A89236F12F4026CCC5D4C810DCB0BF79169B65BF1236800931000517599FBBABA54CF8FEBEC9E686A3EFC0F526A9BCC5E26F390B6635646ACAA97B71D508A69E88300543A468438D6C885ED574FF7F22A77F4CBE68DA3242D8769B331EAD7034A3C992F7F79F74BC859B1BEE1D3FD1A2B5D98FEAB8A7ECDC022C7B6FE6FD1B5A7F1386CD46807F89DA2EA6F854F7478AA28335DD2C274ACB80944B6C051ECC05B94D94F8BC4F4C306353E62648D91092F71B43E56BA575F97567D4ADA9095D0A5D58A24DA6E0986485616FBA722215427EFE41BEB302C5B6F7BBE5B289076F02D434334045F72E3E574651EEA7E41F1F545AE2A034C2A16C4D519380D5E1C75AFF471A4FF036C3FD02B607733558A92146EAFD4F4EF87B65A8DB7D5688122087780E53366A9DBB6E4DC9E5BF890F51AAA1EC186F03D4E689B58235219CBA8FF380BEB18F5CD7F03562E64649E93AE8D53F0851ACD840E850B7EC9997FBF51D663781E0A055CF201EF40CE68CA5D311F212B03575C0A9425F8FDDBCA5A77906D6C6D1F21D93EF1342D509559764B9BEC5E5761A8746EA227F5ED8E85A29B0F11F0F7EB347BCC7D1B6CBA7E9BEC773009A3052FD34A12AEDE6AABFF6AE0F54AA52480CAB665067422244C6B366218BA59C7047EBC4FE69BB69667B9B440663BDA1849C9D55D4D4025D5E2ACAFEEB57880FCAEC7EB449C930DDDE4241BB2D59E29FD56C985DCFFBC6EE3BF9D7BC486647C2C7FD67693DE2D2F4611C7E00095CA0B8D3AA35B665DC996BEC3D04F31F46F56258190F376960CF3F45C2533546EBE3EA44AD8AFA102596E853941258E3EDF7044B88718F1FFABB1BC0E8E3A92EFD5224B7E48E3E4EEEEFF8EA953D9F33FE6A7E81BB0D1CDA4FFCC4128222EC2E3BB5298C6658360453ABB9BE472772F6195A337BBF788D655BD77306B0D726D2D05D7FEDC17F5A097F75B6BE4BD30CD38FA785F9B106B9AACF95481A4BEA47A6E3F5965561631EE245A49F900924851135324809E3A081ED08D807C05FD1A09CEF06B2BC0025DBF2EC951ECDDC7F1D7A816E2DC4CEB89E4DB28AFD92C9AF060728D1F58B3EADEEA3CD0E1342A422DD1C6EA739413B396BB5768CDBAB1ED2D850417E3509DBFE2125ADD3848CAB2A7EAC9E34B53778E160324579D76FB77B165999E7D7DFF21F3E60FC33E4CF4B561EFDF75ACDFDD704F8D995D417E03EC3619E65A3E0EC4CCEFE6DAB187EB6B7176130FF49F27CA997DCD87C0006C5A0501CF5B09BB7ED5FD1C531B37182ADD4EB24F1C5A49844E52CECAE86C955002C1DBF7230C7",
"GTDcnpLW6rDKzHbL");
System.out.println(decrypt);
} catch (Exception e) {
e.printStackTrace();
}
}
}

View File

@ -107,3 +107,4 @@ upload.image.url.prefix=http://192.168.34.221:9111/image/
supplierResubmitApplicationUrl=http://192.168.34.175:88/#/workspace/contractorApply
#管控清单危险源的区域二维码的前缀
riskListSourceRegionQrCode=http://localhost:8088/app/#/pages/projectEnd/safeSame/riskGradingControlList/riskGradingControlList?id=
shantuiAesSecret=GTDcnpLW6rDKzHbL