Форум обсуждения систем  

Вернуться   Форум обсуждения систем "Умный дом", проектов Ардуино, OpenWRT и других DIY устройств > Форум умного дома > Сделай сам > Открытый проект умного дома

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 20.12.2012, 04:53   #11
andr128
Senior Member
 
Аватар для andr128
 
Регистрация: 16.09.2012
Адрес: Irkutsk
Сообщений: 555
Вес репутации: 1605
andr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond repute
По умолчанию

Отлично наш человек!
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_INETSOCK_STREAMSOL_TCP);
  
$result socket_connect($socket$address$port);

  
$msg "hello server!";

  
socket_write($socket$msgstrlen($msg)); //Сообщение серверу
  
  
$out socket_read($socket1024PHP_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_INETSOCK_STREAM0); //создание сокета
    
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 *)&addrsizeof(addr)) < 0) { perror("bind"); exit(2); }

    
listen(list_fd1); //слушать соединения на сокете, 1 - возможн. кол-во соединений


// главный цикл    
while(1)
{
        
sock_fd accept(list_fdNULLNULL); //
        
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;

        
// Ждём события в одном из сокетов
        
selvarselect (sock_fd+1, &readsetNULLNULL, &timeout);
    if (
selvar <= 0) { perror("select"); exit(3); } 
    else {
        if ( 
FD_ISSET(sock_fd, &readset) )
        {
        
bytes_read recv(sock_fdbuf10240); // получаем данные из сокета 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_readbuf);


        
count++; if (count 0xFFFEcount=0// просто счетчик
        //itoa(count, str, 10);
        
sprintf(str"%6u"count); //преобразовать число в строку

//        send(sock_fd, sendstr, strlen(sendstr), 0);
        
send(sock_fdstrstrlen(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. Поэтому скомпилированные вами программы могут не запускаться.
Хотя если использовать библиотеки от нашей версии то...

Последний раз редактировалось andr128; 20.12.2012 в 15:08.
andr128 вне форума   Ответить с цитированием
 


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Текущее время: 01:02. Часовой пояс GMT +3.


Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd. Перевод: zCarot
Яндекс.Метрика