У меня есть TCP-сервер для подключения к устройству IOT, которое отправляет данные на сервер в формате XML. Я написал код сервера PHP и прочитал входные данные из клиентского IOT и сохранил их в журнале.
Проблема:
Ввод IOT XML содержит множество данных xml, разделенных символом «/ n». Теперь проблема в том, что когда я читаю входные данные сокета, он не принимает все входные данные IOT XML. Прекращает чтение после после получения «/ n».
Что мне нужно сделать, чтобы прочитать все входящие данные на сервере сокетов, включая «/ n» и все?
Вот мой код сервера сокетов:
<?php
// set some variables
$host = "XXXXXXXXXXX";
$port = 5008;
// don't timeout!
set_time_limit(0);
// create socket
$socket = socket_create(AF_INET, SOCK_STREAM, 0) or die("Could not create socket\n");
// bind socket to port
$result = socket_bind($socket, $host, $port) or die("Could not bind to socket\n");
// start listening for connections
$result = socket_listen($socket, 3) or die("Could not set up socket listener\n");
// accept incoming connections
// spawn another socket to handle communication
$spawn = socket_accept($socket) or die("Could not accept incoming connection\n");
// read client input
while ($input = socket_read($spawn, 15360, PHP_BINARY_READ) or die("Could not read input\n")) {
$file = date("Ymd")."_uid.txt";
// clean up input string
$input = trim($input);
// $xml = simplexml_load_string($input);
// $json = json_encode($xml);
file_put_contents($file, $input, FILE_APPEND | LOCK_EX);
echo "[" . $input . "]";
// reverse client input and send back
$output = strrev($input);
socket_write($spawn, $output, strlen ($output)) or die("Could not write output\n");
if ($input != "") {
break;
}
}
// close sockets
socket_close($spawn);
socket_close($socket);
?>
И входной формат XML
<?xml version="1.0"?><Message><TerminalType>M50</TerminalType> <DeviceUID>037f6c</DeviceUID> <TerminalID>1</TerminalID> <DeviceSerialNo>69201707250004</DeviceSerialNo> <TransID>0</TransID> <Event>TimeLog</Event> <Year>2017</Year> <Month>11</Month> <Day>22</Day> <Hour>9</Hour> <Minute>54</Minute> <Second>44</Second> <UserID>4</UserID> <AttendStat>Duty On</AttendStat> <VerifMode>FP</VerifMode> <JobCode>0</JobCode> <APStat>None</APStat> <Photo>No</Photo> </Message>
Что не так с моим кодом? Я не могу получить весь журнал IOT.
Задача ещё не решена.
Других решений пока нет …