|
|
@@ -0,0 +1,138 @@
|
|
|
+package cn.vbdsm.hj212.modbus.ws;
|
|
|
+
|
|
|
+import cn.hutool.core.util.ByteUtil;
|
|
|
+import cn.hutool.core.util.CharsetUtil;
|
|
|
+import cn.hutool.core.util.StrUtil;
|
|
|
+import cn.vbdsm.hj212.modbus.server.TcpSocketClient;
|
|
|
+import cn.vbdsm.hj212.modbus.utils.AESUtil;
|
|
|
+import cn.vbdsm.hj212.modbus.utils.RandomHelper;
|
|
|
+import cn.vbdsm.hj212.modbus.ws.data.*;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import lombok.var;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.beans.factory.annotation.Value;
|
|
|
+import org.springframework.stereotype.Component;
|
|
|
+
|
|
|
+import java.math.BigDecimal;
|
|
|
+import java.nio.charset.StandardCharsets;
|
|
|
+import java.time.LocalDateTime;
|
|
|
+import java.time.format.DateTimeFormatter;
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.Arrays;
|
|
|
+import java.util.List;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+
|
|
|
+@Slf4j
|
|
|
+@Component
|
|
|
+public class MockUploadTcpService {
|
|
|
+ @Autowired
|
|
|
+ private MockMonitor mockMonitor;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private TerminalDataDao terminalDataDao;
|
|
|
+
|
|
|
+ public List<TcpSocketClient> clients = new ArrayList<>();
|
|
|
+ @Value("${vbdsm.socket.client.bindIp}")
|
|
|
+ private String host;
|
|
|
+
|
|
|
+ @Value("${vbdsm.socket.client.port}")
|
|
|
+ private String port;
|
|
|
+
|
|
|
+
|
|
|
+ public void connect(){
|
|
|
+ String terminals = mockMonitor.getTerminals();
|
|
|
+ String[] coms = terminals.split("&");
|
|
|
+ for(String c : coms){
|
|
|
+ String[] cts = c.split("@");
|
|
|
+ String[] ts = cts[1].split(",");
|
|
|
+ for(String t : ts){
|
|
|
+ TerminalData td = getTerminal(cts[0],t);
|
|
|
+ TcpSocketClient client = new TcpSocketClient(host,Integer.parseInt(port),td);
|
|
|
+ clients.add(client);
|
|
|
+ client.Connect();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ public void SendAllData() {
|
|
|
+ //定时任务启动前,需要先将客户端全部连接成功!遍历客户端发送数据!
|
|
|
+ for(TcpSocketClient client : clients){
|
|
|
+ TerminalData td = client.getTerminalData();
|
|
|
+ if(td==null){
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ RandomPower power = new RandomPower();
|
|
|
+ setEngine(power,td);
|
|
|
+ try {
|
|
|
+ String nowStr = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"));
|
|
|
+ long now = Long.parseLong(nowStr);
|
|
|
+ now = now - (now - (now / 10000) * 10000) % 500;
|
|
|
+ uploadData(client,td,power,now);
|
|
|
+ }catch (Exception e){
|
|
|
+ log.error("uploadData error:" + e.getMessage());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ private TerminalData getTerminal(String companyId,String terminalId){
|
|
|
+ return terminalDataDao.getCurDayTerminalData(companyId,terminalId,true);
|
|
|
+ }
|
|
|
+
|
|
|
+ private void setEngine(RandomPower power, TerminalData td){
|
|
|
+ var dp = RandomHelper.getRandom(22000,3000,100);
|
|
|
+ var de = RandomHelper.getRandom(6600,600,100);
|
|
|
+ var pe = td.getDayTotal_p().equals(new BigDecimal(0))?new BigDecimal(0):td.getDayTotal_p().add(dp);
|
|
|
+ var qe = td.getDayTotal_e().equals(new BigDecimal(0))?new BigDecimal(0):td.getDayTotal_e().add(de);
|
|
|
+ var ps = td.getTotal_p().add(dp);
|
|
|
+ var qs = td.getTotal_e().add(de);
|
|
|
+ power.setEngine(pe,qe,ps,qs);
|
|
|
+ td.setTotal_p(ps);
|
|
|
+ td.setTotal_e(qs);
|
|
|
+ td.setDayTotal_p(pe);
|
|
|
+ td.setDayTotal_e(qe);
|
|
|
+ terminalDataDao.updateOrInsertTerminalData(td);
|
|
|
+ }
|
|
|
+
|
|
|
+ private void uploadData(TcpSocketClient client,TerminalData td,RandomPower power,long date){
|
|
|
+ String str = StrUtil.format("st=01;cn={};datatime={};cphh=&&",
|
|
|
+ td.getCompanyId(),String.valueOf(date));
|
|
|
+ str += genStr(td,power);
|
|
|
+ String result = "##"+StrUtil.padPre(String.valueOf(str.length()), 6, '0');
|
|
|
+ result += str;
|
|
|
+ result += AESUtil.getHj212CRC16(str.getBytes(StandardCharsets.UTF_8));
|
|
|
+ result += "\r\n";
|
|
|
+ log.info("终端:{},send data:{}" ,td.getTerminalId(), result);
|
|
|
+ //当前客户端如果没有保持在线状态,不发送
|
|
|
+ if(client.isConnect()){
|
|
|
+ client.sendData(result);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private String genStr(TerminalData td,RandomPower power){
|
|
|
+ String str = StrUtil.format("tid={}",td.getTerminalId());
|
|
|
+ str += "&"+ power.getStr();
|
|
|
+ RandomHarmonic hia = new RandomHarmonic("a");
|
|
|
+ hia.setBaseI(power.getIa());
|
|
|
+ str += "&" + hia.getStr_I();
|
|
|
+ RandomHarmonic hib = new RandomHarmonic("b");
|
|
|
+ hib.setBaseI(power.getIb());
|
|
|
+ str += "&" + hib.getStr_I();
|
|
|
+ RandomHarmonic hic = new RandomHarmonic("c");
|
|
|
+ hic.setBaseI(power.getIc());
|
|
|
+ str += "&" + hic.getStr_I();
|
|
|
+ RandomHarmonic hua = new RandomHarmonic("a");
|
|
|
+ hua.setBaseU(power.getUa());
|
|
|
+ str += "&" + hua.getStr_U();
|
|
|
+ RandomHarmonic hub = new RandomHarmonic("b");
|
|
|
+ hub.setBaseU(power.getUb());
|
|
|
+ str += "&" + hub.getStr_U();
|
|
|
+ RandomHarmonic huc = new RandomHarmonic("c");
|
|
|
+ huc.setBaseU(power.getUc());
|
|
|
+ str += "&" + huc.getStr_U();
|
|
|
+ return str;
|
|
|
+ }
|
|
|
+
|
|
|
+}
|