From 9b8dacbe80cccd28c1def64cc46c154ef582be97 Mon Sep 17 00:00:00 2001 From: Ben Menking Date: Fri, 29 May 2026 09:50:37 -0400 Subject: [PATCH] push code adverts --- src/CoreParser.php | 27 +++++++++++++++++++++++++++ src/CoreProtocol.php | 1 + src/Meshcore.php | 4 ---- 3 files changed, 28 insertions(+), 4 deletions(-) diff --git a/src/CoreParser.php b/src/CoreParser.php index d1f428f..6be92f2 100644 --- a/src/CoreParser.php +++ b/src/CoreParser.php @@ -60,12 +60,39 @@ class CoreParser { case CoreProtocol::RESP_CODE_CHANNEL_MSG_RECV_V3: case CoreProtocol::RESP_CODE_CHANNEL_MSG_RECV: return $payload; + case CoreProtocol::PUSH_CODE_ADVERT: + case CoreProtocol::PUSH_CODE_NEW_ADVERT: + return self::parseAdvert($payload); default: echo "Unparsed response: " . \Menking\Meshcore\Util\Debug::hexDump($payload) . "\n"; return $payload; } } + protected static function parseAdvert(string $payload): mixed { + $data = [ + 'code'=>ord($payload[0]), + '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); + } + + return $data; + } + /** * * @param string $payload diff --git a/src/CoreProtocol.php b/src/CoreProtocol.php index c7ea84e..6364cf6 100644 --- a/src/CoreProtocol.php +++ b/src/CoreProtocol.php @@ -150,6 +150,7 @@ class CoreProtocol { } const PUB_KEY_SIZE = 32; + const MAX_PATH_SIZE = 64; const CMD_APP_START = 1; const CMD_SEND_TXT_MSG = 2; diff --git a/src/Meshcore.php b/src/Meshcore.php index 89b093c..87c79fe 100644 --- a/src/Meshcore.php +++ b/src/Meshcore.php @@ -356,10 +356,6 @@ class Meshcore { usleep(250000); $response = $this->readFrame(); - - echo "readFrame: " . \Menking\Meshcore\Util\Debug::hexDump($response) . "\n"; - - usleep(250000); } while( ((time() - $mark) * 1000) < $timeout_ms );