Page 1 sur 1

PDO reccuperer int 32 "pointeur"

Posté : 14 oct. 2021, 19:37
par frederic-iot
Bonjour,
J'ai une fonction en php qui tourne dans un petit script sur une instance.
Je tente de faire des essais avec des modules radio. :-)
Je ne comprends pas comment décaler l 'int 32 qui renseigne ma variable "$val". Actuellement je démarre un octet trop tôt.


frm_payload = "AuqGfY4IAAjc/A==";
Mon playlod, decrypté en Hex => 02ea867d8e080008dcfc
Actuellement je remonte $val = 80008dc (hex) soit 134219996 (dec) alors que je souhaite $val=0008dcfc soit 580860 (dec).
Voici ma fonction.
Merci pour votre aide
function decodeFrame($message)
{
    //echo sprintf("Received message on topic [%s]\n%s\n\n", $message);
    $obj = json_decode($message);
    $device=$obj->{'end_device_ids'};
    $uplinkMessage=$obj->{'uplink_message'};
    $payload=base64_decode($uplinkMessage->{'frm_payload'});
    $rssi=$uplinkMessage->{'rx_metadata'}[0]->{"rssi"};
    echo sprintf("     RSSI: %d\n", $rssi);
    echo sprintf(" DeviceID: %s\n", $device->{'device_id'});
    echo sprintf("DeviceEUI: %s\n", $device->{'dev_eui'});
    echo sprintf("  Payload: %s\n", bin2hex($payload));

    $memoryStream = fopen('php://memory', 'rw+');
    fwrite($memoryStream, $payload);
    rewind($memoryStream);
    $buffer = new ResourceBuffer($memoryStream);

    $buffer->skip(3);
    $wireCut =$buffer->getUnsignedByte() ;
    $batteryLevel =$buffer->getUnsignedByte() ;
    $val = $buffer->getUnsignedInt();
    echo sprintf("   Pulses: %d\n", $val);
    echo sprintf("  Battery: %d\n", $batteryLevel);
    echo sprintf(" Wire cut: %d\n", $wireCut);

    //echo $obj->{'received_at'}."\n";
    $timestamp=new DateTime('NOW');
    logFrame("LORA-".$device->{'dev_eui'},
        $timestamp->format("Y-m-d H:i:s"),
        $rssi,
        $val, "", 0x0);
}

Re: PDO reccuperer int 32 "pointeur"

Posté : 15 oct. 2021, 08:22
par @rthur
Pas sûr de comprendre...
Mon playlod, decrypté en Hex => 02ea867d8e080008dcfc
Actuellement je remonte $val = 80008dc (hex) alors que je souhaite $val=0008dcfc
Comment extrais-tu $val de ton payload ?
Car tu fais des manipulations sur un buffer qui sont incompréhensibles (car on n'a pas les fonctions que tu utilises)
S’il s'agit "juste" de prendre les dix derniers caractères de ton payload décrypté en Hex alors tu peux faire ça simplement :
$val=substr(bin2hex($payload),9); // J'ai indiqué 9, car le 1ᵉʳ caractère a l'index 0, donc le 10ᵉ a l'index 9