Отлично наш человек!
PHP хорошо работает через сокеты.
Вот пример клиента:
PHP код:
<?php
header('Content-Type: text/plain; charset=utf-8 '); //Мы будем выводить простой текст
set_time_limit(0); //Скрипт должен работать постоянно
ob_implicit_flush(); //Все echo должны сразу же выводиться
$address = 'localhost';
$port = 3425;
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
$result = socket_connect($socket, $address, $port);
$msg = "hello server!";
socket_write($socket, $msg, strlen($msg)); //Сообщение серверу
$out = socket_read($socket, 1024, PHP_BINARY_READ); //Читаем сообщение от сервера
// echo "Сообщение от сервера: $out\n"; //Выводим сообщение от сервера
//здесь можно задать массив с данными, получив их с сервера.
$n = array("id" => 56,
"val1" => "off",
"val2" => "on",
"val3" => 129,
"val4" => "0",
"server" => $out,
"time" => date("H:i:s"));
echo json_encode($n);
//Останавливаем работу с сокетом
if (isset($socket)) {
socket_close($socket);
}
?>
Пример сервера для работы с сокетами:
PHP код:
//gcc serv_select.c -o serv_select
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
#include <unistd.h> /* UNIX standard function definitions */
#include <fcntl.h> /* File control definitions */
#include <errno.h> /* Error number definitions */
#include <termios.h> /* POSIX terminal control definitions */
int PORT_SERV = 3425;
char sendstr[] = "I'm Server port 3425";
char str[10];
int count = 0;
int main() {
int sock_fd;
int list_fd;
int selvar;
struct sockaddr_in addr;
char buf[1024];
int bytes_read;
list_fd = socket(AF_INET, SOCK_STREAM, 0); //создание сокета
if (list_fd < 0) { perror("socket"); exit(1); }
// fcntl(list_fd, F_SETFL, O_NONBLOCK); //не блокируемый сокет
addr.sin_family = AF_INET; //тип соединения
addr.sin_port = htons(PORT_SERV); //порт
addr.sin_addr.s_addr = INADDR_ANY; //принимать соед. с любого адреса
//связывание сокета с адресом, портом ..
if ( bind(list_fd, (struct sockaddr *)&addr, sizeof(addr)) < 0) { perror("bind"); exit(2); }
listen(list_fd, 1); //слушать соединения на сокете, 1 - возможн. кол-во соединений
// главный цикл
while(1)
{
sock_fd = accept(list_fd, NULL, NULL); //
if (sock_fd < 0) { perror("accept"); close(sock_fd); return -1; }
while(1) {
// Заполняем множества дискрипторов
fd_set readset; // type
FD_ZERO(&readset); // очистить набор всех дискрипторов
FD_SET(sock_fd, &readset); // включить в набор файловый дискриптор сокета
// Задаём таймаут
struct timeval timeout;
timeout.tv_sec = 1;
timeout.tv_usec = 0;
// Ждём события в одном из сокетов
selvar= select (sock_fd+1, &readset, NULL, NULL, &timeout);
if (selvar <= 0) { perror("select"); exit(3); }
else {
if ( FD_ISSET(sock_fd, &readset) )
{
bytes_read = recv(sock_fd, buf, 1024, 0); // получаем данные из сокета sizeof(buf)
if (bytes_read <= 0) {printf("Bytes: %d\n", bytes_read); close(sock_fd); break; } // Соединение разорвано или ошибка
buf[bytes_read]=0; //добавить в конец 0
printf(" bytes: %d read str: %s\n", bytes_read, buf);
count++; if (count > 0xFFFE) count=0; // просто счетчик
//itoa(count, str, 10);
sprintf(str, "%6u", count); //преобразовать число в строку
// send(sock_fd, sendstr, strlen(sendstr), 0);
send(sock_fd, str, strlen(str), 0); //в ответ будем посылать счетчик
}
}
printf(" Cycle osn\n");
} //осн. цикл
printf(" Cycle MAIN\n");
} //гл. цикл
return 0;
}
Добавьте в этот код работу с модбас и будет у вас свой шлюз.
Код:
Arduino (slave) <---> Modbus RTU (Master) - Sokcet TCP(Server) <---> PHP Socket TCP (Client) -- Web страница
По поводу компиляции под роутер. Мы тут все подсажены на версию trunk r33482. Поэтому скомпилированные вами программы могут не запускаться.
Хотя если использовать библиотеки от нашей версии то...