Моя подруга Shodan. Часть 1.
Дисклаймер: это статья ни про System Shock ни про хакеров.
Дисклаймер 2: тут будет много программерского, не понимаете — пропускайте, ничего не потеряете. Поток сознания как он есть.
После затяжного нежелания что либо делать, благодаря паре удачных совпадений, я наконец продвинулся в своей давней мечте сделать что-то вроде “умного дома”. Да, да, я понимаю, читать очередную статью про очередные китайские датчики температуры и ардуины никому уже не интересно. Поэтому их тут и не будет. По двум причинам:
- Мое любительское электроно-паяние в этом направлении хоть и было удачным, завершалось после успешной сборки прототипа
- Эта статья в большей степени про софт, извращения и интеграцию
Итак, собственно, идея в том, чтобы создать программно-аппаратный комплекс, который в достаточной мере может быть в курсе моей жизни и уметь ее облегчать по мере моих же сил. Тем не менее, не стоит тут искать какую-то практическую пользу: я прекрасно жил и без возможности выключать свет в туалете через интернет.
Начнем с того, что же умеет моя Shodan.
- Постить мне котиков в Telegram. Это самое важное.
- Знать где я
- Сколько времени провожу на работе, и сколько еще нужно (у меня гибкий график), и статус тайм-трекера (отметил ли я сегодня время)
- Управлять компом (громкость, плеер, прочая), а также включать и выключать его, и знать текущее состояние
- Отправлять уведомления (Pushbullet и Telegram)
- Управлять “умным домом”, хотя на самом деле у меня управлять-то можно только светом
- Знать о погоде, температуре, влажности и освещенности комнаты, а так же о наличии интернета
- Уметь отображать это все
- Ну и действительно самое главное — уметь оценивать, все ли идет как надо, уведомлять меня о том, что что-то не то, делать вещи, которые я хочу еще до моей команды.
- Быть милой.
Со стороны это все выглядит не таким уж и сложным, однако, как и всегда, дьявол в деталях.
Пожалуй, я пойду в хронологическом порядке, чтобы было проще понимать, как развивалась система и какие в ней есть части.
А началось все с лошади*. А если точнее, с того, что ко мне наконец приползли заказанные из-за своей дешевизны миникомпьютеры C.H.I.P. Никаких особенных идей у меня на тот момент не было, но линь и встроенный wifi меня радовал. Надо уточнить, что для меня это не первая подобная зверушка — у меня есть небезызвестная Raspberry Pi с адаптером для wifi, есть даже парочка безумных Corewind WiFiG25 веселье с которыми многое мне открыла про встроенные операционки, линукс и железо в частности.
Между строк отмечу: c.h.i.p. — очень хороши за свои деньги. Ничего особенного я на них не делал, может есть косяки по железу, но мне мешало разве что на пинах 3.3v, а не 5.
Я, задним умом вспоминал, что так и не взял vga-адаптер имея в виду, что у меня где-то валялся купленный еще для малинки 7и-дюймовый экранчик. Внезапно оказалось, что он умеет принимать на вход аналоговый сигнал, который только и умеют чипы без плат расширения. Повезло.
В то время (а не так давно это и было, кстати) я как раз игрался с SDL2 для Go. Для тех кто не в курсе — низкоуровневая библиотека для рисования на экране и быстрый компилируемый язык от гугла и столпов языкостроения. У меня есть претензии к обоим, но по крайней мере, мне это интересно.
Так родился Gideon — программка для отображения погоды за окном, времени и наличия интернета. Назвал я ее в честь ИИ из вселенной Флеша. Идеи самой Shodan тогда еще не было. Надо сказать, нечто подобное я уже много раз начинал и обычно оно носило имена Nerevarine или Ravenor.
Сейчас по ссылке вы найдете только небольшой кусочек логики и работу с датчиком температуры, но изначально Гидеон был одинок и сам все умел. Потихоньку его код отрисовки переполз в отдельную библиотечку-движок Seker который пока хорош разве что тем, что довольно шустр и не ломается от многопоточности. Правда анимации в нем очень зачаточны, а периодически он теряет буквы при отрисовке. До сих пор не могу поймать почему.
А код для получения погоды, а так же репортинга комнатной температуры (о чем ниже) в итоге сформировал Shodan — изначально просто набор модулей для работы с разными API.
Но начнем с самого начала. C.H.I.P.-ов у меня два. Собственно Гидеон и его “злой близнец”. Гидеон прошит версией с GUI, что позволяет ему пользоваться экранчиком (жаль, у меня так и не завелся на нем тач), а второй — headless, изначально задуманный как target для сборки бинарей. Напомню, они — ARM. И хоть Go умеет компилить для арма на любой машине, все с дребезгом убивается об SDL, который доставляет уйму проблем и не дает скомпилить программу на x86. Так что у меня есть два братца-акробатца, и много ssh между всеми нами.
Собственно сразу было решено научить Гидеона показывать комнатную температуру. Сделать это было довольно просто — у меня есть и отличный датчик SHT21 и умение с ним обращаться. Разве что руки так и не дошли переписать получение значений с Python на Go, посему пока я уродски дергаю скрипт через консоль.
Кстати, C.H.I.P. на аналоговом выходе дает только 640x480. Правда для моих целей этого более сем достаточно.
Расскажу пару знаменательных косяков связанных с линуксом и арм в частности.
- /dev/i2c как и все устройства пишется и читается только от рута. Я решаю это страшным, но действенным chmod 777 /dev/i2c
- В линуксах пинговать можно только руту. Да, для программки ping сделано исключение, она особо разрешена. Для этого есть негуглящееся решение: setcap cap_net_raw+epi gideon
- Эти команды приходится выполнять после перезагрузке или обновления бинарика. Плюс, запускать удаленно графические приложения от рута — те еще приключения, так что пришлось все это записать в автозапуск и прописать в sudoers, дабы пароль не вводить. Не делайте так на серверах!
- Не используйте на армах sdl.Delay. Она ломает стандартный time.Sleep, которым пользуются, например, http.Get, что делает невозможным нормальную работу всей программы. Молча и без падений. При том на большом брате все работает нормально.
На первый взгляд все.
Но мы хотим странного.
Для начала хотелось построить график температуры и влажности в комнате, так как мало того, что на улице было жарковато, так через день каждые пять минут начинался дождь.
Как оказалось, не так просто найти онлайн-сервис, куда можно писать серию данных и построить по ней график. Естественная мысль была — поднять свою Mongo, но я гнал ее от себя, чтобы не утонуть в частностях. Внезапно спас любимый (хоть и дорогой) SparkFun, открывший сервис специально для всякого кустарного IoT — data.sparkfun. Удобное апи (банальный GET запрос) натолкнул на мысли, что довольно много вещей можно отслеживать, если есть удобное место для их хранения.
И понеслась. Первая мысль, была — ловить по wifi место положение, уровень заряда телефона и тп (кстати “тп” здесь — это практически ничего, так как из умного я смог прикрутить только сплю/проснулся на плагин от замечательного Sleep as Android). Помогал мне во всем этом старинный и уже несколько менее пугающий Tasker.
Таскер был выбран не случайно. Хоть он и платный, я вскользь где-то читал что под него есть плагин для управления… Broadlink RM2 Pro. С чего это важно? А вот тут в бой идет вторая часть истории.
Если первым удачным совпадением были едущие фиг знает сколько месяцев чипы, то второе — внезапно закончившийся кредит на машину. И в честь этого знаменательного события я решил порадовать себя давно желаемым “умным домом”.
Оказалось, что все соооовсем не так просто. По какой-то скрытой от меня причине, взять и купить комплект чего-то нормально стоющего (даже не дешево, просто не запредельно), с нормальным парком перефирии (а не лампочка + ненужный термостат + ненужная умная розетка под американский стандарт) просто не получится.
Слава узкоглазым богам, последнее время китайцы начали работать более основательно, делая уже что-то больше похожее на экосистему устройств. Я надеялся, что Livolo сделает что-то подобное. Их пара выключателей у меня уже года два используются как обычные, так как руки так и не дошли научить кого-нить из ардуинок ими управлять. Однако, нашлись Broadlink. Да, пока у них совсем немного компонентов, однако уже кое-что есть. И выключатели выглядят не хуже. (Кстати, советую хорошего продавца)
Я взял, собственно RM Pro (умеет испускать радио- и ИК-сигналы и запоминать их с пультов), набор выключателей (1- и 2х-кнопочные), а так же набор “сигнализации” S1C.
В целом я доволен этим всем, плюсы можете прочитать в инете, я расскажу о минусах:
- Так себе приложение-управлялка
- S1C — вещь в себе, то есть она может уведомлять тебя, но по сути она не генерит события и подвязать на нее ничего не возможно. Надеюсь, в будущем это исправят или умельцы помогут (о них ниже)
- Управление всем этим счастьем только с телефона, да так хитро, что пока никто не сломал протокол достаточно, чтобы вынести апи с устройства. Так что приходится поднимать сервер на телефоне, чтобы дергать команды RM2. Что нефигово жрет батарейку, естественно.
Тут мне и помог Tasker. В нем много хорошего, как оказалось, но особенно в данном контексте полезны две вещи: плагины и сцены.
Плагины добавляют события и действия ищ других программ, а сцены позволяют сделать свой “пульт”. Да, для менее требовательных пользователей все это предоставляет и родной софт Broadlink-а, но не им единым. Из внезапно хороших плюшек — плагин как раз умеет поднимать http api.
Быстренько переносим это все на планшетик, включаем его в перманентную зарядку и вуаля — “контрольная панель”.
Чуть-чуть забегу вперед, чтобы к Shodan прийти уже во все оружии, хотя хронологически где-то тут она уже многое умела.
Для полноты картины нам не хватает управления компом. На самом деле я раньше вполне справлялся и TeamViewer-ом, но все таки это не удобно, каждый раз лезть в него, целиться по кнопочкам… В процессе просмотра списка плагинов для таскера обнаружился один крайне плодовитый товарищ и его плагин AutoRemote, который кроме прочего умеет отправлять сообщения в некую EventGhost. А это уже оказалось аналогом таскерадля PC.
Дальше были изыскания, почему же сволочь не меняет громкость (проделки десятки), плагина для плеера (там полно всяких, но PotPlayer не встроен, пришлось поискать) и того, а как бы пнуть его снаружи. Снаружи пнуть оказалось можно по… websocket-у, что одновременно странно и завораживающе. Ну путь так, для меня это давно не что-то неизведанное.
Итак, пульт на телефоне уже умеет управлять светом и компом (включать только не умеет, но об этом позже), а так же куда-то в никуда раскрывает мое местоположение (дом/работа/дача/между), статус батарейки и прочее ненужное никому.
Настало время покодить.
И тут внезапно количество слов подходит к “идеальной” отметке в 1.600, так что оттянем знакомство с Shodan еще на чуть-чуть. Надеюсь, никто не успеет прочесть эту часть до того, как я напишу следующую =) Там будет много программерского, мысли о планах на дальнейшее развитие и “потерянные главы” о том, что я забыл рассказать в этой.