Сайт о городе Лукоянове и Лукояновском районе
Нижегородской области
Сегодня: 14 апреля, 2024 (Воскресенье)
 Главная | Фотоальбомы
Помощь проекту
Карта Сбербанка:
4276 1609 4789 6784 (СМШ)
Последние комментарии
Евгений (Статьи)
4 февраля 2024 — 10:42
Моя бабушка как-то говорила: "мы не эрзя и не мокша. Мы - шокша" Она родом из Печь. >>>
Гость (Статьи)
28 ноября 2023 — 22:57
Материал сырой и не точный. >>>
petr123 (Статьи)
5 ноября 2023 — 00:01
Спасибо >>>
admin (Статьи)
4 ноября 2023 — 19:45
Добрый день. 1) Насколько я знаю, два ADSL модема не соединятся между собой. Только связка DSLAM и ADSL модем. В связке могут работать два SHDSL... >>>
petr123 (Статьи)
4 ноября 2023 — 17:49
Добрый день. Спасибо за скетч и схему Но у меня вопросы. 1) Я бы хотел промерить характеристики провода. Те у меня нету на обратной стороне провода... >>>
Прогноз погоды
Поиск по ключевому слову
Ежедневный гороскоп
Вчера  Сегодня  Завтра
Овен (21.03–20.04)
14.04.2024
Сегодня вам следует быть максимально осторожным. Небрежность дорого вам обойдется, если не навлечет прямую опасность. Пусть та неприятность, которой вам с трудом, но удастся избежать в начале дня, послужит вам предупреждением.
Случайное изображение
Березовые рощи на склонах холмов около с. М.Мамлеево.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
Метки:

Комментарии

04 Ноября, 2023 - 17:49:20 (petr123)

offline
Добрый день.
Спасибо за скетч и схему
Но у меня вопросы. 1) Я бы хотел промерить характеристики провода. Те у меня нету на обратной стороне провода станции ADSL. Вопрос: если сделать 2 экземпляра системы, и с обратной стороны мерять линию вторым модемом, можно ли реализовать такое ? И нужно ли править для этого скетч ?
2) где Вы взяли описание протокола общения по UART с Dlink DSL-2500U ?
04 Ноября, 2023 - 19:45:38 (admin)

offline
Добрый день.
1) Насколько я знаю, два ADSL модема не соединятся между собой. Только связка DSLAM и ADSL модем. В связке могут работать два SHDSL модема.
2) Что-то находил в Интернете, но в целом, подключаетесь к модему через разъем uart с компьютера через консоль, есть переходники uart-usb, запускаете putty, входите в консоль, авторизуетесь и через консоль проверяете какие команды и что выводят.
05 Ноября, 2023 - 00:01:06 (petr123)

offline
Спасибо
14 Июня, 2023 - 08:09:09 (Александр Сергеевич)

offline
Добрый день. Приложите пожалуйста использованные библиотеки, спасибо.
24 Июля, 2023 - 20:32:11 (admin)

offline

Наверх