Решаем проблему падения скорости до нуля у USB Модемов.
Внимание! Программа обновлена, читайте #10 пост!
Приветствую
Думаю, у того, кто использует USB модемы (МТС-Коннект в частности) не раз бывала такая проблема, когда скорость интернета падает до нуля, и приходится делать переподключение модема. В ручную несколько раз в день, или особенно ночью, согласитесь, это делать не очень удобно. Сегодня я расскажу вам, как автоматизировать данный процесс, и сохранить нервные клетки.
Итак, начнём.
Писать программу мы будем на C#, проверялось на USB-Модеме от МТС.
Для начала построим схему программы:
Таймаут->Проверка подключения->Если успешно, то запускаем таймаут заново. Иначе - переподключение интернета.
Отлично, теперь обсудим интерфейс программы:
1.) Кнопки Вкл/Выкл автоматического управления
2.) Ручной ввод интервала таймера
3.) Статус интернета
4.) Время до следующей проверки
5.) Сворачивание в трей
6.) Дебаг
Выглядеть графически это будет так:
Самые сложные механизмы в данной программе - это проверка подключения, и переподключение в случае падения интернета.
И то, и другое мы будем реализовывать с помощью командной строки Windows.
С теорией покончено, приступим к практике!
Запустите Microsoft Visual C# (Я использовал 2008 Express).
Файл->Создать проект->Приложение Windows Forms
Далее набросайте формочку как у меня на рисунке, не забудьте про сворачивание в трей (Или можете загрузить готовый проект в конце статьи).
Затем откройте Form1.cs (Или любое другое имя вашей формы). Вписываем следующее:
Код:
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
-----------------------------------
Дополнительные материалы:
Сорцы
Готовая программа