2016-10-25 2 views
1

У меня есть устройство GPS, отправляющее пакеты на мой сервер (Linux с помощью PHP-прослушивателя) через TCP, у меня есть все параметры, кроме одного, состояния ввода-вывода.Формат параметра N_STRING из данных TCP

Протокол tk207 определяет, что параметр, как это: определение

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: Содержит цифры строку символов 0.9. Когда фиксируйте цифры, заполните ASCII-код 0 (Ox30H) слева для отсутствия цифры, за исключением специальной инструкции.

Я получаю значения, как это EDITED *

01000000 
01000001 
11000000 
11000001 

Но я не в состоянии понять, как получить 7 параметров из этой строки.

Любая помощь будет оценена по достоинству.

EDIT: Прежде чем я имел определение о поле, я смотрел на некоторые примеры того, как извлечь включения/выключения значение из этого поля

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

Вы можете поделиться тем, что вы пробовали? –

+0

Прежде чем я нашел это определение, я пытался получить параметр включения/выключения, как этот $ gpioInput = 0; для ($ i = 0; $ i <= 7; $ i ++) { $ b = substr ($ gpioStr, 7 - $ i, 1); if ($ b! = "0") { $ gpioInput | = (1 << $ i); } } – RonEskinder

+0

Пожалуйста, отредактируйте исходное сообщение, чтобы добавить код и/или новую информацию. http://stackoverflow.com/help/mcve –

ответ

1

Мое понимание вы пытались получить доступ к «глобальной» стоимости, которая представляет собой совокупность всех полей $gpioInput |= (1 << $i); Если это так, и это «Off», когда любая цифра нуль, то следующий код должен быть полезен.

<?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

я мог бы что-то отсутствует основополагающий здесь, но из того, что я могу понять из определения, это выглядит довольно просто: каждое значение IO-состояния - это строка из 8 бит, возвращаемая как строковое значение вместо обычного байта.

Принимая первую строку примера вы предоставили, и повернув его на 90 градусов для удобства чтения:

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 

Тогда просто сделать то же самое для трех других линий.

Быстрый способ сделать это в массив, используя str_split(). Который мог бы сделать это немного легче, чтобы пересечься, или манипулировать при необходимости.

0

Это тип строки, а не двоичный тип, возвращаемый службой. Таким образом, вы можете справиться с этим нравится:

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 
} 
Смежные вопросы