Как отправить бинарный пакет в Netty (телтонике) - PullRequest
0 голосов
/ 03 марта 2019

Я пытаюсь создать простой сервер для 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);
}

}
...