lisai17@sina.com 2020-09-24 00:00:15 +08:00
parent 46f88ce90b
commit f4886af87b
13 changed files with 207 additions and 35 deletions

View File

@ -9,6 +9,7 @@ public interface Enums {
HEARTBEATREPLY, // 心跳回复 HEARTBEATREPLY, // 心跳回复
SYNCTASK, // 数据同步 SYNCTASK, // 数据同步
SYNCRECV, // 数据同步反馈 SYNCRECV, // 数据同步反馈
SYNCFAIL, // 数据同步失败,返回失败原因
} }
/** /**

View File

@ -19,7 +19,11 @@ public class AliyunSmsService {
this.client = new DefaultAcsClient(DefaultProfile.getProfile(regionId, accessKeyId, secret)); this.client = new DefaultAcsClient(DefaultProfile.getProfile(regionId, accessKeyId, secret));
} }
public String generator(String temp_code_str, JSONObject param) { public String generator(String temp_code_str, JSONObject param) throws Exception {
if(temp_code_str == null){
throw new Exception("模板文件不存在");
}
for (String key : param.keySet()) { for (String key : param.keySet()) {
temp_code_str = temp_code_str.replace("${" + key + "}", param.getString(key)); temp_code_str = temp_code_str.replace("${" + key + "}", param.getString(key));
} }

View File

@ -52,6 +52,8 @@ public class DeviceThread extends Thread {
private List<Controller> controllers = new ArrayList<>(); private List<Controller> controllers = new ArrayList<>();
private List<Thread> threads = new ArrayList<>(); private List<Thread> threads = new ArrayList<>();
private int supermarket_id;
/* /*
{ {
"flow": [{ "flow": [{
@ -160,9 +162,21 @@ public class DeviceThread extends Thread {
String plckey = plcconf.getString("ip") + "_" + plcconf.getIntValue("port"); String plckey = plcconf.getString("ip") + "_" + plcconf.getIntValue("port");
// 一个摄像头只能连一次 // 一个摄像头只能连一次
Camera camera = new Camera(which + "_camera", cameraconf.getString("ip")); Camera camera = new Camera(which + "_camera", cameraconf.getString("ip"));
XiShuiScale scale = new XiShuiScale(which + "_scale", scaleconf.getString("ip"), scaleconf.getIntValue("port")); LEDThread led = new LEDThread(which + "_led", ledconf.getString("ip"), ledconf.getIntValue("port"));
LEDThread led = new LEDThread(which + "_led", ledconf.getString("ip"), ledconf.getIntValue("port")); AbsScale scale;
if (supermarket_id == 3) { // 城隍用了耀华的表头
scale = new YaoHuaScale(which + "_scale", scaleconf.getString("ip"), scaleconf.getIntValue("port"));
} else if (supermarket_id == 4) { // 石畈用了两个不一样的表头
if (scaleconf.getIntValue("port") == 10001) {
scale = new YaoHuaScale(which + "_scale", scaleconf.getString("ip"), scaleconf.getIntValue("port"));
} else {
scale = new XiShuiScale(which + "_scale", scaleconf.getString("ip"), scaleconf.getIntValue("port"));
}
} else {
scale = new XiShuiScale(which + "_scale", scaleconf.getString("ip"), scaleconf.getIntValue("port"));
}
PLC plc = null; PLC plc = null;
for (Map.Entry<String, PLC> entry : plcMap.entrySet()) { for (Map.Entry<String, PLC> entry : plcMap.entrySet()) {
@ -231,6 +245,14 @@ public class DeviceThread extends Thread {
return cameras.get(ip); return cameras.get(ip);
} }
public int getSupermarket_id() {
return supermarket_id;
}
public void setSupermarket_id(int supermarket_id) {
this.supermarket_id = supermarket_id;
}
/** /**
* *
*/ */

View File

@ -256,10 +256,10 @@ public class PLC extends Device {
public static void main(String[] args) { public static void main(String[] args) {
try { try {
PLC plc = new PLC("_plc", "192.168.20.21", 502, com.cowr.local.ssjygl.devicectrl.common.DeviceThread.defaultAddressTable); PLC plc = new PLC("_plc", "192.168.20.20", 502, com.cowr.local.ssjygl.devicectrl.common.DeviceThread.defaultAddressTable);
plc.connect(); plc.connect();
plc.isConnected(); plc.isConnected();
plc.write("rodOut2Down"); plc.write("rodOut1Up");
// plc.write("rodOut2Up"); // plc.write("rodOut2Up");
// plc.write("sensorIn2Reset"); // plc.write("sensorIn2Reset");

View File

@ -1,7 +1,5 @@
package com.cowr.local.ssjygl.devicectrl.device; package com.cowr.local.ssjygl.devicectrl.device;
;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.util.ArrayList; import java.util.ArrayList;
@ -94,7 +92,7 @@ public class XiShuiScale extends AbsScale {
public static void main(String[] args) { public static void main(String[] args) {
XiShuiScale s = new XiShuiScale("scale", "192.168.20.31", 10001); XiShuiScale s = new XiShuiScale("scale", "192.168.20.30", 10003);
try { try {
boolean connect = s.connect(); boolean connect = s.connect();

View File

@ -0,0 +1,126 @@
package com.cowr.local.ssjygl.devicectrl.device;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Map;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.stream.Collectors;
/**
* 耀
*/
public class YaoHuaScale extends AbsScale {
public YaoHuaScale(String id, String ip, int port) {
super(id, ip, port);
}
@Override
public double weigh() throws IOException {
InputStream inputStream = socket.getInputStream();
byte[] clearBuf = new byte[inputStream.available()];
inputStream.read(clearBuf);
int errCount = 0;
String weight = "0.0";
while (true) {
if (errCount >= 10) {
break;
}
errCount++;
byte[] buf = new byte[12];
int read = inputStream.read(buf);
if (read != 18) {
continue;
}
weight = new String(Arrays.copyOfRange(buf, 2, 8));
break;
}
return Double.parseDouble(weight) / 1000d;
}
@Override
public double weigh15() throws IOException {
ArrayList<String> list = new ArrayList<>();
AtomicBoolean run = new AtomicBoolean(true);
InputStream inputStream = socket.getInputStream();
byte[] clearBuf = new byte[inputStream.available()];
inputStream.read(clearBuf);
int errCount = 0;
while (run.get() && list.size() < 15) {
long st = System.currentTimeMillis();
byte[] buf = new byte[12];
int read = inputStream.read(buf);
if (read != 18 && errCount < 10) {
errCount++;
continue;
}
String weight = new String(Arrays.copyOfRange(buf, 2, 8));
if (!pattern.matcher(weight).matches() || weight.equals("000000")) {
// System.out.println("error:" + weight);
if (errCount == 100) {
break;
}
errCount++;
continue;
}
// System.out.println("读一次耗时:" + (System.currentTimeMillis() - st) + ", " + Double.parseDouble(flip(weight)));
list.add(weight);
}
String max = "0";
if (list.size() > 0) {
Map<String, Long> collect = list.stream().collect(
Collectors.groupingBy(num -> num, Collectors.counting()));
max = collect.entrySet().stream().max(Comparator.comparingLong(Map.Entry::getValue)).get().getKey();
}
return Double.parseDouble(max) / 1000d;
}
public static void main(String[] args) {
YaoHuaScale s = new YaoHuaScale("scale", "192.168.20.30", 10001);
try {
boolean connect = s.connect();
System.out.println("connect " + connect);
} catch (IOException e) {
e.printStackTrace();
}
long st = System.currentTimeMillis();
for (int i = 0; i < 100; i++) {
try {
st = System.currentTimeMillis();
double weigh = s.weigh15();
System.out.println("end:" + weigh + ", tm: " + (System.currentTimeMillis() - st));
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
} catch (IOException e) {
e.printStackTrace();
}
// break;
}
}
}

View File

@ -342,6 +342,7 @@ public class Config extends JFinalConfig {
// 最后启动 deviceThread // 最后启动 deviceThread
// if ("prod".equals(ENV)) { // if ("prod".equals(ENV)) {
deviceThread.setSupermarket_id(CliCacheData.SUP.getId());
deviceThread.start(); deviceThread.start();
// } // }
} catch (Exception e) { } catch (Exception e) {

View File

@ -2,6 +2,7 @@ package com.cowr.local.ssjygl.netty;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.cowr.common.enums.Enums; import com.cowr.common.enums.Enums;
import com.cowr.common.view.Result;
import com.cowr.local.ssjygl.main.Config; import com.cowr.local.ssjygl.main.Config;
import com.cowr.local.ssjygl.synctask.SyncTaskService; import com.cowr.local.ssjygl.synctask.SyncTaskService;
import com.jfinal.log.Log; import com.jfinal.log.Log;
@ -104,7 +105,7 @@ public class NettyClient {
log.debug("停止 socket 服务"); log.debug("停止 socket 服务");
try { try {
if (channel != null) { if (channel != null) {
if(channel.parent() != null){ if (channel.parent() != null) {
channel.parent().close(); channel.parent().close();
} }
channel.close(); channel.close();
@ -154,14 +155,20 @@ public class NettyClient {
log.debug("注册成功supermarket_id" + supermarket_id); log.debug("注册成功supermarket_id" + supermarket_id);
} else if (Enums.MsgTarget.SYNCTASK.name().equals(target)) { } else if (Enums.MsgTarget.SYNCTASK.name().equals(target)) {
JSONObject data = json.getJSONObject("data"); JSONObject data = json.getJSONObject("data");
boolean ret = SyncTaskService.me.recv(data); Result ret = SyncTaskService.me.recv(data);
// 接收成功后返回id // 接收成功后返回id
if (ret) { if (ret.getCode() == Result.SUCCESS) {
sendMsg(ctx, new JSONObject() sendMsg(ctx, new JSONObject()
.fluentPut("target", Enums.MsgTarget.SYNCRECV) .fluentPut("target", Enums.MsgTarget.SYNCRECV)
.fluentPut("id", data.get("id")) .fluentPut("id", data.get("id"))
.toJSONString()); .toJSONString());
} else {
sendMsg(ctx, new JSONObject()
.fluentPut("target", Enums.MsgTarget.SYNCFAIL)
.fluentPut("id", data.get("id"))
.fluentPut("msg", ret.getMsg())
.toJSONString());
} }
} else if (Enums.MsgTarget.SYNCRECV.name().equals(target)) { } else if (Enums.MsgTarget.SYNCRECV.name().equals(target)) {
SyncTaskService.me.syncComplete(json.getString("id")); SyncTaskService.me.syncComplete(json.getString("id"));

View File

@ -3,6 +3,7 @@ package com.cowr.local.ssjygl.synctask;
import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.cowr.common.enums.Enums; import com.cowr.common.enums.Enums;
import com.cowr.common.view.Result;
import com.cowr.local.ssjygl.main.CliCacheData; import com.cowr.local.ssjygl.main.CliCacheData;
import com.cowr.local.ssjygl.main.Config; import com.cowr.local.ssjygl.main.Config;
import com.cowr.model.AuthLicense; import com.cowr.model.AuthLicense;
@ -111,9 +112,9 @@ public class SyncTaskService {
* @param data * @param data
* @return * @return
*/ */
public boolean recv(JSONObject data) { public Result recv(JSONObject data) {
if(!isEnable()){ if(!isEnable()){
return true; return Result.success();
} }
long st = System.currentTimeMillis(); long st = System.currentTimeMillis();
@ -130,9 +131,10 @@ public class SyncTaskService {
) { ) {
log.error("同步的数据是空的 %s", data.toJSONString()); log.error("同步的数据是空的 %s", data.toJSONString());
log.debug("recv 1 time: %s", System.currentTimeMillis() - st); log.debug("recv 1 time: %s", System.currentTimeMillis() - st);
return true; return Result.failedstr("同步的数据是空的 %s", data.toJSONString());
} }
final String[] err = {null};
boolean ret = Db.tx(new IAtom() { boolean ret = Db.tx(new IAtom() {
@Override @Override
public boolean run() { public boolean run() {
@ -219,8 +221,10 @@ public class SyncTaskService {
} catch (Exception e) { } catch (Exception e) {
if (e.getMessage().contains("PRIMARY")) { if (e.getMessage().contains("PRIMARY")) {
log.error("主键冲突 %s", data.toJSONString()); log.error("主键冲突 %s", data.toJSONString());
err[0] = String.format("主键冲突 %s", data.toJSONString());
} else if (e.getMessage().contains("Duplicate entry")) { } else if (e.getMessage().contains("Duplicate entry")) {
log.error("重复数据 %s", data.toJSONString()); log.error("重复数据 %s", data.toJSONString());
err[0] = String.format("重复数据 %s", data.toJSONString());
} else { } else {
log.error(e.getMessage(), e); log.error(e.getMessage(), e);
} }
@ -231,12 +235,12 @@ public class SyncTaskService {
}); });
log.debug("recv 2 time: %s", System.currentTimeMillis() - st); log.debug("recv 2 time: %s", System.currentTimeMillis() - st);
return ret; return ret ? Result.success() : Result.failed(err[0]);
} catch (Exception e) { } catch (Exception e) {
log.error(e.getMessage(), e); log.error(e.getMessage(), e);
log.debug("recv 3 time: %s", System.currentTimeMillis() - st); log.debug("recv 3 time: %s", System.currentTimeMillis() - st);
return false; return Result.failed(e.getMessage());
} }
} }

View File

@ -10,7 +10,7 @@ socketserver.port=21002
socketio.port=12002 socketio.port=12002
#当前部署本地程序的砂站id #当前部署本地程序的砂站id
current.supermarket_id=6 current.supermarket_id=1
#打印用到的配置信息 #打印用到的配置信息
print.vendor=浠水县长投环保有限公司 print.vendor=浠水县长投环保有限公司

View File

@ -199,6 +199,9 @@ public class NettyServer {
} }
} else if (Enums.MsgTarget.SYNCRECV.name().equals(target)) { } else if (Enums.MsgTarget.SYNCRECV.name().equals(target)) {
SyncTaskService.me.syncComplete(json.getString("id")); SyncTaskService.me.syncComplete(json.getString("id"));
} else if (Enums.MsgTarget.SYNCFAIL.name().equals(target)) {
log.debug("客户端[%s]同步数据[sync_task id:%s]发生错误", map.get(ctx.channel()), json.getString("id"));
log.debug("客户端上传错误信息:%s", json.getString("msg"));
} else { } else {
System.out.println(json); System.out.println(json);
} }

View File

@ -76,7 +76,13 @@ public class SmsService {
obj.put("date", DateTimeUtil.sdfymd.get().format(ordercluster.getCutoffTime())); obj.put("date", DateTimeUtil.sdfymd.get().format(ordercluster.getCutoffTime()));
obj.put("weight", String.format("%.2f", ordercluster.getTotalWeight())); obj.put("weight", String.format("%.2f", ordercluster.getTotalWeight()));
String content = this.aliyunsms.generator(Const.SMS_TEMP_MAP.get(Const.TEMP_CODE_PEIE), obj); String content = null;
try {
content = this.aliyunsms.generator(Const.SMS_TEMP_MAP.get(Const.TEMP_CODE_PEIE), obj);
} catch (Exception e) {
log.error(e.getMessage(), e);
return false;
}
for (Sysuser sysuser : users) { for (Sysuser sysuser : users) {
try { try {

View File

@ -57,21 +57,21 @@ log4j.appender.fileInfo.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss.SSS} %p
# %t 输出产生该日志事件的线程名 # %t 输出产生该日志事件的线程名
# nettyclient 日志 # nettyserver 日志
log4j.additivity.com.cowr.service.ssjygl.netty=false log4j.additivity.com.cowr.service.ssjygl.netty=false
log4j.logger.com.cowr.service.ssjygl.netty=DEBUG, nettyclientFile, nettyclientConsole log4j.logger.com.cowr.service.ssjygl.netty=DEBUG, nettyserverFile, nettyserverConsole
log4j.appender.nettyclientFile=org.apache.log4j.RollingFileAppender log4j.appender.nettyserverFile=org.apache.log4j.RollingFileAppender
log4j.appender.nettyclientFile.encoding=UTF-8 log4j.appender.nettyserverFile.encoding=UTF-8
log4j.appender.nettyclientFile.Append=true log4j.appender.nettyserverFile.Append=true
log4j.appender.nettyclientFile.Threshold=DEBUG log4j.appender.nettyserverFile.Threshold=DEBUG
log4j.appender.nettyclientFile.File=../logs/ssjygl.xsx.nettyclient.log log4j.appender.nettyserverFile.File=../logs/ssjygl.xsx.nettyserver.log
log4j.appender.nettyclientFile.MaxFileSize=10MB log4j.appender.nettyserverFile.MaxFileSize=10MB
log4j.appender.nettyclientFile.MaxBackupIndex=1000 log4j.appender.nettyserverFile.MaxBackupIndex=1000
log4j.appender.nettyclientFile.layout=org.apache.log4j.PatternLayout log4j.appender.nettyserverFile.layout=org.apache.log4j.PatternLayout
log4j.appender.nettyclientFile.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss.SSS} %p %F %L - %M %m %X{traceId}%n log4j.appender.nettyserverFile.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss.SSS} %p %F %L - %M %m %X{traceId}%n
log4j.appender.nettyclientConsole.Threshold=DEBUG log4j.appender.nettyserverConsole.Threshold=DEBUG
log4j.appender.nettyclientConsole=org.apache.log4j.ConsoleAppender log4j.appender.nettyserverConsole=org.apache.log4j.ConsoleAppender
log4j.appender.nettyclientConsole.encoding=UTF-8 log4j.appender.nettyserverConsole.encoding=UTF-8
log4j.appender.nettyclientConsole.layout=org.apache.log4j.PatternLayout log4j.appender.nettyserverConsole.layout=org.apache.log4j.PatternLayout
log4j.appender.nettyclientConsole.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss}[%p][%l]: %m%n log4j.appender.nettyserverConsole.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss}[%p][%l]: %m%n