?

Log in

No account? Create an account

Previous 10

Sep. 20th, 2019

Java контроллер на Android

Сегодня прошли первые успешные запуски контроллера под Андроидом.

Как по мне - это очень важный шаг. Только вдуматься, бесплатный универсальный контроллер на железке, которая почти у каждого валяется где-нибудь в столе, не пригодная для современных задач, скажем на 4-ом Андроиде. Ну или современная ТВ приставка, которая и так целыми днями включена. Однозначно, сейчас почти у каждого дома есть устройства с Андроидом, компьютера нет, а Андроид есть.

По сути, теперь контроллер можно развернуть как на любом компьютере так и на любом Андроид устройстве. Понятно, что будут исключения, но на мой взгляд, многие проблемы будут решены. Сейчас я только приступаю к обкатке проекта на различных версиях Андроида. На данный момент Java контроллер запущен и отлично себя чувствует на DEXP Ixion M450 с Android 5.1, под рукой также есть один из первых Huawei с 4-ым Андроидом, позже обкатаю и на нем.

Стоит также сказать, что шел я достаточно долго к этому. Изначально проект контроллера создавался под JRE7, и имел код который может быть выполнен только на PC. Теперь весь код адаптирован под JRE6(необходимо для 4-го Android'а) ну и большая часть кода выведена в отдельную библиотеку без какой-либо привязки к ОС. Также были отдельно скомпилированы все библиотеки устройств, шлюзов и сервисов под Андроид (формат .dex)

И да, я знаю, что Андроид полон сюрпризов, и он потребует много времени. К примеру я потратил более суток, но так и не смог заставить работать корректно сеть с использованием архивирования потока Inflater/Deflater. В эмуляторе Nexus 4 все отлично а вот на Ixion M450 попросту через секунду помирает установленное соединение.
Пришлось поддерживать два типа соединения с сжатием и без.

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

Обновление:
Java контроллер также успешно запустился на Huawei U8860 Honor с Android 4.0.3, думал его разобрать да выкинуть, но видимо нет, еще поработает в виде контроллера.

Sep. 13th, 2019

Техно парк ДВФУ

Подсказывают, что официально мы уже там.

Осталось решить несколько проблем, к примеру завтра мне нужно составить список специализаций для студентов, а вообще по проекту он обширен.

А еще говорят, что ДВФУ закрыла свою инженерную школу- невыгодно говорят. Но это якобы сплетни.

Java Json + Deflater/Inflater

Не совсем новый функционал, но теперь это рабочий функционал.

Здесь стоит рассказать о вещах лежащих в основе.
Если рассмотреть тот-же радиус протокол(ну понятно такого протокола нет, есть куча rfc), то мы увидим, что раньше передаваемые данные старались сделать максимально компактными, особенно в вопросах заголовков, посмотрите в тот-же ipv4 протокол(не забываем про флаг security rfc3514, шутка про голубей, лично по мне, меркнет по сравнению с этим rfc).

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

Ну а старым пердунам куда деваться? Пока опишешь, перепишешь все поля и их содержимое в статическую структуру - так и кони двинуть можно, не молоды ведь. Остается пользоваться более простыми вещами, пусть и расточительными.
Вот и я, вырвав несколько седых волос, решил не заморачиваться и использовать текстовый формат передачи данных - JSON. Но! первое что я сделал для оптимизации - вместо названий полей стал использовать численные идентификаторы в шестнадцатеричном формате, затем обернул все зиппом используя Dedlater и Inflater. В итоге получил существенную оптимизацию, для больших данных экономия достигает 80%.
Стоит ли говорить о том, что передача показаний(а это основное) сжимается плохо, где-то на 30%, однако передаваемые сжатые данные чаще всего весят меньше чем обычный http заголовок(который сейчас очень популярен).

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

А теперь напомню, что у мобильных провайдеров почти ни у кого не осталось безлимитного интернета.
Я думаю, что данное решение позволит мне сэкономить траффик и растраты на него существенно.
Чего и вам желаю.

Sep. 4th, 2019

Чистый оффтоп, Мозайка



Вот мой эталон специалиста типа современного дизайнера, жаль что современный специалист крайне далек от этого эталона.

Это обложка виниловой пластинки ансамбля 'Мозайка' какого-то лохматого года, тогда я еще не знал слово 'компьютер' совсем, но уже мечтал о нем, и скорее всего не знал даже слова 'калькулятор'. Но прекрасно обращался с паялькиком в свои лет 8(привет ардунищики-нашебудущее-рукижопа-лицо).

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

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

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

Sep. 3rd, 2019

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

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

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

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

Aug. 31st, 2019

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



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

Бесперебойное питание контрлоллера и шины на часов 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, что еще нужно? - Вперед!

Ну я и впердел:
вот мой иптаблес(сильно не пинать, пока режим бреда преследования не включил):
INET_IFACE="enxc0742bffdf1c"
LAN_IFACE="eth0"
LAN_IP_POOL="192.168.10.0/24"
WIFI_IFACE="wlan0"
LO_IFACE="lo"
LOOPBACK="127.0.0.0/8"
KILLING_FLOOR_IP="192.168.10.9"
REPOS_IP="192.168.10.8"
STORAGE_IP="192.168.10.3"

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


echo 1 > /proc/sys/net/ipv4/ip_forward

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 -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 24 -j ACCEPT
iptables -A INPUT -i $INET_IFACE -j REJECT
iptables -A INPUT -j REJECT


iptables -A FORWARD -i $LAN_IFACE -j ACCEPT
iptables -A FORWARD -i $WIFI_IFACE -j ACCEPT
iptables -A FORWARD -i $LO_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 22 -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 -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.10.3
#------TORRENTS---
iptables -t nat -A PREROUTING -i $INET_IFACE -p tcp --dport 51413 -j DNAT --to-destination 192.168.10.3
#------Killing-floor---main---
iptables -t nat -A PREROUTING -i $INET_IFACE -p udp -m multiport --dports 7700:7750 -j DNAT --to-destination 192.168.10.9
iptables -t nat -A PREROUTING -i $INET_IFACE -p udp -m multiport --dports 28852:28872 -j DNAT --to-destination 192.168.10.9
iptables -t nat -A PREROUTING -i $INET_IFACE -p tcp -m multiport --dports 28852:28872 -j DNAT --to-destination 192.168.10.9
iptables -t nat -A PREROUTING -i $INET_IFACE -p udp -m multiport --dports 20560:20580 -j DNAT --to-destination 192.168.10.9
#------REPOS---
iptables -t nat -A PREROUTING -i $INET_IFACE -p tcp --dport 26 -j DNAT --to-destination 192.168.10.8:22

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.10.1
netmask 255.255.255.0

auto enxc0742bffdf1c
iface enxc0742bffdf1c inet dhcp

post-up /etc/iptables.sh


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


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


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

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

Aug. 28th, 2019

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

Aug. 27th, 2019

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

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



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

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

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


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

Previous 10