Отличная статья! Arduinка...
Видео можно залить на vimeo
Видео можно залить на vimeo
Последнее редактирование:
Следуйте инструкциям в видео ниже, чтобы узнать, как установить наш сайт как веб-приложение на главный экран вашего устройства.
Примечание: Эта функция может быть недоступна в некоторых браузерах.
uint8_t hmacKey1[]={arduino HEX code};
uint8_t hmacKey1[]={0xe8, 0xf9, 0x35, 0xd8, 0xce, 0xaa, 0xf0, 0x4a, 0x60, 0xae};
// OTP_LCD_RTC_for_CODEBYnet
/*
Код для форума CODEBY.net от Dmitry88
*/
//~~~~~~~~~~~~~ Библиотеки ~~~~~~~~~~~~~~~~~~~~//
#include "sha1.h"
#include <DS3231.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
//~~~Инициализация часов и дисплея ~~~~~~~~~~~//
//включаем часы реального времени DS3231.
DS3231 rtc(SDA, SCL);
//Инициализируем дисплей. Дисплей подключен последовательно с часами по I2C. (SDA-SDA ; SCL-SCL; VCC-VCC (5v): GND-GND) Они работают по разным адресам и друг другу не мешают (часы 0x63, дисплей 0x27)
LiquidCrystal_I2C lcd(0x27,20,4);
//Начало функции
void printHash(uint8_t* hash) {
int i;
for (i=0; i<20; i++) Serial.println(hash[i]);
Serial.println();
}
//~~~~~~~~~~~~~ TOTP ~~~~~~~~~~~~~~~~~~~~~~~~//
uint8_t hmacKey1[]={0xe8, 0xf9, 0x35, 0xd8, 0xce, 0xaa, 0xf0, 0x4a, 0x60, 0xae}; //CODEBY INXWIZLCPFPW4ZLU
//~~~~~~~~~~~~~ Переменные ~~~~~~~~~~~~~~~~~~//
long intern = 0;
long oldOtp = 0; //переменная для проверки старого ОТР
//~~~~~~~~~~~Основная часть программы~~~~~~~~~~//
void setup() {
Serial.begin(9600);
rtc.begin(); //Запускаем часы
// Установка времени на DS3231 - Раскомментировать строки ниже, чтобы прошить часы реального времени, второй раз прошить, закомментировавав их.
//rtc.setDOW(WEDNESDAY); // Set Day-of-Week to SUNDAY
//rtc.setDate(11, 29, 2017); // Set the date to January 1st, 2014 (ММ,ДД,ГГГГ)
//rtc.setTime(13, 23, 0); // Set the time to 12:00:00 (24hr format)
lcd.init(); //Запускаем lcd
lcd.backlight(); //Включаем подсветку
lcd.begin(16, 2);
//~~~~~~~~~~~~~ Приветсвие ~~~~~~~~~~~~~~~~~~~~//
lcd.setCursor(0, 0); //Переместить строку на 1 символ 1 строки (слева - направо)
lcd.print("OTP Generator");
delay(1000); //Задержка 1сек (1000мс) , перед выводом 2 строки
lcd.setCursor(0, 1); //Переместить строку на 1 символ 2 строки (слева - направо)
lcd.print(" for CODEBY.NET");
delay(3000); //Задержка 3 секунды на приветсвие (первое включение arduino до выполнения цикла)
lcd.clear(); //Очистить экран
//~~~~~~~~~~~~~~~~~ Шаблон ~~~~~~~~~~~~~~~~~~~~//
lcd.setCursor(0, 0);
lcd.print("Your OTP: "); // тут есть бага генератора, он не выводит на дисплей 0 первым символом, из-за этого код показывается 5тизначным, а 6й символ отображается не верно. 012345 показывает как 12345&)
}
int wait = 0;
//~~~~~~~~~~~~~~Цикл программы~~~~~~~~~~~~~~~~//
void loop() {
//Создаем переменную GMT , она будет получать UnixTime, которую считает на основе RTS DS3231
long GMT = (rtc.getUnixTime(rtc.getTime())-7205 ); //смещение на 7200сек (GMT+2 , один час = 3600 секунд) , -5сек корректировка времени залитого скетча)
// пересчитайте смещение относительно вашего часового пояса GMT, т.к. изначально rtc.getTime() показывает время для GMT 0
if(intern == 0) intern = GMT;
else{
uint8_t byteArray[8];
long time = intern / 30;
byteArray[0] = 0x00;
byteArray[1] = 0x00;
byteArray[2] = 0x00;
byteArray[3] = 0x00;
byteArray[4] = (int)((time >> 24) & 0xFF) ;
byteArray[5] = (int)((time >> 16) & 0xFF) ;
byteArray[6] = (int)((time >> 8) & 0XFF);
byteArray[7] = (int)((time & 0XFF));
uint8_t* hash;
uint32_t a;
Sha1.initHmac(hmacKey1,10); //hmackKey1, 10 - 10 количество символов секретного ключа (для Google Authenticator app. 10 символов)
Sha1.writebytes(byteArray, 8);
hash = Sha1.resultHmac();
int offset = hash[20 - 1] & 0xF;
long truncatedHash = 0;
int j;
for (j = 0; j < 4; ++j) {
truncatedHash <<= 8;
truncatedHash |= hash[offset + j];
}
truncatedHash &= 0x7FFFFFFF;
truncatedHash %= 1000000;
if(truncatedHash != oldOtp){
oldOtp = truncatedHash;
wait = 0;
//Serial.println(GMT); //вывод unix time в консоль (расскоментируйте для дебага)
//Serial.println(truncatedHash); //выводит в консоль OTP код
lcd.setCursor(10, 0); //Переместить строку на 10 символ 1 строки (слева - направо)
lcd.println(truncatedHash); //Вывод значения OTP на дисплей
lcd.setCursor(0, 1); //Переместить строку на 1 символ 2 строки (слева - направо)
lcd.print(" "); //Очистить вторую строку (забиваем пробелами)
}else wait++;
if(wait % 2 == 0){ //Эта функция каждые 2 секунды смещает курсор на одно деление вправо и печатает символ * (Для отсчета времени жизни ОТР кода - условно 30 сек \ 2 = 15 символов)
lcd.setCursor(wait/2, 1);
lcd.print("*");
//lcd.setCursor(0, 1); //вывод unix time вместо * (расскоментируйте для дебага и закоментируйте 2 строчки выше)
//lcd.println(GMT); //вывод unix time после смещения на экран (расскоментируйте для дебага)
}
delay(1000);
intern++;
}
}
rtc.setDOW(WEDNESDAY); // Set Day-of-Week to SUNDAY
rtc.setDate(11, 29, 2017); // Set the date to January 1st, 2014 (ММ,ДД,ГГГГ)
rtc.setTime(13, 23, 0); // Set the time to 12:00:00 (24hr format)
//rtc.setDOW(WEDNESDAY); // Set Day-of-Week to SUNDAY
//rtc.setDate(11, 29, 2017); // Set the date to January 1st, 2014 (ММ,ДД,ГГГГ)
//rtc.setTime(13, 23, 0); // Set the time to 12:00:00 (24hr format)
#!/bin/bash
while true; do
T=$(date +%H:%M:%S);
U=$(date +%s);
#while[1]; do
echo "Time "$T" = UNIX Time "$U""; sleep 1;
done;
Статья читается полностью. Тезисы со ссылками на разделы появятся позже.
Комментарии
1