2016-01-22 12 views
0

Я пытаюсь объединить фрагменты пакета, который я получаю своим Xbee (802.15.4) в режиме API, через мой последовательный порт RS-232. Я получаю свой фрагмент с помощью метода readBytes из библиотеки jssc для java.Объединить фрагменты api XBee из последовательного порта

Вот мой прием кода

метод
private static class PortReader implements SerialPortEventListener { 

    @Override 
    public void serialEvent(SerialPortEvent event) { 
     if(event.isRXCHAR() && event.getEventValue() > 0) { 
      try { 
       byte[] receivedData = serialPort.readBytes(event.getEventValue()); 
       if(Utils.isConfirmPacket(Utils.toHex(receivedData))){ 
        System.out.println("XBee confim that msg is sent!"); 
       }else{ 
        System.out.println("Received response from port: " + Utils.toHex(receivedData)); 
        int dataLength = Utils.toHex(receivedData).length(); 
        receiveFile("testRx", receivedData, dataLength); 
       } 

      } 
      catch (SerialPortException ex) { 
       System.out.println("Error in receiving response from port: " + ex); 
      } 
     } 
    } 

Мои receiveFile() нужен полный пакет в одном фрагменте. Вот то, что я получаю в моей консоли:

Received response from port: 7e003c8100013200 
Received response from port: 200ff1200 
Received response from port: 0001000500000000 
Received response from port: 0000000020000000 
Received response from port: 1251000012455222 
Received response from port: 446174613a206365 
Received response from port: 6369206573742075 
Received response from port: 6e20746573743b90 

Поскольку я использую режим API, я не был в состоянии отправить конец разделитель указанного конца пакета, как я видел в других решениях (Read Complete Line Java Serial Port).

Я думал использовать начальный разделитель следующего пакета, но он не сработал.

+0

Рассмотрите возможность использования этой библиотеки вместо того, чтобы изобретать колесо. Это должно облегчить обработку данных в виде фреймов вместо потока. https://docs.digi.com/display/XBJLIB/XBee+Java+Library – tomlogic

ответ

0

Я понял, используя длину пакета api. Поскольку длина находится в позиции [1] и [2] первого массива, я могу использовать это значение, чтобы продолжать строить свой пакет по мере получения данных. Когда мое значение msgLengthLeft равно 0, я знаю, что все пакеты были получены, и я могу вернуть полный пакет. Вот мой код:

private static class PortReader implements SerialPortEventListener { 
    private short msgLength; 
    private short msgLengthLeft; 
    private byte[] receivedMsg = new byte[packetSize]; 
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); 

    @Override 
    public void serialEvent(SerialPortEvent event) { 
     if(event.isRXCHAR() && event.getEventValue() > 0) { 
      try { 
       byte[] receivedData = serialPort.readBytes(event.getEventValue()); 
       if(Utils.isConfirmPacket(Utils.toHex(receivedData))){ 
        System.out.println("XBee confim that msg is sent!"); 
       }else{ 
        if(receivedData[0] == 0x7e){ //0x7e is the start delimiter of a frame 
         ByteBuffer wrapped = ByteBuffer.wrap(receivedData,1,2); // big-endian by default 
         msgLength = (short) (wrapped.getShort()+4); //Need to add 4 to the value becaus some field are not include in the length field of the api packet 
         msgLengthLeft = (short) (msgLength - receivedData.length); 
         outputStream.write(receivedData); 
         return; 
        }else{ 
         msgLengthLeft = (short) (msgLengthLeft - receivedData.length); 
         outputStream.write(receivedData); 
         if(msgLengthLeft != 0){ 
          return; 
         } 
        } 
        System.out.println("Received response from port: " + Utils.toHex(outputStream.toByteArray())); 
        int dataLength = Utils.toHex(receivedMsg).length(); 
        //receiveFile("testRx", receivedData, dataLength); 
       } 

      } 
      catch (SerialPortException | IOException ex) { 
       System.out.println("Error in receiving response from port: " + ex); 
      } 
     } 
    } 
}