Как стать автором
Обновить

Железная Бюджетная Хабрамерка (ЖБХ) кармы, рейтинга хабратопика и прочих параметров на arduino + openwrt

Время на прочтение 5 мин
Количество просмотров 6.8K
Привет Хабр!

Представляю вниманию общественности свою Железную Бюджетную Хабрамерку.



ЖБХ позволяет измерять и отображать параметры кармы, рейтинга и позиции в общем рейтинге. Кроме этого, выгодно отличается от софтовых аналогов и позволяет следить за свежим хабратопиком, показывая, кто сколько плюсанул, минусанул, добавил в избранное и общее количество просмотров. Все это безобразие реализовано на ардуине (да-да, унылая ардуина, но и тут есть изюминка, читайте дальше) и в качестве ворот в интернет использовался роутер TP-link wr1043nd с прошивкой openWRT (Роутер пойдет любой, который поддерживает openwrt_)

Уже зачесались руки собрать такую штуку?



Нам понадобится всего несколько вещей, Экран LCD 1602, переменный резистор любого номинала, ардуино про мини и дешевый usb-ttl переходник на pl-2303. Очень бюджетный набор для творчества. Экран LCD — 80 рублей, резистор — даром, ардуино про мини — 100 рублей, usb-ttl — 30 рублей, опыт — бесценно.



Экран подключается посредством стандартной инструкции в картинках, найденной в интернете, настраивается яркость, подключается USB.

Вторая важная вещь — роутер. Список поддерживаемого оборудования каждый найдет вот тут wiki.openwrt.org/toh/start

Прошивка каждого роутера — индивидуальна, но подробно расписана в Вики на сайте OpenWRT, так что описывать не буду. Замечу, что сразу лучше всего вывести внутренний UART разъем наружу, так и можно его вернуть к жизни, и через putty легче отлаживать скрипты — через серийный порт выводятся ВСЕ данные, в то время как по ssh видно далеко не все. За время тестов я уже несколько раз восстанавливал прошивку через COM + ttftp сервер. Все мануалы по работе с железом и начальной установке есть на сайте.



После прошивки настраиваем интернет, обычно хватает вставить кабель с домашнего роутера в WAN роутера с openWRT и интернет в устройстве уже есть. Я себе настроил интернет через wi-fi, использую Веб интерфейс. Не во всех прошивках сразу стоит веб-интерфейс, смотрите документацию по своему роутеру.

Итак, будем считать, что прошло пол дня, на роутере стоит Openwrt, на роутере настроен интернет, через Putty под рутом мы зашли и готовы выполнять любые команды.

Добавляем нужные пакеты. (мне пришлось обновить wget — версия на роутере не поддерживала кукисы — об этом подробнее дальше)

opkg update
opkg install wget
opkg install kmod-usb-acm                      
opkg install kmod-usb-serial-pl2303  


Если вы используете другой usb переходник для ардуины — нужно будет поставить свой пакет под этот переходник. В результате действий должно появится устройство /dev/ttyUSB0 (Оно может называться и иначе, зависит от прошивки и пакета под USB-com переходник)

Заходим в /usr/ и создаем скрипт, например up.sh со следующим содержимым ( уважаемые хабровцы, в коде нужно убрать 0000 (четыре нуля) — получилось, что текст хабратопика неправильно парсится из-за присутствия в коде тригеров, по которым выбирались значения, переделывать лень, чтобы хабраметр работал добавил нули)

Скрытый текст

wget --load-cookies  /usr/cookies.txt -U "User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:28.0) Gecko/20100101 Firefox/28.0" http://habrahabr.ru/post/220893/ -O /tmp/index.html

awk -F ';' '/&ua0000rr;/ {print substr($2,0,index($2," " ))}' /tmp/index.html>/usr/up.txt
UP=`awk 'NR == 1' /usr/up.txt`
echo 'u='$UP > /dev/ttyUSB0


awk -F ';' '/&ua0000rr;/ {print substr($3,0,5)}' /tmp/index.html>/usr/down.txt
sed 's/\"/ /g' /usr/down.txt>/usr/down2.txt
DOWN=`awk 'NR == 1{print$1}' /usr/down2.txt`
echo 'd='$DOWN > /dev/ttyUSB0

VW=`awk -F '>' '/pageviews/ {print substr($2,0,index($2,"<" )-1)}' /tmp/index.html`
echo 'v='$VW > /dev/ttyUSB0

FW=`awk -F '>' '/favs_count/ {print substr($2,0,index($2,"<" )-1)}' /tmp/index.html`
echo 'f='$FW > /dev/ttyUSB0

wget http://habrahabr.ru/api/profile/romanvl/ -O /tmp/index2.html

KARMA=`awk -F '>' '/karma/ {print int(substr($2,0,index($2,"<" )-1))}' /tmp/index2.html`
echo 'k='$KARMA > /dev/ttyUSB0

RATE=`awk -F '>' '/rating>/ {print int(substr($2,0,index($2,"<" )-1))}' /tmp/index2.html`
echo 'r='$RATE > /dev/ttyUSB0

POS=`awk -F '>' '/ratingPosition/ {print substr($2,0,index($2,"<" )-1)}' /tmp/index2.html`
echo 'p='$POS > /dev/ttyUSB0




Тут необходимы пояснения.

1) Авторизация на Хабре — это что-то с чем-то. Без авторизации не отдаются данные о рейтинге хабратопика, т.е. гость просто не увидит нужных цифр. Поэтому используется кукисы, сохраненный из браузера, после успешного входа на хабр.Я использовал Cookie Exporter 1.5 — дополнение для FF, которое экспортирует ВСЕ кукисы в формате, понятном Wget Из файла со всеми кукисами я удалил все, что не относится к хабру, сам файл залил через WinSCP на роутер в папку /usr/ Передавать свои кукисы кому-то постороннему крайне не рекомендую.

2) Парсинг нужных значений сделан через awk — шикарную вещь, но совершенно чуждую простому пользователю=). Очень долго мучался c awk, сделал прикольные костыли, в результате получил результат, уверен, можно лучше, но, для меня это работает (с)

3) Значения кармы я взял из официального источника, хотя можно было спарсить тем же образом, что и данные по хабратопику.

4) Данные передаются в ардуину очень интересным способом! После соединения ардуины по USB с роутером, становится доступна коммуникация в обе стороны через порт на скорости 9600 (именно такая скорость по умолчанию для моего пакета под pl-2303? менять не стал, незачем) Можно было бы отправлять в ардуину строку с данными, ардуина парсила бы строку и выводила на экран. Но! Удачнейшим образом наткнулся на вот это bitlash.net (Если кто впервые видит — посмотрите обязательно, шикарная вещь.) Если в двух словах — это интерпретатор команд. Позволяет программировать ардуину через командную строку. В моем случае — передавать значения переменных и отображать их на экране. Советую почитать доки, для меня было открытием. Перед тем, как запустить код, скачиваем и ставим библиотеку bitlash

Код для ардуины

Скрытый текст
#include "bitlash.h"
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
byte UP[8] = {
  0b00100,
  0b01010,
  0b10001,
  0b11011,
  0b01010,
  0b01010,
  0b01010,
  0b01110
};

byte DWN[8] = {
  0b01110,
  0b01010,
  0b01010,
  0b01010,
  0b11011,
  0b10001,
  0b01010,
  0b00100
};

byte FW[8] = {
  0b00100,
  0b10101,
  0b11111,
  0b01110,
  0b01110,
  0b11011,
  0b10001,
  0b00000
};

byte VW[8] = {
  0b00000,
  0b00000,
  0b01110,
  0b10001,
  0b10101,
  0b10001,
  0b01110,
  0b00000
};

void setup(void) {
  lcd.createChar(0, UP);
  lcd.createChar(1, DWN);
  lcd.createChar(2, FW);
  lcd.createChar(3, VW);


  initBitlash(9600);
  lcd.begin(16, 2);
}

void loop(void) {

  lcd.setCursor(0,0);
  // lcd.print("U");
  lcd.write((uint8_t)0);
  lcd.print(getVar(20));
  // lcd.print("D");
  lcd.write((uint8_t)1);
  lcd.print(getVar(3));
  // lcd.print("F");
  lcd.write((uint8_t)2);
  lcd.print(getVar(5));
  //lcd.print("V");
  lcd.write((uint8_t)3);
  lcd.print(getVar(21));

  lcd.setCursor(0, 1);
  lcd.print("K");
  lcd.print(getVar(10));
  lcd.print(" R");
  lcd.print(getVar(17));
  lcd.print(" P");
  lcd.print(getVar(15));

  runBitlash();
}




Остается запустить выполнение скрипта up.sh через крон, соединить ардуину с роутером по USB и хабромерка готова!

Теги:
Хабы:
+25
Комментарии 14
Комментарии Комментарии 14

Публикации

Истории

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн
Геймтон «DatsEdenSpace» от DatsTeam
Дата 5 – 6 апреля
Время 17:00 – 20:00
Место
Онлайн
PG Bootcamp 2024
Дата 16 апреля
Время 09:30 – 21:00
Место
Минск Онлайн
EvaConf 2024
Дата 16 апреля
Время 11:00 – 16:00
Место
Москва Онлайн