diff --git a/htdocs/app/Services/AstmMessageService.php b/htdocs/app/Services/AstmMessageService.php index ae4330bd..cfa50834 100644 --- a/htdocs/app/Services/AstmMessageService.php +++ b/htdocs/app/Services/AstmMessageService.php @@ -684,6 +684,21 @@ class AstmMessageService return $messages; } + protected function reassembleAstmFrames(string $raw): string + { + $buffer = ''; + $frames = preg_split('/\x02\d/', $raw); // STX + sequence number + + foreach ($frames as $frame) { + // buang ETX, checksum, EOT + $frame = preg_replace('/\x03.*$/s', '', $frame); + $frame = preg_replace('/\x04/', '', $frame); + + $buffer .= $frame; + } + + return trim($buffer); + } protected function processBDAstmResponse(string $raw, $data): bool { @@ -712,7 +727,7 @@ class AstmMessageService if (str_starts_with($line, 'H|')) { $f = explode('|', $line); $parsed['header'] = [ - 'sender_name' => $data->alat, + 'sender_name' => $data->alat ?? ($f[4] ?? 'BD Instrument'), 'version_number' => $f[12] ?? 'V1.0', 'message_datetime' => $this->astmToDateTime($f[13] ?? null) ]; @@ -821,9 +836,10 @@ class AstmMessageService $response = $data->rawdt; if ($data->alat == 'BD Mikro 1'){ if ($data->no_id != ''){ - $messages = $this->splitBDAstmMessages($data->rawdt); + $assembled = $this->reassembleAstmFrames($data->rawdt); + $messages = $this->splitBDAstmMessages($assembled); foreach ($messages as $msg) { - $ok = $this->processBDAstmResponse($msg, $data->alat); + $ok = $this->processBDAstmResponse($msg, $data); } DataListiner::where('urut', $data->urut)->update([ 'processed' => $ok ? 1 : 9