From 14e69dcc83fcd1ebeefe1aaa7ccf485503a27e21 Mon Sep 17 00:00:00 2001 From: kaiyu <404897439@qq.com> Date: Fri, 25 Sep 2020 16:51:01 +0800 Subject: [PATCH] BS获取风向以及站点信息Webscoket接口 --- src/main/java/com/moral/controller/WebController.java | 58 ----------- src/main/java/com/moral/webSocketServer/BSWebsocketServer.java | 159 +++++++++++++++++++++++++++++++ src/main/java/com/moral/config/WebSocketConfig.java | 11 + src/main/java/com/moral/common/bean/ResultBean.java | 1 src/main/java/com/moral/webSocketServer/WebSocketServerNew.java | 3 src/main/java/com/moral/webSocketServer/WebSocketServer.java | 4 src/main/java/com/moral/controller/ScreenController.java | 1 src/main/java/com/moral/util/RabbitMQUtils.java | 47 +++++++++ 8 files changed, 223 insertions(+), 61 deletions(-) diff --git a/src/main/java/com/moral/common/bean/ResultBean.java b/src/main/java/com/moral/common/bean/ResultBean.java index 848cf76..d4391f4 100644 --- a/src/main/java/com/moral/common/bean/ResultBean.java +++ b/src/main/java/com/moral/common/bean/ResultBean.java @@ -32,6 +32,7 @@ this.message = e.toString(); this.code = FAIL; this.errno = 1; + } public ResultBean(T data) { diff --git a/src/main/java/com/moral/config/WebSocketConfig.java b/src/main/java/com/moral/config/WebSocketConfig.java index d102224..565181b 100644 --- a/src/main/java/com/moral/config/WebSocketConfig.java +++ b/src/main/java/com/moral/config/WebSocketConfig.java @@ -1,6 +1,8 @@ package com.moral.config; import com.moral.service.DeviceService; +import com.moral.service.SensorService; +import com.moral.webSocketServer.BSWebsocketServer; import com.moral.webSocketServer.WebSocketServer; import com.moral.webSocketServer.WebSocketServerNew; @@ -15,10 +17,10 @@ public class WebSocketConfig { //��������������������������������� - /*@Bean + @Bean public ServerEndpointExporter serverEndpointExporter() { return new ServerEndpointExporter(); - }*/ + } @Bean public MessageConverter jsonMessageConverter() { @@ -29,6 +31,11 @@ public void setMessageService(DeviceService deviceService){ WebSocketServer.deviceService=deviceService; WebSocketServerNew.deviceService=deviceService; + BSWebsocketServer.deviceService=deviceService; + } + @Autowired + public void setSensorService( SensorService sensorService){ + BSWebsocketServer.sensorService=sensorService; } } diff --git a/src/main/java/com/moral/controller/ScreenController.java b/src/main/java/com/moral/controller/ScreenController.java index 677a1a8..8ecf130 100644 --- a/src/main/java/com/moral/controller/ScreenController.java +++ b/src/main/java/com/moral/controller/ScreenController.java @@ -1614,6 +1614,7 @@ @RequestMapping(value = "/newMap-page", method = RequestMethod.GET) public ModelAndView newMap(ModelAndView model, @RequestParam("areaCode") long code, @RequestParam("accountId") int accountId) { + Account account = accountService.getAccountById(accountId); List<MonitorPoint> monitorPointList = monitorPointService.getMonitorPointListByAccountId(accountId); String regionName = areaService.queryFullNameByCode(code); diff --git a/src/main/java/com/moral/controller/WebController.java b/src/main/java/com/moral/controller/WebController.java index 5fef648..c031c2a 100644 --- a/src/main/java/com/moral/controller/WebController.java +++ b/src/main/java/com/moral/controller/WebController.java @@ -136,64 +136,6 @@ return resultMap; } - //������ - @UserLoginToken - @RequestMapping("getAccountInfoTest") - public Map<String, Object> getAccountInfoTest(@RequestBody Map<String, Object> parameters) { - Map<String, Object> resultMap = new HashMap<String, Object>(); - System.out.println(parameters); - if (!(parameters.containsKey("account") && parameters.containsKey("password"))) { - resultMap.put("msg", "������������������������������������"); - resultMap.put("accountId", -1); - } else { - resultMap = accountService.screenLoginNew(parameters); - // ������������������������������������������ - Object orgId = resultMap.get("orgId"); - if (resultMap.get("orgId") != null && resultMap.get("orgId") instanceof Integer) { - StringBuilder areaNamesBuilder = new StringBuilder("������"); - //��������������������������������� - if (!((Integer) orgId).equals(dictionaryDataService.querySupperOrgId())) { - //��������������������������������������������������� - Organization organization = organizationService.getOrganizationById((Integer) orgId); - if (organization.getAreaNames() != null) { - Map<String, String> areaNameMap = BeanUtils.beanToMap(organization.getAreaNames()); - List<String> names = areaNameMap.entrySet().stream().filter(item -> { - return item.getValue() != null; - }).map(item -> { - return item.getValue(); - }).collect(Collectors.toList()); - AreaNames areaNames = organization.getAreaNames(); - areaNamesBuilder.append("/"); - areaNamesBuilder.append(String.join("/", names)); - } - // ������������ - if (organization.getRank() != null && organization.getRank() == 0) { - resultMap.put("type", "enterprise"); - } else { - resultMap.put("type", "government"); - } - Number mapAreaCode = null; - if (organization.getVillageCode() != null) { - mapAreaCode = organization.getVillageCode(); - } else if (organization.getTownCode() != null) { - mapAreaCode = organization.getTownCode(); - } else if (organization.getAreaCode() != null) { - mapAreaCode = organization.getAreaCode(); - } else if (organization.getCityCode() != null) { - mapAreaCode = organization.getCityCode(); - } else if (organization.getProvinceCode() != null) { - mapAreaCode = organization.getProvinceCode(); - } - resultMap.put("mapAreaCode", mapAreaCode.toString()); - } - resultMap.put("mapPath", areaNamesBuilder.toString()); - String accountId = String.valueOf(resultMap.get("accountId")); - resultMap.put("token", webTokenService.getToken(accountId)); - } - } - return resultMap; - } - @UserLoginToken @GetMapping("report_avg_datas") diff --git a/src/main/java/com/moral/util/RabbitMQUtils.java b/src/main/java/com/moral/util/RabbitMQUtils.java new file mode 100644 index 0000000..ab031ec --- /dev/null +++ b/src/main/java/com/moral/util/RabbitMQUtils.java @@ -0,0 +1,47 @@ +package com.moral.util; + +import com.rabbitmq.client.Channel; +import com.rabbitmq.client.Connection; +import com.rabbitmq.client.ConnectionFactory; + +public class RabbitMQUtils { + private static ConnectionFactory factory ; + + static{ + factory = new ConnectionFactory(); + factory.setHost("47.96.15.25");//������������������ + factory.setPort(5672);//������������ + factory.setUsername("guest"); + factory.setPassword("guest_pass"); + factory.setVirtualHost("/");//������������������ + } + + public static Connection getConnection(){ + try{ + return factory.newConnection(); + }catch (Exception e){ + e.printStackTrace(); + } + return null; + } + + public static void closeConnectionChannel(Connection connection, Channel channel){ + try{ + if(channel!=null) + channel.close(); + if(connection!=null) + connection.close(); + }catch (Exception e){ + e.printStackTrace(); + } + } + + public static void closeChannel( Channel channel){ + try{ + if(channel!=null) + channel.close(); + }catch (Exception e){ + e.printStackTrace(); + } + } +} diff --git a/src/main/java/com/moral/webSocketServer/BSWebsocketServer.java b/src/main/java/com/moral/webSocketServer/BSWebsocketServer.java new file mode 100644 index 0000000..acd222b --- /dev/null +++ b/src/main/java/com/moral/webSocketServer/BSWebsocketServer.java @@ -0,0 +1,159 @@ +package com.moral.webSocketServer; + +import com.alibaba.fastjson.JSON; +import com.moral.common.util.ParameterUtils; +import com.moral.entity.Device; +import com.moral.entity.Sensor; +import com.moral.service.DeviceService; +import com.moral.service.SensorService; +import com.rabbitmq.client.*; +import com.moral.util.RabbitMQUtils; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; + +import javax.annotation.PostConstruct; +import javax.websocket.*; +import javax.websocket.server.PathParam; +import javax.websocket.server.ServerEndpoint; +import java.io.IOException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +@Slf4j +@ServerEndpoint("/web/webSocket/{param}") +@Component +public class BSWebsocketServer { + + public static DeviceService deviceService; + + public static SensorService sensorService; + + /** + * concurrent������������������Set���������������������������������������MyWebSocket��������� + */ + private static ConcurrentHashMap<String, BSWebsocketServer> webSocketMap = new ConcurrentHashMap<>(); + /** + * ������������������������������������������������������������������������������ + */ + private Session session; + + private String orgId; + + private String accountId; + + private String regionCode; + + + private final String exchange = "screens_data"; + + private static Map<String, Sensor> sensors; + + + @PostConstruct + public void init() { + sensors = new HashMap<>(); + List<Sensor> allSensors = sensorService.getAllSensors(); + for (Sensor sensor : allSensors) { + sensors.put(sensor.getSensorKey(), sensor); + } + } + + /** + * ��������������������������������� + */ + @OnOpen + public void onOpen(Session session, @PathParam("param") String param) { + this.session = session; + String[] params = param.split("&"); + this.orgId = params[1]; + this.accountId = params[0]; + this.regionCode = params[2]; + + if (webSocketMap.containsKey(accountId)) { + webSocketMap.remove(accountId); + webSocketMap.put(accountId, this); + } else { + webSocketMap.put(accountId, this); + } + + Map<String, Object> paramMap = new HashMap<String, Object>(); + paramMap.put("orgId", orgId); + paramMap.put("regionCode", regionCode); + ParameterUtils.getRegionType4RegionCode(paramMap); + List<Device> deviceList = deviceService.queryDevice(paramMap); + + try { + Connection connection = RabbitMQUtils.getConnection(); + final Channel channel = connection.createChannel(); + //������������������ + String queue = channel.queueDeclare().getQueue(); + + //������������������������routingKey������������ + String routingKey = ""; + for (Device d : deviceList) { + routingKey = orgId + "." + d.getMac(); + channel.queueBind(queue, exchange, routingKey); + } + + //������������,��������������������� + channel.basicConsume(queue, false, new DefaultConsumer(channel) { + @Override + public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException { + Map message = (Map) JSON.parse((String) JSON.parse(new String(body))); + message = messageFormat(message); + sendMessage(JSON.toJSONString(message)); + channel.basicAck(envelope.getDeliveryTag(), false); + } + }); + } catch (IOException e) { + e.printStackTrace(); + } + + } + + @OnClose + public void onClose() { + if (webSocketMap.containsKey(accountId)) { + webSocketMap.remove(accountId); + } + } + + //������������������������������ + @OnMessage + public void onMessage(String message, Session session) { + + } + + @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()); + } + } + + //���MQ������������������������������������ + private Map<String,Object> messageFormat( Map<String,Object> param) { + Map<String, Object> map = new HashMap<>(); + param.forEach((key, value) -> { ; + Sensor sensor = sensors.get(key); + if (!ObjectUtils.isEmpty(sensor)) { + String unit = ObjectUtils.isEmpty(sensor.getUnit())?"":(String)sensor.getUnit(); + map.put(sensor.getName(),value+unit); + } + }); + map.put("mac",param.get("mac")); + return map; + } + +} diff --git a/src/main/java/com/moral/webSocketServer/WebSocketServer.java b/src/main/java/com/moral/webSocketServer/WebSocketServer.java index 4cc76b6..25ee014 100644 --- a/src/main/java/com/moral/webSocketServer/WebSocketServer.java +++ b/src/main/java/com/moral/webSocketServer/WebSocketServer.java @@ -62,17 +62,21 @@ this.session = session; //������������������������������������������������ webSocketSet.add(this); + int flag = param.indexOf("&"); int regionCodeIndex = param.indexOf("_"); orgId = param.substring(0, flag); accountId = param.substring(flag + 1,regionCodeIndex); regionCode = param.substring(regionCodeIndex + 1); String QUEUE_NAME = "deviceInfo_" + accountId; + Map<String, Object> paramMap = new HashMap<String, Object>(); paramMap.put("orgId", orgId); paramMap.put("regionCode", regionCode); ParameterUtils.getRegionType4RegionCode(paramMap); List<Device> deviceList = deviceService.queryDevice(paramMap); + + try { //������������������������������������������������ ConnectionFactory factory = new ConnectionFactory(); diff --git a/src/main/java/com/moral/webSocketServer/WebSocketServerNew.java b/src/main/java/com/moral/webSocketServer/WebSocketServerNew.java index deac7a4..1b6f298 100644 --- a/src/main/java/com/moral/webSocketServer/WebSocketServerNew.java +++ b/src/main/java/com/moral/webSocketServer/WebSocketServerNew.java @@ -52,12 +52,13 @@ this.session = session; //������������������������������������������������ webSocketSet.add(this); + //������ String[] flag=param.split("&"); - String orgId = flag[0]; String accountId = flag[1]; String monitPointId = flag[2]; String p=flag[3]; + String QUEUE_NAME = "deviceData_" + accountId; Map<String, Object> paramMap = new HashMap<String, Object>(); List<Device> deviceList = deviceService.getDeviceById2(Integer.parseInt(monitPointId)); -- Gitblit v1.8.0