Моя подруга Shodan. Часть 1.

Alexey “Averrin” Nabrodov
8 min readAug 19, 2016

--

Дисклаймер: это статья ни про System Shock ни про хакеров.

Дисклаймер 2: тут будет много программерского, не понимаете — пропускайте, ничего не потеряете. Поток сознания как он есть.

После затяжного нежелания что либо делать, благодаря паре удачных совпадений, я наконец продвинулся в своей давней мечте сделать что-то вроде “умного дома”. Да, да, я понимаю, читать очередную статью про очередные китайские датчики температуры и ардуины никому уже не интересно. Поэтому их тут и не будет. По двум причинам:

  1. Мое любительское электроно-паяние в этом направлении хоть и было удачным, завершалось после успешной сборки прототипа
  2. Эта статья в большей степени про софт, извращения и интеграцию

Итак, собственно, идея в том, чтобы создать программно-аппаратный комплекс, который в достаточной мере может быть в курсе моей жизни и уметь ее облегчать по мере моих же сил. Тем не менее, не стоит тут искать какую-то практическую пользу: я прекрасно жил и без возможности выключать свет в туалете через интернет.

Начнем с того, что же умеет моя Shodan.

  1. Постить мне котиков в Telegram. Это самое важное.
  2. Знать где я
  3. Сколько времени провожу на работе, и сколько еще нужно (у меня гибкий график), и статус тайм-трекера (отметил ли я сегодня время)
  4. Управлять компом (громкость, плеер, прочая), а также включать и выключать его, и знать текущее состояние
  5. Отправлять уведомления (Pushbullet и Telegram)
  6. Управлять “умным домом”, хотя на самом деле у меня управлять-то можно только светом
  7. Знать о погоде, температуре, влажности и освещенности комнаты, а так же о наличии интернета
  8. Уметь отображать это все
  9. Ну и действительно самое главное — уметь оценивать, все ли идет как надо, уведомлять меня о том, что что-то не то, делать вещи, которые я хочу еще до моей команды.
  10. Быть милой.
Кусочек кода Shodan.

Со стороны это все выглядит не таким уж и сложным, однако, как и всегда, дьявол в деталях.

Пожалуй, я пойду в хронологическом порядке, чтобы было проще понимать, как развивалась система и какие в ней есть части.

А началось все с лошади*. А если точнее, с того, что ко мне наконец приползли заказанные из-за своей дешевизны миникомпьютеры 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. Правда для моих целей этого более сем достаточно.

Расскажу пару знаменательных косяков связанных с линуксом и арм в частности.

  1. /dev/i2c как и все устройства пишется и читается только от рута. Я решаю это страшным, но действенным chmod 777 /dev/i2c
  2. В линуксах пинговать можно только руту. Да, для программки ping сделано исключение, она особо разрешена. Для этого есть негуглящееся решение: setcap cap_net_raw+epi gideon
  3. Эти команды приходится выполнять после перезагрузке или обновления бинарика. Плюс, запускать удаленно графические приложения от рута — те еще приключения, так что пришлось все это записать в автозапуск и прописать в sudoers, дабы пароль не вводить. Не делайте так на серверах!
  4. Не используйте на армах 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.

В целом я доволен этим всем, плюсы можете прочитать в инете, я расскажу о минусах:

  1. Так себе приложение-управлялка
  2. S1C — вещь в себе, то есть она может уведомлять тебя, но по сути она не генерит события и подвязать на нее ничего не возможно. Надеюсь, в будущем это исправят или умельцы помогут (о них ниже)
  3. Управление всем этим счастьем только с телефона, да так хитро, что пока никто не сломал протокол достаточно, чтобы вынести апи с устройства. Так что приходится поднимать сервер на телефоне, чтобы дергать команды RM2. Что нефигово жрет батарейку, естественно.

Тут мне и помог Tasker. В нем много хорошего, как оказалось, но особенно в данном контексте полезны две вещи: плагины и сцены.

Плагины добавляют события и действия ищ других программ, а сцены позволяют сделать свой “пульт”. Да, для менее требовательных пользователей все это предоставляет и родной софт Broadlink-а, но не им единым. Из внезапно хороших плюшек — плагин как раз умеет поднимать http api.

Быстренько переносим это все на планшетик, включаем его в перманентную зарядку и вуаля — “контрольная панель”.

Промежуточный вариант “пульта”. Тоже около компа. Удобно управлять светом.

Чуть-чуть забегу вперед, чтобы к Shodan прийти уже во все оружии, хотя хронологически где-то тут она уже многое умела.

Для полноты картины нам не хватает управления компом. На самом деле я раньше вполне справлялся и TeamViewer-ом, но все таки это не удобно, каждый раз лезть в него, целиться по кнопочкам… В процессе просмотра списка плагинов для таскера обнаружился один крайне плодовитый товарищ и его плагин AutoRemote, который кроме прочего умеет отправлять сообщения в некую EventGhost. А это уже оказалось аналогом таскерадля PC.

Дальше были изыскания, почему же сволочь не меняет громкость (проделки десятки), плагина для плеера (там полно всяких, но PotPlayer не встроен, пришлось поискать) и того, а как бы пнуть его снаружи. Снаружи пнуть оказалось можно по… websocket-у, что одновременно странно и завораживающе. Ну путь так, для меня это давно не что-то неизведанное.

Итак, пульт на телефоне уже умеет управлять светом и компом (включать только не умеет, но об этом позже), а так же куда-то в никуда раскрывает мое местоположение (дом/работа/дача/между), статус батарейки и прочее ненужное никому.

Настало время покодить.

И тут внезапно количество слов подходит к “идеальной” отметке в 1.600, так что оттянем знакомство с Shodan еще на чуть-чуть. Надеюсь, никто не успеет прочесть эту часть до того, как я напишу следующую =) Там будет много программерского, мысли о планах на дальнейшее развитие и “потерянные главы” о том, что я забыл рассказать в этой.

--

--

No responses yet