package cn.org.hentai.jtt1078.websocket; import cn.org.hentai.jtt1078.entity.enums.ProtocolVersion; import cn.org.hentai.jtt1078.server.audio.Jt1078AudioSenderService; import org.springframework.stereotype.Component; import org.springframework.web.socket.BinaryMessage; import org.springframework.web.socket.CloseStatus; import org.springframework.web.socket.TextMessage; import org.springframework.web.socket.WebSocketSession; import org.springframework.web.socket.handler.AbstractWebSocketHandler; import java.io.IOException; import java.nio.ByteBuffer; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.CopyOnWriteArrayList; @Component public class MyWebSocketHandler extends AbstractWebSocketHandler { private static final Map> simSessionMap = new ConcurrentHashMap<>(); @Override protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception { System.out.println("Received text: " + message.getPayload()); session.sendMessage(new TextMessage("Echo: " + message.getPayload())); } @Override protected void handleBinaryMessage(WebSocketSession session, BinaryMessage message) { String sim = (String) session.getAttributes().get("sim"); ByteBuffer payload = message.getPayload(); // System.out.println("Received binary message, size: " + payload.remaining()); ProtocolVersion protocolVersion = getProtocolVersion(sim); // 这里处理二进制数据 Jt1078AudioSenderService.sendAudio(sim, 1, payload.array(), protocolVersion); } //根据sim卡长度判断协议版本 private ProtocolVersion getProtocolVersion(String sim) { ProtocolVersion version; if (sim != null && sim.length() == 20) { // 10字节BCD编码 → 20位字符串 version = ProtocolVersion.V2019; } else if (sim != null && sim.length() == 12) { // 6字节BCD编码 → 12位字符串 version = ProtocolVersion.V2013; } else { version = ProtocolVersion.UNKNOWN; // 无法判断 System.err.println("Invalid SIM length, unable to determine JT1078 version"); } return version; } @Override public void afterConnectionEstablished(WebSocketSession session) throws Exception { System.out.println("Connected: " + session.getId()); String sim = (String) session.getAttributes().get("sim"); simSessionMap.computeIfAbsent(sim, k -> new CopyOnWriteArrayList<>()).add(session); System.out.println("绑定SIM: " + sim + " -> " + session.getId()); } @Override public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception { System.out.println("Disconnected: " + session.getId()); simSessionMap.values().forEach(list -> list.remove(session)); } // 给对应 SIM 的所有连接广播音频数据(G.711A原始帧) public static void sendAudioToSim(String sim, byte[] audioData) { List sessions = simSessionMap.get(sim); if (sessions != null) { for (WebSocketSession s : sessions) { if (s.isOpen()) { try { s.sendMessage(new BinaryMessage(audioData)); } catch (IOException e) { System.out.println("发送音频数据失败: " + e.getMessage()); } } } } } }