private void decodeData(InputStream is) throws IOException{
for (int r = fillUp(is); r >= 0; r = fillUp(is)) {
log.info(mountPoint + " Received data : {} B", r);
// we have read something, reset reconnection attempts counters
nbAttempts = 0;
delay = reconnectDelay;
if (stop.get()) {
// stop monitoring immediately
// (returning closes the input stream automatically)
return;
}
// RTCM 메시지 하나당 header(3) + Message(최대 1023) + CRC(3)
int bufferSize = 0;
while (bufferSize() >= 3) {
if (peekByte(0) != PREAMBLE) { //header 3bytes 중 8bit는 PREAMBLE, 6bit는 reserved
// we are out of synch with respect to frame structure
// drop the unknown byte
moveRead(1);
log.info(mountPoint + " PREAMBLE 불일치 => 1byte 이동");
} else {
final int messageSize = (peekByte(1) & 0x03) << 8 | peekByte(2); //header 3bytes 중 뒤쪽의 10bit는 메시지의 사이즈 = 최대 1023
bufferSize = bufferSize();
if (bufferSize >= PREAMBLE_SIZE + messageSize + CRC_SIZE) {
// check CRC
final int crc = (peekByte(PREAMBLE_SIZE + messageSize) << 16) |
(peekByte(PREAMBLE_SIZE + messageSize + 1) << 8) |
peekByte(PREAMBLE_SIZE + messageSize + 2);
//log.info("\n\n\n size = {} crc = {}", size, crc); if (crc == computeCRC(PREAMBLE_SIZE + messageSize)) {
// we have a complete and consistent frame
// we can extract the message it contains
messageEndIndex = (readIndex + PREAMBLE_SIZE + messageSize) % BUFFER_SIZE;
//log.info("readIndex : {}, messageEndIndex : {}", readIndex, messageEndIndex); moveRead(PREAMBLE_SIZE);
start();
// get the message number as a String
int messageNum = (int) extractBits(12);
extractBits(4);
moveRead(messageSize - 2);
// jump to expected message end, in case the message was corrupted
// and parsing did not reach message end
readIndex = (messageEndIndex + CRC_SIZE) % BUFFER_SIZE;
log.info(mountPoint + " RTCM {} : {} B, remaining = {} B", messageNum, messageSize, (bufferSize-messageSize-6));
} else {
// CRC is not consistent, we are probably not really synched
// and the preamble byte was just a random byte
// we drop this single byte and continue looking for sync
moveRead(1);
log.info(mountPoint + " CRC 불일치 => 1byte 이동");
}
} else {
// the frame is not complete, we need more data
break;
}
}
}
}
}