Авторские статьи Решаем проблему падения скорости до нуля у USB Модемов.

Discussion in 'Статьи' started by Sharp.Net, 30 Jul 2012.

  1. Sharp.Net

    Sharp.Net New Member

    Joined:
    28 Jul 2012
    Messages:
    41
    Likes Received:
    3
    Reputations:
    1
    Решаем проблему падения скорости до нуля у USB Модемов.
    Внимание! Программа обновлена, читайте #10 пост!
    Приветствую :)
    Думаю, у того, кто использует USB модемы (МТС-Коннект в частности) не раз бывала такая проблема, когда скорость интернета падает до нуля, и приходится делать переподключение модема. В ручную несколько раз в день, или особенно ночью, согласитесь, это делать не очень удобно. Сегодня я расскажу вам, как автоматизировать данный процесс, и сохранить нервные клетки.
    Итак, начнём.
    Писать программу мы будем на C#, проверялось на USB-Модеме от МТС.
    Для начала построим схему программы:
    Таймаут->Проверка подключения->Если успешно, то запускаем таймаут заново. Иначе - переподключение интернета.
    Отлично, теперь обсудим интерфейс программы:
    1.) Кнопки Вкл/Выкл автоматического управления
    2.) Ручной ввод интервала таймера
    3.) Статус интернета
    4.) Время до следующей проверки
    5.) Сворачивание в трей
    6.) Дебаг
    Выглядеть графически это будет так:
    [​IMG]
    Самые сложные механизмы в данной программе - это проверка подключения, и переподключение в случае падения интернета.

    И то, и другое мы будем реализовывать с помощью командной строки Windows.
    С теорией покончено, приступим к практике!

    Запустите Microsoft Visual C# (Я использовал 2008 Express).
    Файл->Создать проект->Приложение Windows Forms

    Далее набросайте формочку как у меня на рисунке, не забудьте про сворачивание в трей (Или можете загрузить готовый проект в конце статьи).

    Затем откройте Form1.cs (Или любое другое имя вашей формы). Вписываем следующее:
    Code:
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.IO;
    using System.Diagnostics;
    
    //^ Подключение нужный библиотек ^
    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
            //Функция для выполнения системных команд, можно написать и свою, т.к вариант не особо удачен.
            public string exec(string comand)
            {
                string Patch = Directory.GetCurrentDirectory() + @"\trace.bat";
                System.IO.TextWriter BatFile = File.CreateText(Patch);
    
                BatFile.WriteLine("@echo off");
                BatFile.WriteLine(comand);
    
                BatFile.Close();
    
                Process compiler = new Process();
                compiler.StartInfo.StandardOutputEncoding = Encoding.GetEncoding(866);
                compiler.StartInfo.FileName = Patch;
                compiler.StartInfo.CreateNoWindow = true;
                compiler.StartInfo.UseShellExecute = false;
                compiler.StartInfo.RedirectStandardInput = true;
                compiler.StartInfo.RedirectStandardOutput = true;
                compiler.Start();
                string text_cmd = compiler.StandardOutput.ReadToEnd();
                compiler.Close();
                return text_cmd;
            }
    //Таймаут
            private void timer1_Tick(object sender, EventArgs e)
            {
                timer1.Enabled = false; //Выключаем таймер
                ost.Text = time.Text; //Сбрасываем поле "Осталось"
                string a = exec("ping ya.ru -w 150"); //Выполняем системную команду PING для проверки поключения.
                debug.Text = a; //Записываем результат в дебаг
    //Манипуляции для проверки подключения...
                if (a.IndexOf("потеряно = 4") > -1 || a.IndexOf("потеряно = 3") > -1 || a.IndexOf("При проверке связи не удалось обнаружить узел ya.ru.") > -1)
                {
    //Если интернет упал...
                    status.Text = "Off, Перезапуск..."; //Меняем статут
                    string b = exec("taskkill /IM \"Connect Manager.exe\" /F"); //Системная команда чтобы завершить Коннект менеджер. Тут вы можете записать "БИД" Мегафон и т.п...
                    b = exec("rasdial MTS-Internet /DISCONNECT"); //Выключаем интернет, для других операторов читайте выше
                    b = exec("ping -n 10 127.0.0.1 > NUL"); //Даём время на выключение путём пустого пинга...
                    b = exec("start C:\\cm.lnk"); //Самое интересное - в данную папку нужно поместить ярлык на запуск проги интернета.
                    status.Text = "Перезапуск завершён! (On)"; //Изменение статуса
                }
                else
    //Если работает
                {
                    status.Text = "On :D"; //Изменение статуса
                }
                timer1.Enabled = true; //Врубаем таймер
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
    //Кликнули по клавише "Начать"
                timer1.Interval = Convert.ToInt32(time.Text)*1000; //Устанавливаем таймаут для таймера
                timer1.Enabled = true;// Включаем таймер 1
                timer2.Enabled= true;// Включаем таймер 2
                button1.Enabled = false;//Делаем неактивной кнопку "Старт"
                button2.Enabled = true;//Делаем активной кнопку "Стоп"
    
            }
    
            private void button2_Click(object sender, EventArgs e)
            {
    //Кликнули по клавише "Стоп"
                timer1.Enabled = false;// Выключаем таймер 1
                timer2.Enabled = false;// Выключаем таймер 2
                button1.Enabled = true;//Делаем активной кнопку "Старт"
                button2.Enabled = false;//Делаем неактивной кнопку "Стоп"
                ost.Text = time.Text;//Новое значение для поля "Осталось"
            }
    
            private void timer2_Tick(object sender, EventArgs e)
            {
    //Таймер для отнятия по 1 значения из поля "Осталось", если оно равно нулю, то ставим дефолтное значение.
                if (ost.Text == "0")
                {
                    ost.Text = time.Text;
                }
                else
                {
                    ost.Text = Convert.ToString(Convert.ToInt32(ost.Text) - 1);
                }
            }
    
    
            private void notifyIcon1_Click(object sender, EventArgs e)
            {
                this.Show(); // делаю форму видимой
                notifyIcon1.Visible = false; // иконка трея невидима
            }
    
            private void button3_Click(object sender, EventArgs e)
            {
                notifyIcon1.Visible = true; // делаем видимым иконку трея
                this.Hide(); // делаем невидимым форму
            }
    
            private void interval_KeyUp(object sender, KeyEventArgs e)
            {
    //Нажатие клавиши в установке размер таймаута
                time.Text = interval.Text;
                ost.Text = interval.Text;
            }
    
        }
    }
    
    Также хочу отметить, что программа не будет работать тогда, когда закончился трафик, она рассчитана на 3G... Если вам нужен другой результат, поиграйтесь с PING.

    А также таймаут таймера ставьте не менее 10 секунд, т.к просто не успеют операции все провернутся... можете даже дописать проверку, но это уже мелочи, if решает =)

    И главное - сделайте в настройках программы вашего мопеда, чтобы было автоматическое подключение к интернету

    Удачи! С вами был Sharp.Net


    -----------------------------------
    Дополнительные материалы:
    Сорцы
    Готовая программа
     
    #1 Sharp.Net, 30 Jul 2012
    Last edited: 30 Aug 2012
    2 people like this.
  2. Sharp.Net

    Sharp.Net New Member

    Joined:
    28 Jul 2012
    Messages:
    41
    Likes Received:
    3
    Reputations:
    1
    Ну и где поливание говном обещанное?! :D
     
  3. Hardick

    Hardick New Member

    Joined:
    23 Jul 2012
    Messages:
    2
    Likes Received:
    0
    Reputations:
    -5
    Ух, спасибо огромное, парень)
    Я решал проблему запуском в аимпе онлайн радио, или же чисто в браузере D:
    Сейчас поставил программу, надеюсь все будет отлично)
     
  4. bdsql

    bdsql New Member

    Joined:
    28 Dec 2011
    Messages:
    12
    Likes Received:
    2
    Reputations:
    0
    если виндоус будет на англ. языке, не заработает твоя программа, парень :D
     
  5. Pomazan

    Pomazan New Member

    Joined:
    21 Jul 2012
    Messages:
    0
    Likes Received:
    0
    Reputations:
    0
    Получается и возобновляется скорость?
    Кто-нибудь пробовал?
     
  6. POS_troi

    POS_troi Elder - Старейшина

    Joined:
    1 Dec 2006
    Messages:
    1,574
    Likes Received:
    467
    Reputations:
    108
    Виснет модем? Купить нормальный а не то УГ что предлагают. Да дороже в два раза но работает на ура
    Падает коннект из-за плохих условий приёма? Берём предыдущее и нормальную gsm антенну.

    Да кстати. За использование только системных функций плюс но из-за этого у тебя программка не кросплатформенна даже в рамках одной платформы. Так что лучше уж +100кб и заюзать curl или что либо другое.

    Вариант два, взять ping из английской версии винды и положить рядом с программой.

    Вариант три. Юзать AT и не парить мозг )
     
    #6 POS_troi, 17 Aug 2012
    Last edited: 17 Aug 2012
  7. Hardick

    Hardick New Member

    Joined:
    23 Jul 2012
    Messages:
    2
    Likes Received:
    0
    Reputations:
    -5
    не стоит предлагать это все людям, не зная проблемы.
    И да, модем не виснет.
    Условия 97%-99% онли.


    P.S. проверил софт, работает.
    как я понял он лишь не дает "пропасть трафику" т.е. не упасть, например, до нуля, он пингует ya.ru каждые Х секунд, которые Вы выставите.

    раньше проблема заключалась в том, что если не используете интернет, т.е. чисто простой. Хотя мессенджеры онлайн, то трафик падал и нельзя было ничего сделать. Помогало лишь переподключение.
     
  8. Sharp.Net

    Sharp.Net New Member

    Joined:
    28 Jul 2012
    Messages:
    41
    Likes Received:
    3
    Reputations:
    1
    Скоро перепишу прогу чтоб работала под инглишом и т.п, появилась идейка)
     
  9. Sharp.Net

    Sharp.Net New Member

    Joined:
    28 Jul 2012
    Messages:
    41
    Likes Received:
    3
    Reputations:
    1
    Итак, сегодня состоится релиз AIR 1.4
    Новшества:
    [ + ] Универсальная, под любой мопед почти
    [ + ] Не использует более системных команд - решил использовать более интересный способ. Теперь можно запускать, и будет работать даже тогда, когда у вас кончился трафик, но инет работает еле-еле...
    [ + ] Не подвисает во время проверки, т.к теперь добавил многопоток.
    [ + ] Новый уровень, короче :D

    Ожидаем!
     
  10. Sharp.Net

    Sharp.Net New Member

    Joined:
    28 Jul 2012
    Messages:
    41
    Likes Received:
    3
    Reputations:
    1
    Итак, прошу прощения за опоздание релиза, небыло времени..

    [​IMG]

    Во-первых хочу сказать, что прога теперь называется InternetManager

    Основные возможности:
    Выбор таймаута
    Выбор процесса программы от модема
    Выбор подключения
    Выбор места программы от модема вручную
    В трей
    Активировать, Деактивировать
    Сколько осталось до проверки
    Прогресс бар и т.д и т.п

    Также теперь программа многопоточная, т.е не будет подвисать при проверки, и вообще быстрее работает и проверяет...

    Ссылка на скачку: http://www.sendspace.com/file/ejltt9

    Размер архива: 18.79KB
    Размер программы: 41,5КВ

    P.S Исходники легко добудете сами, обо всех багах пишем тут, если таковые есть.
     
    #10 Sharp.Net, 30 Aug 2012
    Last edited: 30 Aug 2012