tachi512
Апрель 21, 2010 21:17:13
добрый день. подскажите пожалуйста, есть ли возможность реализовать в питоне модуль, который будет создавать в системе виртуальный USB порт, данные на котором будут создаваться программно этим самым модулем, которые тот возьмет с другого порта? если да, то куда лучше копать, так как вопрос “слегка” специфичен ))
понимаю, что это изврат, так как по идее нужно писать дрова на соответствующем языке, но я бегаю меж 3мя ОС (win7, linux 2.4.20 & 2.6.30) и мне желательно что-то, что будет работать везде, а не ковырять API каждой системы)
igor.kaist
Апрель 21, 2010 21:28:00
tachi512
мне желательно что-то, что будет работать везде, а не ковырять API каждой системы)
в этом случае, без этого, я думаю не обойтись…
tachi512
Апрель 21, 2010 21:47:09
надежда мрет последней) я просто надеялся, что работа с API реализована уже в библиотеках питона, а мне вместо них дадут универсальные методы с универсальным набором переменных…
по сути мне нужно организовать прямую трансляцию порт<->порт через туннель, но в winAPI сложность написания дров не зависит от количества операций в них ))))
Андрей Светлов
Апрель 21, 2010 23:00:22
tachi512
я просто надеялся, что работа с API реализована уже в библиотеках питона…
Работа с API чего? Универсальный драйвер устройства для любой OS??? :O
tachi512
Апрель 21, 2010 23:28:23
вот именно что ничего… вся работа с устройством будет на уровне другого драйвера (например драйвер принтера) мне же нужно только организовать коридор от реального устройства до нужной мне машины и представиться там как USB порт, а данные будет обрабатывать другой драйвер, конечно же уникальный для каждого устройства. грубо говоря нужен программный USB хаб
Андрей Светлов
Апрель 22, 2010 07:34:53
Позвольте расписать более подробно ту плевую задачку, которую вы хотите решить.
Во первых, для эмуляции USB потребуется драйвер. Драйвера пишут обычно на С (при желании - на С++ с обрезаным runtime). Это происходит не только от нелюбви разработчиков к прогрессивным языкам программирования.
Дело в том, что драйвер работает в kernel mode. Там нет многих привычных вещей, доступны совсем другие библиотеки и, главное, очень суровые требования по памяти и быстродействию. Так что альтернативы нет. Хотя взять пример и сделать USB hub с одной function - не очень сложно.
Далее нужно открыть существующее usb устройство и зацепится на его in/out/ioctl/что там еще у usb есть. Открывать, как я понимаю, нужно на другой машине - так что это будет обычная програмка. Может быть даже на Питоне.
Следующий шаг - следует как-то наладить коммуникацию между драйвером эмулируемого usb и программой, которая прицепилась к реальному порту. Поскольку машины разные, нужен какой-нибудь транспорт. Вероятно, TCP/IP подойдет.
Работать с tcp/ip стеком из ядра - удовольствие сильно ниже среднего. Значит, на машине с драйвером нужно завести демон, который и будет разговаривать с сетью. Зацепить его на наш драйвер (наверное, удобней всего создать еще одно устройство, специально для общения с демоном).
Вот и все. После непродолжительной отладки можно с чистой совестью отправляться за честно заработанным пирожком. Самая проблемная часть работы на Питоне не реализуется никак, хоть тресни. С кроссплатформенностью тоже будут сложности - по сути придется написать две системы, для linux и windows.
Но при желании вполне все может получиться.
tachi512
Апрель 22, 2010 17:19:19
абсолютно точно) вообще есть аналоги, но под винду, а мне нужно хотя бы одну из частей запустить на линуксе (принтсервер на роутере)
ясно, спасибо… в принципе я так и думал, но надеялся на лучше - вдруг питон позаботился о программистах до самых глубин ядра