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, // 心跳回复
SYNCTASK, // 数据同步
SYNCRECV, // 数据同步反馈
SYNCFAIL, // 数据同步失败,返回失败原因
}
/**

View File

@ -19,7 +19,11 @@ public class AliyunSmsService {
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()) {
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<Thread> threads = new ArrayList<>();
private int supermarket_id;
/*
{
"flow": [{
@ -161,8 +163,20 @@ public class DeviceThread extends Thread {
// 一个摄像头只能连一次
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"));
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;
for (Map.Entry<String, PLC> entry : plcMap.entrySet()) {
@ -231,6 +245,14 @@ public class DeviceThread extends Thread {
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) {
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.isConnected();
plc.write("rodOut2Down");
plc.write("rodOut1Up");
// plc.write("rodOut2Up");
// plc.write("sensorIn2Reset");

View File

@ -1,7 +1,5 @@
package com.cowr.local.ssjygl.devicectrl.device;
;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
@ -94,7 +92,7 @@ public class XiShuiScale extends AbsScale {
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 {
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
// if ("prod".equals(ENV)) {
deviceThread.setSupermarket_id(CliCacheData.SUP.getId());
deviceThread.start();
// }
} catch (Exception e) {

View File

@ -2,6 +2,7 @@ package com.cowr.local.ssjygl.netty;
import com.alibaba.fastjson.JSONObject;
import com.cowr.common.enums.Enums;
import com.cowr.common.view.Result;
import com.cowr.local.ssjygl.main.Config;
import com.cowr.local.ssjygl.synctask.SyncTaskService;
import com.jfinal.log.Log;
@ -104,7 +105,7 @@ public class NettyClient {
log.debug("停止 socket 服务");
try {
if (channel != null) {
if(channel.parent() != null){
if (channel.parent() != null) {
channel.parent().close();
}
channel.close();
@ -154,14 +155,20 @@ public class NettyClient {
log.debug("注册成功supermarket_id" + supermarket_id);
} else if (Enums.MsgTarget.SYNCTASK.name().equals(target)) {
JSONObject data = json.getJSONObject("data");
boolean ret = SyncTaskService.me.recv(data);
Result ret = SyncTaskService.me.recv(data);
// 接收成功后返回id
if (ret) {
if (ret.getCode() == Result.SUCCESS) {
sendMsg(ctx, new JSONObject()
.fluentPut("target", Enums.MsgTarget.SYNCRECV)
.fluentPut("id", data.get("id"))
.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)) {
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.JSONObject;
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.Config;
import com.cowr.model.AuthLicense;
@ -111,9 +112,9 @@ public class SyncTaskService {
* @param data
* @return
*/
public boolean recv(JSONObject data) {
public Result recv(JSONObject data) {
if(!isEnable()){
return true;
return Result.success();
}
long st = System.currentTimeMillis();
@ -130,9 +131,10 @@ public class SyncTaskService {
) {
log.error("同步的数据是空的 %s", data.toJSONString());
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() {
@Override
public boolean run() {
@ -219,8 +221,10 @@ public class SyncTaskService {
} catch (Exception e) {
if (e.getMessage().contains("PRIMARY")) {
log.error("主键冲突 %s", data.toJSONString());
err[0] = String.format("主键冲突 %s", data.toJSONString());
} else if (e.getMessage().contains("Duplicate entry")) {
log.error("重复数据 %s", data.toJSONString());
err[0] = String.format("重复数据 %s", data.toJSONString());
} else {
log.error(e.getMessage(), e);
}
@ -231,12 +235,12 @@ public class SyncTaskService {
});
log.debug("recv 2 time: %s", System.currentTimeMillis() - st);
return ret;
return ret ? Result.success() : Result.failed(err[0]);
} catch (Exception e) {
log.error(e.getMessage(), e);
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
#当前部署本地程序的砂站id
current.supermarket_id=6
current.supermarket_id=1
#打印用到的配置信息
print.vendor=浠水县长投环保有限公司

View File

@ -199,6 +199,9 @@ public class NettyServer {
}
} else if (Enums.MsgTarget.SYNCRECV.name().equals(target)) {
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 {
System.out.println(json);
}

View File

@ -76,7 +76,13 @@ public class SmsService {
obj.put("date", DateTimeUtil.sdfymd.get().format(ordercluster.getCutoffTime()));
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) {
try {

View File

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