Virtual Serial Port loopback для Mac OS X
Не могу не порадоваться за себя и порадовать своих редких читателей. На сей раз целью разработки стал драйвер для Mac OS X.
Немного предистории. Не так давно из вполне определенных концептуальных соображений я заменил на своей станционарной радиостанции компьютерный интерфейс. В контексте данной предметной области компьютерный интерфейс - это такая коробочка, которая имеет в себе звуковую карту, несколько специфичных последовательных портов и еще кое-какую дребедень. Все для того, чтоб было удобно работать с радиостанцией разным компьютерным программам.
Был интерфейс RigExpert (вернее, он есть, но теперь предназначен для "походной" станции), в котором, как и в большенстве других разработчики просто сделали обвязку поверх стандарных чипов - не требуется никаких специальных программ и драйверов, все стандартно.
В свою очередь, заменил я его на интерфейс от microHAM. Прекрасный качественный интерфес. Причиной замены стало наличие функции "прозрачного" от компьютерных программ декодирования частоты.
В любительском радио есть стандарт на протокол управления радиостанцией через последовательный порт - CAT (Computer Assister Transceiver), который, помимо всего прочего, позволяет "снимать" текущую настроеную частоту. Эта часотота нужна много где еще: в моем случае это декодер диаппазонов, автоматически переключающий антенны, или усилитель, которого у меня нет. Все они должны получать данные одновременно с программами, а при наличие всего одного CAT-интерфейса на радиостанции это непозволительная роскошь.
Так вот, все обычные интерфейсы не умеют так "прозрачно" делиться информацией о частоте, а microHAM умеет. И вроде бы все великолепно, если бы не одно "но". У него нестандарный интерфейс для программ. Да, торчит обычный последовательный USB-порт FTDI, но на нем передаются не "голые" комманды трансивера, а свой протокол. Ко всему прочему, компания microHAM не поддерживает официально операционных систем, отличных от Windows (для которой в стандартном ПО реализуются виртуальные последовательные порты), но они взаимодействуют со разработчиками для поддержки других ОС. Так для Mac OS X есть решение - uH Router, о котором я уже писал. Решение хорошее и открытое, но требующее поддержки своего API со стороны третих программ. В свою очередь, эти самые разработчики радиолюбительского софта, весьма редкие для Mac OS, зачастую не стремяться поддержать этот API. Ну да не проблема - API просто позволяет обратиться к нужному физическому порту устройства на отдельных UNIX pipe. Есть скриптовые языки вроде PHP, которые позволяют реализовать обращение к этому API, и замечательная утилита socat, перенаправляющая какие угодно потоки куда угодно...
И тут выплывает проблема совершенно другого рода: на столько Mac OS X является *NIX системной, на столько же она ей не является. Вы не найдете привычных для себя /proc на файловой системе, а в /dev присутствуют только стандартные для BSD устройства вроде блочных, терминалов, последовательных портов и и.д. Доступ по всему остальному осуществляется через проприетарный IOKit Framework. Большенство программ для Cocoa использует его для перечисления устройств, в частности - последовательных портов. Так что ситуация выглядит так, что стандартное *NIX решение для реализации виртуальных петлевых устройств - PTY, хоть и имеется в OS X, но никак не работает с большинством программ. Я потратил уйму времени на поиски готового решения на различных форумах, но если PTY не прокатывало - дело не шло, только общие слова вроде "разработайте свой драйвер". Соответственно, пришлось заняться именно этим.
И вот, встречайте - драйвер готов. Сейчас провожу тестирование и рассматриваю вариант его распостранения через App Store. Никак не могу не направить луч поноса в сторону яблочной компании за крайне скудную и неактуальную документацию и даже ее отсутствие по большей части. Предположу, что большенство разработчиков, которые пытались сделать такой петлевой драйвер, бросали свои активности долбясь лбом об эту преграду. Домен IOSerialPortSync вообще не описан, 70% времени было посвещенно изучению исходных кодов уже имеющихся драйверов от Apple и исходных кодов самого kernel-овой части IOKit.
Собственно, дравер уже неделю как работает, а вчера я провел натурные испытания с трансивером. Чем спешу с вами поделиться.





Добавить комментарий