2016-10-25 2 views
1

Ich habe ein GPS-Gerät, Pakete an meinen Server (Linux mit PHP-Listener) über TCP, ich habe alle Parameter außer einem, E/A-Status.Format N_STRING Parameter von TCP-Daten

Das tk207 Protokoll legt fest, dass Parameter wie folgt aus:

IO State 
Length: 8 bits 
Type: N_STRING 
1:Main power, '0' means on power, '1' means off power。 
2:ACC, '0' ACC close, '1' ACC open 
3: blender, '0' Did not.start, '1' Just turning, '2' reverse turning。 
4:Empty/heavy vehicles, '0' Did not.start, '1' Empty, '2' Heavy 
5:Front door, '0' Did not start, ’1’ open, '2' close。 
6: off the oil state, '1' '0' recovery oil 
7: arm/disarm state, '1' '0' from the 8 fortification: there is no vibration 

N_STRING Definition: die Ziffer Zeichenfolge von 0,9 enthalten. Wenn Sie die Ziffern korrigieren, geben Sie den ASCII-Code 0 (Ox30H) links für fehlende Ziffern ein, außer für spezielle Anweisungen.

Ich erhalte Werte wie diese EDITED *

01000000 
01000001 
11000000 
11000001 

Aber ich bin nicht in der Lage, herauszufinden, wie die 7 Parameter aus dieser Zeichenfolge zu erhalten.

Jede Hilfe wird geschätzt.

EDIT: Bevor ich die Definition über das Feld hatte, war ich an einigen Beispielen, wie Blick auf den Ein/Aus-Wert aus diesem Feld

$gpioInput = 0; 
for ($i = 0; $i <= 7; $i++) { 
    $b = substr($gpioStr, 7 - $i, 1); 
    if ($b != "0") { 
     $gpioInput |= (1 << $i); 
    } 
} 
+0

Können Sie teilen, was Sie versucht haben? –

+0

Bevor ich diese Definition gefunden habe, versuchte ich, den Ein/Aus-Parameter wie folgt zu erhalten $ gpioInput = 0; für ($ i = 0; $ i <= 7; $ i ++) { $ b = Teilstr ($ gpioStr, 7 - $ i, 1); if ($ b! = "0") { $ gpioInput | = (1 << $ i); } } – RonEskinder

+0

Bitte bearbeiten Sie Ihren ursprünglichen Beitrag, um Code und/oder neue Informationen hinzuzufügen. http://stackoverflow.com/help/mcve –

Antwort

1

Mein Verständnis Sie Zugang zu einem „globalen“ Wert zu erhalten versucht, die $gpioInput |= (1 << $i); eine Aggregation aller Felder ist: Wenn es so ist, und es ist „Aus“, wenn jede Ziffer ist Null, dann sollte der nächste Code hilfreich sein.

<?php 

const TK207_MAIN_POWER_ON = 0; 
const TK207_MAIN_POWER_OFF = 1; 

const TK207_ACC_CLOSE = 0; 
const TK207_ACC_OPEN = 1; 

const TK207_BLENDER_DID_NOT_START = 0; 
const TK207_BLENDER_JUST_TURNING = 1; 
const TK207_BLENDER_REVERSE_TURNING = 2; 

const TK207_VEHICLES_DID_NOT_START = 0; 
const TK207_VEHICLES_EMPTY = 1; 
const TK207_VEHICLES_HEAVY = 2; 

const TK207_FRONT_DOOR_DID_NOT_START = 0; 
const TK207_FRONT_DOOR_OPEN = 1; 
const TK207_FRONT_DOOR = 2; 

const TK207_OFF_THE_OIL_OFF = 0; 
const TK207_OFF_THE_OIL_RECOVERY = 1; 

const TK207_STATE_ARM = 0; // ??? 
const TK207_STATE_DISARM = 1; // ??? 

//------------------------------- 

function isOn($str) { 
    return (int)array_reduce(str_split($str), function($carry, $item) { 
      $carry &= (bool)$item; 
      return $carry; 
    }, 1); 
} 

function getValues($str) { 
    return str_split($str); 
} 

function getOnOffValues($str) { 
    return array_map(function ($item) { 
     return (int)(bool)$item; 
    }, str_split($str)); 
} 

//------------------------------- 

$offStr = '11210211'; 
$onStr = '11211211'; 

echo isOn($offStr); // off 

echo isOn($onStr); // on 

list($mainPower, $acc, $blender, $vehicles, $frontDoor, $oil, $armDisarm) = getValues($onStr); 
var_dump([$mainPower, $acc, $blender, $vehicles, $frontDoor, $oil, $armDisarm]); 

list($mainPower, $acc, $blender, $vehicles, $frontDoor, $oil, $armDisarm) = getOnOffValues($offStr); 
var_dump([$mainPower, $acc, $blender, $vehicles, $frontDoor, $oil, $armDisarm]); 
0

ich fehlen könnte grundlegend hier etwas retreive, aber Von dem, was ich aus der Definition verstehen kann, scheint es ziemlich einfach zu sein: Jeder IO-State-Wert ist eine Folge von 8 Bits, die als String-Wert anstelle eines normalen Bytes zurückgegeben wird.

nehmen Sie die erste Zeile des Beispiels bereitgestellt und es 90 Grad zur besseren Lesbarkeit drehen:

0 <- Fill digit. 
1 <- Main power: Off. 
0 <- ACC: Closed 
0 <- Blender: Did not start 
0 <- Empty/Heavy: Did not start. 
0 <- Front door: Did not start. 
0 <- Oil state 
0 <- Arm/disarm 

Dann tun genau das gleiche gilt für die drei anderen Linien.

Ein schneller Weg, um es zu einem Array zu machen, ist mit str_split(). Das macht es ein wenig leichter zu durchqueren oder zu manipulieren, wenn es nötig ist.

0

Es ist ein String-Typ, kein binärer Typ, der vom Dienst zurückgegeben wird. So kann es Ihnen gefällt Griff:

foreach(str_split($gpioStr,8) as $gpioStrLine){ 
    // $gpioStrLine[0]<- Fill digit. 
    // $gpioStrLine[1]<- Main power. 
    // $gpioStrLine[2]<- ACC 
    // $gpioStrLine[3]<- Blender 
    // $gpioStrLine[4]<- Empty/Heavy. 
    // $gpioStrLine[5]<- Front door. 
    // $gpioStrLine[6]<- Oil state 
    // $gpioStrLine[7]<- Arm/disarm 
} 
Verwandte Themen