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

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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 20.12.2012, 04:53   #1
andr128
Senior Member
 
Аватар для andr128
 
Регистрация: 16.09.2012
Адрес: Irkutsk
Сообщений: 555
Вес репутации: 1606
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 вне форума   Ответить с цитированием
Старый 20.12.2012, 17:19   #2
zuriuslev
Junior Member
 
Регистрация: 19.12.2012
Адрес: Марбелья
Сообщений: 18
Вес репутации: 0
zuriuslev has a reputation beyond reputezuriuslev has a reputation beyond reputezuriuslev has a reputation beyond reputezuriuslev has a reputation beyond reputezuriuslev has a reputation beyond reputezuriuslev has a reputation beyond reputezuriuslev has a reputation beyond reputezuriuslev has a reputation beyond reputezuriuslev has a reputation beyond reputezuriuslev has a reputation beyond reputezuriuslev has a reputation beyond repute
По умолчанию

Цитата:
Сообщение от andr128 Посмотреть сообщение
По поводу компиляции под роутер. Мы тут все подсажены на версию trunk r33482. Поэтому скомпилированные вами программы могут не запускаться.
Хотя если использовать библиотеки от нашей версии то...
Спасибо за примеры и образцы программ.
Сейчас задумался об использовании LUA.
Оно всё родное для OpenWRT и вторым HTTP сервером железяку напрягать не придётся.
Сижу ковыряюсь с тулзами для биндинга библиотек в LUA
Пробую разную хрень отсюда
Может Вы в курсе, что наиболее юзабельно ?

А для транка скомпилить, это разве проблема ?
Могу начинающим расписать процедуру ...

Последний раз редактировалось andr128; 29.06.2013 в 16:59.
zuriuslev вне форума   Ответить с цитированием
Старый 20.12.2012, 18:42   #3
andr128
Senior Member
 
Аватар для andr128
 
Регистрация: 16.09.2012
Адрес: Irkutsk
Сообщений: 555
Вес репутации: 1606
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
По умолчанию

Цитата:
Сообщение от zuriuslev Посмотреть сообщение
Спасибо за примеры и образцы программ.
Сейчас задумался об использовании LUA.
Оно всё родное для OpenWRT и вторым HTTP сервером железяку напрягать не придётся.
Сижу ковыряюсь с тулзами для биндинга библиотек в LUA
Пробую разную хрень отсюда.
Может Вы в курсе, что наиболее юзабельно ?
Я так понял это web-сервер.
кстати ссылку не верно дали: (_http://http//lua-users.org/wiki/BindingCodeToLua)
Нет не ковырялся. Я вообще не ставил люси нафиг нужно, только место занимать (как раз одна из проблем нехватки места во флэш на mr3020, на версиях др. прошивок где встроен люси, не удается даже установить поддержку usb флэшек). Все что надо, настраивается через терминал в сочетании с WinSCP легко. Если кому нужен LUCI - можно доставить потом, уже на внешнюю флэшку.
Я понимаю так, чтобы не выдумывать свой интерфейс (и облегчить себе жизнь ) для упраления ардуино вы решили сделать его на базе LUI.
Может это и правильно. Не знаю, попробуйте, если получится пожалуйста напишите. Я пока еще плохо разбираюсь в Web технологиях, поэтому стараюсь изучать пока стандартные пути PHP, Java, CSS.


Цитата:
А для транка скомпилить, это разве проблема ?
Могу начинающим расписать процедуру ...
Не проблема, но лучше бинарники не выкладывать от др. версий OpenWrt т.к. могут быть проблемы при запуске. Тут и так люди мучуются устанавливают прошивку одну, а потом не могут установить программы от др. версии. Поэтому мы дружно решили сидеть на одной, уже проверенной версии прошивки и соответственно репозитории от неё.

Как компилировать напишите конечно и желательно с нуля (какие пакеты ставить, настройки компиляции и т.д и т.п.), именно под конкретный транк (r33482), будет очень полезно. Я думаю многие скажут спасибо. К тому же многие тут озадачены стыковкой роутера с ардуиной, а знаний не хватает. Многие линукса не знают, а тут такое непонятное кросскомпиляция
andr128 вне форума   Ответить с цитированием
Ответ


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

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

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

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


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


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