Сайт о городе Лукоянове и Лукояновском районе
Нижегородской области
Сегодня: 28 марта, 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)
28.03.2024
Вы склонны требовать от жизни( и от себя заодно) слишком много. Не стоит так расходовать себя, удовольствие от жизни вполне можно растянуть.
Случайное изображение
20160807115712.jpg
Мудрые мысли
Чтоб мудро жизнь прожить, знать надобно немало Два правила запомни для начала: Ты лучше голодай, чем что попало есть, И лучше будь один, чем вместе с кем попало.
О. Хайям
Реклама
Наш баннер
Лукоянов.Ру - сайт о городе Лукоянове и Лукояновском районе.


Фильтр:

ADSL тестер на базе модема QTECH-1010 с использованием Arduino pro mini - исходный код
17 Января, 2020 - 23:42:21 (admin)
IMG_20100101_032741.jpg
IMG_8874.JPG
Файл не найден!



















Исходники



//Copyright Shukstrov Sergey (shus, shyuser)
#include
#include
#include
LiquidCrystal_I2C lcd(0x26,16,2);
//LiquidCrystal_I2C lcd(0x3F,16,2);
//2017-09-14 - добавил защиту по mac (с шифрованием) и проверку sw

String model = "ADSL Tester v1.3";
String modem = "QTECH QDSL-1010";
String copyright = "by Shukstrov SM";
String copyright1 = "by Lukoyanov.Ru";

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

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

//base64 mac адреса
//char hash_mac[] = "MDA6MUY6Q0U6NDE6NjM6QzQA";//хэш мак адреса 00:1F:CE:41:63:C4
//char hash_mac[] = "MDA6MUY6Q0U6NDA6MEU6RkE=";//хэш мак адреса 00:1F:CE:40:0E:FA
char hash_mac[] = "MDA6MUY6Q0U6NDA6MkE6NjQ=";//хэш мак адреса 00:1F:CE:40:2A:64
int lhash_mac = sizeof(hash_mac);

String sw = "V2.1";//версия прошивки модема для проверки


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

String points = "";
String result = "";
//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;
};
/*----------------------------------------------------------------------------------------------------------------------------------------------------------*/
//заменяем знак табуляции слэшем
String _TabToSlash(String text) {
int i=0;
String result="";
while (i < text.length()) {
if (text[i] == '\t'){
result +='/';
i=i+1;
} 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(2) == "> "){//авторизовались
logining = true;
lcd.setCursor(14,1);
lcd.print("OK");
numlogining = 0;
points = "";
}
};
};
/*----------------------------------------------------------------------------------------------------------------------------------------------------------*/
//проверка копирайта - mac и sn модема
boolean _GetCopyright() {
String text1;
boolean ok = true;

Serial.write("lan show secondary");//
Serial.write(0x0A); // переход на новую строку
text1 = Serial.readString();
result = _Parsing(text1,"HWaddr");
////Serial.println(result);
////Serial.println(mac);
////Serial.println("///////////////////////////////////////////////////////////////////////////");

//декодируем
int decodedLength = Base64.decodedLength(hash_mac, lhash_mac);
char rmac[decodedLength];
Base64.decode(rmac, hash_mac, lhash_mac);
//Serial.println(rmac);

if (result != rmac) {//mac адрес модема совпадает с прописанным в скрипте
ok = false;
};

Serial.write("swversion");
Serial.write(0x0A); // переход на новую строку
text1 = Serial.readString();
result = _Parsing(text1,"QTECH-1010");
////Serial.println(result);
////Serial.println(sw);
////Serial.println("///////////////////////////////////////////////////////////////////////////");
if (result != sw) {//sw модема совпадает с текущей копией прошивки
ok = false;
};
return ok;
};
/*----------------------------------------------------------------------------------------------------------------------------------------------------------*/
void _ViewErrorCopyright() {
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Copyright Error!");
lcd.setCursor(0,1);
lcd.print("Another modem...");
delay(1000);
};
/*----------------------------------------------------------------------------------------------------------------------------------------------------------*/
//проверяем статус линк
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(model);
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 = _Parsing(text1, "Pwr(dBm):");
result = _TabToSlash(result);
lcd.print(result);

delay(pause);

//максимальная скорость
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Max:");
lcd.setCursor(5,0);
result = _Parsing(text1, "Max(Kbps):");
result = _TabToSlash(result);
lcd.print(result);

//текущая скорость
lcd.setCursor(0,1);
lcd.print("Cur:");
lcd.setCursor(5,1);
result = _Parsing(text1, "Rate (Kbps):");
result = _TabToSlash(result);
lcd.print(result);

delay(pause+2000);

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

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

delay(pause-1000);
};
/*----------------------------------------------------------------------------------------------------------------------------------------------------------*/
void setup() {
lcd.init(); // initialize the lcd
lcd.backlight();

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

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

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

delay(4000); // ждем 4 сек.
lcd.setCursor(0,1);
lcd.print(copyright1);
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) {
if (_GetCopyright()) {//пройдена проверка по mac и sw модема
_GetLinkStatus();//проверка состояния линка
if (link < 2){//линка нет или поднялся первый раз
_ViewLinkStatus();//вывод статуса линка
};
if (link > 0){//линк есть
_ViewAdslParametrs();//линк есть, выводим параметры линии
};
} else {
_ViewErrorCopyright();//вывод ошибки копирайта
};
};
};


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

Скачать файл: ADSL Tester на базе Qtech QDSL1010 v1.3.zip
Скачиваний:0
Метки:

Комментарии

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

Наверх