2010-03-09 2 views
2

У меня есть программа, которая взаимодействует с оборудованием через параллельное программирование портов. я скомпилировал его и использовал его объектный файл для взаимодействия с оборудованием (простой светодиод). когда я выполняю его непосредственно на оболочке, он служит для подсвечивания светодиода, но когда я его запускаю с помощью shell_exec() в php, команда выполняется, но не может взаимодействовать с оборудованием. я совершенно смущен.работает с программой управления параллельным портом через php

+0

Вы знаете, что 'shell_exec' запускает только одну команду за раз? Может быть, я смущен. Как вы ожидаете продолжения взаимодействия с оборудованием после завершения функции? – Anthony

+0

@ Энтони: если команда только «Светодиод включен», возможно, больше не требуется взаимодействие. – Piskvor

+0

Я читал «взаимодействовать», чтобы означать «туда и обратно», как при управлении устройством за пределами начальной команды. Но я неправильно понял. Если скрипт не запускает команды оболочки, а не те, которые ему нужны, CGI полностью. Тогда перейдем к моей злой идее. – Anthony

ответ

0

Это может быть не так, но если вы собираетесь использовать PHP для аппаратного взаимодействия, я бы тоже добавил AJAX.

В основном, ваш javascript передает нажатия клавиш на сервер через функцию Ajax. Каждый раз, когда PHP получает новый запрос через javascript, он просматривает нажатие клавиши в массиве предварительно написанного набора команд shell_exec() и запускает один для этого нажатия клавиши.

Попросите javascript прослушать нажатия клавиш, и массив команд оболочки напрямую коррелирует с каждым возможным нажатием клавиши (или комбинацией штрихов, если вы можете получить фантазию).

Я бы начал с чего-то очень простого, например, точек и тире, но я уверен, вы можете быстро стать очень классными.

1

Если ваш PHP-скрипт работает как другой пользователь (например, если вы запустили его как модуль Apache, он может быть пользователем apache), он может не иметь того же доступа к HW, что и при входе в систему как самостоятельно. Проверьте разрешения, необходимые для взаимодействия с параллельным портом.

+0

Если shell_exec вообще не стреляет, он должен запустить сценарий в режиме CGI. Я думал, что он говорит, что только уволил команду, но после этого не дал ему никакого взаимодействия. – Anthony

+0

Он утверждает, что «команда выполнена, но не может взаимодействовать с аппаратным обеспечением», что для меня также звучит как проблема с разрешениями. Скрипт, вероятно, будет запущен как пользователь apache, а apache не будет иметь необходимых прав. Поэтому либо он должен создать скрипт-оболочку, то есть. setuid bit set или демона, который взаимодействует с HW и вызывает это из PHP, или предоставить пользователю apache (или любому другому пользователю скрипт PHP) соответствующие разрешения. Проверка/var/log/messages для сообщений об ошибках также может помочь найти фактическую причину сбоя скрипта. – wimvds

0

Я установил бы какой-то сервер сокетов на хост, подключенный к параллельному порту, и предоставил сокет домена, с которым мог разговаривать PHP. Это действительно единственный способ борьбы с потоковым вводом-выводом по протоколу RESTful.

Как Anthony mentioned, немного AJAX сделало бы это довольно плавным, насколько это было у пользователя.

Это позволяет использовать простые сокеты PHP для подключения, отправки, получения ответа, отображения, а затем стирания/полоскания/повторения на запрос. Намного проще, чем работать с shell_exec().

Смежные вопросы