Заодно воскресил в своей памяти JavaFX.
Рубрика: Работа

Управление питанием web камеры при помощи mikrotik
На одном нашем объекте барахлят web камеры. Очень чувствительные к питанию. Постоянно приходиться их вкл/выкл. Каждый вкл/выкл стоит 1000 р. в обслуживающей организации (объект в другом городе). Да и время уходит, пока парни из саппорта приедут и дернут шнурок питания, строители могут пару самосвалов налево вывезти :).
Камеры без поддержки POE, но питание передаётся по ethernet кабелю. Стоит блок питания необходимой мощности, POE инжектор. На стороне камеры девайс, который из кабеля берет питание и дает его на камеру.
Изначально хотели брать питание с микротика, который там стоит, но когда нам согласовали камеры, выяснилось, что мощи микротика для них не хватает. Поэтому получилась вот такая хитрая фигня.
По идее нужно вставить девайс, который по сигналу отрубает питание камеры и врубает его обратно. Реле, управляемые по Ethernet, стоят куеву тучу денег. Естественно мы их не купили.
Начали гуглить проблему и нашли записки доброго человека из lanmart: https://www.lanmart.ru/blogs/mikrotik-rb750up-remote-power-management-220v/
Он при помощи микротика с POE out управляет автомобильным реле, которое разрывает цепь 220 вольт. Вобщем наша тема!
Мы сделали точно так, но разрывали слаботочку 12 вольт. Реле поместили в корпус блока питания. Ethernet кабель маленько разрезали по середине. Все надрезы основательно изолировали. И вот итог:
На картинке второй конец кабеля воткнут в Mikrotik cAP. Свободный засовывали в управляющий микротик с POE out.
Автомобильное реле влезло в корпус блока питания. Но вот развести провода Ethernet места уже не хватило. Пришлось делать сопливую врезку:
Чуть крупнее.
Бомж комплект собран и работает.
Завтра соберем еще два таких «девайса» и поедем на объект ставить.

Thunerbird 52.3.0 & self signed certificate
При попытке подключиться к почтовому серверу с самоподписанным сертификатом Thunderbird ругался, предупреждал и давал возможность добавить сертификат в исключения.
Это можно было сделать как при подключении, так и при помощи менеджера сертификатов.
Сертификат можно было импортировать из локального файла (кнопка Импортировать) или подгрузить с сервера (кнопка Добавить исключение).
Но это было раньше. Вышло обновление 52.3.0 и пришел пушной зверек.
При попытке добавить исключение при подключении к серверу:
В соответствующем окне пропала кнопка Добавить исключение. И оно тупо информирует нас о том, что сертификат левый и все!
В менеджере сертификатов пропала возможность импортировать сертификат из файла. Ну просто тупо её выпилили.
А Добавить исключение показывает предыдущее окно, в котором таки нет кнопки Добавить исключение.
Таким образом, возникло ощущение, что Thunderbird решил бороться с самоподписанными сертификатами. Просто и незатейливо выпилив функционал добавления исключений в списки сертификатов.
Де%%$ы бл%#ь.
Приходиться удалять Thunderbird, ставить предыдущую версию и в ней добавлять исключения.
pjsip и Билайн
В некоторых местах вместо sip.beeline.ru написан IP этого сервера — 195.239.174.100
Это бжжжж не спроста. Если там писать имя сервера, дальше регистрации дело не идет. Подробнее об этом в предыдущем посту.
[Bi]
type=aor
qualify_frequency=60
contact=sip:195.239.174.100:5060
[Bi]
type=auth
auth_type=userpass
password=bigpassword
username=74955555555@sip.beeline.ru
[Bi]
type=endpoint
transport=0.0.0.0-udp
context=from-pstn
disallow=all
allow=g729,ulaw,alaw,gsm,g726,g723
aors=Bi
language=ru
outbound_auth=Bi
from_domain=sip.beeline.ru
from_user=74955555555
t38_udptl=no
t38_udptl_ec=none
fax_detect=no
t38_udptl_nat=no
dtmf_mode=auto
[Bi]
type=identify
endpoint=Bi
match=195.239.174.100
[Bi]
type=registration
transport=0.0.0.0-udp
outbound_auth=Bi
retry_interval=120
max_retries=10
expiration=3600
auth_rejection_permanent=no
contact_user=74955555555
server_uri=sip:195.239.174.100:5060
client_uri=sip:74955555555@sip.beeline.ru:5060
[0.0.0.0-udp]
type=transport
protocol=udp
bind=0.0.0.0:5060
external_media_address=83.10.10.10
external_signaling_address=83.10.10.10
allow_reload=yes
local_net=192.168.1.0/24
MTT vs Beeline
Сначала пробовал на железяке: не работает.
Для проверки своей криворукости взял аккаунт у МТТ. У них все работает.
Тупо меняю в настройках sip.beeline.ru на voip.mtt.ru и… у билайна не работает, у МТТ все летает.
Ладно, двойной NAT, все может быть. Настраиваю sip клиента на мобиле и вперед через LTE. У билайна не работает, у МТТ все пучком.
Объясняю ситуацию парням из билайна, в ответ рекомендации типа:
— отключите на роутере (микротик) модуль sip.
— вместо sip.beeline.ru пишите IP адрес.
Звиздец.
Ок, кручу астериск. У меня он на pjsip. Билайн же выпендривается, даёт логины типа 74955555555@sip.beeline.ru. Пока разобрался как в pjsip эти хитрые логины вбивать… Но вообщем зарегистрировался на сервере билайна. Регистрация проходит, а вот звонки вообще не того, не идут. Сразу после команды INVITE отваливаются, причем мой астериск им говорит, что они у нас не зарегистрированы. Единственное отличие INVITE от билайна и МТТ: у первого стоит мой внутренний IP (192.168.х.х), а у МТТ реальный IP роутера.
И что мне с этим делать?
P.S. Пока писал это пост, победил астериск. Добился соединения и звонка у билайна, но звук в одну сторону так и не ходит.
Как вы думает работает ли МТТ на астериске? Ага 🙂 без проблем, звоню, общаюсь. Бугагашеньки.
javafx RowFactory или как я красил строки таблицы.
Примеров решений задачи в инете, вагон и маленькая тележка.
Обычно рекомендуют что то типа такого:
tableView.setRowFactory((row) -> {
return new TableRow
@Override
public void updateItem(MainTable item, boolean empty){
super.updateItem(item, empty);
if (item == null || empty) {
setStyle(«»);
} else {
Iterator
while (it.hasNext()) {
Long zakazIndex = it.next().getProductIndex();
Long pIndex = item.getIndex();
if ( Objects.equals(zakazIndex, pIndex) ) {
setStyle(«-fx-background-color:lightgreen»);
}
}
}
}
};
});
И оно даже работает. Но, пока в таблице не включается скроллинг. Как только в таблице начинаешь листать страницы, с удивлением обнаруживаешь, что красятся произвольные строки, в произвольном порядке.
Решение, простое.
До вызова
super.updateItem(item, empty);
Сбросьте стили.
tableView.setRowFactory((TableView
return new TableRow
@Override
public void updateItem(MainTable item, boolean empty){
// Сначала обязательно сбрасываем стиль.
setStyle(«»);
// и только после этого вызываем метод super.updateItem
super.updateItem(item, empty);
if (item == null || empty) {
setStyle(«»);
} else {
Iterator
while (it.hasNext()) {
Long zakazIndex = it.next().getProductIndex();
Long pIndex = item.getIndex();
if ( Objects.equals(zakazIndex, pIndex) ) {
setStyle(«-fx-background-color:lightgreen»);
}
}
}
}
};
});
LXC error cpio: cap_set_file
Собираю контейнер под FreePBX. И тут у меня вдруг не устанавливается апач из стандартных пакетов. Выдает ошибку: cpio: cap_set_file
Лечится явным прописыванием в конфиг файл контейнера параметров:
lxc.cap.drop = mac_admin mac_override
#lxc.cap.drop = setfcap
lxc.cap.drop = sys_module sys_nice sys_pacct
lxc.cap.drop = sys_rawio sys_time
Обратите внимание, что в глобальных параметрах, lxc.cap.drop = setfcap был определен. Если его не прописывать явно в конфиге, то все будет пучком.
Asterisk pjsip и Youmagic (MTT)
Вообщем в итоге получилось, вот так :
pjsip.conf
======================
[global]
type=global
; да, я даже freepbx заводил в виртуалке 🙂 но не понравилось
; оно мне, часть конфига спер оттуда.
user_agent=FPBX-13.0.190.19(13.14.0)
default_outbound_endpoint=dpma_endpoint
; debug не понравился. Лучше tcpdump для отладки еще
; ничего не придумали 🙂
;debug=yes
[dpma_endpoint]
type=endpoint
context=dpma-invalid
[0.0.0.0-udp]
type=transport
protocol=udp
bind=0.0.0.0:5060
; разумеется вместо 999 надо писать реальный IP роутера,
; за которым за натом стоит астериск
external_media_address=999.999.999.999
external_signaling_address=999.999.999.999
allow_reload=yes
local_net=192.168.0.0/24
; тут определены два внутренних телефона 100 и 101
; много текста не показано
;==== YouMagic =======================
; Предположим, что МТТ дали телефон, он же логин (хотя логин
; при регистрации можно установить любой):
; 74990000000
; и пароль: хитрыйпароль
[reg_voip.mtt.ru]
type = registration
retry_interval = 20
max_retries = 10
contact_user = 74990000000
expiration = 120
transport = 0.0.0.0-udp
outbound_auth = auth_reg_voip.mtt.ru
client_uri = sip:74990000000@voip.mtt.ru
server_uri = sip:voip.mtt.ru:5060
[auth_reg_voip.mtt.ru]
type = auth
password = хитрыйпароль
username = 74990000000
[mytrunk]
type = aor
contact = sip:74990000000@voip.mtt.ru
[mytrunk]
type = identify
endpoint = mytrunk
; это IP MTT сервера
match = 80.75.132.66
[mytrunk]
type = auth
username = 74990000000
password = хитрыйпароль
;realm = voip.mtt.ru
[mytrunk]
type = endpoint
context = from-external
transport=0.0.0.0-udp
disallow = all
allow = ulaw
allow = alaw
rtp_symmetric = yes
rewrite_contact = yes
from_user = 74990000000
from_domain=voip.mtt.ru
; МТТ не может аутентифицироваться на нашем сервере
; поэтому не включаем аутентификацию при входящих с МТТ
;auth = mytrunk
outbound_auth = mytrunk
aors = mytrunk
=======================================================
extensions.conf
=====================================================
[others]
[from-internal]
exten => 100,1,Dial(PJSIP/100,20)
exten => 100,2,VoiceMail(100,u)
exten => 101,1,Dial(PJSIP/101,20)
exten => 101,2,VoiceMail(101,u)
exten => *98,1,VoiceMailMain(${CALLERID(num)},s)
exten => _810X.,1,Busy
exten => _8XXX.,1,NoOp(«8xxx»)
exten => _8XXX.,n,Dial(PJSIP/${EXTEN}@mytrunk)
exten => _8XXX.,n,Hangup
[from-external]
exten => 74990000000,1,Dial(PJSIP/100)
exten => 74990000000,n,Hangup
=======================================================
Разумеется, мой сервер за натом. И, разумеется, в фаерволе разрешены хождение пакетов и их проброс только с сервера МТТ.
Проблема выбора.
JavaFX и java.lang.nullpointerexception location is required
java.lang.nullpointerexception location is required
Не грузит сволочь fxml файл.
Облазил все форумы, пробовал и через class.getClassLoader().getResource() и просто class.getResource(). Читаю документацию, указываю пути как надо, с учетом выбранного метода. Не работает хоть тресни.
А всего то, надо было подписать приложение… твою едрить через это самое…