Каталог Поиск 0 Сравнить 0 Закладки 0 Корзина Войти
Каталог
105082, Москва, ул. Фридриха Энгельса, 75с21, БЦ Бауманский ИТКОЛ
Пн - Пт: с 09-00 до 18-00 Сб: с 10-00 до 18-00 Вс: выходной
Страницы: 1
RSS
Изменение VLAN на порту через SNMP или API, UniFi Network
 
У меня есть система для передачи видео по LAN с использованием http://www.octavainc.com/HDMI_extender_LAN_HDDSX.html. В системе 4 трансивера и 8 приёмников. Они рассылают данные по обычному IP-соединению через мультикаст. Приёмники не могут выбирать, какой сигнал принимать, поэтому берут первый, который находят. Чтобы обойти это, я сделал несколько макросов, которые отправляют SNMP-команды на коммутатор Cisco и меняют VLAN на порту. Таким образом, можно, например, поставить порт с трансивером номер один в VLAN 50, а затем добавить в этот VLAN порты приёмников 2, 5 и 7, сделать то же самое для остальных и в реальном времени переключать входы телевизоров на нужный источник.

Я бы хотел сделать то же самое с коммутатором и роутером UniFi, но понятия не имею, возможно ли это и какой лучший способ переключать VLAN на порту не через интерфейс управления. Буду благодарен за любые советы, спасибо!
 
@slooffmaster Отлично, это было бы здорово. Я немного поколдую с этим, было бы классно разобраться самому. Еще раз спасибо!
 
@ksballen

Дай мне пару дней, сейчас я очень занят. Посмотрю, что смогу сделать, чтобы приготовить рабочий пример.
 
@slooffmaster

Спасибо ещё раз за всю твою помощь. Теперь, когда я вернулся из отпуска, решил, что могу сделать простой webview с кнопками, чтобы делать то, что мне нужно, либо запустить это на Raspberry Pi. Сейчас у меня уже настроен Pi с нужным PHP, и я могу запускать твои примеры из клиента и получать ответы. Но сейчас я немного в тупике, потому что не могу понять, к какому именно endpoint нужно обратиться, да и с PHP я, честно говоря, совсем не знаком. Вижу вызовы, которые ты используешь в src клиента, но ни один, кажется, не ведёт к правильному API endpoint.

Ещё я не понимаю, как построить JSON-структуру, чтобы указать, какой переключатель использовать (в моём случае "device_id": "596438184e082fdac6fb1d0b"). Извини, что приходится просить подержать за руку, но была бы огромная помощь, если бы ты мог показать, как примерно должен выглядеть PHP-код, использующий твой клиент, учитывая, что у меня есть device_id, port_idx и portconif_id, которые я хочу применить.

Ещё раз спасибо, что терпишь меня!
 
Спасибо за обновление, я, пожалуй, продолжу использовать другие коммутаторы, пока это как-то не упростят. У меня остальная часть сети настроена на Ubiquiti, так что было бы классно.
 
Я собирался обновить информацию — у меня получилось кое-что сделать с помощью скриптов. Было немного заморочено. Я настроил веб-страницу, где можно выбрать входной сигнал для телевизоров, что меняет VLANы на портах. Конфигурация отправляется через API контроллера, когда это происходит. Но просто изменить конфигурацию одного порта нельзя, поэтому приходится сначала запросить всю конфигурацию коммутатора, найти нужный порт, изменить VLAN, а затем отправить всю конфигурацию обратно.

Это работает нормально, хотя есть задержка, о которой ты упоминал. На все про все уходит около 15 секунд — чтобы настроить коммутатор и поменять видео-вход. Раздражает, но работает.

Ещё один очень важный момент в такой настройке — правильно исключить другие порты от получения видео-мультикаста. Я ставил некоторые порты на все VLAN, где были точки доступа, и это просто убивало их ЦП и память, несмотря на то, что у меня стояла запрет передавать мультикаст с LAN на WLAN. Точки доступа всё равно обрабатывали весь мультикаст, и это их гнало в нагрузку.

Всё ещё не так быстро и удобно, как через SNMP, но, в общем, работает.
 
@ksballen

Ты смог это запустить? У меня похожая проблема — использую простой контроллер автоматизации для переключения видеопотоков. Я могу отправлять API-запросы на устройство, но контроллер слишком медленный, чтобы каждый раз отправлять новую настройку.
 
@ksballen

Хмм, в таком случае лучше всего скопировать весь массив port_overrides, при необходимости изменить существующие переопределения портов или добавить новые, а затем отправить обновлённый полный массив.
 
@slooffmaster

Ох, конечно, я опять должен доставать и беспокоить тебя. Так вот, переключение VLAN для нужного порта сработало. НО я только что заметил, что это фактически стерло все имена и настройки (VLANы и прочее) на всех остальных портах коммутатора! Ты не знаешь, как сделать так, чтобы такое изменение было добавочным, а не нужно было отправлять всю конфигурацию целиком? Если придется отправлять всё, то мне сначала придется получить состояние с вызова, потом обновить часть и запушить обратно — что точно чревато проблемами. Ещё раз спасибо за любые идеи!
 
Да, не стесняйся, ещё раз спасибо!
 
@ksballen Спасибо за обратную связь, приятно слышать! Если не возражаете, я добавлю эту функцию/метод в клиент API в следующем обновлении. Думаю, это будет полезно и многим другим.
 
Всё отлично, это было всё, теперь всё работает, и я свяжу это с приложением через веб-вью на Android. Спасибо!
 
Хмм, может проблема в том, что port_overrides должен быть массивом, содержащим объекты/ассоциативные массивы?

Попробуй внести вот такое изменение в код:
$json = json_encode(['port_overrides' => [['port_idx' => intval($port_idx), 'portconf_id' => $portconf_id]]]);
Обрати внимание на дополнительную пару квадратных скобок.
 
@slooffmaster

Извини, что снова докучаю, но я попытался разобраться и теперь застрял: либо я неправильно форматирую JSON, либо не включаю что-то обязательное.

Есть ли какая-то документация по тому, что требуется для вызова?

Во всяком случае, вот моя функция, если будет время глянуть.

   public function change_vlan($device_id, $port_idx, $portconf_id)
   {
       if (!$this->is_loggedin) return false;
       $this->request_type = 'PUT';
       $json     = json_encode(['port_overrides' => ['port_idx' => intval($port_idx), 'portconf_id' => $portconf_id]]);
       $response = $this->exec_curl('/api/s/'.$this->site.'/rest/device/'.trim($device_id), $json);
       return $this->process_response_boolean($response);
   }

Вот как это запускается, но не парсится.

-------URL & PAYLOAD---------
https://10.0.10.20:8443/api/s/default/rest/device/596438184e082fdac6fb1d0b0
{"port_overrides":{"port_idx":1,"portconf_id":"599b65e5e4b0bfa10879817f"}}
----------RESPONSE-----------
{ "data" : [ ] , "meta" : { "msg" : "api.err.InvalidPayload" , "rc" : "error"}}
-----------------------------
</pre>false<pre>

Еще раз спасибо за помощь!
 
@UBNT-cmb

В общем, именно это я и предлагал, но на основе API-клиента, который я поддерживаю, а не того, что идет в комплекте с контроллером. В нем уже есть поддержка этих API-эндпоинтов, и для реализации потребуется всего 5-6 строчек кода. Единственное условие — PHP и php-curl. Если еще не смотрели, вот ссылка на GitHub: https://github.com/Art-of-WiFi/UniFi-API-client
 
Никаких заморочек на стороне клиента не нужно, достаточно просто curl или любого инструмента, который позволит сформировать HTTPS-запросы. Посмотрите на unifi_sh_api, который есть во всех релизах контроллера, например вот здесь.  
https://community.ui.com/releases/a83b2010-edf2-4f74-9c93-8c9a35e20e78
 
Спасибо за ответы, я проверю все предложенные варианты. Есть какое-то приложение для мобильных устройств, которым пользуются разработчики, я выясню, что это за программа, может, смогу добавить к ней клиентскую библиотеку, чтобы упростить работу. Маршрут через ssh тоже интересен, так как устройства будут в той VLAN, мы можем использовать этот вариант, и это может быть быстрее (хотя я не уверен, сколько работы мне потребуется и насколько можно будет использовать готовую клиентскую библиотеку). Я знаю, что раньше они делали это через SNMP, и теперь мне интересно, есть ли у них другие сетевые библиотеки. Ещё раз спасибо, пропустил ваши ответы, иначе ответил бы быстрее!
Страницы: 1
Читают тему (гостей: 1)