Сайт о городе Лукоянове и Лукояновском районе
Нижегородской области
Сегодня: 19 марта, 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)
19.03.2024
Последнее время у вас появилась тенденция не замечать ничего, кроме волнующей вас проблемы, будь то работа или вопросы, связанные с личной жизнью. Все же постарайтесь вспомнить, что существует еще и окружающий мир, в котором, несмотря на удручающую экологическую обстановку, все равно неплохо.
Случайное изображение
324.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

Наверх