package org.yzh.client; import io.github.yezhihao.netmc.util.Client; import io.github.yezhihao.netmc.util.Stopwatch; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import io.netty.buffer.Unpooled; import org.yzh.QuickStart; import org.yzh.commons.util.StrUtils; import org.yzh.protocol.basics.JTMessage; import org.yzh.protocol.codec.JTMessageEncoder; import org.yzh.protocol.commons.JT808; import org.yzh.protocol.t808.T0100; import org.yzh.protocol.t808.T0200; import org.yzh.protocol.t808.T0801; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.nio.channels.FileChannel; import java.nio.charset.StandardCharsets; import java.time.LocalDateTime; import java.util.Arrays; /** * 压力测试 * 模拟1200台设备,每100毫秒上报一次位置信息 */ public abstract class StressTest { public static final byte[] bytes = ByteBufUtil.decodeHexDump("7e0200407c0100000000017299841738ffff000004000000080006eeb6ad02633df701380003006320070719235901040000000b02020016030200210402002c051e3737370000000000000000000000000000000000000000000000000000001105420000004212064d0000004d4d1307000000580058582504000000632a02000a2b040000001430011e310128637e"); public static final JTMessageEncoder encoder = new JTMessageEncoder("org.yzh.protocol"); private static final Stopwatch s = new Stopwatch().start(); public static final String host = "127.0.0.1"; public static final int port = QuickStart.port; public static final int size = 1000; public static final long Interval = 4; public static void main(String[] args) throws Exception { // Client[] clients = Client.UDP(host, port, size); Client[] clients = Client.TCP(host, port, size); for (int i = 0; i < size; i++) { clients[i].send(T0100(i)); s.increment(); } Thread.sleep(500L); // ByteBuf imagePacket = packet(); Object[] points = locations(); LocalDateTime deviceTime = LocalDateTime.now(); int num = 0; while (true) { int[] point = (int[]) points[num++]; if (num >= points.length) num = 0; deviceTime = deviceTime.plusSeconds(1); for (int i = 0; i < size; i++) { T0200 message = T0200(i, deviceTime, point); // T0801 message = T0801(i, strTime, point); // imagePacket.readerIndex(0); // message.setPacket(imagePacket); clients[i].send(getBytes(message)); s.increment(); } try { Thread.sleep(Interval); } catch (InterruptedException e) { } } } private static Object[] locations() throws IOException { Object[] points; try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream("jtt808-server/target/test-classes/轨迹区域测试.txt"), StandardCharsets.UTF_8))) { points = reader.lines().map(s -> { double[] doubles = Arrays.stream(s.split(",")).mapToDouble(Double::parseDouble).toArray(); return new int[]{(int) (doubles[0] * 1000000d), (int) (doubles[1] * 1000000d), (int) (doubles[2])}; }).toArray(); } return points; } private static int ProtocolVersion = 1; public static byte[] T0100(int i) { String id = String.valueOf(i + 1); String deviceId = "T" + StrUtils.leftPad(id, 6, '0'); String clientId = "1" + StrUtils.leftPad(id, 10, '0'); String plateNo = "测A" + StrUtils.leftPad(id, 5, '0'); T0100 message = new T0100(); message.setMessageId(JT808.终端注册); message.setProtocolVersion(ProtocolVersion); message.setVersion(true); message.setClientId(clientId); message.setProvinceId(31); message.setCityId(115); message.setMakerId("yzh"); message.setDeviceModel("www.jtt808.cn"); message.setDeviceId(deviceId); message.setPlateColor(1); message.setPlateNo(plateNo); byte[] bytes = getBytes(message); return bytes; } public static T0200 T0200(int id, LocalDateTime time, int[] point) { String clientId = "1" + StrUtils.leftPad(String.valueOf(id + 1), 10, '0'); T0200 message = new T0200(); message.setMessageId(JT808.位置信息汇报); message.setProtocolVersion(ProtocolVersion); message.setVersion(true); message.setClientId(clientId); message.setWarnBit(1024); message.setStatusBit(2048); message.setLongitude(point[0]); message.setLatitude(point[1]); message.setAltitude(312); message.setSpeed(point[2]); message.setDirection(99); message.setDeviceTime(time); return message; } public static T0801 T0801(int id, LocalDateTime time, int[] point) { String clientId = "1" + StrUtils.leftPad(String.valueOf(id + 1), 10, '0'); T0801 bean = new T0801(); bean.setMessageId(JT808.多媒体数据上传); bean.setProtocolVersion(ProtocolVersion); bean.setVersion(true); bean.setClientId(clientId); bean.setId(-1); bean.setType(0); bean.setFormat(0); bean.setEvent(-1); bean.setChannelId(1); bean.setLocation(T0200(id, time, point)); return bean; } private static ByteBuf packet() throws IOException { FileInputStream fos = new FileInputStream("D:/test.jpg"); FileChannel fc = fos.getChannel(); ByteBuf byteBuf = Unpooled.buffer(9000); int size = (int) fc.size(); byteBuf.writeBytes(fc, 0, size); return byteBuf; } private static byte[] getBytes(JTMessage message) { ByteBuf buf = encoder.encode(message); byte[] bytes = new byte[buf.readableBytes()]; buf.readBytes(bytes); buf.release(); return bytes; } }