Я работаю над некоторыми простыми средствами домашней автоматизации, используя Raspberry Pi. На Pi у меня работает Java-сервер, который может взаимодействовать с выводами GPIO на основе команд, которые он получает. Затем я планирую создать веб-интерфейс с использованием jQuery и PHP для взаимодействия с сервером Java. Пользователь может нажать кнопку на веб-странице, и этот запрос будет обработан с помощью PHP, который установит соединение с сервером Java через сокет. PHP запишет команду на сервер Java на основе ввода пользователя.
Проблема, с которой я столкнулся, заключается в том, что мой PHP-код, работающий на сервере Apache, расположенном на Pi, не будет подключаться к сокету Java. Я получаю сообщение об ошибке «невозможно подключиться [110] истекло время ожидания подключения». С сервером Java, работающим на Pi, я могу подключиться к серверу с клиентом Java с другого компьютера и подключиться к серверу Java через PHP, работающий на моем ноутбуке (обратите внимание, что клиентский код PHP, который я запускал, был одинаковым на обоих машины).
Это приводит меня к мысли, что проблема заключается в том, что PHP работает на самом Pi. Существуют ли какие-либо настройки, включающие разрешения или что-то подобное, которые мешали бы мне иметь возможность подключаться к серверу Java из PHP на Pi?
Кажется, я ничего не могу найти, чтобы предположить, в чем заключается моя проблема. Как я уже сказал, я считаю, что проблема заключается в самом движке PHP, который работает на Pi. Я понятия не имею, какие настройки могут быть причиной этой проблемы. Я не собираюсь публиковать какой-либо код, потому что я подтвердил, что он на самом деле работает как задумано.
Вот Java-сервер, который работает на Raspberry Pi.
ServerSocket welcomeSocket = new ServerSocket(20222);
System.out.println("Server listening for connections");
while(true)
{
Socket connectionSocket = welcomeSocket.accept();
System.out.println("Client Has Connected");
BufferedReader input =
new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
clientCommand = input.readLine();
}
Клиент PHP, который работает на Pi. К вашему сведению, местный адрес Пи 10.0.0.27
Я пытался изменить $HOST
переменная к localhost
а также 0.0.0.0
все без эффекта.
$PORT = 20222; //the port on which we are connecting to the "remote" machine
$HOST = "10.0.0.27"; //the ip of the remote machine (in this case it's the same machine)
$sock = socket_create(AF_INET, SOCK_STREAM, 0) //Creating a TCP socket
or die("error: could not create socket\n");
$succ = socket_connect($sock, $HOST, $PORT) //Connecting to to server using that socket
or die("error: could not connect to host\n");
$text = "Hello, Java!"; //the text we want to send to the server
echo "Connected to Server...";
socket_write($sock, "test" . "\n", strlen($text) + 1) //Writing the text to the socket
or die("error: failed to write to socket\n");
После запуска сервера Java и выполнения sudo netstat -tnlp
Я получаю этот вывод.
pi@raspberrypi ~ $ sudo netstat -tlnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 2427/sshd
tcp 0 0 0.0.0.0:20222 0.0.0.0:* LISTEN 29175/java
tcp 0 0 0.0.0.0:5900 0.0.0.0:* LISTEN 2508/Xtightvnc
tcp 0 0 0.0.0.0:5901 0.0.0.0:* LISTEN 2463/Xtightvnc
tcp 0 0 0.0.0.0:6000 0.0.0.0:* LISTEN 2508/Xtightvnc
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 2208/apache2
tcp 0 0 0.0.0.0:6001 0.0.0.0:* LISTEN 2463/Xtightvnc
Когда PHP-клиент на Pi пытается подключиться, он просто отключается по таймауту. Если я запустил на своем ноутбуке тот же PHP-клиент, который находится в той же сети, что и пи, и просто изменил $HOST
Переменная на адрес Пи, я могу без проблем подключиться и записать в сокет TCP. Кажется, что сервер Java работает и слушает, как и должно. Я утверждаю, что проблема с php работает на Pi.
Задача ещё не решена.
Других решений пока нет …