Сайт о городе Лукоянове и Лукояновском районе
Нижегородской области
Сегодня: 28 октября, 2021 (Четверг)
 Главная | Фотоальбомы
Последние комментарии
Ольга (Статьи)
14 октября 2021 — 14:06
Здравствуйте.Может кто помнит и знает про Арзяевых и Аркаевых. >>>
виктор (Статьи)
22 сентября 2021 — 12:53
как сложилась судьба анастасии саблиной >>>
Гость (Статьи)
7 мая 2021 — 08:22
Дедушка Горжусь Тобой Спасибо Тебе За Победу >>>
Татьяна Сироткина (Статьи)
20 января 2021 — 16:18
Татьяна, давайте спишимся по электронной почте skazkaluk@mai.ru Нам с Вами есть о чем поговорить. >>>
opergs (Статьи)
18 декабря 2020 — 14:36
Спасибо за интересные комментарии. У Вас, наверное, сведения, так сказать, из первых уст? От самих жителей этих мест? >>>
Прогноз погоды
Ежедневный гороскоп
Вчера  Сегодня  Завтра
Овен (21.03–20.04)
28.10.2021
Сегодня у вас появится талант вмешиваться в чужие дела и путать чужие планы. Лучше заройте его в землю, такой - не жалко.
Случайное изображение
Василий Павлович Давыдов (в центре) со своими сослуживцами, 1943 год.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
Метки:

Комментарии

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

Наверх