Mac - виртуальный последовательный порт
Мне нужно создать приложение Cocoa, которое создаст виртуальный последовательный порт, доступный для других приложений, то есть зарегистрированных в реестре IO Kit.
Суть приложения:
- Создайте виртуальный последовательный порт (указанный в /dev и зарегистрированный в реестре IOKit)
- Инициируйте соединение tcp с другим компьютером
- Прокси все, что поступает на виртуальный последовательный порт, выходит в сеть и наоборот.
Это приложение будет использоваться сторонними приложениями, которые общаются с последовательными портами на компьютере, позволяя определенному последовательному устройству быть расположенным в сети. Какао и сетевая часть не проблема, я написал несколько приложений, которые общаются по сети. Мое зависание - это последовательный порт.
Я выполнил тест с помощью socat/netcat/minicom, чтобы убедиться, что все это работает для прокси pty/tty-трафика по сети, но используемый tty не показывается как используемый случайными приложениями, потому что он не зарегистрирован в наборе IO Реестр.
Хотя я могу использовать pty/tty m aster / slave для связи, мне нужен этот slave tty для отображения приложений Mac. Что было бы очень удобно, так это способ регистрации tty в реестре IO Kit.
Действительно ли мне нужно создавать собственный драйвер IOKit kext, который регистрируется во время выполнения приложения Cocoa? Если так, у меня впереди большая учебная кривая. С чего мне начать читать? Или я могу использовать IOKit для создания виртуального последовательного порта и зарегистрировать его в качестве используемого последовательного порта для приложений без необходимости загрузки каких-либо расширений ядра?
Спасибо за любую помощь, которую вы можете предоставить,
Stateful
1 ответ
Прежде всего, вы проверили, можете ли вы позаимствовать решение из этого приложения? С веб-сайта не очевидно, удалось ли им полностью интегрировать свои виртуальные последовательные порты в систему.
Если есть способ сделать это из пространства пользователя, я не знаю об этом. API пользовательского пространства IOKit обычно не позволяет создавать экземпляры классов, не говоря уже о новых классах драйверов устройств. Может быть, вы можете каким-то образом убедить библиотеки Какао найти его, несмотря на то, что он не зарегистрирован в ядре.
Я не знаю, сможете ли вы избежать создания в ядре "фиктивного" последовательного порта, а затем переместить ваш tty на свое место в / dev из вашего демона пользовательского пространства. Может быть, это вариант.
В случае, если вам нужно сделать все это в ядре:
По крайней мере, сам виртуальный драйвер не должен слишком много работать, хотя потребуется некоторое время, чтобы освоиться с ядром dev. К сожалению, документация для драйверов последовательного порта довольно тонкая - ключ подклассов IOSerialDriverSync
абстрактный класс. Почти единственное описание, которое я видел, находится в книге Оле Генри Халворсена по программированию ядра для OSX и iOS. Также имеется фрагмент примера для операций чтения и записи. (раскрытие: я был одним из технических рецензентов для этой книги; у меня нет стимулов рекомендовать ее - в данном случае это буквально единственная документация, о которой я знаю). Источник полного драйвера последовательного порта можно найти в Apple. Драйвер USBCDC, AppleUSBCDCDMM
это класс, который фактически представляет узел последовательного порта.
Относительно просто открыть в ядре так называемый сокет "управления ядром", отдельные API описаны здесь; из пользовательского пространства вы используете обычный BSD сокет send
/ recv
API-интерфейсы. (это также описано в вышеупомянутой книге). Затем ваш демон может подключиться к нему, и все, что вам нужно сделать, это передать данные между сокетом и устройством виртуального последовательного порта. Вам, конечно, нужно правильно обрабатывать события отключения и тому подобное.
Тем не менее, я думаю, что это достижимо в качестве первого проекта ядра для опытного программиста C (с небольшим количеством C++).
Надеюсь, это поможет!