作者 钟来

模块整理

正在显示 22 个修改的文件 包含 549 行增加264 行删除
package com.zhonglai.luhui.lsy.plc.service.comm.service;
import com.alibaba.fastjson.JSONObject;
import com.zhonglai.luhui.device.analysis.dto.ApiName;
import com.zhonglai.luhui.device.analysis.dto.DeviceCommandApiParameter;
import com.zhonglai.luhui.device.analysis.dto.Message;
import com.zhonglai.luhui.device.analysis.dto.MessageCode;
import com.zhonglai.luhui.device.domain.IotDevice;
import com.zhonglai.luhui.device.domain.IotTerminal;
import org.eclipse.paho.client.mqttv3.MqttException;
/**
* 设备指令接口
*/
public class DeviceCommandApi {
private ApiName apiName; //指令接口名称
private DeviceCommandApiParameter deviceCommandApiParameter; //参数
public Message invokeApi(MqttDeviceService deviceService) throws InterruptedException, MqttException {
switch (apiName)
{
// case read:
// return deviceService.read(deviceCommandApiParameter.getClient_id(),deviceCommandApiParameter.getMap());
// case control:
// return deviceService.control(deviceCommandApiParameter.getClient_id(), deviceCommandApiParameter.getMap());
// case controlHex:
// return deviceService.controlHex(deviceCommandApiParameter.getClient_id(),deviceCommandApiParameter.getData());
// case closeSession:
// return deviceService.closeSession(deviceCommandApiParameter.getClient_id());
// case delIotDevice:
// deviceService.closeSession(deviceCommandApiParameter.getClient_id()); //强制下线
// return deviceService.delIotDevice(deviceCommandApiParameter.getClient_id());
// case delIotTerminal:
// deviceService.closeSession(deviceCommandApiParameter.getClient_id()); //强制下线
// return deviceService.delIotTerminal(deviceCommandApiParameter.getClient_id(),deviceCommandApiParameter.getNumber());
// case getFirmwareVersion:
// return deviceService.getFirmwareVersion(deviceCommandApiParameter.getData());
// case updateIotDevice:
// IotDevice iotDevice = JSONObject.parseObject(JSONObject.toJSONString(deviceCommandApiParameter.getMap()), IotDevice.class);
// deviceCommandApiParameter.setClient_id(iotDevice.getClient_id());
// return deviceService.updateIotDevice(iotDevice);
// case updateIotTerminal:
// IotTerminal iotTerminal = JSONObject.parseObject(JSONObject.toJSONString(deviceCommandApiParameter.getMap()), IotTerminal.class);
// deviceCommandApiParameter.setClient_id(iotTerminal.getId());
// return deviceService.updateIotTerminal(iotTerminal);
// case delDeviceHost:
// return deviceService.delDeviceHost(deviceCommandApiParameter.getClient_id());
// case delDeviceInfo:
// deviceCommandApiParameter.setClient_id(deviceCommandApiParameter.getData());
// return deviceService.delDeviceInfo(deviceCommandApiParameter.getData());
// case delDeviceInfoFromDeviceId:
// return deviceService.delDeviceInfoFromDeviceId(deviceCommandApiParameter.getClient_id());
// case transferPond:
// return deviceService.transferPond(deviceCommandApiParameter.getClient_id(),deviceCommandApiParameter.getMap());
// case updateDeviceInfo:
// return deviceService.updateDeviceInfo(deviceCommandApiParameter.getClient_id(),deviceCommandApiParameter.getMap());
default:
return new Message(MessageCode.DEFAULT_FAIL_CODE,"接口不存在");
}
}
public ApiName getApiName() {
return apiName;
}
public void setApiName(ApiName apiName) {
this.apiName = apiName;
}
public DeviceCommandApiParameter getDeviceCommandApiParameter() {
return deviceCommandApiParameter;
}
public void setDeviceCommandApiParameter(DeviceCommandApiParameter deviceCommandApiParameter) {
this.deviceCommandApiParameter = deviceCommandApiParameter;
}
}
package com.zhonglai.luhui.lsy.plc.service.comm.service;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.zhonglai.luhui.device.analysis.comm.db.DeviceService;
import com.zhonglai.luhui.device.analysis.comm.db.mode.TerminalDataThingsModeService;
import com.zhonglai.luhui.device.analysis.comm.dto.LogDeviceOperation;
import com.zhonglai.luhui.device.analysis.comm.dto.thingsmodels.ThingsModelBase;
import com.zhonglai.luhui.device.analysis.comm.dto.thingsmodels.ThingsModelDataTypeEnum;
import com.zhonglai.luhui.device.analysis.comm.dto.thingsmodels.ThingsModelItemBase;
import com.zhonglai.luhui.device.analysis.comm.factory.Topic;
import com.zhonglai.luhui.device.analysis.comm.service.BusinessDataUpdateService;
import com.zhonglai.luhui.device.analysis.comm.service.CacheServiceImpl;
import com.zhonglai.luhui.device.analysis.comm.service.DataPersistenceServiceImpl;
import com.zhonglai.luhui.device.analysis.comm.service.DeviceLogService;
import com.zhonglai.luhui.device.analysis.comm.util.DateUtils;
import com.zhonglai.luhui.device.analysis.dto.Message;
import com.zhonglai.luhui.device.analysis.dto.MessageCode;
import com.zhonglai.luhui.device.analysis.dto.topic.AddPostDto;
import com.zhonglai.luhui.device.domain.IotThingsModel;
import com.zhonglai.luhui.lsy.plc.service.service.ClienNoticeService;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@Service
public class MqttDeviceService {
private static final Logger log = LoggerFactory.getLogger(MqttDeviceService.class);
@Autowired
private ClienNoticeService clienNoticeService;
}
... ... @@ -5,20 +5,13 @@ import com.google.gson.JsonObject;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.GsonConstructor;
import com.zhonglai.luhui.device.analysis.comm.factory.Topic;
import com.zhonglai.luhui.device.analysis.comm.util.ByteUtil;
import com.zhonglai.luhui.device.analysis.comm.util.StringUtils;
import com.zhonglai.luhui.device.analysis.comm.util.TableUtil;
import com.zhonglai.luhui.device.analysis.dto.Message;
import com.zhonglai.luhui.device.analysis.dto.MessageCode;
import com.zhonglai.luhui.device.domain.IotDevice;
import com.zhonglai.luhui.device.domain.IotTerminal;
import com.zhonglai.luhui.lsy.plc.service.comm.service.DeviceService;
import com.zhonglai.luhui.lsy.plc.service.comm.service.MqttDeviceService;
import com.zhonglai.luhui.lsy.plc.service.comm.service.TerminalService;
import com.zhonglai.luhui.lsy.plc.service.comm.util.TopicUtil;
import com.zhonglai.luhui.lsy.plc.service.dto.*;
import com.zhonglai.luhui.lsy.plc.service.service.ClienNoticeService;
import com.zhonglai.luhui.lsy.plc.service.service.topic.AllPostTopic;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
... ... @@ -30,7 +23,6 @@ import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
... ...
... ... @@ -65,6 +65,13 @@
<groupId>jakarta.xml.bind</groupId>
<artifactId>jakarta.xml.bind-api</artifactId>
</dependency>
<!-- mqtt -->
<dependency>
<groupId>org.eclipse.paho</groupId>
<artifactId>org.eclipse.paho.client.mqttv3</artifactId>
</dependency>
</dependencies>
<build>
... ...
... ... @@ -12,7 +12,7 @@ public class OperatingData {
public static CameraData cameraData = new CameraData(); //摄像头数据
public static CameraConfig cameraConfig = new CameraConfig() ; //摄像头配置
public static FeederConfig feederConfig = new FeederConfig() ; //投料机配置
public static FeederData feederData = new FeederData() ; //投料机配置
public static FeederData feederData = new FeederData() ; //投料机数据
public static RegisterConfig registerConfig = new RegisterConfig(); //数据解析字典
public static void setClassObjecValue(Object value,IfOperatingDataValueIsNotNull ifOperatingDataValueIsNotNull) throws IllegalAccessException, InstantiationException {
... ...
... ... @@ -106,4 +106,5 @@ public class CameraData {
* 尺度之内的面积之和占比
*/
private Integer scaleAreaSumPercentage = 0;
}
... ...
... ... @@ -30,7 +30,7 @@ public class RegisterConfig implements OperatingDataType{
registerList.add(new Register(6,"饲料重量",0,16,"fodderweight","java.lang.Float"));
registerList.add(new Register(7,"投料次数",0,16,"feednum","java.lang.Integer"));
registerList.add(new Register(8,"本次投料量",0,16,"feedweight","java.lang.Float"));
registerList.add(new Register(13,"运行模式",0,16,"runmode","java.lang.Boolean"));
registerList.add(new Register(13,"运行模式",0,16,"runmode","java.lang.Integer"));
registerList.add(new Register(14,"投料量",0,16,"runspeed","java.lang.Integer"));
registerList.add(new Register(15,"投料时间",0,16,"worktime","java.lang.Integer"));
registerList.add(new Register(16,"间隔时间",0,16,"interval","java.lang.Integer"));
... ...
... ... @@ -13,4 +13,6 @@ public class Condata
private Integer interval; //时间间隔 1-18秒
private Integer runstate; //运行状态 1运行、3停止(平台可以设置0启动中,2关闭中,4异常)
private Integer stopfeedcnt; //手动投料倒计时时间 单位分
private Integer onoff;
}
... ...
... ... @@ -57,24 +57,25 @@ public class DateListenService {
}
OperatingData.feederData.setInfo(info);
List<Integer[]> timerList = new ArrayList<>();
for(String key:data.keySet())
{
if(key.startsWith("timer"))
{
FeederTimer feederTimer = (FeederTimer) data.get(key);
timerList.add(new Integer[]{feederTimer.getTimer_start_h(),feederTimer.getTimer_start_m(),feederTimer.getTimer_close_h(),feederTimer.getTimer_start_m(),feederTimer.getTimer_if_start()});
}
}
if(null != timerList && timerList.size() != 0)
{
if(ObjectUtil.notEqual(OperatingData.feederConfig.getTimer(),timerList))
{
OperatingData.feederConfig.setTimer(timerList);
reportTimer();
}
}
//投料机不可以读
// List<Integer[]> timerList = new ArrayList<>();
// for(String key:data.keySet())
// {
// if(key.startsWith("timer"))
// {
// FeederTimer feederTimer = (FeederTimer) data.get(key);
// timerList.add(new Integer[]{feederTimer.getTimer_start_h(),feederTimer.getTimer_start_m(),feederTimer.getTimer_close_h(),feederTimer.getTimer_start_m(),feederTimer.getTimer_if_start()});
// }
// }
//
// if(null != timerList && timerList.size() != 0)
// {
// if(ObjectUtil.notEqual(OperatingData.feederConfig.getTimer(),timerList))
// {
// OperatingData.feederConfig.setTimer(timerList);
// reportTimer();
// }
// }
}
},1,10, TimeUnit.SECONDS);
... ... @@ -159,23 +160,23 @@ public class DateListenService {
CmdDto cmdDto = new CmdDto().setImei(OperatingData.sysConfig.getNettyConfig().getClientId()).setJsonObject( GsonConstructor.get().fromJson( str, JsonObject.class));
MessageUtil.sendMessage(InitService.nettyClient.getCtx(), cmdDto.generateCmd(),true);
}
/**
* 上报投料机定时参数
*/
public void reportTimer()
{
DevicedatRequest devicedatRequest = new DevicedatRequest();
devicedatRequest.setCmd("devicedata");
devicedatRequest.setType("4G.hs");
devicedatRequest.setSignal(4);
devicedatRequest.setMachstate(1);
devicedatRequest.setBattlevel(4);
devicedatRequest.setTimer(OperatingData.feederConfig.getTimer());
String str = GsonConstructor.get().toJson(devicedatRequest);
System.out.println(str);
CmdDto cmdDto = new CmdDto().setImei(OperatingData.sysConfig.getNettyConfig().getClientId()).setJsonObject( GsonConstructor.get().fromJson( str, JsonObject.class));
MessageUtil.sendMessage(InitService.nettyClient.getCtx(), cmdDto.generateCmd(),true);
}
// /**
// * 上报投料机定时参数
// */
// public void reportTimer()
// {
// DevicedatRequest devicedatRequest = new DevicedatRequest();
// devicedatRequest.setCmd("devicedata");
// devicedatRequest.setType("4G.hs");
// devicedatRequest.setSignal(4);
// devicedatRequest.setMachstate(1);
// devicedatRequest.setBattlevel(4);
// devicedatRequest.setTimer(OperatingData.feederConfig.getTimer());
// String str = GsonConstructor.get().toJson(devicedatRequest);
// System.out.println(str);
// CmdDto cmdDto = new CmdDto().setImei(OperatingData.sysConfig.getNettyConfig().getClientId()).setJsonObject( GsonConstructor.get().fromJson( str, JsonObject.class));
// MessageUtil.sendMessage(InitService.nettyClient.getCtx(), cmdDto.generateCmd(),true);
// }
/**
* 上报串口参数
... ... @@ -265,7 +266,7 @@ public class DateListenService {
devicedatRequest.setCondata(OperatingData.feederConfig.getCondata());
devicedatRequest.setInfo(OperatingData.feederData.getInfo());
devicedatRequest.setTimer(OperatingData.feederConfig.getTimer());
// devicedatRequest.setTimer(OperatingData.feederConfig.getTimer());
devicedatRequest.setSysConfig(OperatingData.sysConfig);
devicedatRequest.setCameraData(OperatingData.cameraData);
... ...
... ... @@ -42,7 +42,7 @@ public class DeviceService {
ModbusDto modbusDto = serialPortService.sendHexData(FeederCommdUtil.controlData(FeederCommd06ResponseType.runmode,0)); //,运行模式改成手动
if(null!=modbusDto)
{
condata.setRunmode(1);
condata.setRunmode(0);
}
}
... ...
... ... @@ -6,16 +6,19 @@ import com.zhonglai.luhui.smart.feeder.config.ScheduledConfig;
import com.zhonglai.luhui.smart.feeder.dto.FishCurveControlCondition;
import com.zhonglai.luhui.smart.feeder.service.device.CameraHandle;
import com.zhonglai.luhui.smart.feeder.service.device.handle.CameraRtspHandle;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.opencv.core.*;
import org.opencv.highgui.HighGui;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
import org.opencv.video.BackgroundSubtractorMOG2;
import org.opencv.video.Video;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.*;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
... ... @@ -77,6 +80,9 @@ public class FishGroupImageRecognitionService {
{
CameraHandle cameraHandle = InitService.cameraHandle;
// // 创建一个窗口来显示图像
// HighGui.namedWindow("Image", HighGui.WINDOW_AUTOSIZE);
if(!cameraHandle.isOpen())
{
if (!cameraHandle.init())
... ... @@ -90,7 +96,10 @@ public class FishGroupImageRecognitionService {
public void stop()
{
srsService.stop();
if(null != srsService)
{
srsService.stop();
}
OperatingData.cameraData.setFishGroupImageRecognIsRun(false);
backgroundSubtractor.clear();
... ... @@ -144,7 +153,22 @@ public class FishGroupImageRecognitionService {
{
if(null != srsService && endTime-DateUtils.getNowTimeMilly()>0)
{
srsService.push(frame);
CameraRtspHandle cameraRtspHandle = (CameraRtspHandle)cameraHandle;
Mat mat = cameraRtspHandle.compress(frame);
// 将图像转换为二进制数据
MatOfByte matOfByte = new MatOfByte();
Imgcodecs.imencode(".jpg", mat, matOfByte);
byte[] byteArray = matOfByte.toArray();
logger.info("推送图片大小:"+(byteArray.length/1024)+"kb");
String base64String = Base64.getEncoder().encodeToString(byteArray);
mqttService.pullimg(base64String.getBytes());
// // 显示图像
// HighGui.imshow("Image", mat);
// HighGui.waitKey(1);
matOfByte.release();
mat.release();
}else {
if(null != srsService)
{
... ... @@ -197,101 +221,114 @@ public class FishGroupImageRecognitionService {
double[] dsTotal = new double[5];
contours.removeIf(matOfPoint -> {
Rect rect = Imgproc.boundingRect(matOfPoint);
matOfPoint.release();
double[] ds = count(image,rect);
dsTotal[0]+=ds[0];
dsTotal[1]+=ds[1];
dsTotal[2]+=ds[2];
dsTotal[4]++;
if(rect.width!=image.width() && rect.width>OperatingData.cameraConfig.getCalloutBoxWidthMin())
{
double[] ds = count(image,rect);
if(filterate(ds))
{
dsTotal[0]+=ds[0];
dsTotal[1]+=ds[1];
dsTotal[2]+=ds[2];
dsTotal[3]+=ds[3];
dsTotal[4]++;
Imgproc.rectangle(image, rect.tl(), rect.br(), new Scalar(0, 255, 0), 2);
return false;
}else{
dsTotal[3]+=0;
}
}else{
dsTotal[3]+=0;
}
return true;
});
if(0!=dsTotal[4])
if(0==dsTotal[4])
{
double brightness = dsTotal[0]/dsTotal[4];
double reflection= dsTotal[1]/dsTotal[4];
double transparencyMeasure= dsTotal[2]/dsTotal[4];
double area = dsTotal[3]/dsTotal[4];
//计算斜率
double slope = area - (null==OperatingData.cameraData.getArea()?area:OperatingData.cameraData.getArea());
//当前斜率的差值
double slopeDifference = slope-(null==OperatingData.cameraData.getSlope()?slope:OperatingData.cameraData.getSlope());
//计算斜率差值的绝对值
double absValue = Math.abs(slopeDifference);
OperatingData.cameraData.setBrightness(brightness);
OperatingData.cameraData.setReflection(reflection);
OperatingData.cameraData.setTransparencyMeasure(transparencyMeasure);
OperatingData.cameraData.setArea(area);
OperatingData.cameraData.setSlope(slope);
OperatingData.cameraData.setSlopeDifference(slopeDifference);
OperatingData.cameraData.setAbsValue(absValue);
OperatingData.cameraData.setSize(new Double(dsTotal[4]).intValue());
List<Double> scaleAreaList = OperatingData.cameraData.getScaleAreaList();
//计算尺度之内的面积集合的大小
int size = new Double((OperatingData.cameraConfig.getCollectionScale()*60*1000l)/time).intValue();
//如何集合满了,就吧第一个挤出去,然后放在集合最后
if(scaleAreaList.size()>=size)
{
scaleAreaList.remove(0);
}
scaleAreaList.add(dsTotal[4]);
//计算鱼群规模
Double[] fishSchoolSizeConfig = OperatingData.cameraConfig.getFishSchoolSizeConfig();
int grade = 0;
double fishSchoolSize = area*dsTotal[4];
System.out.println("=======鱼群规模:"+fishSchoolSize+"=========");
for (int i=0;i<fishSchoolSizeConfig.length;i++)
{
if(fishSchoolSize-fishSchoolSizeConfig[i]>0)
{
grade = i+1;
}
}
if(OperatingData.cameraData.getFishSchoolSize()!=grade)
{
OperatingData.cameraData.setFishSchoolSize(grade);
if(OperatingData.cameraConfig.getIfSendFishSchoolSize())
{
int finalGrade = grade;
ScheduledConfig.scheduler.schedule(() -> {
String nowtime = DateUtils.getTime();
String[] ss = OperatingData.cameraConfig.getFishSchoolSizeConfigString();
String fishSchoolSizeStr = ss[finalGrade];
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append(nowtime);
stringBuffer.append(" ");
stringBuffer.append(fishSchoolSizeStr);
// stringBuffer.append(",当前档位:");
// stringBuffer.append(null==OperatingData.cameraData.getNowGear()?0:OperatingData.cameraData.getNowGear());
// stringBuffer.append("档");
InitService.dateListenService.reportIntelligentFeeding(stringBuffer.toString());
},0, TimeUnit.SECONDS);
}
}
logger.info("当前画面的亮度:{},当前画面的反光:{},当前画面的透明度:{},当前画面的平均面积:{},鱼群规模:{},鱼群数量:{}",brightness,reflection,transparencyMeasure,area,fishSchoolSize, OperatingData.cameraData.getSize());
return;
}
List<Double> scaleAreaList = OperatingData.cameraData.getScaleAreaList();
//计算尺度之内的面积集合的大小
int size = new Double((OperatingData.cameraConfig.getCollectionScale()*60*1000l)/time).intValue();
//如何集合满了,就吧第一个挤出去,然后放在集合最后
if(scaleAreaList.size()>=size)
{
scaleAreaList.remove(0);
}
scaleAreaList.add(dsTotal[3]);
OperatingData.cameraData.setBrightness(new BigDecimal(dsTotal[0]/dsTotal[4]).setScale(2, RoundingMode.HALF_UP).doubleValue());
OperatingData.cameraData.setReflection(new BigDecimal(dsTotal[1]/dsTotal[4]).setScale(2, RoundingMode.HALF_UP).doubleValue());
OperatingData.cameraData.setTransparencyMeasure(new BigDecimal(dsTotal[2]/dsTotal[4]).setScale(2, RoundingMode.HALF_UP).doubleValue());
OperatingData.cameraData.setArea(new BigDecimal(dsTotal[3]/dsTotal[4]).setScale(2, RoundingMode.HALF_UP).doubleValue());
OperatingData.cameraData.setFishSchoolSize(new Double(dsTotal[3]).intValue());
OperatingData.cameraData.setSize(new Double(dsTotal[4]).intValue());
// if(0!=dsTotal[4])
// {
// double brightness = dsTotal[0]/dsTotal[4];
// double reflection= dsTotal[1]/dsTotal[4];
// double transparencyMeasure= dsTotal[2]/dsTotal[4];
// double area = dsTotal[3]/dsTotal[4];
//
// //计算斜率
// double slope = area - (null==OperatingData.cameraData.getArea()?area:OperatingData.cameraData.getArea());
// //当前斜率的差值
// double slopeDifference = slope-(null==OperatingData.cameraData.getSlope()?slope:OperatingData.cameraData.getSlope());
// //计算斜率差值的绝对值
// double absValue = Math.abs(slopeDifference);
//
// OperatingData.cameraData.setBrightness(brightness);
// OperatingData.cameraData.setReflection(reflection);
// OperatingData.cameraData.setTransparencyMeasure(transparencyMeasure);
// OperatingData.cameraData.setArea(area);
// OperatingData.cameraData.setSlope(slope);
// OperatingData.cameraData.setSlopeDifference(slopeDifference);
// OperatingData.cameraData.setAbsValue(absValue);
// OperatingData.cameraData.setSize(new Double(dsTotal[4]).intValue());
//
// //计算鱼群规模
// Double[] fishSchoolSizeConfig = OperatingData.cameraConfig.getFishSchoolSizeConfig();
// int grade = 0;
// double fishSchoolSize = dsTotal[3];
// System.out.println("=======鱼群规模:"+fishSchoolSize+"=========");
// for (int i=0;i<fishSchoolSizeConfig.length;i++)
// {
// if(fishSchoolSize-fishSchoolSizeConfig[i]>0)
// {
// grade = i+1;
// }
// }
//
// if(OperatingData.cameraData.getFishSchoolSize()!=grade)
// {
// OperatingData.cameraData.setFishSchoolSize(grade);
// if(OperatingData.cameraConfig.getIfSendFishSchoolSize())
// {
// int finalGrade = grade;
// ScheduledConfig.scheduler.schedule(() -> {
//
// String nowtime = DateUtils.getTime();
// String[] ss = OperatingData.cameraConfig.getFishSchoolSizeConfigString();
// String fishSchoolSizeStr = ss[finalGrade];
// StringBuffer stringBuffer = new StringBuffer();
// stringBuffer.append(nowtime);
// stringBuffer.append(" ");
// stringBuffer.append(fishSchoolSizeStr);
//// stringBuffer.append(",当前档位:");
//// stringBuffer.append(null==OperatingData.cameraData.getNowGear()?0:OperatingData.cameraData.getNowGear());
//// stringBuffer.append("档");
// InitService.dateListenService.reportIntelligentFeeding(stringBuffer.toString());
//
// },0, TimeUnit.SECONDS);
// }
// }
//
// logger.info("当前画面的亮度:{},当前画面的反光:{},当前画面的透明度:{},当前画面的平均面积:{},鱼群规模:{},鱼群数量:{}",brightness,reflection,transparencyMeasure,area,fishSchoolSize, OperatingData.cameraData.getSize());
//
// }
}
}
... ...
... ... @@ -17,6 +17,8 @@ public class InitService {
public static DateListenService dateListenService;
public static MqttService mqttService;
public static FishGroupImageRecognitionService fishGroupImageRecognitionService;
/**
* 加载配置
... ... @@ -57,6 +59,10 @@ public class InitService {
//数据上报
dateListenService = new DateListenService(serialPortService);
dateListenService.run();
//数据上报
mqttService = new MqttService();
mqttService.start();
}
}
... ...
package com.zhonglai.luhui.smart.feeder.service;
import cn.hutool.core.bean.BeanUtil;
import com.alibaba.fastjson.JSON;
import com.google.gson.JsonObject;
import com.ruoyi.common.utils.ByteUtil;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.GsonConstructor;
import com.zhonglai.luhui.smart.feeder.config.OperatingData;
import com.zhonglai.luhui.smart.feeder.config.ScheduledConfig;
import com.zhonglai.luhui.smart.feeder.dto.CameraData;
import org.eclipse.paho.client.mqttv3.*;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.util.Date;
import java.util.Map;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
import static com.zhonglai.luhui.smart.feeder.service.InitService.mqttService;
public class MqttService {
private static final Logger log = LoggerFactory.getLogger(MqttService.class);
private MqttClient mqttclient ;
private MqttConnectOptions options;
private String username="12_ZY_AI";
private String password="Luhui586";
private Long endTime=0l;
private Long interval = 1000l;
private boolean isRun = false ;
private String imgtopic = "/2/"+username+"/IMG_POST/"+OperatingData.sysConfig.getNettyConfig().getClientId();
private String datatopic = "/2/"+username+"/ALL_POST/"+OperatingData.sysConfig.getNettyConfig().getClientId();
public void stop()
{
try {
if(null != mqttclient)
{
mqttclient.close();
}
} catch (MqttException e) {
log.error("关闭失败",e);
}
}
public void start()
{
if(null == mqttclient)
{
init();
}
try {
connect();
} catch (MqttException e) {
throw new RuntimeException(e);
}
}
private void init()
{
try {
mqttclient = new MqttClient("tcp://47.112.163.61:1883", OperatingData.sysConfig.getNettyConfig().getClientId(),new MemoryPersistence());
options = new MqttConnectOptions();
options.setCleanSession(true);
options.setConnectionTimeout(15);
//设置断开后重新连接
options.setAutomaticReconnect(true);
mqttclient.setCallback(new MqttCallbackExtended() {
@Override
public void connectComplete(boolean b, String s) {
log.info("连接成功");
try {
subscribe();
} catch (MqttException e) {
throw new RuntimeException(e);
}
}
@Override
public void connectionLost(Throwable cause) {
log.error("连接丢失",cause);
}
@Override
public void messageArrived(String topic, MqttMessage message) throws Exception {
//接收到消息
StringBuffer buffer = new StringBuffer();
buffer.append("topic:");
buffer.append(topic);
buffer.append("\r\n");
buffer.append("mqttMessage字符串:");
buffer.append(message.toString());
buffer.append("\r\n");
buffer.append("mqttMessage十六进制:");
buffer.append(ByteUtil.hexStringToSpace(ByteUtil.toHexString(message.getPayload())));
buffer.append("\r\n");
buffer.append("\r\n");
log.info(buffer.toString());
String str = new String(message.getPayload());
JsonObject jsonObject = GsonConstructor.get().fromJson(str, JsonObject.class);
if(null != jsonObject && jsonObject.size() !=0)
{
for (String key:jsonObject.keySet())
{
switch (key)
{
case "pulldata":
JsonObject pulldata = jsonObject.get("pulldata").getAsJsonObject();
Long pullTime = pulldata.get("pullTime").getAsLong();
Long intervalTime = pulldata.get("intervalTime").getAsLong();
pulldata(pullTime,intervalTime);
break;
case "restartService":
if(jsonObject.get("restartService").getAsInt()==1)
{
try {
String shutdownCommand;
String operatingSystem = System.getProperty("os.name");
if (operatingSystem.contains("Windows")) {
shutdownCommand = "shutdown.exe -r -t 0";
} else {
shutdownCommand = "sudo shutdown -r now";
}
Runtime.getRuntime().exec(shutdownCommand);
} catch (IOException e) {
e.printStackTrace();
}
}
break;
default:
break;
}
}
}
}
@Override
public void deliveryComplete(IMqttDeliveryToken token) {
log.info("成功发出消息 token {}",token.getTopics());
}
});
} catch (MqttException e) {
throw new RuntimeException(e);
}
}
private void connect() throws MqttException {
options.setUserName(username);
options.setPassword(password.toCharArray());
mqttclient.connect(options);
}
private void subscribe() throws MqttException {
mqttclient.subscribe(new String[]{"/2/"+username+"/PUT/"+OperatingData.sysConfig.getNettyConfig().getClientId()});
}
public void publish(String topic, MqttMessage message) throws MqttException {
mqttclient.publish(topic,message);
}
public void pullimg(byte[] byteArray)
{
MqttMessage message = new MqttMessage();
message.setPayload(byteArray);
try {
mqttService.publish(imgtopic,message);
} catch (MqttException e) {
log.error("图片发送异常",e);
}
}
public void pulldata(Long pullTime,Long intervalTime)
{
if(intervalTime<1000l)
{
return;
}
endTime = System.currentTimeMillis()+pullTime;
interval = intervalTime;
if(isRun)
{
return;
}
MqttMessage mqttMessage = new MqttMessage();
ScheduledConfig.scheduler.schedule(() -> {
isRun = true;
while (endTime- System.currentTimeMillis()>0)
{
try {
Map<String,Object> map = BeanUtil.beanToMap(OperatingData.cameraData, "brightness","reflection","transparencyMeasure","area","size","fishSchoolSize"
,"scaleAreaSum" ,"scaleAreaSumMax","scaleAreaSumPercentage");
map.put("update_time",DateUtils.parseDateToStr("HH:mm:ss",new Date()));
mqttMessage.setPayload(JSON.toJSONString(map).trim().getBytes());
publish(datatopic,mqttMessage);
} catch (Exception e) {
log.error("数据推送异常",e);
}finally {
try {
Thread.sleep(interval);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
isRun = false;
},0,TimeUnit.SECONDS);
}
}
... ...
... ... @@ -8,6 +8,7 @@ import com.zhonglai.luhui.smart.feeder.service.device.SerialPortService;
import com.zhonglai.luhui.smart.feeder.util.FeederCommd06ResponseType;
import com.zhonglai.luhui.smart.feeder.util.FeederCommdUtil;
import java.util.Date;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
... ... @@ -15,6 +16,7 @@ import java.util.concurrent.TimeUnit;
* 尺度步长法
*/
public class ScaleStepMethodService {
private Integer logTady = Integer.parseInt(DateUtils.parseDateToStr("yyyyMMdd",new Date()));
private ScheduledFuture scheduledFuture;
private SerialPortService serialPortService;
... ... @@ -27,6 +29,7 @@ public class ScaleStepMethodService {
public void run()
{
scheduledFuture = ScheduledConfig.scheduler.scheduleWithFixedDelay(() -> {
Integer nowTady = Integer.parseInt(DateUtils.parseDateToStr("yyyyMMdd",new Date()));
if( OperatingData.cameraData.getScaleAreaList().size()==0)
{
return;
... ... @@ -40,6 +43,12 @@ public class ScaleStepMethodService {
OperatingData.cameraData.setScaleAreaSumMax(sum);
}
if(nowTady-logTady!=0)
{
OperatingData.cameraData.setScaleAreaSumMax(sum);
logTady = nowTady;
}
String nowtime = DateUtils.getTime();
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append(nowtime);
... ... @@ -47,8 +56,7 @@ public class ScaleStepMethodService {
//如果鱼群急剧减少,就停止投料
Integer scaleAreaSumPercentage = new Double((sum/OperatingData.cameraData.getScaleAreaSumMax())*100).intValue();
OperatingData.cameraData.setScaleAreaSumPercentage(scaleAreaSumPercentage);
if (scaleAreaSumPercentage-OperatingData.cameraConfig.getStopTriggeringConditions()<=0)
if (100-scaleAreaSumPercentage!=0 && OperatingData.cameraData.getScaleAreaSumPercentage()-OperatingData.cameraConfig.getStopTriggeringConditions()>0 && scaleAreaSumPercentage-OperatingData.cameraConfig.getStopTriggeringConditions()<=0)
{
Condata condata = OperatingData.feederConfig.getCondata();
... ... @@ -63,8 +71,20 @@ public class ScaleStepMethodService {
//发送停止投料指令
if (serialPortService.isOpen())
{
if(OperatingData.feederConfig.getCondata().getRunmode()==1)
{
InitService.serialPortService.sendHexData(FeederCommdUtil.controlData( FeederCommd06ResponseType.runmode,0)); //通知串口
OperatingData.feederConfig.getCondata().setRunmode(0);
}
serialPortService.sendHexData(FeederCommdUtil.controlData(FeederCommd06ResponseType.runstate,0));
stringBuffer.append("发送停止投料指令,");
InitService.serialPortService.sendHexData(FeederCommdUtil.controlData( FeederCommd06ResponseType.runmode,1)); //通知串口
OperatingData.feederConfig.getCondata().setRunmode(1);
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}else{
stringBuffer.append("投料机串口未打开,无法发送停止投料指令,");
}
... ... @@ -89,7 +109,7 @@ public class ScaleStepMethodService {
}
//如果鱼群急剧增加,。。。
if (100-OperatingData.cameraConfig.getStopTriggeringConditions()-scaleAreaSumPercentage<=0)
if (100-scaleAreaSumPercentage!=0 && OperatingData.cameraData.getScaleAreaSumPercentage()-(100-OperatingData.cameraConfig.getStopTriggeringConditions())<0 && scaleAreaSumPercentage-(100-OperatingData.cameraConfig.getStopTriggeringConditions())>=0)
{
stringBuffer.append("发现鱼群急剧增加,");
... ... @@ -100,8 +120,10 @@ public class ScaleStepMethodService {
stringBuffer.append(OperatingData.cameraData.getScaleAreaSumMax());
InitService.dateListenService.reportIntelligentFeeding(stringBuffer.toString());
}
System.out.println("尺度之内的面积之和:"+sum+";尺度之内的面积之和曲线的峰值:"+OperatingData.cameraData.getScaleAreaSumMax()+";尺度之内的面积之和占比:"+scaleAreaSumPercentage+";上一个尺度之内的面积之和占比:"+OperatingData.cameraData.getScaleAreaSumPercentage());
OperatingData.cameraData.setScaleAreaSumPercentage(scaleAreaSumPercentage);
System.out.println("尺度之内的面积之和:"+sum+";尺度之内的面积之和曲线的峰值:"+OperatingData.cameraData.getScaleAreaSumMax()+";尺度之内的面积之和占比:"+scaleAreaSumPercentage);
},0, OperatingData.cameraConfig.getScaleStep(), TimeUnit.SECONDS);
}
... ...
... ... @@ -3,6 +3,7 @@ package com.zhonglai.luhui.smart.feeder.service;
import com.ruoyi.common.utils.DateUtils;
import com.zhonglai.luhui.smart.feeder.config.OpenCVConfig;
import com.zhonglai.luhui.smart.feeder.config.OperatingData;
import com.zhonglai.luhui.smart.feeder.config.ScheduledConfig;
import com.zhonglai.luhui.smart.feeder.draw.FishRegionPanel;
import com.zhonglai.luhui.smart.feeder.dto.VeiwDto;
import com.zhonglai.luhui.smart.feeder.opencv.OpenCVUtil;
... ...
package com.zhonglai.luhui.smart.feeder.service.device;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil;
import com.fazecast.jSerialComm.SerialPort;
import com.fazecast.jSerialComm.SerialPortDataListener;
import com.fazecast.jSerialComm.SerialPortEvent;
import com.ruoyi.common.utils.ByteUtil;
import com.zhonglai.luhui.smart.feeder.config.OperatingData;
import com.zhonglai.luhui.smart.feeder.config.ScheduledConfig;
import com.zhonglai.luhui.smart.feeder.dto.ModbusDto;
import com.zhonglai.luhui.smart.feeder.dto.SerialPortConfig;
import com.zhonglai.luhui.smart.feeder.dto.commd.FeederCommdDto;
import com.zhonglai.luhui.smart.feeder.dto.mqtt.Condata;
import com.zhonglai.luhui.smart.feeder.dto.mqtt.Info;
import com.zhonglai.luhui.smart.feeder.service.AnalysisDataService;
import com.zhonglai.luhui.smart.feeder.service.ConfigurationParameterService;
import com.zhonglai.luhui.smart.feeder.service.InitService;
import com.zhonglai.luhui.smart.feeder.util.FeederCommdUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
... ... @@ -19,6 +26,7 @@ import org.springframework.stereotype.Service;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.util.Map;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit;
... ... @@ -32,9 +40,24 @@ public class SerialPortService {
// 用于存储串口返回的数据,使用线程安全的队列
private BlockingQueue<ModbusDto> dataQueue = new LinkedBlockingQueue<>();
private AnalysisDataService analysisDataService = new AnalysisDataService();
public SerialPortService()
{
open();
ModbusDto modbusDto = sendHexData(FeederCommdUtil.readAll());
Map<String,Object> data = analysisDataService.analysis(modbusDto);
if(null != data && data.size() != 0)
{
Condata condata = BeanUtil.mapToBean(data, Condata.class,false,null);
Info info = BeanUtil.mapToBean(data, Info.class,false,null);
if(ObjectUtil.notEqual(OperatingData.feederConfig.getCondata(),condata))
{
OperatingData.feederConfig.setCondata(condata);
}
OperatingData.feederData.setInfo(info);
}
}
private SerialPort findSerialPort()
... ...
... ... @@ -96,6 +96,16 @@ public class CameraRtspHandle implements CameraHandle {
Thread thread1 = new Thread(() -> init());
thread1.start();
while (true)
{
if(isOpen())
{
InitService.fishGroupImageRecognitionService.run();
break;
}
Thread.sleep(1000);
}
}
} catch (Exception e) {
logger.error("抓取摄像头帧失败",e);
... ... @@ -199,6 +209,7 @@ public class CameraRtspHandle implements CameraHandle {
return converter2.convert(frame);
}
public Frame toFram(Mat mat) {
if(null == mat)
{
... ... @@ -236,6 +247,17 @@ public class CameraRtspHandle implements CameraHandle {
return null;
}
public Mat compress(Mat mat)
{
Frame frame = toFram(mat);
if(null != frame)
{
frame = compress(frame);
return converter2.convertToOrgOpenCvCoreMat(frame);
}
return null;
}
public Frame compress(Frame frame)
{
try {
... ...
... ... @@ -44,8 +44,16 @@ public class CfgdataService {
}
try {
CfgdataRequest cfgdataRequest = GsonConstructor.get().fromJson(data.toString(), CfgdataRequest.class);
Condata condata = cfgdataRequest.getCondata();
if(OperatingData.feederConfig.getCondata().getRunmode()==1)
{
String commd = FeederCommdUtil.controlData( FeederCommd06ResponseType.runmode,0);
logger.info("自动模式切换成手动模式");
InitService.serialPortService.sendHexData(commd); //通知串口
OperatingData.feederConfig.getCondata().setRunmode(0);
}
FeederConfig feederConfig = new FeederConfig();
feederConfig.setCondata(cfgdataRequest.getCondata());
feederConfig.setCondata(condata);
OperatingData.setClassObjecValue(feederConfig, (fieldname, fieldObject) -> {
try {
String commd = FeederCommdUtil.controlData( FeederCommd06ResponseType.valueOf(fieldname),(Integer) fieldObject);
... ... @@ -59,9 +67,8 @@ public class CfgdataService {
}
});
List<Integer[]> timerList = cfgdataRequest.getTimer();
if(null != timerList && timerList.size() != 0 )
if(null != timerList)
{
ModbusDto modbusDto = InitService.serialPortService.sendHexData(FeederCommdUtil.controlTimer(timerList));
if(0x10==modbusDto.getCommdcode())
... ... @@ -69,6 +76,11 @@ public class CfgdataService {
OperatingData.feederConfig.setTimer(timerList);
}
String commd = FeederCommdUtil.controlData( FeederCommd06ResponseType.runmode,1);
logger.info("定时在自动上运行");
InitService.serialPortService.sendHexData(commd); //通知串口
OperatingData.feederConfig.getCondata().setRunmode(1);
Thread.sleep(2000);
}
MessageUtil.sendFeederResponseMessage(ctx,"cfgdataOK", FeederBackstateTtpe.success,0);
}catch (Exception e)
... ... @@ -78,4 +90,9 @@ public class CfgdataService {
}
public static void main(String[] args) {
String commd = FeederCommdUtil.controlData( FeederCommd06ResponseType.runmode,0);
System.out.println(commd);
}
}
... ...
... ... @@ -4,6 +4,7 @@ import com.google.gson.JsonObject;
import com.ruoyi.common.utils.GsonConstructor;
import com.zhonglai.luhui.smart.feeder.config.OperatingData;
import com.zhonglai.luhui.smart.feeder.dto.FeederConfig;
import com.zhonglai.luhui.smart.feeder.dto.ModbusDto;
import com.zhonglai.luhui.smart.feeder.dto.commd.FeederBackstateTtpe;
import com.zhonglai.luhui.smart.feeder.dto.mqtt.CfgdataRequest;
import com.zhonglai.luhui.smart.feeder.dto.mqtt.CmdDto;
... ... @@ -38,8 +39,16 @@ public class ManualcontrolService {
}
try {
ManualcontrolRequest manualcontrolRequest = GsonConstructor.get().fromJson(data.toString(), ManualcontrolRequest.class);
Condata condata = manualcontrolRequest.getCondata();
if( OperatingData.feederConfig.getCondata().getRunmode()==1)
{
String commd = FeederCommdUtil.controlData( FeederCommd06ResponseType.runmode,0);
logger.info("自动模式切换成手动模式");
InitService.serialPortService.sendHexData(commd); //通知串口
OperatingData.feederConfig.getCondata().setRunmode(0);
}
FeederConfig feederConfig = new FeederConfig();
feederConfig.setCondata(manualcontrolRequest.getCondata());
feederConfig.setCondata(condata);
OperatingData.setClassObjecValue(feederConfig, (fieldname, fieldObject) -> {
try {
String commd = FeederCommdUtil.controlData( FeederCommd06ResponseType.valueOf(fieldname),(Integer) fieldObject);
... ...
... ... @@ -34,7 +34,20 @@ public class NettyClient {
close();
start();
}
},1,1,TimeUnit.SECONDS);
},1,3,TimeUnit.SECONDS);
while (true)
{
if(null != ctx && ctx.channel().isActive() && ctx.channel().isOpen())
{
return;
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
private void start() {
... ...
... ... @@ -23,6 +23,10 @@ public enum FeederCommd06ResponseType {
*/
runstate(17),
/**
* 开/关
*/
onoff(17),
/**
*停投料倒计时
*/
stopfeedcnt(18);
... ...
... ... @@ -6,6 +6,7 @@ import com.ruoyi.common.utils.ByteUtil;
import com.zhonglai.luhui.smart.feeder.dto.commd.*;
import com.zhonglai.luhui.smart.feeder.dto.mqtt.CfgdataRequest;
import java.util.ArrayList;
import java.util.List;
public class FeederCommdUtil {
... ... @@ -20,9 +21,6 @@ public class FeederCommdUtil {
return feederCommdDto.getHstr();
}
public static void main(String[] args) {
System.out.println(readAll());
}
/**
* 写运行模式
... ... @@ -34,6 +32,16 @@ public class FeederCommdUtil {
return feederCommdDto.getHstr();
}
/**
* 读取模式
* @return
*/
public static String readMode()
{
FeederCommdDto feederCommdDto = new FeederCommdDto(new FeederCommd03Response(13,14));
return feederCommdDto.getHstr();
}
/**
* 写定时器
... ... @@ -41,6 +49,13 @@ public class FeederCommdUtil {
*/
public static String controlTimer(List<Integer[]> timerList)
{
if(timerList.size() == 0) //情况定时器
{
for (int i=0;i<8;i++)
{
timerList.add(new Integer[]{0,0,0,0,0});
}
}
byte[] data = null;
for (int i=0;i<timerList.size();i++)
{
... ... @@ -49,11 +64,19 @@ public class FeederCommdUtil {
feederTimer.setTimer_start_m(timerNumbers[1]);
feederTimer.setTimer_start_h(timerNumbers[0]);
feederTimer.setTimer_if_start(timerNumbers[4]);
feederTimer.setTimer_is_start(1);
feederTimer.setTimer_close_m(timerNumbers[3]);
feederTimer.setTimer_close_h(timerNumbers[2]);
feederTimer.setTimer_if_close(timerNumbers[4]);
feederTimer.setTimer_is_close(1);
if(timerNumbers[1]-timerNumbers[3]==0 && timerNumbers[0]-timerNumbers[2]==0)
{
feederTimer.setTimer_is_start(0);
feederTimer.setTimer_is_close(0);
}else{
feederTimer.setTimer_is_start(1);
feederTimer.setTimer_is_close(1);
}
int i23 = 0;
if(null != feederTimer.getTimer_start_m())
... ...