Доступ к последовательным портам из браузера через сервер

Преимущества такого решения:

  1. кросс-платформенность — Windows/Linux/MacOS/Android;
  2. удаленный доступ с разных компьютеров/планшетов/смартфонов;
  3. для внесения изменений не нужна перекомпиляция — достаточно перегрузить страницу;
  4. простота создания интерфейса, особенно при использовании библиотек типа jQuery.

    Например, полноценный терминал в 200 строк HTML+JS:

Недостатки:
  1. Работает не так быстро как обычные приложения. Но для простого управления типа «передать строку — получить ответ» хватает.

С учетом таких требований был разработан универсальный сервер Meerkat
Бинарные сборки находятся тут: bitbucket.org/edartuz/meerkat/downloads

Для работы нужно:
  • установить Java;
  • скачать и распаковать бинарную сборку;
  • запустить командный файл meerkat.bat/start.bat (Windows), meerkat.sh/start.sh (Linux/MacOS).


Для настройки можно задать параметры ком.строки (в формате -имя=значение).
Краткую справку по параметрам можно увидеть если запустить с ключом --help:

  • /?;-h;--help [Boolean = true] — показать помощь;
  • -p;--port [Integer = 8080] — задать рабочий порт для сервера (по умолч.8080);
  • -eto;--exit-timeout [Integer = 0] — тайм-аут остановки сервера если не было обращений, сек (0 — не используется);
  • -br;--browser [String = default] — запуск браузера при старте (none — не запускать, default — по умолчанию, или путь к программе;
  • -bd;--browser-delay [Integer = 3000] — пауза перед запуском, мс;
  • -sp;--start-page [String = index.html] — начальная страница (по умолч.«index.html»);
  • -sd;--static-dir [String = ./static] — путь к папке со статическими файлами (по умолч. "./static");
  • -std;--stop-delay [Integer = 1000] — пауза перед выходом, мс;
  • -sct;--socket-port [Integer = 502] — локальный порт для сокет-соединения.


Примерный шаблон страницы — в файле ./static/index.html (т.е. по адресу http://localhost:8080/index.html.

Также есть 2 рабочих примера: mk/eval.html — Javascript-консоль, в которой можно «поиграть» с JS-выражениями и посмотреть результаты их выполнения, и mk/term.html — терминал.

Вся работа с сервером происходит через Ajax POST — запросы.

Функции для работы с портами находятся в файле /mk/ul.mk.js, в объекте ul.mk:

  • ul.mk.exit() — остановить сервер;
  • types() — получить список типов доступных соединений (serial — посл.порты, socket — TCP-сокеты, ftdi — интерфейсы FTDI);
  • names(type) — получить список доступных портов для данного типа соединения;
  • open(id, type, name, config) — открыть порт с заданным типом и названием, присвоить соединению идентификатор id, и сконфигурировать его (config — строка в формате «параметр=значение;»), возвращает true/false;
  • opened() — получить список идентификаторов открытых соединений;
  • isOpened(id) — проверить открыто ли соединенние з данным id;
  • close(id) — закрыть соединение;
  • available(id) — количество байт в приемном буфере;
  • write(id, data) — передать строку / байтовый массив;
  • read(id, length) — прочитать length байт (если 0 то все);


Для каждого соединения также доступны ряд параметров настройки, доступ к которым — через функции:

  • ul.mk.attr.names(id) — получить список названий параметров;
  • get(id, k) — прочитать значение параметра;
  • set(id, k, v) — записать значение параметра;
  • getAll(id, asObject) — получить значения всех параметров (если asObject==false — в виде строки "имя=значение;", если true — в виде объекта);
  • setAll(id, config) — задать значения нескольких параметров, config — строка или объект.

Для последовательных портов доступны атрибуты: baud/bits/stops/parity, dtr/rts, dsr/cts/dcd/ri.
  • -2
  • 15 апреля 2013, 08:10
  • reptile

Комментарии (20)

RSS свернуть / развернуть
А можно немного поподробней?
Вообще то открывая статью рассчитывал увидеть принципы работы с ком-портом из JS или нечто вроде. А тут сказано что вот сервер, вот настройки, но что делает этот сервер и насколько он нужен для работы непонятно. Ну и причем тут ком-порт тоже не совсем ясно…
0
напрямую с портом из JS работать нельзя. Для этого нужен сервер и библиотека JS-функций.
0
теперь понятно, но лучше в статье это немного расписать. А то чайников вроде меня тут довольно много и Вы сами устанете отвечать на глупые вопросы
0
добавил в заголовок. Думал это очевидно.
0
Работать «напрямую с портом из JS» можно. Из броузера — нельзя. Из nodejs можно:
github.com/voodootikigod/node-serialport
0
ну это тот же сервер. Из клиентского JS — нельзя.
0
Но ведь с файлами клиентский JS работать может, как минимум с выбранным пользователем (а насколько я помню некоторые вирусы, то и к любому файлу доступ получить можно), а ком-порт — тот же файл. Правда, не знаю как насчет установки его параметров.
0
теоретически да, но только под .NIX, и файл должен быть явно выбран юзером.
настроить тоже нужно ручками (ioctl ессно недоступен).
0
читать только можно, и то через пень-колоду: dev.w3.org/2006/webapi/FileAPI/#blobreader-state
0
Некоторые вируслоадеры пользуются какой-то дыркой, позволяющей писать в любой файл. Кажется, какой-то подходящий COM-объект. Не кроссплатформенно это, правда.
Еще, в принципе, при желании работать с ком-портом в браузере у клиента можно использовать жаба-апплет или COM-объект, но это уже ближе к варианту с сервером.
0
недавно лазил по сайтам и искал какую-то доку. На одном из сайтов мне с вебстраницы на JS испохабило весь реестр (открытие любого браузера, а их у меня сейчас 5 штук, приводило к переходу на данную страницу и простым изменением настроек браузера на настройки по умолчанию не лечилось. Потратил 3 часа чтоб все вычистить, в результате слетела база солидворкса. Хоть и не критично, но неприятно. Так что если знать нужные дыры, клиентский JS очень даже неплохо может везде лазить.
0
можно: github.com/rogerwang/node-webkit
и не только по unix
0
«под unix»
0
ну опять таки — только Chrome, доступ с мобильных девайсов (iOs, Android) — невозможен, удаленный доступ — вроде тоже (могу ошибаться)
0
Вы определитесь сначала, что там «невозможно» и что нужно. А то, сначала «прямо из JS невозможно», потом возможно, но не из броузера, потом возможно из броузера но не с девайса.

Мысль стоит выражать точнее. Удалённый доступ к serial вообще возможен только в архитектуре клиент-сервер, на то он и удалённый. И javascript тут непричём, в любом случае. И броузер непричём.
0
не пойму о чем спор. Из стандартного клиентского — невозможно, и точка. То что Вы предлагаете — модифицированный движок, который не работает например на Андроиде.
0
Не спорю, я говорю о том, что в утверждениях надо быть точнее… Нельзя говорить «из JS невозможно», «из броузера невозможно». Потому что:

1) это возможно
2) но по условию задачи требуется совсем другое

Вот Вы ответили человеку «напрямую с портом из JS работать нельзя» — он отложит в голове это обобщённое ложное утверждение. А правильный ответ: «По условию нашей задачи, удалённое управление портом, требует наличия сервера. Поэтому только сетевыми запросами. А JS или нет — дело десятое.»

Это и будет точный ответ.
0
Претензия «только Chrome» — непонятна вообще. Для такой задачи принципиален выбор конкретного броузера?
0
На Electrotormentor автор был ещё мение многословным.
0
добавлю потом описание. Спрашивайте что непонятно, отвечу.
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.