我有一个 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/