GazePoint инструмент отслеживания глаз Он использует протокол TCP для подключения. Я хочу подключиться к нему с помощью PHP. Я написал простой код PHP, но он висит на fgets
, Я также использовал packetsender для отправки и получения пакетов, но я получаю только пустые пакеты в ответ. Дело в том, что у меня есть код MatLab, который отлично работает с Gazepoint. Интересно, в чем проблема!
Код Matlab:
classdef gazept < handle
properties(SetAccess=public)
ip_address
port_number
client_socket
gx
gy
end
methods
function obj = connect(obj, ip, portnum)
if nargin < 2, ip = '127.0.0.1'; end
if nargin < 3, portnum = 4242; end
obj.ip_address=ip;
obj.port_number = portnum;
try
obj.client_socket = tcpip(obj.ip_address, obj.port_number);
set(obj.client_socket, 'InputBufferSize', 4096);
fopen(obj.client_socket);
obj.client_socket.Terminator = 'CR/LF';
gazepoint_info = strcat('Connected to:', obj.ip_address, ' on port:', num2str(obj.port_number), '\n');
fprintf(gazepoint_info);
catch err
rethrow(err);
fprintf('Make sure GazepointControl is open on host machine.');
end
end
function obj = calibrate(obj,delay)
if nargin < 2, delay = 15; end
fprintf(obj.client_socket, '<SET ID="CALIBRATE_SHOW" STATE="1" />');
pause(10);
while (get(obj.client_socket, 'BytesAvailable') > 0)
results = fscanf(obj.client_socket)
pause(.01);
end
fprintf(obj.client_socket, '<SET ID="CALIBRATE_START" STATE="1" />');
fprintf(obj.client_socket, '<SET ID="CALIBRATE_SHOW" STATE="0" />');
fprintf(obj.client_socket, '<SET ID="CALIBRATE_START" STATE="0" />');
fprintf(obj.client_socket, '<GET ID="CALIBRATE_RESULT_SUMMARY" />');
fprintf(obj.client_socket, '<SET ID="ENABLE_SEND_DATA" STATE="0" />');
pause(delay);
while (get(obj.client_socket, 'BytesAvailable') > 0)
results = fscanf(obj.client_socket)
pause(.01);
end
pause(1);
fprintf(obj.client_socket, '<SET ID="ENABLE_SEND_DATA" STATE="1" />');
end
Код PHP:
$fp = fsockopen("127.0.0.1", 4242, $erro, $errstr, 30);
if (!$fp) {
echo "$errstr ($errno)<br /><br/>";
} else {
echo "connected to 127.0.0.1:4242<br/>";
$out = '<GET ID="CALIBRATE_SHOW" />';
$res = fwrite($fp, $out);
echo "res: " . $res . "<br/>";
sleep(5);
while (!feof($fp)) {
echo fgets($fp, 128);
}
fclose($fp);
}
Проблема решена!
Мне нужно было добавить CR / LF в конец пакета. Я не знал, что такое CR / LF. Я только добавил .chr (13) .chr (10) в конец пакета. chr (13) является CR, а chr (10) является LF. Новый код выглядит так:
$fp = fsockopen("172.16.146.203", 4242, $erro, $errstr, 30);
if (!$fp) {
echo "$errstr ($errno)<br /><br/>";
} else {
echo "connected to 127.0.0.1:4242<br/>";
$delay = 15;
$out = '<GET ID="CALIBRATE_SHOW" />'.chr(13).chr(10);
$res = fwrite($fp, $out);
echo "res: " . $res . "<br/>";
sleep(5);
while (!feof($fp)) {
echo fgets($fp, 128);
}
fclose($fp);
}
Других решений пока нет …