sabbatazh
Помогающий
Offline
|
|
« : 18-03-2015 19:08 » |
|
Здравствуйте, Уважаемые знатоки! Возник вопрос и нужна Ваша помощь! Как из программы на С# управлять 3G модемом, т.е. : Включить\отключить (сон\пробудить); подключить\отключить от сети?! Хотя бы подскажите направление в котором рассматривать эту проблему... Спасибо! Добавлено через 3 часа, 37 минут и 5 секунд:Может быть, что модем не поддерживает набор АТ-команд?!
|
|
« Последнее редактирование: 18-03-2015 22:45 от sabbatazh »
|
Записан
|
|
|
|
darkelf
Молодой специалист
Offline
|
|
« Ответ #1 : 19-03-2015 06:32 » |
|
К сожалению не большой знаток модемов, но вроде таких модемов сейчас, наверное, и быть не должно. Модем у Вас виден, как COM-порт? Вы пытались обращаться к нему через штатные утилиты ОС, если у Вас Windows, то, например, через HyperTerminal? Вы настроили для COM-порта к которому подключен модем скорость, число битов данных, число стоп-битов, чётность и паритет? Кто производитель 3G модема, как называется модель?
|
|
|
Записан
|
|
|
|
zubr
Гость
|
|
« Ответ #2 : 19-03-2015 06:49 » |
|
Для вышеназванных действий (включить\выключить, подключить\отключить) не нужны AT-команды. Для включения\выключения модема смотри в сторону утилиты devcon, для подключить\отключить от сети - rasdial.
|
|
|
Записан
|
|
|
|
sabbatazh
Помогающий
Offline
|
|
« Ответ #3 : 20-03-2015 14:53 » |
|
Для вышеназванных действий (включить\выключить, подключить\отключить) не нужны AT-команды. Для включения\выключения модема смотри в сторону утилиты devcon, для подключить\отключить от сети - rasdial.
Спасибо! буду разбираться! а то уже написал код доступа к ком порту, к диаллапу стучусь на СОМ-порт, а к подключенному по USB не могу достучатся АТ-командами... это ведь тоже не правильно? darkelf, вот как у меня происходит процесс достукивания к модему, модем по USB, определяется по 3 разным СОМ-портам (Win 7), пробовал по каждому ничего не работает: private AutoResetEvent receiveNow = new AutoResetEvent(false); private SerialPort comport = new SerialPort("COM9"); private void button1_Click(object sender, EventArgs e) { bool error = false; if (comport.IsOpen == true) comport.Close(); comport.BaudRate = int.Parse("9600"); comport.DataBits = int.Parse("8"); comport.StopBits = (StopBits)Enum.Parse(typeof(StopBits), "One"); comport.Parity = (Parity)Enum.Parse(typeof(Parity), "None"); comport.Handshake = (Handshake)Enum.Parse(typeof(Handshake), "None"); //comport.ReadTimeout = SerialPort.InfiniteTimeout; comport.ReadTimeout = 300; comport.WriteTimeout = 300; comport.DataReceived += new SerialDataReceivedEventHandler(AcceptData); // comport.WriteBufferSize = int.Parse("1024"); try { // Open the port comport.Open(); } catch (UnauthorizedAccessException) { error = true; } catch (IOException) { error = true; } catch (ArgumentException) { error = true; } if (error) MessageBox.Show("ERROR", "!!!", MessageBoxButtons.OK, MessageBoxIcon.Stop); else { if (comport != null) { // Show the initial pin states comport.DtrEnable = true; comport.RtsEnable = true; comport.DiscardOutBuffer(); comport.DiscardInBuffer(); receiveNow.Reset(); comport.Write("ATE0" + "\r"); string input = ReadResponse(comport, 300); textBox1.AppendText(input + "\r\n"); comport.Write("ATA" + Convert.ToChar(13).ToString()); Thread.Sleep(500); comport.Write("ATE0" + Convert.ToChar(13).ToString()); Thread.Sleep(500); comport.Close(); textBox1.AppendText("порт закрыт" + "\r\n"); } } } private void AcceptData(object sender, SerialDataReceivedEventArgs e) { SerialPort port = (SerialPort)sender; string str; //Thread.Sleep(100); str = port.ReadLine(); textBox1.Invoke(new MethodInvoker(delegate { textBox1.AppendText(str + "\r\n"); })); } public string ReadResponse(SerialPort port, int timeout) { string buffer = string.Empty; try { do { if (receiveNow.WaitOne(timeout, false)) { string t = port.ReadExisting(); buffer += t; } else { if (buffer.Length > 0) throw new ApplicationException("Response received is incomplete."); else throw new ApplicationException("No data received from phone."); } } while (!buffer.EndsWith("\r\nOK\r\n") && !buffer.EndsWith("\r\n> ") && !buffer.EndsWith("\r\nERROR\r\n")); } catch (Exception ex) { throw ex; } return buffer; } } !
|
|
« Последнее редактирование: 20-03-2015 14:58 от sabbatazh »
|
Записан
|
|
|
|
darkelf
Молодой специалист
Offline
|
|
« Ответ #4 : 21-03-2015 15:08 » |
|
а то уже написал код доступа к ком порту, к диаллапу стучусь на СОМ-порт, а к подключенному по USB не могу достучатся АТ-командами... это ведь тоже не правильно? darkelf, вот как у меня происходит процесс достукивания к модему, модем по USB, определяется по 3 разным СОМ-портам (Win 7), пробовал по каждому ничего не работает:
пожалуйста расшифруйте, что значит "ничего не работает". Компьютер вообще не включается? COM-порт не открывается? открывается, но в ответ на выданные запросы ничего не говорит? Попробуйте всё-таки воспользоваться штатными утилитами ОС (HyperTerminal), прежде чем писать код. консольная утилита mode что-нибудь говорит про эти com-порты? и опять - какая модель и кто производитель модема?
|
|
|
Записан
|
|
|
|
Aether
|
|
« Ответ #5 : 21-03-2015 16:37 » |
|
COM-порт не открывается? Попробуйте всё-таки воспользоваться штатными утилитами ОС (HyperTerminal), прежде чем писать код.
Я полагаю, что 3G модем - это нечто современное, далёкое от COM порта и технологии связи по телефонным проводам. Похоже, что ТС ищет какое-то API для управления, вообще, классом таких устройств. Я не сталкивался с такой проблемой, поэтому посоветовать нечего.
|
|
|
Записан
|
|
|
|
sabbatazh
Помогающий
Offline
|
|
« Ответ #6 : 23-03-2015 16:12 » |
|
а то уже написал код доступа к ком порту, к диаллапу стучусь на СОМ-порт, а к подключенному по USB не могу достучатся АТ-командами... это ведь тоже не правильно? darkelf, вот как у меня происходит процесс достукивания к модему, модем по USB, определяется по 3 разным СОМ-портам (Win 7), пробовал по каждому ничего не работает:
пожалуйста расшифруйте, что значит "ничего не работает". Компьютер вообще не включается? COM-порт не открывается? открывается, но в ответ на выданные запросы ничего не говорит? Попробуйте всё-таки воспользоваться штатными утилитами ОС (HyperTerminal), прежде чем писать код. консольная утилита mode что-нибудь говорит про эти com-порты? и опять - какая модель и кто производитель модема? USB-Модем, называется - Verizon; Компьютер работает, все хорошо; COM-порт - открывается; при обращение к нему ничего в ответ не получаю; COM-порт не открывается? Попробуйте всё-таки воспользоваться штатными утилитами ОС (HyperTerminal), прежде чем писать код.
Я полагаю, что 3G модем - это нечто современное, далёкое от COM порта и технологии связи по телефонным проводам. Похоже, что ТС ищет какое-то API для управления, вообще, классом таких устройств. Я не сталкивался с такой проблемой, поэтому посоветовать нечего. Добавлено через 1 минуту и 46 секунд:а то уже написал код доступа к ком порту, к диаллапу стучусь на СОМ-порт, а к подключенному по USB не могу достучатся АТ-командами... это ведь тоже не правильно? darkelf, вот как у меня происходит процесс достукивания к модему, модем по USB, определяется по 3 разным СОМ-портам (Win 7), пробовал по каждому ничего не работает:
пожалуйста расшифруйте, что значит "ничего не работает". Компьютер вообще не включается? COM-порт не открывается? открывается, но в ответ на выданные запросы ничего не говорит? Попробуйте всё-таки воспользоваться штатными утилитами ОС (HyperTerminal), прежде чем писать код. консольная утилита mode что-нибудь говорит про эти com-порты? и опять - какая модель и кто производитель модема? USB-Модем, называется - Verizon; Компьютер работает, все хорошо; COM-порт - открывается; при обращение к нему ничего в ответ не получаю; COM-порт не открывается? Попробуйте всё-таки воспользоваться штатными утилитами ОС (HyperTerminal), прежде чем писать код.
Я полагаю, что 3G модем - это нечто современное, далёкое от COM порта и технологии связи по телефонным проводам. Похоже, что ТС ищет какое-то API для управления, вообще, классом таких устройств. Я не сталкивался с такой проблемой, поэтому посоветовать нечего. определяется модем: Novatel Wireless Application Port(СОМ8); Novatel Wireless GPS Port(СОМ7); Novatel Wireless Status Port(СОМ9); при обращении к каждому по отдельности результата нет! Спасибо!
|
|
« Последнее редактирование: 23-03-2015 16:14 от sabbatazh »
|
Записан
|
|
|
|
Aether
|
|
« Ответ #7 : 23-03-2015 17:19 » |
|
при обращении к каждому по отдельности результата нет!
И, вряд ли будет. 1) Это устройство именуется модемом лишь номинально, на деле это сложный компьютер с радио штучками и иными модулями внутри. 2) Устройство, как я понимаю, присоединяется к USB порту. А стало быть, если и существуют COM7, 8, 9, то это виртуальные порты - управляться могут несколько иначе, нежели обычный физический UART типа 16550A. 3) COM порт - это штука далеко не простая, чтобы общаться по нему нужно чётко знать специфику подключённого оборудования, то есть: - настройки COM порта в устройстве, такие как скорость, число бит в транзакции, число стоп битов... - конкретный вид протокола... - команды управления устройством, их правильный синтаксис... Итог: вся эта информация, возможно, может представлять собой коммерческую тайну фирмы-разработчика этого устройства. Прямой путь без знания этой документации невозможен. Возможно, нужно идти от обратного, например, какое штатное ПО шло в комплекте с этим устройством? Возможно, существует альтернативное открытое ПО, например, под Linux`ом, из которого можно почерпнуть что и как.
|
|
|
Записан
|
|
|
|
sabbatazh
Помогающий
Offline
|
|
« Ответ #8 : 23-03-2015 21:32 » |
|
Терминалом не достучался в сей дивайс... Перепробовал все настройки... Документация содержит только характеристики, драйвера на Линух нет!
печаль! или у меня руки кривые...
|
|
|
Записан
|
|
|
|
|
sabbatazh
Помогающий
Offline
|
|
« Ответ #10 : 29-03-2015 10:03 » |
|
Спасибо! Буду разбираться!
|
|
|
Записан
|
|
|
|
sabbatazh
Помогающий
Offline
|
|
« Ответ #11 : 30-04-2015 07:49 » |
|
Здравствуйте, Уважаемые Форумчане! После танцев с бубном вокруг пресловутого модема получилось его определить как модем в ДУ - произошел глюк в винде, и с третьего раза переустановки драйверов система определила 3G-модем как модем и присвоила ему ком порт. получилось достучатся до него по ком порту, нацарапал код: private SerialPort comport = new SerialPort("COM5");
private AutoResetEvent receiveNow;
public bool SetupComPort() { bool error = false;
// If the port is open, close it. if (comport.IsOpen == true) comport.Close();
receiveNow = new AutoResetEvent(false); try { comport.DataReceived += new SerialDataReceivedEventHandler(AcceptData); // Set the port's settings comport.BaudRate = int.Parse("230400"); comport.DataBits = int.Parse("8"); comport.StopBits = (StopBits)Enum.Parse(typeof(StopBits), "One"); comport.Parity = (Parity)Enum.Parse(typeof(Parity), "None"); comport.Handshake = (Handshake)Enum.Parse(typeof(Handshake), "None"); // Open the port comport.Open();
_Message("Port Modem Open: " + comport.PortName); } catch (UnauthorizedAccessException) { error = true; } catch (IOException) { error = true; } catch (ArgumentException) { error = true; }
if (error) MessageBox.Show("Could not open the COM-port MODEM. Most likely it is already in use, has been removed, or is unavailable.", "COM Port Unavalible", MessageBoxButtons.OK, MessageBoxIcon.Stop); else { }
return error; }
public void CloseComPort() { comport.Close();
comport.DataReceived -= new SerialDataReceivedEventHandler(AcceptData);
comport = null; }
private void AcceptData(object sender, SerialDataReceivedEventArgs e) { try { if (e.EventType == SerialData.Chars) { receiveNow.Set(); //_Message("Modem Accept Data..."); } } catch (Exception ex) { throw ex; } }
public bool SendData(string command, int responseTimeout) { bool error = false; try { comport.DiscardOutBuffer(); comport.DiscardInBuffer(); receiveNow.Reset(); comport.Write(command + "\r");
string input = ReadResponse(responseTimeout);
_Message(input); } catch (FormatException) { error = true; } catch (TimeoutException) { error = true; }
return error; }
public string ReadResponse(int timeout) { string buffer = string.Empty; try { do { if (receiveNow.WaitOne(timeout, false)) { string t = comport.ReadExisting(); buffer += t; } else { if (buffer.Length > 0) _Message("Response received is incomplete."); else _Message("No data received from phone."); } } while (!buffer.EndsWith("\r\nOK\r\n") && !buffer.EndsWith("\r\n> ") && !buffer.EndsWith("\r\nERROR\r\n")); } catch (Exception ex) { throw ex; } return buffer; } код работает! пробую отправить в модем команду: NPortModem.SendData("ATI", 300);//данные о модеме NPortModem.SendData("AT+CSQ", 300);//качество сигнала проходят, возвращаются данные. но как только пытаюсь включить/выключить возвращаются ошибки: NPortModem.SendData("AT+CFUN=0", 300);//выключить телефон (Ошибку возвращает) задержка в 10 сек... NPortModem.SendData("AT+CFUN=1", 300);//включить телефон (ERROR) воспользовался данными с сайта http://www.activexperts.com/mobile-messaging-component/at/etsi/но чет я не нашел тут команд управления модемом... Может я так смотрел или не туда, или я не так что-то делаю?! Спасибо!
|
|
|
Записан
|
|
|
|
sabbatazh
Помогающий
Offline
|
|
« Ответ #12 : 13-05-2015 10:53 » |
|
получаю от модема следующие данные: Port Modem Open: COM5 ATE0 OK AT+CSQ 27, 99 OK ATI Manufacturer: NOVATEL WIRELESS INCORPORATED Model: MiFi2200 VZW Revision: Q6085BDRAGONFLY_V167_029.0201 [2010-10-01 15:49:01] ESN: 0x5BB59059 +GCAP: +CIS707-A, CIS-856-A, +MS, +ES, +DS OK а вот команды на включение и отключение (состояния) модема не проходят: AT+CFUN? ERROR AT+CFUN=? ERROR AT+CFUN=?? ERROR
|
|
|
Записан
|
|
|
|
darkelf
Молодой специалист
Offline
|
|
« Ответ #13 : 13-05-2015 13:28 » |
|
sabbatazh, сорри, не могу ничего подсказать.. Тут пытаются выключать какой-то NOVATEL-овский модем через команду +CFUN=4, а сбрасывать через +CFUN=6. Правда это для LTE, как я понимаю, что для 3G такое может и не поддерживается. В общем - попробуйте посмотреть тут и вообще тут, может увидите что-нибудь для себя полезное.
|
|
|
Записан
|
|
|
|
sabbatazh
Помогающий
Offline
|
|
« Ответ #14 : 21-09-2015 05:56 » |
|
Здравствуйте, Уважаемые Знатоки! пришлось купить новый модем HUAWEI... Удалось получить управление над модем с помощи АТ-команд и DotRas https://dotras.codeplex.com/public bool Connect(string dialerEntryName)//bool monitorSignalUpdates { if (!NPortModem.SetupComPort()) { NPortModem.SendData("ATZ", 300);//сброс модема... NPortModem.SendData("AT", 300); //Get the modem's attention NPortModem.SendData("AT+CFUN=1", 300); Thread.Sleep(500); NPortModem._CloseComPort();
RasPhoneBook rpb = new RasPhoneBook(); rpb.Open(true); if (!rpb.Entries.Contains(dialerEntryName)) { rpb.Entries.Add(RasEntry.CreateBroadbandEntry(dialerEntryName, RasDevice.GetDeviceByName("HUAWEI Mobile Connect - 3G Modem", RasDeviceType.Modem), true)); } _rd = new RasDialer(); _rd.EntryName = dialerEntryName;//"3G Connection"; _rd.PhoneNumber = "#777"; try { handle = _rd.Dial(); _Message("Подключение в интернет прошло успешно…\r\n"); //Thread.Sleep(1000); return true; } catch (Exception ex) { MessageBox.Show(ex.Message, "Интернет соединение"); //MessageBox.Show("Невозможно подключится к интернету!!!", "Интернет соединение", MessageBoxButtons.OK, MessageBoxIcon.Stop); } return false; } else { handle = null; MessageBox.Show("Нет подключения к модему!!!", "Интернет соединение", MessageBoxButtons.OK, MessageBoxIcon.Stop); return false; } }
public void Disconnect() { if (!(this._rd == null)) { if (this._rd.IsBusy) { // The connection attempt has not been completed, cancel the attempt. this._rd.DialAsyncCancel(); } else { if (!(handle == null)) { // The connection attempt has completed, attempt to find the connection in the active connections. RasConnection connection = RasConnection.GetActiveConnectionByHandle(this.handle); if (connection != null) { // The connection has been found, disconnect it. connection.HangUp(); } } } } _Message("Отключили интернет…\r\n");
Thread.Sleep(1000); if (!NPortModem.SetupComPort()) { NPortModem.SendData("ATZ", 300);//сброс модема... NPortModem.SendData("AT", 300); //Get the modem's attention NPortModem.SendData("AT+CFUN=0", 300); Thread.Sleep(500); NPortModem._CloseComPort(); } _Message("Выключили модем…\r\n"); } главное правильно настроить СОМ-порт... нашел ошибку в настройке скорости на один 0 ошибся, и по 64 разрядной виндой работало с перебоями, не мог понять в чем дело, а тут стартанул под 32 и сразу ошибку обнаружил, чудеса от винды... но то и ладно... отладил и все заработало... и подобрал временные интервалы для нормальной "парковки" модема... Спасибо Всем за помощь!
|
|
|
Записан
|
|
|
|
|