diff --git a/src/CoreParser.php b/src/CoreParser.php index 5aae06f..6675bca 100644 --- a/src/CoreParser.php +++ b/src/CoreParser.php @@ -3,6 +3,7 @@ namespace Menking\Meshcore; use Exception; +use Menking\Meshcore\Model\AdvertResponse; use Menking\Meshcore\Model\BinaryResponse; use Menking\Meshcore\Model\ChannelResponse; use Menking\Meshcore\Model\CodeSentResponse; @@ -12,6 +13,7 @@ use Menking\Meshcore\Model\ErrorResponse; use Menking\Meshcore\Model\LoginResponse; use Menking\Meshcore\Model\LogReceiveResponse; use Menking\Meshcore\Model\BatteryStorageResponse; +use Menking\Meshcore\Model\MessageResponse; class CoreParser { /** @@ -70,33 +72,25 @@ class CoreParser { } protected static function parseMsg(string $payload): mixed { - $idx = 0; + $m = new MessageResponse(); - $data = [ - 'code'=>ord($payload[$idx]) - ]; + $idx = 0; + $m->code = ord($payload[$idx]); $idx++; - if( ord($payload[0]) == CoreProtocol::RESP_CODE_CHANNEL_MSG_RECV_V3 ) { - $alt = [ - 'snr'=>unpack('V', substr($payload, 1, 4))[1], - 'reserved1'=>0, - 'reserved2'=>0 - ]; - - $data = array_merge($data, $alt); + if( $m->code == CoreProtocol::RESP_CODE_CHANNEL_MSG_RECV_V3 ) { + $m->snr = unpack('V', substr($payload, 1, 4))[1] / 4; $idx = 5; } - $remains = [ - 'channel_idx'=>ord($payload[$idx]), - 'path_len'=>ord($payload[$idx+1]), - 'type'=>ord($payload[$idx+2]), - 'timestamp'=>unpack('V', substr($payload, $idx+3, 4))[1], - 'message'=>substr($payload, $idx+7) - ]; + $m->channel_idx = ord($payload[$idx]); + $m->path_len = ord($payload[$idx+1]); + $m->type = ord($payload[$idx+2]); + $m->timestamp = unpack('V', substr($payload, $idx+3, 4))[1]; + $m->message = substr($payload, $idx+7); - return array_merge($data, $remains); + + return $m; } /** @@ -105,27 +99,23 @@ class CoreParser { * @return mixed */ protected static function parseAdvert(string $payload): mixed { - $data = [ - 'code'=>ord($payload[0]), - 'pub_key'=>base64_encode(substr($payload, 1, CoreProtocol::PUB_KEY_SIZE)) - ]; + $m = new AdvertResponse(); + $m->code = ord($payload[0]); + $m->pub_key = base64_encode(substr($payload, 1, CoreProtocol::PUB_KEY_SIZE)); + if( strlen($payload) > CoreProtocol::PUB_KEY_SIZE ) { - $new_data = [ - 'type'=>ord($payload[33]), - 'flags'=>ord($payload[34]), - 'out_path'=>substr($payload, 35, CoreProtocol::MAX_PATH_SIZE), - 'name'=>substr($payload, 99, 32), - 'last_advert_time'=>unpack('V', substr($payload, 203, 4))[1], - 'lat'=>unpack('V', substr($payload, 207, 4))[1], - 'lon'=>unpack('V', substr($payload, 211, 4))[1], - 'last_mod'=>unpack('V', substr($payload, 215, 4))[1], - ]; - - $data = array_merge($data, $new_data); + $m->type = ord($payload[33]); + $m->flags = ord($payload[34]); + $m->out_path = substr($payload, 35, CoreProtocol::MAX_PATH_SIZE); + $m->name = substr($payload, 99, 32); + $m->last_advert_time = unpack('V', substr($payload, 203, 4))[1]; + $m->lat = unpack('V', substr($payload, 207, 4))[1]; + $m->lon = unpack('V', substr($payload, 211, 4))[1]; + $m->last_mod = unpack('V', substr($payload, 215, 4))[1]; } - return $data; + return $m; } /** diff --git a/src/Model/AdvertResponse.php b/src/Model/AdvertResponse.php new file mode 100644 index 0000000..9aec87c --- /dev/null +++ b/src/Model/AdvertResponse.php @@ -0,0 +1,16 @@ +