using models for AdvertPath, AppStart and Contact responses

This commit is contained in:
Ben Menking
2026-05-29 23:43:18 -04:00
parent 9b6781a3f9
commit 0b8e34832e
4 changed files with 106 additions and 42 deletions
+64 -42
View File
@@ -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);
}
}
+10
View File
@@ -0,0 +1,10 @@
<?php
namespace Menking\Meshcore\Model;
class AdvertPathResponse extends Response {
public int $code;
public int $received_timestamp;
public int $path_len;
public string $path;
}
+15
View File
@@ -0,0 +1,15 @@
<?php
namespace Menking\Meshcore\Model;
class AppStartResponse extends Response {
public int $code;
public int $advert_type;
public int $tx_power_dbm;
public int $max_tx_power;
public string $pub_key;
public int $lat;
public int $lon;
public int $multi_acks;
public int $advert_loc_policy;
}
+17
View File
@@ -0,0 +1,17 @@
<?php
namespace Menking\Meshcore\Model;
class ContactResponse extends Response {
public int $code;
public string $pub_key;
public int $type;
public int $flags;
public int $out_path_len;
public string $out_path;
public string $name;
public int $last_advert_timestamp;
public int $lat;
public int $lon;
public int $lastmod;
}