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

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

bfa37be6b9240de1fff9db2d4c12681d.jpg

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

Я собрал рабочий прототип на бредборде за день, думаю, что каждому это по силам. Уже зачесались руки собрать такую штуку?

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

c098db648680e8457459290a872e5b09.jpg

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

2abab3e02c65c63ead35c43f97002806.jpg

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

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

e5c6a4e992a1ccc750625ae89179aa9a.jpg

После прошивки настраиваем интернет, обычно хватает вставить кабель с домашнего роутера в 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 со следующим содержимым

Скрытый текст 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 ';' '/↑/ {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 ';' '/↑/ {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, которое экспортирует ВСЕ кукисы в формате, понятном Цпуею Из файла со всеми кукисами я удалил все, что не относится к хабру, сам фал залил через 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 и хабромерка готова!

af97c0a9d6a30b48f0a53cd6af90e00b.jpg

Прямую трансляцию с моего ЖБХ можно посмотреть тут www.justin.tv/romanvl2

© Habrahabr.ru