php - 从 TCP 数据格式化 N_STRING 参数

标签 php tcp gps format

我有一个 GPS 设备通过 TCP 向我的服务器(带有 PHP 监听器的 Linux)发送数据包,我有所有的参数,除了一个,I/O 状态。

tk207 协议(protocol)将该参数定义为:

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)。

我得到的值像这样已编辑*

01000000
01000001
11000000
11000001

但我不知道如何从该字符串中获取 7 个参数。

我们将不胜感激。

编辑: 在我对字段进行定义之前,我正在查看一些有关如何从该字段中检索开/关值的示例

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

最佳答案

我的理解是您试图访问“全局”值,该值是所有字段的聚合 $gpioInput |= (1 << $i);如果是这样,并且当任何数字为零时它为“关闭”,那么下一个代码应该会有所帮助。

<?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]);

关于php - 从 TCP 数据格式化 N_STRING 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40244488/

相关文章:

tcp - 轻量级应用程序级别确认

android - 在哪里保存 Android GPS(纬度,经度)点?

java - 当用户在某个地方时,我该如何使用他们的位置?这个地方会根据位置触发一个 Action

用于GPS轨迹预处理的Python库?

php - 在php上多次运行mysql查询但条件不同

php - 每个单词的哈希输出都相同

php - 获取数组中重复值的键

php - 如果已分配给 orderno,则选择不显示的查询

python - 如何将 asyncio 任务添加到 pyqt5 事件循环,以便它运行并避免从未等待的错误?

c# - 理解正确的 http keep-alive 实现