Получение силы сигнала сотового ключа (GSM) в настольном приложении, написанном на C#

Я пытаюсь получить SignalStrength (т.е. как информацию о сотовых телефонах за решеткой), но в настольном приложении, разработанном на С# .NET 4.0, к которому подключен GSM-адаптер. Мне удалось подключиться и отключиться от поставщика услуг с помощью RasDialer, но я все равно не могу найти, чтобы получить SignalStrength. Я пробовал MbnApi, но он отлично работает, пока я не получу подключенные интерфейсы, и после того, как я использую один из них для ЛЮБОГО, он падает с исключением COM, говорящим: «данные, необходимые для завершения этой операции, еще недоступны». Вот фрагмент кода, который вылетает с этим исключением в последней строке:

 MbnInterfaceManager mbnInfMgr = new MbnInterfaceManager();
 IMbnInterfaceManager infMgr = (IMbnInterfaceManager)mbnInfMgr;

 MbnConnectionManager mbnConnectionMgr = new MbnConnectionManager();
 IMbnConnectionManager ImbnConnectionMgr = (IMbnConnectionManager)mbnConnectionMgr;

 var mobileInterface = infMgr.GetInterfaces() as IMbnInterface[];

 IMbnSignal sig = (IMbnSignal)mobileInterface[0];

 uint signalStrength = sig.GetSignalStrength();

Может ли кто-нибудь помочь, либо объяснив, что я делаю неправильно с MbnApi, либо направив меня к другой альтернативе?

Заранее большое спасибо, Ярон.


person Yaron Adler    schedule 20.05.2014    source источник


Ответы (1)


Я не увидел каких-либо явных ошибок, поэтому вставил ваш точный код в тестовый проект .NET 4.0, сослался на MbnApi, созданный в системе Windows 8, и запустил его, и он работал нормально. Я получил уровень сигнала моего встроенного модема.

Я предполагаю, что в вашем коде обычно есть блоки try/catch, тесты на нуль и т.д.

Вы исследовали, сколько интерфейсов присутствует, и действительно ли вам нужен интерфейс [0] или другой? Также очевидные вещи, такие как перезагрузка Windows и т. Д.

Вы спрашивали о других возможностях получения этой информации. При использовании MBN API для уровня сигнала следует учитывать этот фактор. AT-команда AT+CESQ дает более точное значение. Это описано в разделе 8.69 этого документа. В SO и в Интернете есть много информации о том, как использовать AT-команды с C# — попробуйте тег at-command или выполните поиск [c#][at-command] в SO.

person user1725145    schedule 21.05.2014
comment
@aldridmc AT+CESQ, если он поддерживается, дает точные значения для GSM, UMTS и LTE. - person user1725145; 23.05.2014
comment
Никогда не видел эту команду, кроме как в стандартных документах ETSI. Знаете ли вы какие-либо модемы, которые на самом деле поддерживают эту команду? - person Matt Aldridge; 23.05.2014
comment
Я не видел ни одного, но я также не проводил много тестов AT-команд на разных модемах LTE. Но я думаю, что в любом случае полезно изучить эту команду, потому что из всех вариантов это на самом деле лучший способ получить правильную информацию. Если вы изучите ответы на эту AT-команду, по крайней мере, вы знаете, что вы должны получить. Для справки, интерфейс Android также пытается предоставить правильные значения для разных сетей. - person user1725145; 26.05.2014