Как обработать пакет данных (Java)

324
24 августа 2017, 19:49

Устройство подключенное через переходник USART-USB отправляет на комп данные, программа на компе принимает пакет данных (при помощи библиотеки JSSC) в виде массива байт. Байты массива - это заранее определенные параметры, например "Состояние устройства", "Серийный номер" и т.п. соответственно нужна какая-то константная структура, реализующая таблицу соответствий - какой байт каким параметром является. Плюс нужна какая-то константная структура для интерпретации значения параметра к виду, подходящему для вывода в GUI, типа "FF" -> "IDLE", "FE" -> "SLEEP" и т.п. Причем таких состояний десятки и параметров десятки. Cейчас начал делать так:

public class Packet {
    public static String Partnum;
    public static String Version;
    public static String State;
    public static String LQI;
    public static String RSSI;
    public static String Freqest;
    public static String RXfifo;
    public static String VCO_VC_DAC;
    public static String WOR;
    public static void packetHandler(String[] arg) {
        Partnum = "0x"+arg[0];
        Version = "0x"+arg[1];
        // State
        if (arg[2].equals("0D")) {
            State = "RX";
        }
        else if (arg[2].equals("01")) {
            State = "IDLE";
        }
        else if (arg[2].equals("11")) {
            State = "RXFIFO_OVERFLOW";
        }
        else {
            State = arg[2];
        }
        LQI = arg[3];
        Freqest = arg[4];
        RSSI = arg[5];
        RXfifo = arg[6];
        VCO_VC_DAC = arg[7];
        WOR = arg[8]+" "+arg[9];
    }
}

Оно работает, но чувствую что так не правильно и не годится для обработки больших пакетов. Да и время на обработку, даже при количестве в несколько параметров, занимает просто огромное. Как корректно разобрать и интерпретировать содержание пакета инструментами Java? Может есть какие-то примеры? то что я нашел, оно интересно https://github.com/farrellf/TelemetryViewer/tree/master/Telemetry%20Viewer , но там пакет содержит просто значения для вывода и как таковой обработки и интерпретации не требуют.

Answer 1

Я бы написал что-то такое:

public class Packet {
   private int partNum;
   private int version;
   private String state;
private static boolean isRx(byte b) {
   return (b==0x0d)?true:false;
}
private static boolean isIdle(byte b) {
   return (b==0x01)?true:false;
}
private static boolean isOverflow(byte b) {
   return (b==0x11)?true:false;
}
public void parsePacketHandler(byte[] args) {
   this.partNum=args[0];
   this.version=args[1];
   if(isIdle(args[2))
     this.state="idle";
   else if(isRx(args[2]))
     this.state="rx";
   else if(isOverflow(args[2]))
     this.state="overflow"
   else
     this.state=""+args[2];
   }
}
READ ALSO
При отправке данных на сервер вместо русских символов вопросительные знаки

При отправке данных на сервер вместо русских символов вопросительные знаки

Столкнулся с проблемой некорректного отображения русских символовНе знаю в чём проблема

332
String hashCode performance

String hashCode performance

Добрый деньИзвестно, что хэшкод для строк кэшируется в поле hash в момент первого вызова методы hashCode(), и для последующих вызовов не рассчитывается

250
Обновление UI во время выполнения

Обновление UI во время выполнения

Что нужно дописать в код, чтобы текст обновлялся на кнопке раз в секунду, или ткните где искать инфу, заранее благодарю

294
Наполнение ExpandableLV SpannableString-элементами

Наполнение ExpandableLV SpannableString-элементами

Ломаю голову второй деньНеобходимо программно менять цвет у элементов ExpListView (Не родителей)

233