PHP и com-порт: Как не закрывать соединение? Или, все таки JAVA?

Тема в разделе "PHP", создана пользователем Footniko, 1 окт 2012.

Модераторы: latteo
  1. Footniko

    Footniko Постоялец

    Регистр.:
    2 ноя 2011
    Сообщения:
    57
    Симпатии:
    4
    Всем доброго времени суток, господа!
    Вот уже как второй день пытаюсь обойти эту проблему. В общем, пишу php скрипт, который должен подключатся к COM-порту и отсылать/принимать с него данные(все действие происходит в AJAX режиме). Проблема заключается в том, что нужно постоянно, что бы было открыто соединение с портом, а у меня оно автоматически закрывается после отрабатывания скрипта. Как сделать так, что бы соединение было открыто до тех пор, пока не будет нажата какая то кнопка на странице. Пробую примерно так:
    PHP:
    exec("mode com3: BAUD=9600 PARITY=N data=8 stop=1 xon=off");
    $port fopen('COM3''w');
    sleep(2);
    fwrite($port, (string)$_POST["lampValue"]);
    //sleep(5);
    То есть, на главной странице мы жмем кнопки. В зависимости от нажатой кнопки, в $_POST["lampValue"] попадает соответствующее значение.
    У меня работает так:
    После нажатия кнопки, открывается соединение, ждем 2 секунды, загорается лампочка и сразу тухнет, потому что закрывается соединение.
    Должно работать так:
    После нажатия кнопки, открывается соединение, ждем 2 секунды, загорается лампочка и горит до тех пор, пока не будет нажата соответствующая кнопка на странице. Только тогда она тухнет и разрывается соединение. В то время как лампочка горит(соединение включено), мы можем отсылать/принимать какие то данные с нашего порта.
    К чему веду:
    Планирую через web-интерфейс управлять машинкой, подключенной через com-порт. На сколько это реально и удобно с PHP? Слышал, что на JAVA можно писать web-сайты. Появится ли у меня там возможность реализовать эту идею? Повторюсь, обязательно нужно через web-интерфейс. PHP я уже хоть какой то опыт имею, JAV'у в глаза не видел. Какие ваши мысли по этому поводу? Спасибо.
     
  2. zerg

    zerg

    Регистр.:
    5 май 2006
    Сообщения:
    262
    Симпатии:
    345
  3. Footniko

    Footniko Постоялец

    Регистр.:
    2 ноя 2011
    Сообщения:
    57
    Симпатии:
    4
    Демоны... мне кажется это слишком глубоко... Да и мне нужно влиять на процесс, который выполняется(в моем случае это открытое соединение с com-портом(просто while(true) не прокатит)). Не могли бы вы пример маленький привести, а то мне кажется мне оно не подойдет. Горы информации, а того, что мне нужно, не нашел.
    По сути, все что мне нужно - это что бы php не закрывал соединение с com-портом до тех пор, пока я ему не скажу. Или даже так: когда я открыл страницу - скрипт соединился с портом. Закрыл страницу - отсоединился...
    Возможно такое с php или это проблематично?
    Спасибо.
     
  4. kaktyc1

    kaktyc1

    Регистр.:
    30 апр 2008
    Сообщения:
    576
    Симпатии:
    310
    Я думаю, что все дело в том, что при завершении работы скрипта удаляются все переменные и закрываются все соединения, а рабочему скрипту передать новые данные невозможно... Отсюда делаем вывод, что нужно делать 2 скрипта на рнр: 1. постоянно запущен и в цикле читает какой либо файл, в который записываем команды (например 1- включить лампочку, 0- выключить лампочку) 2. Скрипт который доступен с браузера и принимает команды пользователя и записывает в файл.
     
    Footniko нравится это.
  5. Footniko

    Footniko Постоялец

    Регистр.:
    2 ноя 2011
    Сообщения:
    57
    Симпатии:
    4
    Так что ли?
    PHP:
    while(true) {
        include(
    'lamp.php');
        echo 
    $value;
        if(
    $value == 3)
            break;
    }
    Так не пойдет. Нельзя менять параметры динамически...( (Напомню, что параметры приходят в файл lamp.php через ajax).
     
  6. kaktyc1

    kaktyc1

    Регистр.:
    30 апр 2008
    Сообщения:
    576
    Симпатии:
    310
    PHP:
    while(true){
    $filename "flag.txt";
    $handle fopen($filename"r");
    $contents fread($handle1);
    fclose($handle);
    if(
    $contents==0){close_port()}
    if(
    $contents==1){open_port()}
    sleep(5);
    }
    ну а в lamp.php делаем запись в файл flag.txt в зависимости от пришедшего события.
     
    Footniko нравится это.
  7. Footniko

    Footniko Постоялец

    Регистр.:
    2 ноя 2011
    Сообщения:
    57
    Симпатии:
    4
    Сделал так:
    PHP:
    $port  fopen('file.txt''r');
    $port2 fopen('COM3''w');
    sleep(2);
     
    while(
    $port2) {
        
    $contents fread($port1);
        if(
    $contents == 3)
            break;
        
    fwrite($port2$contents);
    }
    fclose($port);
    Но все равно не пашет. Не влияет оно на скрипт во время его исполнения(while(true)), хотя в файл все записывается...
    Еще раз повторюсь. Вся проблема в том, что закрывается соединение с com-портом после отрабатывания скрипта. Если бы не это, я бы ввобще тему не поднимал. Есть ли какой нибудь способ изменить это, возможно в настройках php? Или, может, все таки на java пробовать?
     
  8. kaktyc1

    kaktyc1

    Регистр.:
    30 апр 2008
    Сообщения:
    576
    Симпатии:
    310
    Повторяю еще раз... Один файл должен крутиться в ВЕЧНОМ цикле, по той простой причине, что как полько он выйдет из цикла порт закроется!!! А вот с помощью второго скрипта через файл нужно управлять первым. Может хоть так дойдет... При закрытии программы (не важно на чем она написана) все ее переменные УНИЧТОЖАЮТСЯ.
     
    Footniko нравится это.
  9. Footniko

    Footniko Постоялец

    Регистр.:
    2 ноя 2011
    Сообщения:
    57
    Симпатии:
    4
    kaktyc1,
    Спасибо! Вроде получилось:
    index.php:
    PHP:
    $port2 fopen('COM3''w');
    sleep(2);
     
    while(
    true) {
        
    $port  fopen('file.txt''r');
        
    $contents fread($port1);
        if(
    $contents == 3)
            break;
        if(
    $contents == 1)   
            
    fwrite($port2'1');
        if(
    $contents == 0)   
            
    fwrite($port2'0');   
    }
    fclose($port);
    fclose($port2);
    lamp.php:
    PHP:
    $file fopen('file.txt''w');
    fwrite($file$_POST["lampValue"]);
     
    fclose($port);
    Только, правда, почему то, красная лампочка загорается на платке при запуске этого скрипта, как будто в нее постоянно какие то параметры записываются... Ну, ладно, ерунда, разберусь с этим.
    Это только лампочка, а что будет, когда нужно будет управлять моторчиками...)
    Хотя, как по мне - это самый важный шаг, а то я уже думал что на пхп этого не реализовать...

    А, теперь понятно, я же сам в цикле это и делаю)
    Так будет правильнее:
    PHP:
    $port2 fopen('COM3''w');
    sleep(2);
     
    while(
    true) {
        
    $port  fopen('file.txt''r');
        
    $contents fread($port1);
        if(
    $contents == 3)
            break;
        if(
    $contents == 1)    {
            if(isset(
    $mem) && $mem == 1)
                continue;
            else    {   
                
    $mem 1;
                
    fwrite($port2'1');
            }   
        }   
        if(
    $contents == 0)    {
            if(isset(
    $mem) && $mem == 0)
                continue;
            else    {   
                
    $mem 0;
                
    fwrite($port2'0');
            }   
        }   
    }
    fclose($port);
    fclose($port2);
     
  10. Alsou

    Alsou Писатель

    Регистр.:
    23 ноя 2013
    Сообщения:
    9
    Симпатии:
    0
    Здравствуйте.)))))Можно здесь уточнить некоторые моменты?
    Я попыталась реализовать, почти так же, как здесь написано, только вместо лампочки я решила использовать принтер, т.е я пыталась включать и выключать его, но он не реагировал на мои команды. Вначале я создала кнопки и в скрипте для кнопки «включить» я присвоила переменной lampValue значение «1», а для кнопки «выключить» lampValue="0".
    т.е у меня вышло 2 скрипта для кнопок:
    vkl.php:
    PHP:
    <?php
    function pressAnyKey() {
        
    $lampValue="1";
    }
    ?>
    vikl.php:
    PHP:
    <?php
    function pressSomeKey() {
        
    $lampValue="0";
    }
    ?>
    Затем я вставила два скрипта index.php и lamp.php в html файл, содержимые скриптов такое же как описывалось в этой теме.
    В общем у меня получилось:
    HTML:
    <p align="center"><p align="right"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
    <head>   
    <!--#include virtual="vkl.php" -->
    <!--#include virtual="vikl.php" -->
    <!--#include virtual="lamp.php" -->
    <!--#include virtual="index.php" -->
    <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />   
    <meta name="author" content="" />    <title>Untitled 3</title> 
    <link href="css/main.css" rel="stylesheet" type="text/css"/></head>
    <body><div id="page_align" class="b3radius">
      <div id="header">
    <div id="header_nav"><ul><li><a href="a">Главная</a></li>
    <li><a href="a">Климат-контроль</a></li>
    <li><a href="a">Кормление</a></li>
    </ul>
    <div id="content" class="f_right">
    <div id="c_right f_right">
    <input type="button" value="Вкл" name="button" class="push_but" onclick="pressAnyKey()" />
    <input type="button" value="Выкл" name="btn" class="push_btn" onclick="pressSomeKey()" />
    </div>
    </div>
    </div>
    <div id="sidebar"></div><div id="content">Сайт.</div>
    <div class="clr"></div></div></body></html></p></p>
    
    Только вот прога почему-то не пашет(((((
    Может дело в кнопках, может я им не ту переменную присвоила?))))Буду очень признательна за ответ))))))