Модераторы: Aliance, skyboy, MoLeX, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с железом через serproxy и сокеты. hardware -> serproxy -> socket 
:(
    Опции темы
xZ0RGx
Дата 5.6.2009, 03:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 5.6.2009

Репутация: нет
Всего: нет



Здравствуйте!

Есть у меня интересная задачка. Суть в следующем.

Имеется железка подключенная к COM-порту. С этой железкой надо общаться по её собственному протоколу. Т.е. я посылаю данные на COM-порт, затем должен получить ответ от железки и т.д. Принцип вопрос-ответ. Проблема в том, что мне надо написать это на PHP. Да, я знаю, что я извращенец, можете не говорить  smile

Для PHP есть замечательный класс PHPSerial, но вот беда в винде не работает чтение из порта и предлагают использовать serproxy например. Ну что же послушаемся совета. Serproxy - я так понимаю ловит все данные "прилетающие"  на указанный порт (в конфиге), например для COM1 это 5331 и посылает их на COM-порт.
Ну своеобразный уровень абстракции, прокладка эдакая.

Ну так вот. Я так понимаю, чтобы работать теперь с моей железкой с помощью serproxy мне надо для начала установить соединение через сокет, а затем послать данные в этот поток.

Нюанс: Данные железке надо посылать в виде специально сформированного пакета в HEX.

Код

<?php
$fp = fsockopen("127.0.0.1", 5331, $errno, $errstr, 10);
$out = "0203063041B3";
fwrite($fp, $out);
echo fread($fp, 4096);
fclose($fp);
?>


Вот такой простейший пример кода. Сразу оговорюсь, раньше никогда не работал с сокетами на PHP.

Я правильно понимаю, что:

fsockopen() - осуществляет коннект на указанный порт (открывает сокет)?

fwrite - отправляет данные на указанный порт (пишет в поток), т.е. по сути выполнив fwrite я отправлю данные на нужный мне порт, где их словит serproxy и передаст COM-порту? Т.е. по идее здесь мои данные должны доходить до железки. Но почему-то она никак не реагирует  smile Хотя я не исключаю возможность неправильной сборки пакета. Еще меня терзают смутные сомнения. Может быть HEX нельзя отправлять так чистой строкой, а для этого нужен режим передачи особый? бинарный?

fread - читает данные . Т.е. по сути здесь я должен получить ответ от железки и увидеть его в браузере, т.к. echo, но тоже тишина и ничего не получаю. Вот это меня настораживает больше всего. Даже если я отправил неверный пакет данных железка должна была ответить кодом ошибки.


Поясните мне пожалуйста непонятные для меня моменты, буду признателен smile

PM MAIL   Вверх
xZ0RGx
Дата 7.6.2009, 21:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 5.6.2009

Репутация: нет
Всего: нет



Кое что прояснилось и есть подозрение откуда ноги растут. Поставил порт сниффер.

Вот как работает с железкой родная прога.

Код

Запрос:07.06.2009 21:15:30.95364 (+1.2656 seconds)

       Данные                                           Данные(символы)
 02 03 06 30 41 B3                                 ...0A³


А вот такое вижу от PHP :(

Код

Запрос:07.06.2009 21:20:18.73564 (+9.4531 seconds)
    
                   Данные                                            Данные(символы)
 30 32 30 33 30 36 33 30 34 31 42 33               0203063041B3


Тестировалось с использованием класса PHPSerial (линк в пред. посте) таким вот кодом:

Код

<?php
include "php_serial.class.php";
$serial = new phpSerial;
$serial->deviceSet("COM1");
$serial->deviceOpen();
$serial->sendMessage("0203063041B3");
$serial->deviceClose();
?>


Также проверил serproxy. Тоже самое.

Код

Порт открыт процессом "serproxy.exe" (PID: 2828)

 30 32 30 33 30 36 33 30 34 31 42 33               0203063041B3


Не пойму в чем косяк. =(
PM MAIL   Вверх
youri
Дата 10.6.2009, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 17.4.2004

Репутация: нет
Всего: 16



тебе поможет chr ;)
p.s. а вообще у меня есть dll под windows для работы с COM-портом, надо?

Это сообщение отредактировал(а) youri - 10.6.2009, 13:39
PM   Вверх
xZ0RGx
Дата 12.6.2009, 05:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 5.6.2009

Репутация: нет
Всего: нет



В общем мне тут подсказали, что проблема в том, что как первый пример кода, так и второй посылают данные обычной строкой, а надо byte. Ну я репу почесал и запомнил. Сейчас полез в инет рыться как-бы так извернуться. И меня осенило. В общем.

Я полный кретин! smile На самом деле всё гораздо проще. pack(). Черт побери, обычный pack().   smile smile

youri: Спасибо за ответ, но уже не очень актуально smile А что за DLLка? Непосредственно для PHP?
PM MAIL   Вверх
youri
Дата 12.6.2009, 05:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 17.4.2004

Репутация: нет
Всего: 16



Цитата
А что за DLLка? Непосредственно для PHP?

php extension, могу даже с исходниками
PM   Вверх
xZ0RGx
Дата 12.6.2009, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 5.6.2009

Репутация: нет
Всего: нет



C удовольствием бы взял, посмотрел что это такое. 

Можно и с исходниками.

Я так понимаю это сторонняя библиотека которая не входит в PECL? smile

Это сообщение отредактировал(а) xZ0RGx - 12.6.2009, 21:45
PM MAIL   Вверх
youri
Дата 13.6.2009, 03:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 17.4.2004

Репутация: нет
Всего: 16



ну можешь попробовать посмотреть
p.s. не знаю как исходники соответствуют dll'ке, но расхождения должны быть не сильные
p.p.s. тебе может помочь http://msdn.microsoft.com/en-us/library/aa363196(VS.85).aspx

Это сообщение отредактировал(а) youri - 13.6.2009, 03:17

Присоединённый файл ( Кол-во скачиваний: 30 )
Присоединённый файл  serial.rar 11,30 Kb
PM   Вверх
webber
Дата 13.6.2009, 03:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 3.10.2006

Репутация: нет
Всего: нет



xZ0RGx, если не секрет скажите почему именно потребовалось на php?
PM MAIL   Вверх
xZ0RGx
Дата 19.6.2009, 01:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 5.6.2009

Репутация: нет
Всего: нет



youri: Спасибо большое. Я так понимаю надо положить ее в папку ext и затем подключить в php.ini модулем, типа zend_extension_ts = <full path to php ext folder>\php_serial.dll. Затем подключаем файл класса к проекту и работаем уже через класс? Интересно а расширение не SWIG'ом в дллку завернули? smile

webber: да, можно и на "ты" smile Ну, потому, что пишу на php приложение вот такое. Быть может стоило выбрать и другой язык для этой цели, но php кроссплатформенный и к тому же я его неплохо знаю.

Это сообщение отредактировал(а) xZ0RGx - 19.6.2009, 01:44
PM MAIL   Вверх
youri
Дата 19.6.2009, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 17.4.2004

Репутация: нет
Всего: 16



Цитата(xZ0RGx @  19.6.2009,  01:08 Найти цитируемый пост)
Спасибо большое. Я так понимаю надо положить ее в папку ext и затем подключить в php.ini модулем, типа zend_extension_ts = <full path to php ext folder>\php_serial.dll. Затем подключаем файл класса к проекту и работаем уже через класс?

так же как с другими расширениями - положить в папку ext и подключить:
extension = php_serial.dll
можно и без класса: класс в некоторой степени показывает, как использовать эту dll'ку

Цитата(xZ0RGx @  19.6.2009,  01:08 Найти цитируемый пост)
Интересно а расширение не SWIG'ом в дллку завернули?

нет, это я его писал

xZ0RGx, а что за проект? Полностью работает под управлением веб-сервера? Рассчитан на работу в интернете?
PM   Вверх
xZ0RGx
Дата 23.6.2009, 09:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 5.6.2009

Репутация: нет
Всего: нет



а расширение только для винды я так понимаю? Пока через serproxy сделал, так как сокеты самый кросс платформенный вариант.

Цитата

нет, это я его писал


респект smile

Цитата

а что за проект? Полностью работает под управлением веб-сервера? Рассчитан на работу в интернете? 


Ну, что за проект не хотелось бы рассказывать на просторах интернета, если очень интересно могу в личку написать. Удивишься.
Пока да, работает под управлением веб-сервера только, но думаю, что можно сделать и несколько по-другому.
На работу в интернете не совсем рассчитан. Только если демка какая-то.

P.S.: А, кстати, ещё есть потребность эмуляции многопоточности. Надо в цикле опрашивать железку о её состоянии, чтобы зафиксировать когда оно изменится. Т.е. опрашиваем ее в одном потоке и когда статус железки изменился, надо как-то сказать об этом в основной поток, чтобы там обработать эвент smile Ты бы какой вариант эмуляции выбрал? Смотрел на pcntl_fork(), но он не кросс платформенный. Думаю может под никсы демона написать небольшого на PHP, а для винды просто скрипт из CLI запускать с set_time_limit(0)?!

Это сообщение отредактировал(а) xZ0RGx - 23.6.2009, 09:13
PM MAIL   Вверх
youri
Дата 23.6.2009, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 17.4.2004

Репутация: нет
Всего: 16



Цитата(xZ0RGx @  23.6.2009,  09:06 Найти цитируемый пост)
а расширение только для винды я так понимаю?

да


Цитата(xZ0RGx @  23.6.2009,  09:06 Найти цитируемый пост)
Ну, что за проект не хотелось бы рассказывать на просторах интернета, если очень интересно могу в личку написать. Удивишься.

интересно


Цитата(xZ0RGx @  23.6.2009,  09:06 Найти цитируемый пост)
А, кстати, ещё есть потребность эмуляции многопоточности

так тебе ж получается скорее event'ы нужны, а не многопоточность. Под unix - это сигналы, как я понимаю. Есть еще вариант делать все это в том же потоке (возможно с помощью асинхронных вызовов). Но может лучше и демон, правда почему под windows "скрипт из CLI запускать с set_time_limit(0)" и как он работать будет. Ты, наверное, имеешь в виду, под windows тоже демон написать. Я бы посмотрел (подумал), как оно будет выглядеть в одном потоке, но скорее писал бы демона
p.s. остерегайся циклических ссылок при длительной работе php-скриптов
PM   Вверх
xZ0RGx
Дата 28.6.2009, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 5.6.2009

Репутация: нет
Всего: нет



youri, отписал в личку.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Сеть | Следующая тема »


 




[ Время генерации скрипта: 0.0826 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.