Я пытаюсь создать простой сервер для Teltonika ('устройство GPS-отслеживания), который не делает ничего, кроме сохранения местоположений.
Я попадаю в точку, где Teltonika отправляет сообщение сидентификация (IMEI) для моего сервера, но затем я должен ответить следующим образом:
После получения IMEI сервер должен определить, будет ли он принимать данные из этого модуля.Если да, сервер ответит на модуль 01, если не 00. Обратите внимание, что подтверждение должно быть отправлено в виде двоичного пакета.Затем модуль начинает отправлять первый пакет данных AVL.После того, как сервер получил пакет и проанализировал его, сервер должен сообщить модулю номер полученных данных как целое число (четыре байта).Если номер отправленных данных и сообщенный сервером не совпадает, модуль отправляет повторно отправленные данные.
Поэтому я должен отправить 01 как "двоичный пакет", но я не знаю, как отправить двоичный пакетв netty (через TCP), может кто-нибудь сказать, пожалуйста, как это сделать?
Что я * уже пробовал:
DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
ByteBuf inBuffer = (ByteBuf) msg;
String received = inBuffer.toString(CharsetUtil.UTF_8);
System.out.println(dateFormat.format(new Date()) + " Server received: " + received);
byte[] out = new byte[] { 0, 1 };
ByteBuf encoded = ctx.alloc().buffer(4);
encoded.writeBytes(out);
ctx.writeAndFlush(encoded);
}
@Override
public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
ctx.writeAndFlush(Unpooled.EMPTY_BUFFER).addListener(ChannelFutureListener.CLOSE);
}
Я сейчас опробовал = новый байт []{0x01}
и добавил sysout для каждого метода (кроме channelread и channelreadcomplete), и получился следующий вывод:
channelRegistered
channelActive
19:41:08 Server received: 352094088680829
channelInactive
channelUnregistered
channelRegistered
channelActive
19:41:19 Server received: 352094088680829
channelInactive
channelUnregistered
channelRegistered
channelActive
19:41:30 Server received: 352094088680829
...
Сейчас я нахожусь в точке, гдеTeltonika отправляет второй пакет (я думаю, один с данными о местоположении, но нужно проверить немного дальше)
код, который я использовал
Сервер:
import java.net.InetSocketAddress;
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
public class MainNettyApplicationServer {
public static void main(String[] args) throws InterruptedException {
EventLoopGroup group = new NioEventLoopGroup();
try{
ServerBootstrap serverBootstrap = new ServerBootstrap();
serverBootstrap.group(group);
serverBootstrap.channel(NioServerSocketChannel.class);
serverBootstrap.localAddress(new InetSocketAddress("10.0.0.2", 11111));
serverBootstrap.childHandler(new ChannelInitializer<SocketChannel>() {
protected void initChannel(SocketChannel socketChannel) throws Exception {
socketChannel.pipeline().addLast(new SimpleServerHandler());
}
});
ChannelFuture channelFuture = serverBootstrap.bind().sync();
System.out.println("Server started.");
channelFuture.channel().closeFuture().sync();
} catch(Exception e){
e.printStackTrace();
} finally {
group.shutdownGracefully().sync();
}
}
}
Обработчик:
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.util.CharsetUtil;
public class SimpleServerHandler extends ChannelInboundHandlerAdapter {
DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
ByteBuf inBuffer = (ByteBuf) msg;
String received = inBuffer.toString(CharsetUtil.UTF_8);
System.out.println(dateFormat.format(new Date()) + " Server received: " + received);
byte[] out = new byte[] { 0x01 };
ByteBuf encoded = ctx.alloc().buffer(1);
encoded.writeBytes(out);
ctx.writeAndFlush(encoded);
}
@Override
public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
// ctx.writeAndFlush(Unpooled.EMPTY_BUFFER).addListener(ChannelFutureListener.CLOSE);
}
}