From 0b8e34832eca70184908ce147fe0afbb0106fd84 Mon Sep 17 00:00:00 2001 From: Ben Menking Date: Fri, 29 May 2026 23:43:18 -0400 Subject: [PATCH] using models for AdvertPath, AppStart and Contact responses --- src/CoreParser.php | 106 +++++++++++++++++++------------ src/Model/AdvertPathResponse.php | 10 +++ src/Model/AppStartResponse.php | 15 +++++ src/Model/ContactResponse.php | 17 +++++ 4 files changed, 106 insertions(+), 42 deletions(-) create mode 100644 src/Model/AdvertPathResponse.php create mode 100644 src/Model/AppStartResponse.php create mode 100644 src/Model/ContactResponse.php diff --git a/src/CoreParser.php b/src/CoreParser.php index 506591b..be137fa 100644 --- a/src/CoreParser.php +++ b/src/CoreParser.php @@ -3,7 +3,9 @@ namespace Menking\Meshcore; use Exception; +use Menking\Meshcore\Model\AdvertPathResponse; use Menking\Meshcore\Model\AdvertResponse; +use Menking\Meshcore\Model\AppStartResponse; use Menking\Meshcore\Model\BinaryResponse; use Menking\Meshcore\Model\ChannelResponse; use Menking\Meshcore\Model\CodeSentResponse; @@ -13,6 +15,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\ContactResponse; use Menking\Meshcore\Model\ContactsFullResponse; use Menking\Meshcore\Model\MessageResponse; use Menking\Meshcore\Model\MessagesWaitingResponse; @@ -110,7 +113,7 @@ class CoreParser { $m = new AdvertResponse(); $m->code = ord($payload[0]); - $m->pub_key = base64_encode(substr($payload, 1, CoreProtocol::PUB_KEY_SIZE)); + $m->pub_key = self::formatPublicKey(substr($payload, 1, CoreProtocol::PUB_KEY_SIZE)); if( strlen($payload) > CoreProtocol::PUB_KEY_SIZE + 2 ) { $m->type = ord($payload[33]); @@ -213,7 +216,7 @@ class CoreParser { $data->code = ord($payload[0]); $data->status = false; $data->is_admin = ord($payload[1]); - $data->pub_key_prefix = base64_encode(substr($payload, 2, 6)); + $data->pub_key_prefix = self::formatPublicKey(substr($payload, 2, 6)); return $data; } @@ -229,7 +232,7 @@ class CoreParser { $data->code = ord($payload[0]); $data->status = true; $data->is_admin = ord($payload[1]); - $data->pub_key_prefix = base64_encode(substr($payload, 2, 6)); + $data->pub_key_prefix = self::formatPublicKey(substr($payload, 2, 6)); if( strlen($payload) > 8 ) { $data->timestamp = unpack('V', substr($payload, 8, 4))[1]; @@ -313,49 +316,64 @@ class CoreParser { return $data; } - public static function getContact(string $payload) { - $contact = [ - 'code'=>ord($payload[0]), - 'pub_key'=>base64_encode(substr($payload, 1, CoreProtocol::PUB_KEY_SIZE)), - 'type'=>ord($payload[33]), - 'flags'=>ord($payload[34]), - 'out_path_len'=>ord($payload[35]), - 'out_path'=>trim(substr($payload, 36, 64)), - 'contact_name'=>trim(substr($payload, 100, 32)), - 'last_advert_timestamp'=>date('r', unpack('V', substr($payload, 132, 4))[1]), - 'gps_lat'=>unpack('l', substr($payload, 136, 4))[1] / 1000000.0, - 'gps_lon'=>unpack('l', substr($payload, 140, 4))[1] / 1000000.0, - 'lastmod'=>date('r', unpack('V', substr($payload, 144, 4))[1]) - ]; - - return $contact; - } - - public static function parseAppStart(string $payload) { - $info = [ - 'response_code'=>ord($payload[0]), - 'advert_type'=>ord($payload[1]), - 'tx_power_dbm'=>ord($payload[2]), - 'max_tx_power'=>ord($payload[3]), - 'public_key'=>base64_encode(substr($payload, 4, CoreProtocol::PUB_KEY_SIZE)), - 'lat'=>unpack('l', substr($payload, 36, 4))[1] / 1000000.0, - 'long'=>unpack('l', substr($payload, 40, 4))[1] / 1000000.0, - 'multi_acks'=>ord($payload[44]), - 'advert_loc_policy'=>ord($payload[45]), - ]; + /** + * + * @param string $payload + * @return ContactResponse + */ + public static function getContact(string $payload): ContactResponse { + $m = new ContactResponse(); - return $info; + $m->code = ord($payload[0]); + $m->pub_key = self::formatPublicKey(substr($payload, 1, CoreProtocol::PUB_KEY_SIZE)); + $m->type = ord($payload[33]); + $m->flags = ord($payload[34]); + $m->out_path_len = ord($payload[35]); + $m->out_path = substr($payload, 36, 64); + $m->name = trim(substr($payload, 100, 32), ' '); + $m->last_advert_timestamp = date('r', unpack('V', substr($payload, 132, 4))[1]); + $m->lat = unpack('l', substr($payload, 136, 4))[1] / 1000000.0; + $m->lon = unpack('l', substr($payload, 140, 4))[1] / 1000000.0; + $m->lastmod = date('r', unpack('V', substr($payload, 144, 4))[1]); + + return $m; } - public static function parseAdvertPathResponse(string $payload) { - $info = [ - 'code'=>ord($payload[0]), - 'received_timestamp'=>unpack('V', substr($payload, 1, 4))[1], - 'path_len'=>ord($payload[5]), - 'path'=>substr($payload, 6, ord($payload[5])) - ]; + /** + * + * @param string $payload + * @return AppStartResponse + */ + public static function parseAppStart(string $payload): AppStartResponse { + $m = new AppStartResponse(); + + $m->code = ord($payload[0]); + $m->advert_type = ord($payload[1]); + $m->tx_power_dbm = ord($payload[2]); + $m->max_tx_power = ord($payload[3]); + $m->pub_key = self::formatPublicKey(substr($payload, 4, CoreProtocol::PUB_KEY_SIZE)); + $m->lat = unpack('l', substr($payload, 36, 4))[1] / 1000000.0; + $m->lon = unpack('l', substr($payload, 40, 4))[1] / 1000000.0; + $m->multi_acks = ord($payload[44]); + $m->advert_loc_policy = ord($payload[45]); - return $info; + return $m; + } + + /** + * + * @param string $payload + * @return AdvertPathResponse + */ + public static function parseAdvertPathResponse(string $payload): AdvertPathResponse { + $m = new AdvertPathResponse(); + + $m->code = ord($payload[0]); + $m->received_timestamp = unpack('V', substr($payload, 1, 4))[1]; + $m->path_len = ord($payload[5]); + $m->path = substr($payload, 6, ord($payload[5])); + + return $m; } public static function parseCodeStatusResponse(string $payload) { @@ -445,4 +463,8 @@ class CoreParser { return trim(substr($str, 0, $x)); } } + + public static function formatPublicKey(string $pubkey): string { + return bin2hex($pubkey); + } } \ No newline at end of file diff --git a/src/Model/AdvertPathResponse.php b/src/Model/AdvertPathResponse.php new file mode 100644 index 0000000..e3bfc74 --- /dev/null +++ b/src/Model/AdvertPathResponse.php @@ -0,0 +1,10 @@ +