From 782e84d68779471c0640584678d4c4df3afa80a2 Mon Sep 17 00:00:00 2001 From: 于紫祥_1901 <email@yuzixiang_1910> Date: Mon, 14 Dec 2020 17:29:08 +0800 Subject: [PATCH] 电子屏 --- src/main/java/com/moral/service/DeviceService.java | 3 src/main/resources/mapper/DeviceMapper.xml | 6 + src/main/java/com/moral/config/WebSocketConfig.java | 11 + src/main/java/com/moral/mapper/DeviceMapper.java | 2 src/main/java/com/moral/controller/ScreenController.java | 7 + src/main/java/com/moral/service/impl/DeviceServiceImpl.java | 5 + src/main/java/com/moral/webSocketServer/ElectronicSWebSocketServer.java | 224 ++++++++++++++++++++++++++++++++++++++++++++ 7 files changed, 253 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/moral/config/WebSocketConfig.java b/src/main/java/com/moral/config/WebSocketConfig.java index df8b756..80c4225 100644 --- a/src/main/java/com/moral/config/WebSocketConfig.java +++ b/src/main/java/com/moral/config/WebSocketConfig.java @@ -1,12 +1,10 @@ package com.moral.config; +import com.moral.service.AccountService; import com.moral.service.DeviceService; import com.moral.service.SensorService; -import com.moral.webSocketServer.BSAQIWebSocketServer; -import com.moral.webSocketServer.BSWebsocketServer; -import com.moral.webSocketServer.WebSocketServer; +import com.moral.webSocketServer.*; -import com.moral.webSocketServer.WebSocketServerNew; import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter; import org.springframework.amqp.support.converter.MessageConverter; import org.springframework.beans.factory.annotation.Autowired; @@ -36,9 +34,14 @@ BSAQIWebSocketServer.deviceService=deviceService; } @Autowired + public void setMessageService(AccountService accountService){ + ElectronicSWebSocketServer.accountService=accountService; + } + @Autowired public void setSensorService( SensorService sensorService){ BSWebsocketServer.sensorService=sensorService; BSAQIWebSocketServer.sensorService=sensorService; + ElectronicSWebSocketServer.sensorService=sensorService; } } diff --git a/src/main/java/com/moral/controller/ScreenController.java b/src/main/java/com/moral/controller/ScreenController.java index 65924e7..34b7118 100644 --- a/src/main/java/com/moral/controller/ScreenController.java +++ b/src/main/java/com/moral/controller/ScreenController.java @@ -2987,4 +2987,11 @@ } return new ResultBean<List<Map<String,Object>>>(rList); } + + @PostMapping("byAccountGetDevices") + public List<Device> byAccountGetDevices(@RequestBody Map<String, Object> parameters) { + String id =parameters.get("id").toString(); + List<Device> devicesList = deviceService.getDevicesByAccountId(id); + return devicesList; + } } \ No newline at end of file diff --git a/src/main/java/com/moral/mapper/DeviceMapper.java b/src/main/java/com/moral/mapper/DeviceMapper.java index a30d2e1..4cedb72 100644 --- a/src/main/java/com/moral/mapper/DeviceMapper.java +++ b/src/main/java/com/moral/mapper/DeviceMapper.java @@ -95,5 +95,5 @@ List<Device> getDeviceByCityCode(); - + List<Device> getDevicesByAccountId(String id); } \ No newline at end of file diff --git a/src/main/java/com/moral/service/DeviceService.java b/src/main/java/com/moral/service/DeviceService.java index 0789f53..28038d1 100644 --- a/src/main/java/com/moral/service/DeviceService.java +++ b/src/main/java/com/moral/service/DeviceService.java @@ -90,4 +90,7 @@ List<Device> getDevice(String macOrName); List<Device> getDeviceByCode(); + + List<Device> getDevicesByAccountId(String id); + } diff --git a/src/main/java/com/moral/service/impl/DeviceServiceImpl.java b/src/main/java/com/moral/service/impl/DeviceServiceImpl.java index f7168de..2a020ef 100644 --- a/src/main/java/com/moral/service/impl/DeviceServiceImpl.java +++ b/src/main/java/com/moral/service/impl/DeviceServiceImpl.java @@ -1130,4 +1130,9 @@ return deviceMapper.getDeviceByCityCode(); } + @Override + public List<Device> getDevicesByAccountId(String id) { + return deviceMapper.getDevicesByAccountId(id); + } + } diff --git a/src/main/java/com/moral/webSocketServer/ElectronicSWebSocketServer.java b/src/main/java/com/moral/webSocketServer/ElectronicSWebSocketServer.java new file mode 100644 index 0000000..75e24cb --- /dev/null +++ b/src/main/java/com/moral/webSocketServer/ElectronicSWebSocketServer.java @@ -0,0 +1,224 @@ +package com.moral.webSocketServer; + +import com.alibaba.fastjson.JSON; +import com.moral.entity.Account; +import com.moral.entity.Device; +import com.moral.entity.Sensor; +import com.moral.service.AccountService; +import com.moral.service.DeviceService; +import com.moral.service.SensorService; +import com.moral.util.RabbitMQUtils; +import com.rabbitmq.client.*; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; +import org.springframework.web.bind.annotation.CrossOrigin; + +import javax.annotation.PostConstruct; +import javax.annotation.Resource; +import javax.websocket.*; +import javax.websocket.server.PathParam; +import javax.websocket.server.ServerEndpoint; +import java.io.IOException; +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.CopyOnWriteArraySet; +import java.util.concurrent.TimeoutException; + +@Slf4j +@ServerEndpoint("/web/ESWebSocket/{param}") +@Component +public class ElectronicSWebSocketServer { + + public static AccountService accountService; + + public static SensorService sensorService; + + /** + * concurrent������������������Set���������������������������������������WebSocket��������� + */ + public static CopyOnWriteArraySet<ElectronicSWebSocketServer> webSocketSet = new CopyOnWriteArraySet<ElectronicSWebSocketServer>(); + + /** + * ������������������������������������������������������������������������������ + */ + private Session session; + + private String orgId; + private String accountId; + private String mac; + + private final String exchange = "screens_data"; + Connection connection; + Channel channel; + + @OnOpen + public void onOpen(Session session, @PathParam("param") String param) { + + this.session = session; + webSocketSet.add(this); + String[] params = param.split("&"); + this.accountId = params[0]; + Map<String, Object> organizationIdByAccountId = accountService.getOrganizationIdByAccountId(this.accountId); + this.mac = params[1]; + this.orgId = organizationIdByAccountId.get("organization_id").toString(); + try { + connection = RabbitMQUtils.getConnection(); + channel = connection.createChannel(); + + //������������������ + String queue = channel.queueDeclare().getQueue(); + //������������������������routingKey������������ + String routingKey = ""; + routingKey = this.orgId + "." + this.mac; + channel.queueBind(queue, exchange, routingKey); + //������������,��������������������� + channel.basicQos(30);//��������������� + channel.basicConsume(queue, false, new DefaultConsumer(channel) { + @Override + public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException { + //������MQ������������������������������������������������������������ + Map<String,Object> message = (Map) JSON.parse((String) JSON.parse(new String(body))); + Map<Integer,Object> sortMap = new HashMap<>(); + message.forEach((key,value)->{ + SensorSortEnum sensorSortEnum = SensorSortEnum.valueOf(key); + Map newMap = new HashMap(); + newMap.put(key,value); + sortMap.put(sensorSortEnum.getSensorSort(),newMap); + }); + + Set<Map.Entry<Integer, Object>> entries = sortMap.entrySet(); + List<Map.Entry<Integer, Object>> list = new ArrayList<>(); + list.addAll(entries); + Collections.sort(list, new Comparator<Map.Entry<Integer, Object>>() { + @Override + public int compare(Map.Entry<Integer, Object> o1, Map.Entry<Integer, Object> o2) { + return o1.getKey()-o2.getKey(); + } + }); + + Map<String,Object> resultMap = new LinkedHashMap<>(); + for (Map.Entry<Integer, Object> entry : list) { + Map<String,Object> linkedMap = (Map<String, Object>) entry.getValue(); + linkedMap.forEach((key,value)->{ + resultMap.put(SensorSortEnum.valueOf(key).getSensorName(),value); + }); + } + Map<String,Object> reMap = new LinkedHashMap<>(); + List<Sensor> allSensors = sensorService.getAllSensors(); + for (int i = 0; i <resultMap.keySet().size() ; i++) { + for (Sensor sensor : allSensors) { + if (Arrays.asList(resultMap.keySet().toArray(new String[resultMap.keySet().size()])).get(i).equals(sensor.getSensorKey())){ + String value = resultMap.get(Arrays.asList(resultMap.keySet().toArray(new String[resultMap.keySet().size()])).get(i)).toString(); + /* String e = Arrays.asList(resultMap.keySet().toArray(new String[resultMap.keySet().size()])).get(i); + resultMap.remove(e);*/ + reMap.put(sensor.getName(), value+sensor.getUnit()); + break; + }else { + continue; + } + } + } + reMap.put("time",resultMap.get("time")); + + sendMessage(JSON.toJSONString(reMap)); + //������������ + channel.basicAck(envelope.getDeliveryTag(), true); + //������socket������������������ + } + }); + } catch (IOException e) { + e.printStackTrace(); + } + } + + @OnClose + public void onClose() { + webSocketSet.remove(this); // ���set��������� + try { + channel.close(); + connection.close(); + } catch (IOException e) { + e.printStackTrace(); + } catch ( + TimeoutException e) { + e.printStackTrace(); + } + } + + //������������������������������ + @OnMessage + public void onMessage(String message, Session session) { + + } + //��������������������������������������� + + enum SensorSortEnum { + e1(1,"e1"), + e20(2,"e20"), + e7(3,"e7"), + e2(4,"e2"), + e17(5,"e17"), + e6(6,"e6"), + e15(7,"e15"), + e27(8,"e27"), + e18(9,"e18"), + e11(10,"e11"), + e21(11,"e21"), + e23(12,"e23"), + e10(13,"e10"), + e25(14,"e25"), + e28(15,"e28"), + e16(16,"e16"), + e26(17,"e26"), + e12(18,"e12"), + e5(19,"e5"), + e3(20,"e3"), + e13(21,"e13"), + e9(22,"e9"), + e4(23,"e4"), + e51(24,"e51"), + mac(100,"mac"), + ver(101,"ver"), + time(102,"time"), + e8(14,"e8"), + e94(94,"e94"), + e92(92,"e92"), + e40(40,"e40"), + e93(93,"e93"); + + private final Integer sensorSort; + private final String sensorName; + + SensorSortEnum(Integer sensorSort, String sensorName) { + this.sensorSort = sensorSort; + this.sensorName = sensorName; + } + + public Integer getSensorSort() { + return sensorSort; + } + + public String getSensorName() { + return sensorName; + } + } + + @OnError + public void onError(Session session, Throwable error) { + log.error(error.getMessage()); + } + + public void sendMessage(String message) throws IOException { + try { + if (session.isOpen()) { + this.session.getBasicRemote().sendText(message); + } + } catch (IOException e) { + + //log.error(e.getMessage()); + } + } + + +} diff --git a/src/main/resources/mapper/DeviceMapper.xml b/src/main/resources/mapper/DeviceMapper.xml index cbdd370..33cac0c 100644 --- a/src/main/resources/mapper/DeviceMapper.xml +++ b/src/main/resources/mapper/DeviceMapper.xml @@ -577,4 +577,10 @@ <select id="getDeviceByCityCode" resultType="com.moral.entity.Device"> SELECT d.* FROM `monitor_point` mt,device d where d.monitor_point_id=mt.id and d.state!=4 and mt.city_code=130900 </select> + <select id="getDevicesByAccountId" resultType="com.moral.entity.Device"> + select d.* from monitor_point as m,device as d +where d.monitor_point_id=m.id and d.monitor_point_id in +(select m.id from organization as o,monitor_point as m where o.id = m.organization_id and o.id = +(select o.id FROM account as a,organization as o where a.organization_id = o.id and a.id = #{id})) and d.is_delete !=1 + </select> </mapper> \ No newline at end of file -- Gitblit v1.8.0