Программное определение используемого 3g модемом COM порта в Windows
Исходные данные:
ОС WIN ХР SP3, 3G-модем Huawei или 3G-модем Alcatel, установленные драйвера к ним и готовые подключения в папке «Сетевые подключения»
Известно также, что при непосредственном подсоединении модема к порту USB, создается несколько виртуальных COM-портов (для разных моделей число может быть различным, как правило — от 2 до 4 портов).
Номера портов, естественно, произвольные и при каждом подключении могут изменяться.
Один из этих портов распознается в Диспетчере устройств на вкладке «Модемы»как 3G-модем, а остальные порты располагаются во вкладке «Порты (COM и LPT)», и им присваиваются какие-либо номера.
При этом модем использует чаще всего один из COM-портов для чтения команд, а другой для записи ответов.
Иногда бывает, что один COM-порт используется для чтения команд, а ответ пишется сразу в несколько других COM-портов.
Вопрос: как программно(с помощью WINAPI, язык С/С++), определить для данного подключения, в какой (в какие) порты для этого модема осуществлять запись, а из какого (из каких) портов производить чтение ответов?
Моя идея была в том, чтобы программно получить название COM-порта из ярлыка Подключения (см.Исходные данные), а далее отправить стандартную команду AT, при этом в цикле перебирая и прослушивая все свободные COM-порты. Получив ответ на каком-либо из них(либо на нескольких сразу), считать что пара портов для записи-чтения найдена.
Проблема, с которой я столкнулся, заключается в том, что мне не удалось найти подходящей функции WINAPI, которая, грубо говоря, по входному параметру «Имя_подключения» вернула бы «Имя_COM_порта», соответствующее этому подключению.
При этом, в самом ярлыке Подключение этот COM-порт вполне хорошо виден.
(Для примера в случае Мегафона в его Подключении указан COM9, а на вкладке «Порты (COM и LPT)» виден COM10, соответственно пишем в COM9, читаем из COM10. А Alcatel вообще открывает 4 COM-порта).
Для решения этой задачи использовал подмножество функций и структур RAS из WINAPI, но, как сказал выше, не нашел подходящей функции для возврата имени COM-порта.
Возможно, задачу надо вообще решать по-другому. Как быть?
А чем вызвана необходимость привязки к имени соединения? Или у Вас не один модем в комп воткнут? Живых com портов, которые можно открыть и записать туда AT будет в системе не так уж и много, можно все их и перебрать
Не знаю, как с GSM, но CDMA-модемы могут создавать следующие устройства при включении:
1) COM-порт модема (основной порт для приема-передачи, изменение режимов работы модема)
2) COM-порт диагностики (используется для настройки устройства — изменение параметров Оператора, получение диагностических данных CDMA-сети и пр.)
3) COM-порт GPS-устройства (NMEA и др. протоколы)
Например, устройство Huawey E176 создает 2 COM-порта «Huawey Mobile Connect — 3G Application Interface (COM4)» (модем) и «Huawey Mobile Connect — 3G PC UI Interface (COM5)» (диагностика). При этом еще создается сетевая плата «Huawey Mobile Connect — 3G Network Card» и сетевое подключение «Подключение по локальной сети 3», а управление процессом «Подключение/отключение» выполняет фронт-энд ПО «Mobile Partner».
Или у Вас устройство без фронт-энд ПО, когда пользователь вручную создает и использует стандартное подключение Windows? Что у вас действительно в исходных данных из вышеперечисленного?