This commit is contained in:
2024-08-09 09:05:41 +08:00
parent 41f8c873a4
commit 7449efc6a3
12 changed files with 1170 additions and 276 deletions

View File

@@ -9,6 +9,7 @@ import com.huawei.it.eip.ump.client.listener.MessageListener;
import com.huawei.it.eip.ump.common.exception.UmpException;
import com.huawei.it.eip.ump.common.message.Message;
import com.njcn.roma.pojo.MessageBodyDTO;
import com.njcn.roma.server.WebSocketServer;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.*;
@@ -28,6 +29,8 @@ import java.util.Map;
@RequiredArgsConstructor
public class ClientHandler extends Thread {
private final WebSocketServer webSocketServer;
public String topicMsg = "{\"HRPhV_H14_phsC\":\"0.0000\",\"HRPhV_H14_phsB\":\"0.0000\",\"HRPhV_H14_phsA\":\"0.0000\",\"HRPhV_H2_phsB\":\"0.0100\",\"HRPhV_H2_phsA\":\"0.0100\",\"HRPhV_H2_phsC\":\"0.0100\",\"HRPhV_H15_phsA\":\"0.0120\",\"TotW\":\"19771.1367\",\"HRPhV_H15_phsB\":\"0.0120\",\"HRPhV_H15_phsC\":\"0.0120\",\"FreqDev\":\"0.0000\",\"PPV_phsAB\":\"384.0318\",\"A_phsC\":\"60.7116\",\"TotPF\":\"0.4946\",\"A_phsA\":\"60.7123\",\"A_phsB\":\"60.7111\",\"PPV_phsBC\":\"383.3656\",\"HRPhV_H25_phsB\":\"0.0080\",\"HRPhV_H25_phsC\":\"0.0080\",\"HRPhV_H25_phsA\":\"0.0080\",\"DataTag\":\"0\",\"HRPhV_H20_phsA\":\"0.0000\",\"HRPhV_H20_phsB\":\"0.0000\",\"HRPhV_H20_phsC\":\"0.0000\",\"PPV_phsCA\":\"383.3637\",\"HRPhV_H3_phsB\":\"0.0640\",\"HRPhV_H3_phsC\":\"0.0640\",\"HRPhV_H9_phsC\":\"0.0220\",\"ThdPhV_phsA\":\"0.0913\",\"HRPhV_H9_phsB\":\"0.0220\",\"HRPhV_H9_phsA\":\"0.0220\",\"ThdPhV_phsB\":\"0.0913\",\"ThdPhV_phsC\":\"0.0913\",\"HRPhV_H19_phsC\":\"0.0100\",\"HRPhV_H19_phsB\":\"0.0100\",\"HRPhV_H19_phsA\":\"0.0100\",\"HRPhV_H16_phsA\":\"0.0000\",\"HRPhV_H13_phsA\":\"0.0140\",\"HRPhV_H16_phsC\":\"0.0000\",\"HRPhV_H13_phsB\":\"0.0140\",\"HRPhV_H16_phsB\":\"0.0000\",\"TotVA\":\"39977.2305\",\"HRPhV_H13_phsC\":\"0.0140\",\"HRPhV_H6_phsB\":\"0.0026\",\"HRPhV_H3_phsA\":\"0.0640\",\"HRPhV_H6_phsA\":\"0.0026\",\"HRPhV_H10_phsA\":\"0.0026\",\"HRPhV_H10_phsB\":\"0.0026\",\"HRPhV_H6_phsC\":\"0.0026\",\"HRPhV_H10_phsC\":\"0.0026\",\"ImbNgV\":\"0.0012\",\"TotVar\":\"34745.9492\",\"HRPhV_H7_phsC\":\"0.0280\",\"HRPhV_H7_phsB\":\"0.0280\",\"HRPhV_H22_phsC\":\"0.0000\",\"HRPhV_H22_phsB\":\"0.0000\",\"ImbZroV\":\"0.0012\",\"HRPhV_H22_phsA\":\"0.0000\",\"HRPhV_H7_phsA\":\"0.0280\",\"HRPhV_H8_phsA\":\"0.0026\",\"HRPhV_H23_phsB\":\"0.0080\",\"PhV_phsA\":\"221.9935\",\"HRPhV_H8_phsB\":\"0.0026\",\"HRPhV_H23_phsC\":\"0.0080\",\"HRPhV_H8_phsC\":\"0.0026\",\"PhV_phsB\":\"221.9947\",\"PhV_phsC\":\"221.9979\",\"HRPhV_H23_phsA\":\"0.0080\",\"PstPhV_phsC\":\"3.2942\",\"PstPhV_phsA\":\"3.3086\",\"PstPhV_phsB\":\"3.2987\",\"Freq\":\"50.0000\",\"HRPhV_H11_phsA\":\"0.0180\",\"HRPhV_H11_phsB\":\"0.0180\",\"HRPhV_H17_phsC\":\"0.0100\",\"HRPhV_H11_phsC\":\"0.0180\",\"HRPhV_H17_phsB\":\"0.0100\",\"HRPhV_H17_phsA\":\"0.0100\",\"SeqV_C2\":\"0.0715\",\"HRPhV_H4_phsB\":\"0.0050\",\"SeqV_C1\":\"60.4601\",\"HRPhV_H4_phsA\":\"0.0050\",\"SeqV_C0\":\"0.0714\",\"PhVDev_phsC\":\"0.0119\",\"HRPhV_H5_phsA\":\"0.0400\",\"HRPhV_H5_phsB\":\"0.0400\",\"HRPhV_H5_phsC\":\"0.0400\",\"PhVDev_phsB\":\"0.0119\",\"HRPhV_H12_phsC\":\"0.0010\",\"PltPhV_phsA\":\"0.0000\",\"PhVDev_phsA\":\"0.0119\",\"HRPhV_H12_phsB\":\"0.0010\",\"HRPhV_H4_phsC\":\"0.0050\",\"HRPhV_H18_phsB\":\"0.0000\",\"HRPhV_H18_phsC\":\"0.0000\",\"HRPhV_H12_phsA\":\"0.0010\",\"HRPhV_H18_phsA\":\"0.0000\",\"HFundPhV_phsC\":\"220.8052\",\"HRPhV_H21_phsC\":\"0.0080\",\"HRPhV_H21_phsB\":\"0.0080\",\"HRPhV_H24_phsC\":\"0.0000\",\"HFundPhV_phsA\":\"220.8056\",\"HRPhV_H21_phsA\":\"0.0080\",\"HFundPhV_phsB\":\"220.8055\",\"HRPhV_H24_phsB\":\"0.0000\",\"PltPhV_phsC\":\"0.0000\",\"HRPhV_H24_phsA\":\"0.0000\",\"PltPhV_phsB\":\"0.0000\",\"time\":\"20240704T152745Z\"}";
@@ -37,8 +40,8 @@ public class ClientHandler extends Thread {
private Consumer consumer;
@GetMapping("message")
private Map<String,String> message() {
Map<String,String> map = JSONObject.parseObject(topicMsg, Map.class);
private JSONObject message() {
JSONObject map = JSONObject.parseObject(topicMsg);
map.put("customDevId",devId);
return map;
}
@@ -62,9 +65,11 @@ public class ClientHandler extends Thread {
try {
System.out.println("收到新的一轮数据:******************");
topicMsg = new String(message.getBody(), "UTF-8");
System.out.println("装置信息:========="+message.getProperties());
devId = message.getProperties().get("deviceId")+"#"+message.getProperties().get("deviceIdentifier");
devId = message.getProperties().get("deviceIdentifier");
System.out.println("Receive>>>>>>>>>>>>: " + topicMsg);
JSONObject jsonObject = JSONObject.parseObject(topicMsg);
jsonObject.put("customDevId",devId);
webSocketServer.sendSocketMessageToAll(jsonObject.toJSONString());
} catch (Exception e) {
System.out.println("帮忙拍个照这个是接收消息的报错------------------------------------------------------------");
e.printStackTrace();

View File

@@ -0,0 +1,17 @@
package com.njcn.roma.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;
@Configuration
public class WebSocketConfig {
/**
* 用于扫描和注册所有携带ServerEndPoint注解的实例。
*/
@Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}
}

View File

@@ -1,15 +1,19 @@
package com.njcn.roma.controller;
import com.alibaba.fastjson.JSONObject;
import com.huawei.it.eip.ump.client.producer.Producer;
import com.huawei.it.eip.ump.client.producer.SendResult;
import com.huawei.it.eip.ump.common.exception.UmpException;
import com.huawei.it.eip.ump.common.message.Message;
import com.njcn.roma.client.ClientHandler;
import com.njcn.roma.server.WebSocketServer;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.io.UnsupportedEncodingException;
import java.util.Map;
import java.util.Random;
/**
* roma
@@ -23,6 +27,8 @@ public class TestController {
private final ClientHandler clientHandler;
private final WebSocketServer webSocketServer;
@GetMapping("send")
@@ -94,4 +100,72 @@ public class TestController {
return clientHandler.topicMsg +" >>>>>>> "+ clientHandler.devId;
}
@GetMapping("simulationWebSocket")
public String simulationWebSocket() {
clientHandler.devId = "NJCN230497";
// 浮动范围比如我们希望数值在原始值的基础上最多变化10%
double fluctuationRange = 0.10;
// 创建Random实例
Random random = new Random();
for(int i=0;i<300;i++){
JSONObject map = JSONObject.parseObject(clientHandler.topicMsg);
map.put("customDevId",clientHandler.devId);
double vA = Double.valueOf(map.get("PhV_phsA").toString());
double vB = Double.valueOf(map.get("PhV_phsB").toString());
double vC = Double.valueOf(map.get("PhV_phsC").toString());
// 生成浮动值
// 注意因为我们要的是百分比所以我们将fluctuationRange乘以originalValue得到最大浮动的绝对值
double fluctuationA = (random.nextDouble() * 2 - 1) * (fluctuationRange * vA);
// 计算新的数值
double newValueA = vA + fluctuationA;
double fluctuationB = (random.nextDouble() * 2 - 1) * (fluctuationRange * vB);
// 计算新的数值
double newValueB = vA + fluctuationB;
double fluctuationC = (random.nextDouble() * 2 - 1) * (fluctuationRange * vC);
// 计算新的数值
double newValueC = vC + fluctuationC;
map.put("PhV_phsA",String.valueOf(newValueA));
map.put("PhV_phsB",String.valueOf(newValueB));
map.put("PhV_phsC",String.valueOf(newValueC));
double iA = Double.valueOf(map.get("A_phsA").toString());
double iB = Double.valueOf(map.get("A_phsB").toString());
double iC = Double.valueOf(map.get("A_phsC").toString());
// 生成浮动值
// 注意因为我们要的是百分比所以我们将fluctuationRange乘以originalValue得到最大浮动的绝对值
double fluctuationIA = (random.nextDouble() * 2 - 1) * (fluctuationRange * vA);
// 计算新的数值
double newValueIA = iA + fluctuationIA;
double fluctuationIB = (random.nextDouble() * 2 - 1) * (fluctuationRange * iB);
// 计算新的数值
double newValueIB = iA + fluctuationIB;
double fluctuationIC = (random.nextDouble() * 2 - 1) * (fluctuationRange * iC);
// 计算新的数值
double newValueIC = iC + fluctuationIC;
map.put("A_phsA",String.valueOf(newValueIA));
map.put("A_phsB",String.valueOf(newValueIB));
map.put("A_phsC",String.valueOf(newValueIC));
webSocketServer.sendSocketMessageToAll(map.toJSONString());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
return "推送成功";
}
}

View File

@@ -0,0 +1,13 @@
package com.njcn.roma.pojo.websocket;
import lombok.Data;
@Data
public class SocketMessage {
private Integer type;
private Object body;
}

View File

@@ -0,0 +1,67 @@
package com.njcn.roma.server;
import org.springframework.stereotype.Component;
import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@Component
@ServerEndpoint("/socket")
public class WebSocketServer {
/**
* 全部在线会话 PS: 基于场景考虑 这里使用线程安全的Map存储会话对象。
*/
private static Map<String, Session> onlineSessions = new ConcurrentHashMap<>();
/**
* 当客户端打开连接1.添加会话对象 2.更新在线人数
*/
@OnOpen
public void onOpen(Session session) {
onlineSessions.put(session.getId(), session);
System.out.println("websocket客户端"+session.getId()+"连接");
}
/**
* 当客户端发送消息1.获取它的用户名和消息 2.发送消息给所有人
* <p>
* PS: 这里约定传递的消息为JSON字符串 方便传递更多参数!
*/
@OnMessage
public void onSocketMessage(Session session, String jsonStr) {
}
/**
* 当关闭连接1.移除会话对象 2.更新在线人数
*/
@OnClose
public void onClose(Session session) {
onlineSessions.remove(session.getId());
System.out.println("websocket客户端"+session.getId()+"断开连接");
}
/**
* 当通信发生异常:打印错误日志
*/
@OnError
public void onError(Session session, Throwable error) {
error.printStackTrace();
}
/**
* 公共方法:发送信息给所有人
*/
public void sendSocketMessageToAll(String msg) {
onlineSessions.forEach((id, session) -> {
try {
session.getBasicRemote().sendText(msg);
} catch (IOException e) {
e.printStackTrace();
}
});
}
}