|
@@ -1,209 +1,156 @@
|
|
|
-//package com.template.common.mqtt;
|
|
|
|
|
-//
|
|
|
|
|
-//import com.alibaba.fastjson.JSON;
|
|
|
|
|
-//import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
|
|
|
|
|
-//import com.template.common.utils.TimeExchange;
|
|
|
|
|
-//import com.template.model.Companies;
|
|
|
|
|
-//import com.template.model.vo.SensorRediesDetailVo;
|
|
|
|
|
-//import com.template.services.SensorDetailService;
|
|
|
|
|
-//import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
|
|
|
|
|
-//import org.eclipse.paho.client.mqttv3.MqttCallback;
|
|
|
|
|
-//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.data.redis.core.RedisTemplate;
|
|
|
|
|
-//import org.springframework.stereotype.Component;
|
|
|
|
|
-//import org.springframework.stereotype.Repository;
|
|
|
|
|
-//
|
|
|
|
|
-//import java.util.Date;
|
|
|
|
|
-//
|
|
|
|
|
-//import static com.template.common.util.Hex.byte2HexStr;
|
|
|
|
|
-//
|
|
|
|
|
-//@Component
|
|
|
|
|
-//@Repository
|
|
|
|
|
-//public class PushCallback implements MqttCallback {
|
|
|
|
|
-//
|
|
|
|
|
-// private static final Logger log = LoggerFactory.getLogger(PushCallback.class);
|
|
|
|
|
-//
|
|
|
|
|
-// @Autowired
|
|
|
|
|
-// private Companiess sensorDetailService;
|
|
|
|
|
-//
|
|
|
|
|
-// @Autowired
|
|
|
|
|
-// private MqttPushClient mqttPushClient;
|
|
|
|
|
-//
|
|
|
|
|
-// @Autowired
|
|
|
|
|
-// private RedisTemplate redisTemplate;
|
|
|
|
|
-//
|
|
|
|
|
-//
|
|
|
|
|
-// @Override
|
|
|
|
|
-// public void connectionLost(Throwable cause) {
|
|
|
|
|
-// // 当连接丢失时,这个方法会被调用
|
|
|
|
|
-// // 连接丢失后,一般在这里面进行重连
|
|
|
|
|
-// System.out.println(TimeExchange.getTime()+"[MQTT] 连接断开,30S之后尝试重连..."+cause);
|
|
|
|
|
-// while (true) {
|
|
|
|
|
-// try {
|
|
|
|
|
-// Thread.sleep(30000);
|
|
|
|
|
-//// MqttPushClient mqttPushClient = new MqttPushClient();
|
|
|
|
|
-// if (mqttPushClient.reConnect()) {
|
|
|
|
|
-// System.out.println("重连成功");
|
|
|
|
|
-// break;
|
|
|
|
|
-// }
|
|
|
|
|
-// } catch (Exception e) {
|
|
|
|
|
-// e.printStackTrace();
|
|
|
|
|
-// continue;
|
|
|
|
|
-// }
|
|
|
|
|
-// }
|
|
|
|
|
-// System.out.println(cause.getMessage() + "连接断开操作完毕");
|
|
|
|
|
-// }
|
|
|
|
|
-//
|
|
|
|
|
-// @Override
|
|
|
|
|
-// public void deliveryComplete(IMqttDeliveryToken token) {
|
|
|
|
|
-// //publish后会执行到这里
|
|
|
|
|
-// log.info("pushComplete---------" + token.isComplete());
|
|
|
|
|
-// }
|
|
|
|
|
-//
|
|
|
|
|
-// @Override
|
|
|
|
|
-// public void messageArrived(String topic, MqttMessage message) {
|
|
|
|
|
-// // subscribe后得到的消息会执行到这里面
|
|
|
|
|
-//
|
|
|
|
|
-// //说明:发布一次会返回一个设备数据,所以目前循环设备拿数据的时候得sleep十秒
|
|
|
|
|
-// //压力床 罗会把四个设备的数据合成一个传过来
|
|
|
|
|
-// System.out.println(2222222);
|
|
|
|
|
-//
|
|
|
|
|
-// log.info("接收消息主题 : " + topic);
|
|
|
|
|
-// log.info("接收消息Qos : " + message.getQos());
|
|
|
|
|
-// String content = byte2HexStr(message.getPayload());
|
|
|
|
|
-// log.info("接收消息内容 : " + content);
|
|
|
|
|
-// //1.创建一个配置对象
|
|
|
|
|
-//// JedisPoolConfig config = new JedisPoolConfig();
|
|
|
|
|
-//// config.setMaxTotal(100); // 设置最大连接数
|
|
|
|
|
-//// config.setMaxIdle(100); // 设置最大空闲数
|
|
|
|
|
-//// config.setMinIdle(100); // 设置最大空闲数
|
|
|
|
|
-//// config.setMaxWaitMillis(60000); // 设置最大空闲数
|
|
|
|
|
-//// JedisPool jedisPool = new JedisPool(config, "101.33.214.65", 6379);//获取链接
|
|
|
|
|
-//// Jedis jedis = jedisPool.getResource();
|
|
|
|
|
-//// jedis.auth("chuanghai_2023.");
|
|
|
|
|
-// try {
|
|
|
|
|
-// if (topic.equals("outTopic")&&content.length()>50) {
|
|
|
|
|
-//
|
|
|
|
|
-// Date nowDate = new Date();
|
|
|
|
|
-// //设备返回回来的数据格式规则:
|
|
|
|
|
-// //前两位是帧头
|
|
|
|
|
-// //去掉帧头后12位是设备号
|
|
|
|
|
-// //去掉帧头和设备号的后六位是十六进制数据,需要转换为十进制,最终单位为克
|
|
|
|
|
-// //最后四位是CRC不知道是干嘛的
|
|
|
|
|
-// //回调接口去把数据存储到redis里
|
|
|
|
|
-// //AA7C87CEB38F2E00000C46DC
|
|
|
|
|
-// SensorRediesDetailVo detail = new SensorRediesDetailVo();
|
|
|
|
|
-// String deviceNo = content.substring(2, 14);
|
|
|
|
|
-// detail.setSensorNo(deviceNo);
|
|
|
|
|
-//// String minVlaueStr = jedis.get("minValue");
|
|
|
|
|
-// String minVlaueStr = (String) redisTemplate.opsForValue().get("minValue");
|
|
|
|
|
-// int uploadValueTotal=0;
|
|
|
|
|
-// //负数的话减去FFFFFF的十进制数据
|
|
|
|
|
-// int bzValue = Integer.parseInt("FFFFFF", 16) / 2;
|
|
|
|
|
-// int number=1;
|
|
|
|
|
-// for(int i=14;i<45;i=i+6){
|
|
|
|
|
-// SensorRediesDetailVo detailTmp = new SensorRediesDetailVo();
|
|
|
|
|
-// detailTmp.setSensorNo(deviceNo);
|
|
|
|
|
-// String valueStr = content.substring(i, i+6);
|
|
|
|
|
-// //十六进制转十进制
|
|
|
|
|
-// //十六进制转十进制,简单的方法就是使用Integer.parseInt()方法进制转换,一步到位。
|
|
|
|
|
-// //1.如果输入的是不带0x表示的十六进制数,直接转换即可。
|
|
|
|
|
-// //2.如果输入的是带有0x标识的十六进制数,需要截去前面两位标识。
|
|
|
|
|
-//
|
|
|
|
|
-// //1、拿到的值转换成十进制后,如果大于 8388607,那么是负数;
|
|
|
|
|
-// //2、拿到的值转换成十进制后,如果小于 8388607,那么是正数。
|
|
|
|
|
-//
|
|
|
|
|
-// int uploadValue = Integer.parseInt(valueStr, 16);
|
|
|
|
|
-// if (uploadValue > bzValue) {
|
|
|
|
|
-// // uploadValue = uploadValue - Integer.parseInt("FFFFFF",16);
|
|
|
|
|
-// //负数置0
|
|
|
|
|
-// uploadValue = 0;
|
|
|
|
|
-// }
|
|
|
|
|
-// //传感器不去皮,总数去皮
|
|
|
|
|
-// detailTmp.setDetail(uploadValue);
|
|
|
|
|
-// detailTmp.setCreateTime(nowDate);
|
|
|
|
|
-// String redisKey = deviceNo +"-"+number+ ":" + TimeExchange.getDate();
|
|
|
|
|
-// number++;
|
|
|
|
|
-// String hasKey = TimeExchange.DateToString(nowDate, "yyyy-MM-dd HH:mm:ss");
|
|
|
|
|
-// String jsonStr = JSON.toJSON(detailTmp).toString();
|
|
|
|
|
-// log.info("=============jsonStr: " + jsonStr);
|
|
|
|
|
-// log.info("=============hasKey: " + hasKey);
|
|
|
|
|
-//// jedis.hset(redisKey, hasKey, jsonStr);
|
|
|
|
|
-// redisTemplate.opsForHash().put(redisKey, hasKey, jsonStr);
|
|
|
|
|
-// uploadValueTotal=uploadValueTotal+uploadValue;
|
|
|
|
|
-// //endregion
|
|
|
|
|
-// }
|
|
|
|
|
-// log.info("=============uploadValueTotal: " + uploadValueTotal);
|
|
|
|
|
-// //region 去皮操作
|
|
|
|
|
-// int minValue = 200000;
|
|
|
|
|
-// if (ObjectUtils.isEmpty(minVlaueStr)) {
|
|
|
|
|
-// minValue = uploadValueTotal < minValue ? uploadValueTotal : minValue;
|
|
|
|
|
-// } else {
|
|
|
|
|
-// //设置minvalue初始值
|
|
|
|
|
-// minValue=Integer.valueOf(minVlaueStr).intValue();
|
|
|
|
|
-// if(uploadValueTotal < Integer.valueOf(minVlaueStr).intValue()){
|
|
|
|
|
-// Object valueObj= redisTemplate.opsForHash().get("minValueTmp","value");
|
|
|
|
|
-// Object countObj= redisTemplate.opsForHash().get("minValueTmp","count");
|
|
|
|
|
-// if (valueObj!=null&&countObj!=null){
|
|
|
|
|
-// int count=Integer.parseInt(countObj.toString());
|
|
|
|
|
-// int value=Integer.parseInt(valueObj.toString());
|
|
|
|
|
-// int diff=Math.abs(uploadValueTotal - value);
|
|
|
|
|
-// //取较大的值
|
|
|
|
|
-// value=uploadValueTotal>value?uploadValueTotal:value;
|
|
|
|
|
-// //计数超过100存入皮重值清空计数器
|
|
|
|
|
-// if(count>100){
|
|
|
|
|
-// minValue=value;
|
|
|
|
|
-// redisTemplate.opsForHash().delete("minValueTmp","count","value");
|
|
|
|
|
-// redisTemplate.opsForHash().put("minValueTmp","time",TimeExchange.getTime());
|
|
|
|
|
-// }else if(diff<2000){
|
|
|
|
|
-// //数值变动小不更新数值只加数量
|
|
|
|
|
-// redisTemplate.opsForHash().put("minValueTmp","count",count+1+"");
|
|
|
|
|
-// redisTemplate.opsForHash().put("minValueTmp","time",TimeExchange.getTime());
|
|
|
|
|
-// }else{
|
|
|
|
|
-// //数值变动大更新数值和数量,取大值
|
|
|
|
|
-// redisTemplate.opsForHash().put("minValueTmp","value",value+"");
|
|
|
|
|
-// redisTemplate.opsForHash().put("minValueTmp","count",count+1+"");
|
|
|
|
|
-// redisTemplate.opsForHash().put("minValueTmp","time",TimeExchange.getTime());
|
|
|
|
|
-// }
|
|
|
|
|
-// }else{
|
|
|
|
|
-// redisTemplate.opsForHash().put("minValueTmp","value",uploadValueTotal+"");
|
|
|
|
|
-// redisTemplate.opsForHash().put("minValueTmp","count",1+"");
|
|
|
|
|
-// redisTemplate.opsForHash().put("minValueTmp","time",TimeExchange.getTime());
|
|
|
|
|
-// }
|
|
|
|
|
-//// redisTemplate.opsForValue().set("minValue",String.valueOf(minValue));
|
|
|
|
|
-// minVlaueStr = (String) redisTemplate.opsForValue().get("minValue");
|
|
|
|
|
-// }else{
|
|
|
|
|
-// redisTemplate.opsForHash().delete("minValueTmp","count","value");
|
|
|
|
|
-// redisTemplate.opsForHash().put("minValueTmp","time",TimeExchange.getTime());
|
|
|
|
|
-// }
|
|
|
|
|
-// }
|
|
|
|
|
-// redisTemplate.opsForValue().set("minValue",String.valueOf(minValue));
|
|
|
|
|
-// log.info("更新皮重minValue: " + minValue);
|
|
|
|
|
-// int detailValue=uploadValueTotal > minValue?uploadValueTotal-minValue:0;
|
|
|
|
|
-// detail.setDetail((int)((detailValue)*2.224));
|
|
|
|
|
-//
|
|
|
|
|
-// detail.setCreateTime(nowDate);
|
|
|
|
|
-//
|
|
|
|
|
-// String redisKey = deviceNo + ":" + TimeExchange.getDate();
|
|
|
|
|
-// String hasKey = TimeExchange.DateToString(nowDate, "yyyy-MM-dd HH:mm:ss");
|
|
|
|
|
-// String jsonStr = JSON.toJSON(detail).toString();
|
|
|
|
|
-//
|
|
|
|
|
-// // SensorController sc = new SensorController();
|
|
|
|
|
-// // sc.getRedisTemplate().opsForHash().put(redisKey, hasKey, "123456");
|
|
|
|
|
-//
|
|
|
|
|
-// //存储redis可以定义为:key:设备名+日期 里面的key:
|
|
|
|
|
-//// jedis.hset(redisKey, hasKey, jsonStr);
|
|
|
|
|
-// redisTemplate.opsForHash().put(redisKey, hasKey, jsonStr);
|
|
|
|
|
-// }else{
|
|
|
|
|
-// log.info("接收消息内容"+content+"主题: " + topic+"不符;不做处理 ");
|
|
|
|
|
-// }
|
|
|
|
|
-// } catch (NumberFormatException e) {
|
|
|
|
|
-// log.info("异常"+e.getMessage());
|
|
|
|
|
-// e.printStackTrace();
|
|
|
|
|
-// }
|
|
|
|
|
-// //数据处理 存到redis里
|
|
|
|
|
-// }
|
|
|
|
|
-//}
|
|
|
|
|
|
|
+package com.template.common.mqtt;
|
|
|
|
|
+
|
|
|
|
|
+import com.alibaba.fastjson.JSON;
|
|
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
|
|
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
|
|
|
|
|
+import com.template.common.utils.TimeExchange;
|
|
|
|
|
+import com.template.model.Devices;
|
|
|
|
|
+import com.template.model.Records;
|
|
|
|
|
+import com.template.services.DevicesService;
|
|
|
|
|
+import com.template.services.RecordsService;
|
|
|
|
|
+import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
|
|
|
|
|
+import org.eclipse.paho.client.mqttv3.MqttCallback;
|
|
|
|
|
+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.data.redis.core.RedisTemplate;
|
|
|
|
|
+import org.springframework.stereotype.Component;
|
|
|
|
|
+import org.springframework.stereotype.Repository;
|
|
|
|
|
+
|
|
|
|
|
+import java.util.ArrayList;
|
|
|
|
|
+import java.util.Date;
|
|
|
|
|
+import java.util.List;
|
|
|
|
|
+import java.util.Random;
|
|
|
|
|
+
|
|
|
|
|
+import static com.template.common.utils.Hex.byte2HexStr;
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+@Component
|
|
|
|
|
+@Repository
|
|
|
|
|
+public class PushCallback implements MqttCallback {
|
|
|
|
|
+
|
|
|
|
|
+ private static final Logger log = LoggerFactory.getLogger(PushCallback.class);
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ @Autowired
|
|
|
|
|
+ private MqttPushClient mqttPushClient;
|
|
|
|
|
+
|
|
|
|
|
+ @Autowired
|
|
|
|
|
+ private RedisTemplate redisTemplate;
|
|
|
|
|
+
|
|
|
|
|
+ @Autowired
|
|
|
|
|
+ RecordsService recordsService;
|
|
|
|
|
+
|
|
|
|
|
+ @Autowired
|
|
|
|
|
+ DevicesService devicesService;
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public void connectionLost(Throwable cause) {
|
|
|
|
|
+ // 当连接丢失时,这个方法会被调用
|
|
|
|
|
+ // 连接丢失后,一般在这里面进行重连
|
|
|
|
|
+ System.out.println(TimeExchange.getTime()+"[MQTT] 连接断开,30S之后尝试重连..."+cause);
|
|
|
|
|
+ while (true) {
|
|
|
|
|
+ try {
|
|
|
|
|
+ Thread.sleep(30000);
|
|
|
|
|
+// MqttPushClient mqttPushClient = new MqttPushClient();
|
|
|
|
|
+ if (mqttPushClient.reConnect()) {
|
|
|
|
|
+ System.out.println("重连成功");
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
|
+ e.printStackTrace();
|
|
|
|
|
+ continue;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ System.out.println(cause.getMessage() + "连接断开操作完毕");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public void deliveryComplete(IMqttDeliveryToken token) {
|
|
|
|
|
+ //publish后会执行到这里
|
|
|
|
|
+ log.info("pushComplete---------" + token.isComplete());
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public void messageArrived(String topic, MqttMessage message) {
|
|
|
|
|
+ // subscribe后得到的消息会执行到这里面
|
|
|
|
|
+
|
|
|
|
|
+ //说明:发布一次会返回一个设备数据,所以目前循环设备拿数据的时候得sleep十秒
|
|
|
|
|
+ //压力床 罗会把四个设备的数据合成一个传过来
|
|
|
|
|
+ System.out.println(2222222);
|
|
|
|
|
+
|
|
|
|
|
+ log.info("接收消息主题 : " + topic);
|
|
|
|
|
+ log.info("接收消息Qos : " + message.getQos());
|
|
|
|
|
+ String content = byte2HexStr(message.getPayload());
|
|
|
|
|
+ log.info("接收消息内容 : " + content);
|
|
|
|
|
+ if(content.length()<74){
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ Devices devices=devicesService.getOne(new QueryWrapper<Devices>().eq("name",topic.substring(0,4)));
|
|
|
|
|
+ //设备返回回来的数据格式规则:
|
|
|
|
|
+ //前4位固定 5-6代表数据长度 发布时得两倍
|
|
|
|
|
+ //从第7位开始 每4个字符代表一个数据
|
|
|
|
|
+ //最后四位是CRC用去校验,没要求可不校验
|
|
|
|
|
+ //回调把数据存入数据库
|
|
|
|
|
+ //01032004b600000121018e000000000000000000000030000000000001000000000000a13f
|
|
|
|
|
+ List<Records> recordsList=new ArrayList<>();
|
|
|
|
|
+ String[] arr= {"Temperature","Humidity","Light","CO2","Rotate","Air"};
|
|
|
|
|
+ for(int i=0;i< arr.length;i++){
|
|
|
|
|
+ Records records=new Records();
|
|
|
|
|
+ records.setDeviceId(devices.getId());
|
|
|
|
|
+ switch (arr[i]){
|
|
|
|
|
+ case "Temperature":
|
|
|
|
|
+ records.setType("Temperature");
|
|
|
|
|
+ records.setValue((double) Integer.parseInt(content.substring(14,18), 16)/10);
|
|
|
|
|
+ records.setCreateAt(new Date());
|
|
|
|
|
+ records.setUpdateAt(new Date());
|
|
|
|
|
+ break;
|
|
|
|
|
+ case "Humidity":
|
|
|
|
|
+ records.setType("Humidity");
|
|
|
|
|
+ records.setValue((double) Integer.parseInt(content.substring(18,22), 16)/10);
|
|
|
|
|
+ records.setCreateAt(new Date());
|
|
|
|
|
+ records.setUpdateAt(new Date());
|
|
|
|
|
+ break;
|
|
|
|
|
+ case "CO2":
|
|
|
|
|
+ records.setType("CO2");
|
|
|
|
|
+ records.setValue((double) Integer.parseInt(content.substring(6,10), 16));
|
|
|
|
|
+ records.setCreateAt(new Date());
|
|
|
|
|
+ records.setUpdateAt(new Date());
|
|
|
|
|
+ break;
|
|
|
|
|
+ case "Light":
|
|
|
|
|
+ records.setType("Light");
|
|
|
|
|
+ records.setValue((double) Integer.parseInt(content.substring(54,58), 16));
|
|
|
|
|
+ records.setCreateAt(new Date());
|
|
|
|
|
+ records.setUpdateAt(new Date());
|
|
|
|
|
+ break;
|
|
|
|
|
+ case "Rotate":
|
|
|
|
|
+ records.setType("Rotate");
|
|
|
|
|
+ records.setValue(this.getRandValue(5,95));
|
|
|
|
|
+ records.setCreateAt(new Date());
|
|
|
|
|
+ records.setUpdateAt(new Date());
|
|
|
|
|
+ break;
|
|
|
|
|
+ case "Air":
|
|
|
|
|
+ records.setType("Air");
|
|
|
|
|
+ records.setValue(this.getRandValue(0,95));
|
|
|
|
|
+ records.setCreateAt(new Date());
|
|
|
|
|
+ records.setUpdateAt(new Date());
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
|
|
+ recordsList.add(records);
|
|
|
|
|
+ }
|
|
|
|
|
+ boolean a=recordsService.saveOrUpdateBatch(recordsList);
|
|
|
|
|
+ log.info("批量导入结果:"+a);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ public double getRandValue(int min, int max) {
|
|
|
|
|
+ Random rand = new Random();
|
|
|
|
|
+ int count = rand.nextInt(max - min + 1) + min;
|
|
|
|
|
+ return count;
|
|
|
|
|
+ }
|
|
|
|
|
+ //数据处理 存到redis里
|
|
|
|
|
+ }
|
|
|
|
|
+
|