Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Управлять 3G модемом из приложения  (Прочитано 40202 раз)
0 Пользователей и 5 Гостей смотрят эту тему.
sabbatazh
Помогающий

ua
Offline Offline

« : 18-03-2015 19:08 » 

Здравствуйте, Уважаемые знатоки!

Возник вопрос и нужна Ваша помощь!
Как из программы на С# управлять 3G модемом, т.е. : Включить\отключить (сон\пробудить); подключить\отключить от сети?!

Хотя бы подскажите направление в котором рассматривать эту проблему...  Не может быть...
Спасибо!

Добавлено через 3 часа, 37 минут и 5 секунд:
Может быть, что модем не поддерживает набор АТ-команд?!
« Последнее редактирование: 18-03-2015 22:45 от sabbatazh » Записан
darkelf
Молодой специалист

fr
Offline Offline

« Ответ #1 : 19-03-2015 06:32 » 

К сожалению не большой знаток модемов, но вроде таких модемов сейчас, наверное, и быть не должно. Модем у Вас виден, как COM-порт? Вы пытались обращаться к нему через штатные утилиты ОС, если у Вас Windows, то, например, через HyperTerminal? Вы настроили для COM-порта к которому подключен модем скорость, число битов данных, число стоп-битов, чётность и паритет? Кто производитель 3G модема, как называется модель?
Записан
zubr
Гость
« Ответ #2 : 19-03-2015 06:49 » 

Для вышеназванных действий (включить\выключить, подключить\отключить) не нужны AT-команды.
Для включения\выключения модема смотри в сторону утилиты devcon, для подключить\отключить от сети - rasdial.
Записан
sabbatazh
Помогающий

ua
Offline Offline

« Ответ #3 : 20-03-2015 14:53 » 

Для вышеназванных действий (включить\выключить, подключить\отключить) не нужны AT-команды.
Для включения\выключения модема смотри в сторону утилиты devcon, для подключить\отключить от сети - rasdial.

Спасибо! буду разбираться!

а то уже написал код доступа к ком порту, к диаллапу стучусь на СОМ-порт, а к подключенному по USB не могу достучатся АТ-командами... это ведь тоже не правильно?
darkelf, вот как у меня происходит процесс достукивания к модему, модем по USB, определяется по 3 разным СОМ-портам (Win 7), пробовал по каждому ничего не работает:
Код: (C#)
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
Молодой специалист

fr
Offline Offline

« Ответ #4 : 21-03-2015 15:08 » 

а то уже написал код доступа к ком порту, к диаллапу стучусь на СОМ-порт, а к подключенному по USB не могу достучатся АТ-командами... это ведь тоже не правильно?
darkelf, вот как у меня происходит процесс достукивания к модему, модем по USB, определяется по 3 разным СОМ-портам (Win 7), пробовал по каждому ничего не работает:
пожалуйста расшифруйте, что значит "ничего не работает". Компьютер вообще не включается? COM-порт не открывается? открывается, но в ответ на выданные запросы ничего не говорит?
Попробуйте всё-таки воспользоваться штатными утилитами ОС (HyperTerminal), прежде чем писать код.
консольная утилита mode что-нибудь говорит про эти com-порты? и опять - какая модель и кто производитель модема?
Записан
Aether
Специалист

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 21-03-2015 16:37 » 

COM-порт не открывается? Попробуйте всё-таки воспользоваться штатными утилитами ОС (HyperTerminal), прежде чем писать код.
Я полагаю, что 3G модем - это нечто современное, далёкое от COM порта и технологии связи по телефонным проводам. Похоже, что ТС ищет какое-то API для управления, вообще, классом таких устройств. Я не сталкивался с такой проблемой, поэтому посоветовать нечего.
Записан
sabbatazh
Помогающий

ua
Offline Offline

« Ответ #6 : 23-03-2015 16:12 » new

а то уже написал код доступа к ком порту, к диаллапу стучусь на СОМ-порт, а к подключенному по 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
Специалист

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 23-03-2015 17:19 » 

при обращении к каждому по отдельности результата нет!
И, вряд ли будет.
1) Это устройство именуется модемом лишь номинально, на деле это сложный компьютер с радио штучками и иными модулями внутри.
2) Устройство, как я понимаю, присоединяется к USB порту. А стало быть, если и существуют COM7, 8, 9, то это виртуальные порты - управляться могут несколько иначе, нежели обычный физический UART типа 16550A.
3) COM порт - это штука далеко не простая, чтобы общаться по нему нужно чётко знать специфику подключённого оборудования, то есть:
- настройки COM порта в устройстве, такие как скорость, число бит в транзакции, число стоп битов...
- конкретный вид протокола...
- команды управления устройством, их правильный синтаксис...

Итог: вся эта информация, возможно, может представлять собой коммерческую тайну фирмы-разработчика этого устройства. Прямой путь без знания этой документации невозможен.

Возможно, нужно идти от обратного, например, какое штатное ПО шло в комплекте с этим устройством? Возможно, существует альтернативное открытое ПО, например, под Linux`ом, из которого можно почерпнуть что и как.
Записан
sabbatazh
Помогающий

ua
Offline Offline

« Ответ #8 : 23-03-2015 21:32 » 

Терминалом не достучался в сей дивайс...
Перепробовал все настройки...
Документация содержит только характеристики, драйвера на Линух нет!

печаль! или у меня руки кривые...
Записан
darkelf
Молодой специалист

fr
Offline Offline

« Ответ #9 : 24-03-2015 07:42 » 

тут https://community.verizonwireless.com/thread/781121 пишут, что часть AT-команд поддерживается, часть нет, если конечно там такое-же устройство, как и у Вас. У Вас есть "VZ Access Manager" что-бы попробовать? Вы так и не назвали модель устройства, полагаю их у Verizon/Novatel-а более одного.
а судя по этому - https://forum.dc-unlocker.com/forum/modems-and-phones/novatel/8758-novatel-mifi-4510l-hotspot-unlocking
вполне возможно должен быть ещё один COM - как-раз с эмуляцией модема. Возможно что-то не установилось.
« Последнее редактирование: 24-03-2015 07:49 от darkelf » Записан
sabbatazh
Помогающий

ua
Offline Offline

« Ответ #10 : 29-03-2015 10:03 » 

тут https://community.verizonwireless.com/thread/781121 пишут, что часть AT-команд поддерживается, часть нет, если конечно там такое-же устройство, как и у Вас. У Вас есть "VZ Access Manager" что-бы попробовать? Вы так и не назвали модель устройства, полагаю их у Verizon/Novatel-а более одного.
а судя по этому - https://forum.dc-unlocker.com/forum/modems-and-phones/novatel/8758-novatel-mifi-4510l-hotspot-unlocking
вполне возможно должен быть ещё один COM - как-раз с эмуляцией модема. Возможно что-то не установилось.
Спасибо! Буду разбираться!
Записан
sabbatazh
Помогающий

ua
Offline Offline

« Ответ #11 : 30-04-2015 07:49 » 

Здравствуйте, Уважаемые Форумчане!
После танцев с бубном вокруг пресловутого модема получилось его определить как модем в ДУ - произошел глюк в винде, и с третьего раза переустановки драйверов система определила 3G-модем как модем и присвоила ему ком порт.
получилось достучатся до него по ком порту, нацарапал код:
Код: (C#)
        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
Помогающий

ua
Offline Offline

« Ответ #12 : 13-05-2015 10:53 » 

получаю от модема следующие данные:
Код: (ASM)
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
а вот команды на включение и отключение (состояния) модема не проходят:
Код: (ASM)
AT+CFUN?
 
ERROR
 
AT+CFUN=?
 
ERROR
 
AT+CFUN=??
 
ERROR
Записан
darkelf
Молодой специалист

fr
Offline Offline

« Ответ #13 : 13-05-2015 13:28 » 

sabbatazh, сорри, не могу ничего подсказать.. Тут пытаются выключать какой-то NOVATEL-овский модем через команду +CFUN=4, а сбрасывать через +CFUN=6. Правда это для LTE, как я понимаю, что для 3G такое может и не поддерживается. В общем - попробуйте посмотреть тут и вообще тут, может увидите что-нибудь для себя полезное.
Записан
sabbatazh
Помогающий

ua
Offline Offline

« Ответ #14 : 21-09-2015 05:56 » 

Здравствуйте, Уважаемые Знатоки!
пришлось купить новый модем HUAWEI...
Удалось получить управление над модем с помощи АТ-команд и DotRas https://dotras.codeplex.com/
Код: (C#)
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 и сразу ошибку обнаружил, чудеса от винды... но то и ладно... отладил и все заработало... и подобрал временные интервалы для нормальной "парковки" модема...
Спасибо Всем за помощь!
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines