Сайт о городе Лукоянове и Лукояновском районе
Нижегородской области
Сегодня: 03 июня, 2023 (Суббота)
 Главная | Фотоальбомы
Последние комментарии
Света (Статьи)
31 мая 2023 — 08:21
Кладбище сохранилось, администрация по мере возможности поддерживает порядок. >>>
Александр (Статьи)
27 марта 2023 — 12:11
http://podolskie.org/Nikolay.shtmlПодольские В октябре месяце мы с отцом поехали в Лукоянов, для сдачи мною экзамена на звание учителя начального... >>>
ОКСАНА (Статьи)
23 февраля 2023 — 15:57
напишите мне kids-52@yandex.ru Мои бабушки и дедушки родом из д.Николаевка >>>
Дмитрий Пронькин (Статьи)
27 ноября 2022 — 17:39
Здравствуйте, я тоже из Гаврилово и фамилия пронькин, там сейчас ещё давольно таки много пронькиных >>>
Олег (Статьи)
26 сентября 2022 — 20:45
Здравствуйте,Наталья,понятно,Боженькин Иван Васильевич в Малой Аре был мужем сестры моего деда Новикова Павла Еремеевича.А это вы ведете ветку ваших... >>>
Прогноз погоды
Поиск по ключевому слову
Ежедневный гороскоп
Вчера  Сегодня  Завтра
Овен (21.03–20.04)
03.06.2023
Из того факта, что вам задают вопрос, отнюдь не следует, что вы обязаны на него отвечать. Тем более при отсутствии адвоката. Защищайте собственные интересы ревностнее.
Случайное изображение
6783463_IMG_4523.jpg
Мудрые мысли
И рождаясь и умирая, мы делаем кому-нибудь больно.
Эмиль Кроткий
Реклама
Наш баннер
Лукоянов.Ру - сайт о городе Лукоянове и Лукояновском районе.


Фильтр:

ADSL тестер на базе модема Dlink DSL-2500U hw_D4 с использованием Arduino pro mini - исходный код
17 Января, 2020 - 22:43:57 (admin)
IMG_8919.JPG







Исходники


//Copyright Shukstrov Sergey (shus, shyuser)
/* 2018-03-22
* ADSL tester v1.0
* для модема Dlink DSL-2500U hw_D4 fw_1.0.50
* для Arduino ProMini
*
* без I2C
* без шифрования mac адреса
* с шифрованием копирайта по Base64
*
* доработать!!!!!!!!!!!!!!!!!!!
* - не выключается подстветка это было только с I2C, но можно реализовать добавлением транзистора и его выключением через деактивацию пина или тупо так оставить Улыбка
* + доработать _Tab1ToSlash - выводит только одно значение и без /
* + в итоге сделать для Arduino Pro Mini
* -как проблема пока не решенная иногда не полность выводится текущая скорость на 1602
*/

#include
#include
#include
// RS, E, DB4, DB5, DB6, DB7
LiquidCrystal lcd(2, 3, 4, 5, 6, 7);


String caption = "ADSL Tester ";
String revision = "v1.0";
String modem = "Dlink DSL-2500U";

//шифрованные значений переменных копирайта внутри
//<<<<<<<<<<<<<
String cprt = "";
char cprt_h[] = "YnkgIFNodWtzdHJvdiBTTQ";//by Shukstrov SM
int cprt_lh = sizeof(cprt_h);

String cprt1 = "";
char cprt1_h[] = "YnkgIEx1a295YW5vdi5SdQ";//by Lukoyanov.Ru
int cprt1_lh = sizeof(cprt1_h);
//>>>>>>>>>>>>>

char* login = "admin";
char* password1 = "admin";
char* password2 = "password";
char* password3 = "nimda";
char* password4 = "admin1";

int pause = 4000; //время задержки показаний параметров на экране

boolean logining = false; //флаг, что мы авторизованы в модеме
int numlogining = 0; //повторная попытка залогиниться для точек
int link = 0; //статус линка

String points = ""; //result - результат запроса
String result = ""; //points - текущее кол-во точек для бегущих точек



/*----------------------------------------------------------------------------------------------------------------------------------------------------------*/
//проходим SafeMode модема - тупо ждём пока с порта модема идёт загрузка более чем 5 секунд
void _SkipSafeMode() {
int n = 0;
while (n < 7) {
while (Serial.available()>0){
//Serial.write(Serial.read());
char inchar = (char)Serial.read();
n=0;
};
delay(1000);
n = n+1;
_Points(7);//бегающие точки
};
};
/*----------------------------------------------------------------------------------------------------------------------------------------------------------*/
//ищем в тексте text фрагмент tget и возвращаем текст из text от конца tget до первого пробела, но не менее 2 символов
String _Parsing(String &text,String tget) {//text - полный текст, tget - искомый фрагмент текста запроса
String res,str;//результат
int ltext = text.length();//длина исходного текста
int ltget = tget.length();//длина текста запроса
int bres = 0;
int n = 0;//просто счетчик
boolean ftget = false;//флаг, что нашли искомый фрагмент

while (n<(ltext-ltget+1) && !ftget) {//ищем запрос в тексте
str = text.substring(n, n+ltget);
if (str == tget) {//если нашли искомый фрагмент
ftget = true;
bres = n+ltget+1; //запоминаем откуда начинать брать ответ на запрос
}
n=n+1;
}

boolean fres = false;
n=0;
while (ftget && !fres && n char inchar = text[bres+n];
if (inchar != ' ' && inchar != '0xA' && inchar != '\r' && inchar != '\n') {//берем текст до бробела не менее 2 символов чтобы, вдруг сразу после tget идут пробелы
res += inchar;
} else {
if (res.length() > 1) {//если вначале пробелы
fres = true;
};
};
n = n+1;
};
res.trim();
return res;
};

//ищем в тексте text фрагмент tget и возвращаем текст из text от tget до конца строки
/*----------------------------------------------------------------------------------------------------------------------------------------------------------*/
String _ParsingString(String &text,String tget) {//text - полный текст, tget - искомый фрагмент текста запроса
String res,str;//результат
int ltext = text.length();//длина исходного текста
int ltget = tget.length();//длина текста запроса
int bres = 0;
int n = 0;//просто счетчик
boolean ftget = false;//флаг, что нашли искомый фрагмент

while (n str = text.substring(n, n+ltget);
if (str == tget) {//если нашли искомый фрагмент
ftget = true;
bres = n+ltget+1; //запоминаем откуда начинать брать ответ на запрос
}
n=n+1;
}

boolean fres = false;
n=0;
while (ftget && !fres && n char inchar = text[bres+n];
if (inchar != '\r') {//берем текст до бробела не менее 2 символов чтобы, вдруг сразу после tget идут пробелы
res += inchar;
} else {
if (res.length() > 1) {//если вначале пробелы
fres = true;
};
};
n = n+1;
};
//res = text.substring(bres);
res.trim();
return res;
};

/*----------------------------------------------------------------------------------------------------------------------------------------------------------*/
//ставим между значениями слэш "/"
String _Tab1ToSlash(String text) {
int i=0;
boolean fone = false; //флаг, что нашли первый символ пробела или табуляции
String result="";
while (i < text.length()) {
if (text[i] == '\t' || text[i] == ' '){
if (!fone) {
fone = true;
result +='/';
};
} else {
result +=text[i];
}
i = i+1;
};
return result;
};

/*----------------------------------------------------------------------------------------------------------------------------------------------------------*/
//бегающие точки
void _Points (int xr) {
if (points == " ") {
points = ". ";
} else {
if (points == ". ") {
points = ".. ";
} else {
if (points == ".. ") {
points = "...";
} else {
points =" ";
};
};
};
lcd.setCursor(xr,1);
lcd.print(points);
};

/*----------------------------------------------------------------------------------------------------------------------------------------------------------*/
//проверка что мы уже авторизованы в модеме
void _TestLogin() {
Serial.write(0x0A); // переход на новую строку
String txt = Serial.readString();
int i = 0;//счетчик символов
boolean flog = false;//флаг, что символ приглашения ">" нашелся
while (i < txt.length() || !flog) {//тупо ищем в тексте символ >
if (txt[i] == '#'){
flog = true;
};
i=i+1;
};

if (!flog){//модем закрыл сессию
logining == false;
} else {
numlogining = 0;
}
};

/*----------------------------------------------------------------------------------------------------------------------------------------------------------*/
//авторизация в модеме под учеткой
void _Logining() {
if (numlogining == 0) {//первая авторизация
lcd.setCursor(0,1);
lcd.print("Logining ");
numlogining = 1;
}
_Points(8);//бегающие точки

Serial.write(0x0A); // переход на новую строку

String txt = Serial.readString();

if (txt.substring(txt.length()-7,txt.length()-1) == "Login:") {
if (numlogining == 1) {//попытка авторизации под первой учеткой
Serial.write(login);
Serial.write(0x0A); // переход на новую строку
delay(200);
Serial.write(password1);
Serial.write(0x0A); // переход на новую строку
delay(200);
numlogining = numlogining + 1;
};
if (numlogining == 2) {//попытка авторизации под второй учеткой
Serial.write(login);
Serial.write(0x0A); // переход на новую строку
delay(200);
Serial.write(password2);
Serial.write(0x0A); // переход на новую строку
delay(200);
numlogining = numlogining + 1;
};
if (numlogining == 3) {//попытка авторизации под третьей учеткой
Serial.write(login);
Serial.write(0x0A); // переход на новую строку
delay(200);
Serial.write(password3);
Serial.write(0x0A); // переход на новую строку
delay(200);
numlogining = numlogining + 1;
};

if (numlogining == 4) {//попытка авторизации под четвертой учеткой
Serial.write(login);
Serial.write(0x0A); // переход на новую строку
delay(200);
Serial.write(password4);
Serial.write(0x0A); // переход на новую строку
numlogining = 1;
};
} else {
if (txt.substring(11) == "# "){//авторизовались
logining = true;
lcd.setCursor(14,1);
lcd.print("OK");
numlogining = 0;
points = "";

Serial.write("sh"); //заходим в BusyBox
Serial.write(0x0A); // переход на новую строку
delay(200);
}
};
};

/*----------------------------------------------------------------------------------------------------------------------------------------------------------*/
//проверяем статус линк
void _GetLinkStatus() {
String text1;
Serial.write("adsl info --show");
Serial.write(0x0A); // переход на новую строку
text1 = Serial.readString();
result = _Parsing(text1,"Status:");
if (result != "Showtime") {//линка нет
if (link > 1) {//был линк
link = 0;
} else {//линк уже был
link = link-1;
if (link < -15) {// нет линка долго защита
link = -16;
};
}
} else {
if (link < 1) {//небыло линка
link = 1;
} else {//линк уже был
link = link +1;
if (link > 15) {//линка долго есть защита
link = 15;
};
}
};
};
/*----------------------------------------------------------------------------------------------------------------------------------------------------------*/
//выводим состояние линка
void _ViewLinkStatus() {
int xr;
if (link > 0) {//линк есть
xr = 14;
result = "UP";
//lcd.backlight();
} else {
xr = 12;
result = "DOWN";
};
if (link > -2 && link < 2) {//если линк есть или нет первый раз
lcd.clear();
lcd.setCursor(0,0);
lcd.print(caption+revision);
lcd.setCursor(0,1);
lcd.print("Link adsl...");
lcd.setCursor(xr,1);
lcd.print(result);
delay(1000);
} else {//если линк есть или нет не первый раз
_Points(9);//бегающие точки
};
if (link < (-15)) {//отключаем подсветку экрана если нет линка долго
//lcd.noBacklight();
};
};
/*----------------------------------------------------------------------------------------------------------------------------------------------------------*/
//по порядку выводим параметры линии
void _ViewAdslParametrs() {
String text1;
Serial.write("adsl info --show");
Serial.write(0x0A); // переход на новую строку
text1 = Serial.readString();
delay(200);

//стандарт ADSL
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Mode:");
lcd.setCursor(6,0);
result = _Parsing(text1,"Mode:");
lcd.print(result);

//мощность сигнала
lcd.setCursor(0,1);
lcd.print("Powr:");
lcd.setCursor(6,1);
result = _ParsingString(text1, "Pwr(dBm):");
result = _Tab1ToSlash(result);
lcd.print(result);

delay(pause);

lcd.clear();
lcd.setCursor(0,0);
lcd.print("Max:");
lcd.setCursor(5,0);
//Serial.println("Max:");
String text2;
text2 = _ParsingString(text1,"Max:");
//Serial.println(text2);
result = _Parsing(text2,"Downstream rate =") + '/';//строка для вывода итоговая
//Serial.println(result);

result += _Parsing(text2,"Upstream rate =");//строка для вывода итоговая
lcd.print(result);
//Serial.println(result);

//текущая скорость
lcd.setCursor(0,1);
lcd.print("Cur:");
lcd.setCursor(5,1);
String text3;
//Serial.println("Cur:");
text3 = _ParsingString(text1,"Path:");
//Serial.println(text2);
result = _Parsing(text3,"Downstream rate =") + '/';//строка для вывода итоговая
//Serial.println(result);

result += _Parsing(text3,"Upstream rate =");//строка для вывода итоговая
lcd.print(result);
//Serial.println(result);
delay(pause+2000);

//SNR - соотношение сигнал/шум
lcd.clear();
lcd.setCursor(0,0);
lcd.print("SNR: ");
lcd.setCursor(5,0);
result = _ParsingString(text1, "SNR (dB):");
//Serial.println("SNR: ");
//Serial.println(result);
result = _Tab1ToSlash(result);
lcd.print(result);

//затужание сигнала
lcd.setCursor(0,1);
lcd.print("ATT:");
lcd.setCursor(5,1);
result = _ParsingString(text1, "Attn(dB):");
//Serial.println("ATT:");
//Serial.println(result);
result = _Tab1ToSlash(result);
lcd.print(result);

delay(pause-1000);
};
/*----------------------------------------------------------------------------------------------------------------------------------------------------------*/
void setup() {
//определяем размер экрана
lcd.begin(16,2);

//Скорость порта
Serial.begin (115200);
//while (!Serial) {;} // wait for Arduino Serial1 Monitor to open
//Serial.begin (115200);

//расшифровываем переменные копирайта для вывода
int decodedLength = Base64.decodedLength(cprt_h, cprt_lh);
char rcprt[decodedLength];
Base64.decode(rcprt, cprt_h, cprt_lh);
cprt = rcprt;

int decodedLength1 = Base64.decodedLength(cprt1_h, cprt1_lh);
char rcprt1[decodedLength1];
Base64.decode(rcprt1, cprt1_h, cprt1_lh);
cprt1 = rcprt1;


//01 - заставку вешаем пока прогрузится режим SafeMode модема
lcd.setCursor(0,0);
lcd.print(caption+" for");

lcd.setCursor(0,1);
lcd.print(modem);

delay(3000); // ждем 4 сек.

lcd.setCursor(0,0);
lcd.print(caption+revision);

lcd.setCursor(0,1);
lcd.print(cprt);

delay(4000); // ждем 4 сек.


lcd.setCursor(0,1);
lcd.print(cprt1);

delay(4000); // ждем 4 сек.

//02 - заставку вешаем пока прогрузится режим SafeMode модема
lcd.setCursor(0,1);
lcd.print("Loading ");
points = " ";
_SkipSafeMode();
//тупо выводим ОК и ждем
lcd.setCursor(14,1);
lcd.print("OK");
delay(2000); // ждем 2 сек.

points = " ";
};
/*----------------------------------------------------------------------------------------------------------------------------------------------------------*/
void loop (){
if (!logining) {//если не приглашение к вводу команд - авторизация не прошла
_Logining();//авторизация в модеме
} else {
_TestLogin();//проверка что авторизованы - на случай если модем сам закрыл сессию
};
if (logining) {
_GetLinkStatus();//проверка состояния линка
if (link < 2){//линка нет или поднялся первый раз
_ViewLinkStatus();//вывод статуса линка
};
if (link > 0){//линк есть
_ViewAdslParametrs();//линк есть, выводим параметры линии
};
};
};



Ссылка на скетч

Скачать файл: ADSL Tester на базе Dlink DSL-2500U hw_D4 v1.0.zip
Скачиваний:0
Метки:

Комментарии

Пока нет комментариев

Наверх