2012-04-30 15 views
2

Мне нужно создать приложение Cocoa, которое создаст виртуальный последовательный порт, доступный для других приложений, то есть зарегистрированный в реестре ввода-вывода.Mac - виртуальный последовательный порт

сути приложения:

  • Создать виртуальный последовательный порт (перечислено в/разработчике и зарегистрирован в IOKit реестре)
  • Инициирование соединения или из другого компьютера
  • Proxy всех полученных виртуальный последовательный порт подключается к сети и наоборот.

Это приложение будет использоваться сторонними приложениями, которые будут разговаривать с последовательными портами на компьютере, позволяя определять конкретное последовательное устройство по всей сети. Какао и сетевая часть не проблема, я написал несколько приложений, которые говорят по сети. Мое зависание - это последовательный порт.

Я провел тест с помощью socat/netcat/minicom, чтобы убедиться, что все это работает для прокси-трафика pty/tty по сети, но tty, который я использую, не отображается как пригодный для использования случайными приложениями, потому что он не зарегистрирован в реестре набора IO.

Хотя я могу использовать pty/tty master/slave для связи, мне нужен этот slave tty для отображения приложений Mac. Что было бы очень удобно - это способ зарегистрировать tty в реестре IO Kit.

Нужно ли мне создавать пользовательский драйвер IQKit kext, который регистрируется во время выполнения приложения Cocoa? Если это так, у меня впереди большая кривая обучения. Где я должен начать читать? Или я могу использовать IOKit для создания виртуального последовательного порта и зарегистрировать его как удобный последовательный порт для приложений без необходимости загрузки каких-либо расширений ядра?

Спасибо за любую помощь вы можете предоставить,
Stateful

ответ

4

Прежде всего, вы проверили, если вы можете взять решение от this app? Это не очевидно из сайта, если им удалось получить их виртуальные последовательные порты, полностью интегрированные в систему.

Если есть способ сделать это из пользовательского пространства, я не знаю об этом. API-интерфейс IOKit для пользовательского пространства обычно не позволяет создавать экземпляры классов, не говоря уже о новых классах драйверов устройств. Возможно, вы можете каким-то образом убедить библиотеки Cocoa найти его, несмотря на то, что он не зарегистрирован в ядре.

Я не знаю, сможешь ли вы сойти с создания «фиктивного» последовательного порта в ядре, а затем переместите свой tty на свое место в/dev из своего демонстратора пространства пользователей. Возможно, это вариант.

В случае, если вы должны делать все это в ядре:

сам виртуальный водитель не должен быть слишком много работы, по крайней мере, хотя для этого потребуется некоторое время, чтобы получить до скорость с помощью ядра dev. К сожалению, документация довольно тонкая для драйверов последовательного порта - ключ подклассифицирует абстрактный класс IOSerialDriverSync. Практически единственное описание, которое я видел, - это OSX и iOS Kernel. Программирование. Он также имеет фрагмент примера для чтения операций записи &.(раскрытие: Я был одним из тех, кто пересматривает эту книгу, я не получаю никаких стимулов для ее рекомендации - в этом случае это буквально единственная документация, которую я знаю). Вы можете найти источник для полного драйвера последовательного порта в Apple's USBCDC driver, AppleUSBCDCDMM - это класс, который фактически представляет узел последовательного порта.

Относительно просто открыть так называемый сокет "kernel control" в ядре, отдельные API-интерфейсы: documented here; из пользовательского пространства вы используете обычный разъем BSD send/recv API. (это также описано в вышеупомянутой книге). Затем ваш демон может подключиться к этому, и все, что вам нужно сделать, - это нажать данные между сокетом и устройством виртуального последовательного порта. Разумеется, вам придется обрабатывать события разъединения и так правильно.

Тем не менее, я думаю, что это возможно в качестве первого проекта ядра для опытного программиста на C (с некоторыми C++).

Я надеюсь, что это поможет!

+2

Великий материал, pmjordan. Я взглянул на это приложение, на которое вы ссылались, и на самом деле они собирают скомпилированный исполняемый файл socat в свое приложение, а затем просто передают ему аргументы для его выполнения. И эти последовательные порты, которые он использует, также не зарегистрированы в IO Kit Registry. Я купил копию упомянутой вами книги, и там есть масса информации. Спасибо за указатель! – Stateful

+0

@Stateful Приветствую вас, удачи, что он работает! – pmdj

+0

@Stateful У вас это получилось вообще? – tcv