Новый функционал, сценарии.

Сегодня я ввел возможность запускать по сценарию исполняемые файлы или просто выполнять команды операционной системы внутри процесса контроллера.
Фича достаточно просто реализуется, но тем не менее очень полезна.

К примеру:
Я могу создать несколько сценариев, причиной запуска которых будет недоступность контроллера(со стороны сервера).
первый, срабатывает через 3 минуты, его задача проинформировать
второй, срабатывает через 15 минут, его задача перезапустить сеть(как раз на базе нового функционала)
третий, срабатывает через 20 минут, он полностью перезагрузит компьютер с контроллером.

Ну и таких вариаций множество, я к примеру в первую очередь применю его для управления ограничением доступа в интернет(буду обновлять записи iptables, да, контроллер будет расположен прямо на интернет шлюзе) просто наживая кнопки в клиенте или используя фразы в телеграме.

Мой гараж, первый шаг, блок контроллера



Я его слепил из того, что был...

Бесперебойное питание контрлоллера и шины на часов 5 минимум, GSM канал, символьный экран.

Остальное по мере применения.


И вообще, я не интегратор, но приходится(жду электросчетчик с rs485 за ~2 тыс руб)

Интернет шлюз

Как говорил ранее, ребята, я создаю конструктор, а вот как вы его используете - дело Ваше.

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

Дело в том, что до проекта у меня дома интернет шлюзом выступал Linksys E2000(типа киска, ага, развели как лоха), похоже у него были серьезные проблемы с производительностью, особенно при мультикастингах с броадкастингами(потоковое тв).
Потом Mikrotik(c RouterOS v6.42.12, лучше бы меня еще раз развели как лоха). Взял так как оно поддерживает eap->peap->mschapv2 (у него просто проблемы, ну проблемный он. Сильно болезненного котика, одного из десяти вы будете лечить или прост утопите?)
Крупная торговая компания ими восхищается, жаль, что я не узнал этого человека в лицо, да особо то и не нужно.

Кстати, да, был очень удивлен, что админы ДВФУ знают, что такое PEAP, мне даже кажется, что дело в том, что туда не так давно пришел работать мой коллега, не знаю я, наверное просто совпадение, но он точно знает, что такое нормальный радиус и peap.

Ну а теперь, теперь меня просто выбесила 'корректная работа mikrotik os' и я решил создать свое 'поделие'(куда мне до них).

Ничего проще и дешевле - orange pi - r1 http://www.orangepi.org/OrangePiR1/

Два сетевых интерфейса, 256MB RAM, Armbian, что еще нужно? - Вперед!

Ну я и впердел:
вот мой иптаблес(сильно не пинать, пока режим бреда преследования не включил):
#!/bin/sh

INET_IFACE="enxc0742bffdf1c"
LAN_IFACE="eth0"
LAN_IP_POOL="192.168.x.0/24"
WIFI_IFACE="wlan0"
LO_IFACE="lo"
LOOPBACK="127.0.0.0/8"
KILLING_FLOOR_IP="192.168.x.x"
REPOS_IP="192.168.x.x"
STORAGE_IP="192.168.x.x"

iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P POSTROUTING ACCEPT
iptables -t nat -P OUTPUT ACCEPT
iptables -t mangle -P PREROUTING ACCEPT
iptables -t mangle -P OUTPUT ACCEPT
iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -X
iptables -t nat -X
iptables -t mangle -X

#for gre forwarding
sysctl -w net.netfilter.nf_conntrack_helper=1
modprobe ip_nat_pptp

#for forwarding
echo 1 > /proc/sys/net/ipv4/ip_forward


#Kirill trafic manage (iptables -R KIRILL_RULE 1 -j REJECT)
iptables -N KIRILL_RULE
iptables -A KIRILL_RULE -j REJECT

iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -A OUTPUT -j ACCEPT

iptables -A INPUT -i $LAN_IFACE -j ACCEPT
iptables -A INPUT -i $LO_IFACE -j ACCEPT
iptables -A INPUT -i $INET_IFACE -s 192.168.x.0/24 -j DROP
iptables -A INPUT -i $INET_IFACE -p udp -j ACCEPT
iptables -A INPUT -i $INET_IFACE -p icmp -j ACCEPT
iptables -A INPUT -i $INET_IFACE -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i $INET_IFACE -p tcp --dport x -m state --state NEW -m recent --set --name SSH
iptables -A INPUT -i $INET_IFACE -p tcp --dport x -m state --state NEW -m recent --update --seconds 60 --hitcount 4 --rttl --name SSH -j DROP
iptables -A INPUT -i $INET_IFACE -p tcp --dport x -j ACCEPT
iptables -A INPUT -i $INET_IFACE -j REJECT
iptables -A INPUT -j REJECT


iptables -A FORWARD -i $WIFI_IFACE -j ACCEPT
iptables -A FORWARD -i $LO_IFACE -j ACCEPT
iptables -A FORWARD -i $LAN_IFACE -o $INET_IFACE -m iprange --src-range 192.168.x.x-192.168.x.x -j KIRILL_RULE
iptables -A FORWARD -i $LAN_IFACE -j ACCEPT
iptables -A FORWARD -i $INET_IFACE -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i $INET_IFACE -d $KILLING_FLOOR_IP -p udp -m multiport --dports 7700:7750 -j ACCEPT
iptables -A FORWARD -i $INET_IFACE -d $KILLING_FLOOR_IP -p udp -m multiport --dports 28852:28872 -j ACCEPT
iptables -A FORWARD -i $INET_IFACE -d $KILLING_FLOOR_IP -p tcp -m multiport --dports 28852:28872 -j ACCEPT
iptables -A FORWARD -i $INET_IFACE -d $KILLING_FLOOR_IP -p udp -m multiport --dports 20560:20580 -j ACCEPT
iptables -A FORWARD -i $INET_IFACE -d $REPOS_IP -p tcp --dport x -m state --state NEW -m recent --set --name SSH2
iptables -A FORWARD -i $INET_IFACE -d $REPOS_IP -p tcp --dport x -m state --state NEW -m recent --update --seconds 60 --hitcount 4 --rttl --name SSH2 -j DROP
iptables -A FORWARD -i $INET_IFACE -d $REPOS_IP -p tcp --dport x -j ACCEPT
iptables -A FORWARD -i $INET_IFACE -d $STORAGE_IP -p tcp --dport 80 -j ACCEPT
iptables -A FORWARD -i $INET_IFACE -d $STORAGE_IP -p tcp --dport 51413 -j ACCEPT
#iptables -A FORWARD -i $INET_IFACE -d $STORAGE_IP -p tcp --dport 1723 -j ACCEPT
#iptables -A FORWARD -i $INET_IFACE -d $STORAGE_IP -p gre -j ACCEPT
iptables -A FORWARD -i $INET_IFACE -j REJECT
iptables -A FORWARD -j REJECT

#---PORT-FORWARDING---
#------MRTG--FENGO--KF-MAPS---
iptables -t nat -A PREROUTING -i $INET_IFACE -p tcp --dport 80 -j DNAT --to-destination 192.168.x.x
#------TORRENTS---
iptables -t nat -A PREROUTING -i $INET_IFACE -p tcp --dport 51413 -j DNAT --to-destination 192.168.x.x
#------Killing-floor---main---
iptables -t nat -A PREROUTING -i $INET_IFACE -p udp -m multiport --dports 7700:7750 -j DNAT --to-destination 192.168.x.x
iptables -t nat -A PREROUTING -i $INET_IFACE -p udp -m multiport --dports 28852:28872 -j DNAT --to-destination 192.168.x.x
iptables -t nat -A PREROUTING -i $INET_IFACE -p tcp -m multiport --dports 28852:28872 -j DNAT --to-destination 192.168.x.x
iptables -t nat -A PREROUTING -i $INET_IFACE -p udp -m multiport --dports 20560:20580 -j DNAT --to-destination 192.168.x.x
#------REPOS---
iptables -t nat -A PREROUTING -i $INET_IFACE -p tcp --dport x -j DNAT --to-destination 192.168.x.x:x

iptables -t nat -A POSTROUTING -s $LAN_IP_POOL -o $INET_IFACE -j MASQUERADE

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

А вот мой /network/interfaces
source /etc/network/inAterfaces.d/*
# Network is managed by Network manager
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
address 192.168.x.x
netmask 255.255.255.0

auto enxc0742bffdf1c
iface enxc0742bffdf1c inet dhcp

post-up /etc/iptables.sh


Ага, NM не успел удалить, это пусть новое поколение пользуется вместе с iproute2.


Ну и конечно DHCPD, но там нет ничего интересного, поэтому приводить его не буду, он прост осообщает NTP сервер в локальной сети и раздает статические IP


А еще я поставил darkstat(стоящая вещь, собирает инфу по интерфейсу).
И еще Pi hole, явно писанная современными специалистами, ведь только они могут создать веб интерфейс не несущий никакой полезной информации, тем более мешающий работе ABP(в общем под наблюдением, скорее всего скоро снесу, уже снес)

Ну и в будущем - squid, c5277 контроллер и все вроде. потом дополню.

Контроллер, описание модели опроса устройств

Механизм опроса достаточно сложен, порой я сам забываю как он работает в деталях.

Я думаю, этот пост будет важен не только мне, но и интеграторам при создании сложного проекта.

И так, как я уже сегодня писал, контроллер формирует заявки на опрос устройства с периодичностью указанной либо в локации, либо непосредственно в устройстве. Опрос может выполняться чаще(раз в минуту) если предыдущий опрос(с тремя попытками) был не успешным. Также заявка на опрос подается при получении команды для устройства или формировании ее сценариями. Ну и клиент тоже может сформировать такую заявку.

Заявки поступают опрашивателю(interrogator). Опрашиватель создается для каждого используемого физического интерфейса контроллера. Таким образом есть возможность вести параллельный опрос различных устройств подключив их к разным шинам, например используя несколько USB->RS485 шлюзов.
При получении заявки опрашиватель добавляет ее в свою очередь(FIFO), также проверяет принадлежность данного устройства к типу устройств поддерживающих функционал ExtraScan.

Если устройство поддерживает ExtraScan, а шлюз непосредственно подключенный к устройству не поддерживает, то опрашиватель берет эту задачу на себя, выполняя частый, постоянный опрос таких устройств.
Идея ExtraScan проста, она дает возможность быстро реагировать на события от устройств, которые не могут передавать события, например устройства реализованные на базе RS485 Modbus.

Далее, каждый опрашиватель постоянно выполняет обработку очереди заявок, выдерживая паузу между итерациями как минимум в 300 миллисекунд (иначе будет высокая нагрузка на ЦП).

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

Далее идет непосредственно обработка очереди заявок. Устанавливается соединение с устройством. Создается пустой снимок показаний. Проверяется наличие других заявок для устройства(например чтение/запись конфигурации) и выполняются все команды управления устройством. Затем выполняется опрос в котором библиотека устройства выполняет все необходимые действия и наполняет снимок показаниями.
Есть поддержка асинхронных устройств, устройство может ответить, что заявка принята и данные будут позже, в этом случае опрашиватель оставляет снимок показаний пустым, считая, что опрос пройден успешно(механизм получения данных будет рассмотрен отдельно).
Сразу после этого еще раз выполняются новые команды управления устройством(да, могли появиться после опроса, если сейчас не выполнить, то будет пауза(некоторые устройства выдерживают паузы при подключении, отключении и между передачей пакетов данных, паузы могут быть значительные)). Закрываем соединение и проверяем результат всех действий, если где-то что-то пошло не так, то повторяем еще раз(максимум 3 попытки) добавляя нашу заявку заново в конец очереди.
И еще раз проверяем на наличие новых команд, если есть то добавляем также в конец очереди. Последним этапом, в случае успешного опроса или при исчерпании всех попыток, форсируется работа коммуникатора(он отвечает за взаимодействие с сервером в облаке) заставляя его передать полученные данные с минимальными задержками.

В случае, если заявок у опрашивателья нет, то он выполняет ExtraScan функционал и спит по 300мс каждую итерацию.
Первая же добавленная заявка моментально выведет его из сна.


*Пост будет редактироваться по мере внесения изменений в функционал.

Новый функционал, контроллер.

Я попробую взять за привычку писать здесь также все нововведения в проект.

Сегодня я доработал механизм отвечающий за периодичность опроса устройств контроллером.
Казалось бы здесь все просто, опрашивай раз в период и все, но на самом деле нет.
В проекте периодичность опроса можно указать как для локации(всех ее устройств), так и для каждого устройства отдельно. Т.е. если указали для локации минуту, а для конкретного устройства 5 минут, то контроллер именно так и должен поступить - опросить все устройства каждую минуту кроме одного, которое нужно опрашивать каждые 5 минут.

А что если устройство не удалось опросить? Ну например оно опрашивается через интернет, и в этот момент опроса не было связи. И периодичность у нас выставлена не в минуту, а скажем в 6 часов. Ждать данных еще 6 часов в надежде, что в следующий момент опроса устройство будет доступно? На мой взгляд это не корректно.
Поэтому, с этого момента, контроллер повторяет опрос каждую минуту если предыдущий опрос был неудачным, не взирая на выставленный период опроса.

Двухканальное реле TOSR02 от TinySine

Добавил поддержку нового устройства



Проект позволяет подключить его как по USB, так и через платы расширения типа XBee,WiFiBee, BluetoothBee и т.п.
На данный момент в проект введена поддержка шлюза WiFiBee(остальные по мере необходимости)

Я не закладываю в проект настройку самого шлюза, в проекте можно прописать только необходимые параметры, как например IP и TCP порт. Настройка шлюза выполняется вручную. В теории я мог бы наработать функционал для полной настройки, но для этого нужно время, и главное - настройку можно легко выполнить через терминал или использовав кучу доступного ПО. При этом настройка выполняется обычно один раз.

Вот так выглядит устройство в клиенте:


Я специально добавил это устройство, чтобы тестировать облачный контроллер.
В принципе задумка удобная, но не надежная:
Я проброшу на своем домашнем роутере(которому выделен статический внешний IP адрес) порт на WiFiBee модуль(которому пропишу на роутере статический IP адрес в локальной сети).
Активирую облачный контроллер и добавлю в проект TOSR02, после чего мне останется на него подать питание, подключить потребителей к реле и все, устройство доступно откуда угодно через клиент, Алису, Почту или Телеграм. Могу сценарии посоздавать, в общем все что угодно.

Время собирать камни?

Да, наверное завтра я решу, что это было зря.

Но тем не менее я попробую высказаться, просто для себя или типа я предупреждал.

Думаю настал тот момент когда мой проект достиг максимальной фазы и уже летит в тар-та-ра-ры.

Потратил я на него что-то около 5-6 лет, лет проведенных за проектом вместо кружки пенного вкусного пива с соленой рыбкой, вместо игрушек, вместо дополнительного времени с семьей, вместо отдыха, вместо жизни по большему счету (когда вы развлекались я скорее всего хреначил над проектом, или продумывал его). И на это есть причины, но эти причины, какие бы они не были, никак не умаляют проделанную работу.

Сделал я не мало, учитывая что 5-6 лет назад я только нахватался опыта по автоматизации. А в схемотехнике я только знал, что есть какие-то микроконтроллеры и что такое pnp и npn транзистор.
Сейчас я достаточно хорошо владею схемотехникой в вопросах цифровой электроники(ttl) и достаточно уверенно себя чувствую в разработке подобных устройств (да, именно настолько чтобы презирать ардуинщиков).
У меня есть комплексное Java решение, охватывающее очень многие задачи, которое почти нигде не использует чужие наработки, типа библиотек Apache. А различные фреймворки меня забавляют как малые дети.

Я вырос из тех задач, которые 5-6 лет назад для меня были фантастикой. Не просто вырос, теперь у меня есть мощный универсальный и легко расширяемый инструмент.
А главное есть опыт, знания и наработки, которые я мог бы повторить.
Ведь самое сложное не написать код или сделать дизайн и рекламу. Самое сложное - опробованная, реально работающая концепция, сделать решение которое будет содержать минимум костылей и будет интуитивно понятно (конечно речь о крупном решении). Этого достичь можно только перелопатив кучу кода, найдя в итоге максимально подходящее решение. Да куча кода(сил, времени, стараний) было выброшено/потрачено для того, чтобы достичь чего-то стоящего.

Сейчас я в положении, при котором я получаю совсем не высокую зарплату(хотя мне платят за проект, по большей части на который я имею полные права, и компания тоже, конечно же) и в течении нескольких лет слышу постоянные обещания(99% которых не выполняется, к примеру у меня нет рабочего места вообще, работаю с дома в кабинете 2x3м с плохой вентиляцией и жарой минимум в 30 градусов Цельсия, по сути работаю в шкафу при этом часто с токсичными веществами. При этом часто за дверью орет подросток играя в игрушку про зэков и вертухаев), и это меня пока устраивает, так как есть семейные обстоятельства.

И это тупик, данное занятие начинает больше требовать чем отдавать. Далее либо каким-то образом оно становится решением приносящим прибыль, либо поддерживается правой пяткой, хотя это не страшно, большинство пи№;арасов людей вокруг меня считают такой подход к клиенту вполне нормальным.

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

Ну и в конце концов, за эти 5-6 лет у меня появился сын, которому сейчас почти 4 года и дочь, которой еще нет 2-х месяцев. А еще есть подросток 17-ти лет, который 90% времени вне сна проводит в свое удовольствие ничем существенно не помогая(вопрос влияния отчима на пасынка и его мать). Времени свободного сами понимаете - не много.

И еще одна деталь, все мы по разному относимся к работе, вопрос, сильно ли выкладывается человек на работе, если у него не остается сил вести свои дела дома?
Я хотел сказать следующее, если Вы объединяете хобби и работу, то готовьтесь к тому, что работать вы будете всегда, кроме когда спите, хотя это поправимо бессонницей от постоянной переутомляемости.

А так, по мелочи, есть новости, запущена реализация контроллера в облаке (достаточно просто нажать кнопку в клиенте), значительно оптимизирован клиент, введена поддержка ардуино уно в качестве шлюза, реализовано достаточно полное логирование устройств с возможностью просмотра прямо в клиенте, немного переделаны формы.

И остаются не сделанными еще очень много дел, как по багфиксу в рамках общего проекта, так и по прошивкам новых устройств в моем личном проекте.

А главное нет сил, времени, опыта, знаний и желания, чтобы продвигать продукт в массы. Никто кроме меня не знает его возможностей, даже мой директор(должен быть максимально заинтересованным лицом) не знает и 30% возможностей моего решения. Как-то так.

Все спасибо если прочли.

Ардуино как шлюз

Приветствую.

Не так давно я реализовал шлюз в своем проекте с названием 'Arduino UNO'.

Все просто. Я описал в системе шлюз, у которого входным интерфейсом является UART или USB.
А исходящими GPIO, I2C и 1W.

А затем, посвятил пол дня на ардуино(ранее я с ним не работал, ну может раз среду разработки запустил оплевался и выкинул). Моих знаний было достаточно, чтобы почти не глядя создать скетчь(тьфу, матерное слово, простите). Это скетч (еще одно матерное слово) на данный момент выполняет функционал шлюза, т.е. по запросам от контроллера управляет портами. К примеру я легко запустил в проекте управление двухканальном реле и символьным дисплее winstar 1602.
Да, скетч прошивка еще сырая, будут дополнения как и по i2c функционалу так и другие плюшки. И никто не мешает доработать эту прошивку (протокол универсальный).

Для чего это?

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

P.S. все что вы знаете хорошего об ардуино заслуга только Atmel и никого более, все остальное паразитизм.

Видео:


Java, изменение строки

Наткнулся на статейку http://www.skipy.ru/technics/strings.html#mutation

Там вполне грамотный чел рассказывает о возможности в Java изменить текст строки, даже не смотря на то, что строка объявлена неизменяемой (final).

Можно считать, что это очень хороший вопрос для собеседования.
В Джава есть множество подобных нюансов и список вопросов можно написать совсем не маленький.

В принципе так и делают многие компании, в нете также много онлайн тестов подобного характера.

И меня мучает один вопрос, как подобные знания применимы на практике?
Лично для меня это загадка.
Попросту потому, что нет никакой необходимости изменять таким образом текст строки в собственном проекте.
Более того, все эти хитрости в основном надуманные, мне незачем усложнять свой собственный код.
Оптимизация? А вам, к примеру, известно, что очень крупная торговая компания, пишет свои проекты в основном на 1C? Для этого она выделяет сервера с терабайтами оперативки и сетка между компьютерами там как минимум 1ГБит. Разработчики там получают по максимуму для нашего рынка.
Т.е. выигрыш в производительности после оптимизации кода на Java просто ничтожен, если сравнивать с продуктами писаными в той компании, а ведь там, судя по ЗП, программисты высшего уровня.

Да, можно сказать, что знание таких аспектов явно подчеркивает высокий уровень специалиста.
Можно было бы, если бы я лично не знал программистов с заученными шаблонами.
Ведь можно попросту начитаться книжек, если память хорошая. Но главное ли это свойство программиста?
Выходит, что да, для многих топовых компаний - хорошая память и начитанность - главное, за это и платят.

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

В этом главное отличие. Как-то я спросил у одного программиста на фарпосте, который владел огромным багажом знаний(я там многих названий попросту не знал), сколько у него рабочих или завершенных проектов. В ответе он винил бардак в компании, количество проектов он не назвал, похоже попросту ни одного. При этом он просил ЗП что-то около 150 тыс. руб. в месяц.

А еще меня смущает мода. Меня как-то поправил студент которого спросили, как правильно  Ява или Джава?
Парнишке с умным видом было невдомек, что некоторые названия имеют русский вариант произношения, например Австралия, мы же не говорим Оустрэлия.

Короче все плохо, мало того, что сферу интенсивно занимают люди, чья главная особенность - хорошая память, так еще хуже то, что сделать они надежные решения не могут. Ведь приглядитесь, все глючит, глючит в элементарной логике, в базовой логике, зачастую ошибки лезут из-за отвратительно плохой логики взаимодействия узлов системы.
Я из того поколения, который юность провел без интернета, работая на ZX Spectrum, позже немного в MS-DOS.
Я отлично помню программы, достаточно сложные программы, которые не глючили и были интуитивно понятны, в том числе и игры. Сейчас такое ПО - большая редкость. И можно сказать, что современная разработка ПО находится где-то на дне. Плохо то, что сейчас тоже самое происходит и со схемотехникой, где, на мой взгляд, основной причиной выступает торговая марка Ардуино.