我有一台设备将其纬度和经度作为浮点数(lat + lng)发送到Sigfox:
消息开始为-6.60276853.37419
在设备上,由于消息长度限制为12字节,我必须在float中加上micropython:
message=struct.pack('f',float(lat)) +struct.pack('f',float(lng)))
message.send
一旦到达Sigfox,回调就会以十六进制消息的形式将其发送到我的服务器:
data=e049d3c02b7f5542
而且我无法在php中解压缩原始浮点数:
<?php
$_data = $_GET["data"];
$rcvMsgHexString = $_data;
print("Received message = ".$rcvMsgHexString." [".strlen($$rcvMsgHexString)." characters]\n");
// Convert hex string back to binary string
$rcvMsgString = '';
for ($i=0; $i<8; $i++) {
$byte = substr($rcvMsgHexString,2*$i,2);
$rcvMsgString[$i] = chr(hexdec($byte));
}
print $rcvMsgString;
// Make sure to unpack in correct order: lat is at start of string
$lat = unpack( "f", $rcvMsgString, 0 );
$lng = unpack( "f", $rcvMsgString, 4 );
if ( $fl = fopen('logs.txt','a')) {
fwrite($fl,"\"msg\": { \"latitude\" : \"". $lat. "\", "
."\"longitude\" :\"" . $lng . "\" }\n" );
fclose($fl);
}
?>
lat和lng仅写为空白。有人可以帮我正确地找到原始经纬度吗?
答案 0 :(得分:1)
使用pack
将十六进制数字转换为实际的二进制数据,然后使用unpack
从二进制中提取浮点值:
$coords = unpack('flat/flon', pack('H*', $data));
echo $coords['lat'] . PHP_EOL;
echo $coords['lon'] . PHP_EOL;
详细信息:
pack('H*', ...)
从$data
读取十六进制数字,并将其转换为二进制编码数据。unpack('flat/flon', ...)
从二进制字符串读取一个浮点数,将其存储在键lat
下的结果数组中,然后从二进制字符串读取另一个浮点并将其存储在{{1}下的结果数组中}。