Ограниченный доступ к контроллеру по мобильной сети

Добрый день! Судя по вашему выводу, была ошибка копи-паста. Давайте попробуем еще раз. Скрипт ниже, я в прошлой версии нашел некоторые недочеты.

#!/bin/sh
# Диагностика канала контроллер <-> Wiren Board Cloud
# Работает на bullseye и trixie, интерфейс определяется по маршруту по умолчанию.
# Только читает и измеряет, кроме двух тестовых файлов на удалённом WebDAV для проверки отдачи.

have() { command -v "$1" >/dev/null 2>&1; }
GW=$(ip route | awk '/^default/{print $3; exit}')
IF=$(ip route | awk '/^default/{for(i=1;i<=NF;i++) if($i=="dev"){print $(i+1); exit}}')
[ -n "$IF" ] || IF=eth0
echo "=== ВРЕМЯ ==="; date '+%F %T %Z (%z)'
echo; echo "=== ЛИНК $IF ==="
if have ethtool; then ethtool "$IF" 2>&1 | grep -E "^[[:space:]]*(Speed|Duplex|Auto-negotiation|Link detected):"; else echo "ethtool не установлен"; cat /sys/class/net/$IF/speed /sys/class/net/$IF/duplex /sys/class/net/$IF/carrier 2>&1; fi
echo; echo "=== СЧЁТЧИКИ $IF ==="; ip -s link show "$IF"
echo "--- переходы линка с момента загрузки ---"
for f in carrier carrier_changes carrier_up_count carrier_down_count; do printf "%-20s " "$f"; cat /sys/class/net/$IF/$f 2>/dev/null || echo "(нет)"; done
echo; echo "=== PING ШЛЮЗ $GW (100 пакетов) ==="; ping -c 100 -i 0.2 -q "$GW" 2>&1 | tail -4
echo; echo "=== PING 8.8.8.8 (100 пакетов) ==="; ping -c 100 -i 0.2 -q 8.8.8.8 2>&1 | tail -4
echo; echo "=== DNS ==="; cat /etc/resolv.conf | grep -v '^#'; getent hosts agent.wirenboard.cloud tunnels.wirenboard.cloud timescale.wirenboard.cloud 2>&1 || echo "имя не разрешается"
echo; echo "=== ТАЙМИНГИ HTTPS ДО ОБЛАКА (3 прогона) ==="
for i in 1 2 3; do
  curl -o /dev/null -sS --max-time 30 \
    -w "прогон$i: dns=%{time_namelookup} tcp=%{time_connect} tls=%{time_appconnect} first_byte=%{time_starttransfer} total=%{time_total} code=%{response_code}\n" \
    https://wirenboard.cloud/ 2>&1
done
echo; echo "=== СКОРОСТЬ КАНАЛА, малый файл (3 прогона) ==="
. /usr/lib/wb-release 2>/dev/null
ARCH=$(dpkg --print-architecture 2>/dev/null || echo arm64)
URL="https://deb.wirenboard.com/${TARGET}/dists/${SUITE}/main/binary-${ARCH}/Packages.gz"
echo "релиз: ${RELEASE_NAME} ${TARGET} ${SUITE} ${ARCH}"
echo "тестовый файл: $URL"
for i in 1 2 3; do
  curl -L -o /dev/null -sS --max-time 60 \
    -w "прогон$i: speed=%{speed_download} байт/с size=%{size_download} total=%{time_total} c code=%{response_code}\n" \
    "$URL" 2>&1
done
echo; echo "=== СКОРОСТЬ КАНАЛА, фиксированный объём 5 МБ (Range, не зависит от размера файла на сервере) ==="
for i in 1 2; do
  curl -r 0-5242879 -o /dev/null -sS --max-time 120 \
    -w "прогон$i: speed=%{speed_download} байт/с size=%{size_download} code=%{response_code} total=%{time_total}\n" \
    "$URL" 2>&1
done
echo "(ожидаем code=206 size=5242880 — если size меньше или code не 206, сервер Range не поддержал, полагайтесь на малый файл выше)"
echo; echo "=== СКОРОСТЬ ОТДАЧИ, малый файл 300 КБ (быстрый, почти всегда завершается) ==="
head -c 300000 /dev/urandom > /tmp/wb-up-small.bin 2>/dev/null
if [ -s /tmp/wb-up-small.bin ]; then
  curl -T /tmp/wb-up-small.bin -u "6YilW8SLkFBdDMS:" -sS --connect-timeout 15 --max-time 90 \
    -w "speed_upload=%{speed_upload} байт/с size_upload=%{size_upload} total=%{time_total} code=%{response_code}\n" \
    "https://cloud.ek-tmn.ru/public.php/webdav/wb-net-check-small-$(date +%s).bin" 2>&1
  rm -f /tmp/wb-up-small.bin
else
  echo "не удалось создать тестовый файл (/dev/urandom недоступен или нет места в /tmp)"
fi
echo; echo "=== СКОРОСТЬ ОТДАЧИ, большой файл 5 МБ (может не успеть на медленном канале — это тоже результат) ==="
head -c 5000000 /dev/urandom > /tmp/wb-up-big.bin 2>/dev/null
if [ -s /tmp/wb-up-big.bin ]; then
  curl -T /tmp/wb-up-big.bin -u "6YilW8SLkFBdDMS:" -sS --connect-timeout 15 --max-time 300 \
    -w "speed_upload=%{speed_upload} байт/с size_upload=%{size_upload} total=%{time_total} code=%{response_code}\n" \
    "https://cloud.ek-tmn.ru/public.php/webdav/wb-net-check-big-$(date +%s).bin" 2>&1
  rm -f /tmp/wb-up-big.bin
else
  echo "не удалось создать тестовый файл (/dev/urandom недоступен или нет места в /tmp)"
fi
echo; echo "=== АГЕНТ ==="; systemctl is-active wb-cloud-agent@wirenboard.cloud wb-cloud-agent-frpc@wirenboard.cloud wb-cloud-agent-metrics@wirenboard.cloud
echo; echo "=== КОНТРОЛЬНЫЙ ЗАПРОС В ОБЛАКО ==="
curl --connect-timeout 45 --retry 8 --retry-delay 1 --retry-all-errors \
  --cert /var/lib/wb-cloud-agent/device_bundle.crt.pem \
  --engine ateccx08 --key ATECCx08:00:02:C0:00 --key-type ENG \
  -o /dev/null -sS -w 'code=%{response_code} total=%{time_total}\n' \
  https://agent.wirenboard.cloud/api-agent/v1/agent-start-up/ 2>&1
echo; echo "=== ЗАМЕРЫ ОТПРАВКИ МЕТРИК ==="
if [ "$(systemctl is-active wb-cloud-agent-metrics@wirenboard.cloud 2>/dev/null)" != "active" ]; then
  echo "служба отправки метрик не запущена — замеров нет"
else
  journalctl -u wb-cloud-agent-metrics@wirenboard.cloud -n 500 --no-pager 2>/dev/null | grep -oE "metrics send: [0-9.]+s" | sed 's/.*: //; s/s$//' | awk '{v=$1+0; n++; if(v<1)a++; else if(v<3)b++; else e++} END{if(n==0) print "замеров в выборке нет"; else printf "замеров: %d | <1c: %d | 1-3c: %d | >=3c: %d\n",n,a+0,b+0,e+0}'
  journalctl -u wb-cloud-agent-metrics@wirenboard.cloud -n 500 --no-pager 2>/dev/null | grep -E "ERROR" | tail -5
fi
echo; echo "=== ГОТОВО ==="

Обмен пакетами с wirenboard.com [45.89.25.184] с 32 байтами данных:
Ответ от 45.89.25.184: число байт=32 время=41мс TTL=65
Ответ от 45.89.25.184: число байт=32 время=51мс TTL=65
Ответ от 45.89.25.184: число байт=32 время=61мс TTL=65
Ответ от 45.89.25.184: число байт=32 время=54мс TTL=65
Ответ от 45.89.25.184: число байт=32 время=59мс TTL=65
Ответ от 45.89.25.184: число байт=32 время=46мс TTL=65

Статистика Ping для 45.89.25.184:
Пакетов: отправлено = 6, получено = 6, потеряно = 0
(0% потерь)
Приблизительное время приема-передачи в мс:
Минимальное = 41мсек, Максимальное = 61 мсек, Среднее = 52 мсек
Control-C

Получится обновленный скрипт (чуть выше) запустить?

видимо с первого раза не ушло, сделал тесть еще раз

Диагностика канала контроллер ↔ Wiren Board Cloud

Работает на bullseye и trixie, интерфейс определяется по маршруту по умолчанию.

Только читает и измеряет, кроме двух тестовых файлов на удалённом WebDAV для проверки отдачи.

have() { command -v “$1” >/dev/null 2>&1; }
GW=$(ip route | awk ‘/^default/{print $3; exit}’)
IF=$(ip route | awk ‘/^default/{for(i=1;i<=NF;i++) if($i==“dev”){print $(i+1); exit}}’)
[ -n “$IF” ] || IF=eth0
echo “=== ВРЕМЯ ===”; date ‘+%F %T %Z (%z)’
echo; echo “=== ЛИНК $IF ===”
if have ethtool; then ethtool “$IF” 2>&1 | grep -E “[1]*(Speed|Duplex|Auto-negotiation|Link detected):”; else echo “ethtool не установлен”; cat /sys/class/net/$IF/speed /sys/class/net/$IF/duplex /sys/class/net/$IF/carrier 2>&1; fi
echo; echo “=== СЧЁТЧИКИ $IF ===”; ip -s link show “$IF”
echo “— переходы линка с момента загрузки —”
for f in carrier carrier_changes carrier_up_count carrier_down_count; do printf "%-20s " “$f”; cat /sys/class/net/$IF/$f 2>/dev/null || echo “(нет)”; done
echo; echo “=== PING ШЛЮЗ $GW (100 пакетов) ===”; ping -c 100 -i 0.2 -q “$GW” 2>&1 | tail -4
echo; echo “=== PING 8.8.8.8 (100 пакетов) ===”; ping -c 100 -i 0.2 -q 8.8.8.8 2>&1 | tail -4
echo; echo “=== DNS ===”; cat /etc/resolv.conf | grep -v ‘^#’; getent hosts agent.wirenboard.cloud tunnels.wirenboard.cloud timescale.wirenboard.cloud 2>&1 || echo “имя не разрешается”
echo; echo “=== ТАЙМИНГИ HTTPS ДО ОБЛАКА (3 прогона) ===”
for i in 1 2 3; do
curl -o /dev/null -sS --max-time 30
-w “прогон$i: dns=%{time_namelookup} tcp=%{time_connect} tls=%{time_appconnect} first_byte=%{time_starttransfer} total=%{time_total} code=%{response_code}\n”
https://wirenboard.cloud/ 2>&1
done
echo; echo “=== СКОРОСТЬ КАНАЛА, малый файл (3 прогона) ===”
. /usr/lib/wb-release 2>/dev/null
ARCH=$(dpkg --print-architecture 2>/dev/null || echo arm64)
URL=“https://deb.wirenboard.com/${TARGET}/dists/${SUITE}/main/binary-${ARCH}/Packages.gz
echo “релиз: ${RELEASE_NAME} ${TARGET} ${SUITE} ${ARCH}”
echo “тестовый файл: $URL”
for i in 1 2 3; do
curl -L -o /dev/null -sS --max-time 60
echo; echo "=== ГОТОВО ===“ent-metrics@wirenboard.cloud -n 500 --no-pager 2>/dev/null | grep -E “ERROR” | tail -5рке нет”; else
=== ВРЕМЯ ===
2026-08-07 13:17:21 +05 (+0500)

=== ЛИНК eth0 ===
Speed: 100Mb/s
Duplex: Full
Auto-negotiation: on
Link detected: yes

=== СЧЁТЧИКИ eth0 ===
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
link/ether 00:85:01:02:7d:36 brd ff:ff:ff:ff:ff:ff
RX: bytes packets errors dropped missed mcast
871978820 11884086 0 0 0 0
TX: bytes packets errors dropped carrier collsns
3223452298 14865928 0 0 0 0
— переходы линка с момента загрузки —
carrier 1
carrier_changes 27
carrier_up_count 14
carrier_down_count 13

=== PING ШЛЮЗ 192.168.0.1 (100 пакетов) ===

— 192.168.0.1 ping statistics —
100 packets transmitted, 100 received, 0% packet loss, time 20007ms
rtt min/avg/max/mdev = 0.464/1.096/2.498/0.541 ms

=== PING 8.8.8.8 (100 пакетов) ===

— 8.8.8.8 ping statistics —
100 packets transmitted, 99 received, 1% packet loss, time 19875ms
rtt min/avg/max/mdev = 67.481/85.230/158.770/11.702 ms

=== DNS ===
nameserver 192.168.0.1
5.35.10.8 wirenboard.cloud agent.wirenboard.cloud
5.35.10.8 wirenboard.cloud tunnels.wirenboard.cloud
5.35.10.8 timescale.wirenboard.cloud

=== ТАЙМИНГИ HTTPS ДО ОБЛАКА (3 прогона) ===
прогон1: dns=0.004069 tcp=0.073104 tls=0.214822 first_byte=0.296532 total=0.296818 code=200
прогон2: dns=0.005146 tcp=0.048770 tls=0.211150 first_byte=0.271975 total=0.277085 code=200
прогон3: dns=0.004926 tcp=0.051570 tls=0.188034 first_byte=0.267018 total=0.271468 code=200

=== СКОРОСТЬ КАНАЛА, малый файл (3 прогона) ===
релиз: wb-2606 wb8/bullseye stable arm64
тестовый файл: https://deb.wirenboard.com/wb8/bullseye/dists/stable/main/binary-arm64/Packages.gz
прогон1: speed=5562 байт/с size=55619 total=9.999609 c code=200
прогон2: speed=5649 байт/с size=55619 total=9.845305 c code=200
прогон3: speed=5946 байт/с size=55619 total=9.353330 c code=200

=== СКОРОСТЬ КАНАЛА, фиксированный объём 5 МБ (Range, не зависит от размера файла на сервере) ===
прогон1: speed=6611 байт/с size=55619 code=206 total=8.413278
прогон2: speed=6551 байт/с size=55619 code=206 total=8.489769
(ожидаем code=206 size=5242880 — если size меньше или code не 206, сервер Range не поддержал, полагайтесь на малый файл выше)

=== СКОРОСТЬ ОТДАЧИ, малый файл 300 КБ (быстрый, почти всегда завершается) ===
speed_upload=6173 байт/с size_upload=300000 total=48.592082 code=201

=== СКОРОСТЬ ОТДАЧИ, большой файл 5 МБ (может не успеть на медленном канале — это тоже результат) ===
curl: (28) Operation timed out after 300002 milliseconds with 0 bytes received
speed_upload=5898 байт/с size_upload=1769472 total=300.002221 code=100

=== АГЕНТ ===
active
active
active

=== КОНТРОЛЬНЫЙ ЗАПРОС В ОБЛАКО ===
code=200 total=1.089236

=== ЗАМЕРЫ ОТПРАВКИ МЕТРИК ===
замеров: 33 | <1c: 3 | 1-3c: 22 | >=3c: 8
Aug 07 12:18:33 wirenboard-AUSRVB3H python3[2710639]: 2026-08-07 12:18:33,127 ERROR wb-cloud-metrics: Metrics iteration failed: Network error while sending metrics (curl code=6): curl: (6) Could not resolve host: timescale.wirenboard.cloud

=== ГОТОВО ===
root@wirenboard-AUSRVB3H:~#


  1. [:space:] ↩︎

Большое спасибо!

Подтверждается версия с медленным каналом МТС.

Направление Скорость
Скачивание 46–53 кбит/с
Отдача 47–49 кбит/с

Для работы веб-интерфейса через облако контроллеру нужно передать со своей стороны несколько файлов — код и стили интерфейса, суммарно около 740 КБ. На измеренной у вас скорости отдачи это заняло бы около 2 минут только на передачу этих файлов, ещё до того, как интерфейс сможет начать показывать живые данные. Отсюда и зависание при открытии — браузер столько не ждёт.

Дополнительные наблюдения.

Обрывы связи по кабелю участились. По сравнению с прошлой проверкой число обрывов выросло. DNS периодически не успевает разрешиться при попытке связи с облаком — ещё один симптом того же узкого канала: при низкой скорости даже короткие запросы иногда не укладываются в отведённое время.

Общественная сеть МТС на объекте для удалённого доступа непригодна — её пропускной способности не хватает. Надо пробовать свой канал: для начала, отдельная SIM-карта в телефоне и раздача инета по wifi. Но и тут, увы, полного доверия нет, с учетом нынешней ситуации с мобильным интернетом. (

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

Да, можно использовать ssh для управления.
Или развернуть telegram bot, это удобно.

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

Для начала прошу простить мою невнимательность, я принял совет моего коллеги, как ваш ответ.

Скажите, сейчас SSH через облако в браузере нормально открывается и работает?

Команды по ssh могу отправлять, получать ответ. Но вэб так и не коннектится.

А вообще можно ли подключится к публичной wifi сети мтс, там аутентификация по номеру телефона

Добрый день! Вы проверяли именно через “SSH и файлы” в облаке?

У меня есть серьезные опасения, что скорости этой публичной сети хватит на работу контроллера. Что касается аутентификации в сети, прошу обратиться к документации провайдера.

Да, ssh в облаке проверял, команды уходят, ответ получаю. Файлы тоже открываются

Очень хорошо. Хоть какой-то вариант управления и наблюдения у вас есть. Остается найти вменяемый канал связи.

Да, буду на неделе пробовать отдельный модем

Я дал ответ на ваш изначальный вопрос?

Как только я проверю на другом канале связи, тогда конечно всё встанет на свои места. Сразу встречный вопрос: изначально, когда вел настройку на объекте, я мог подключиться удаленно, что потом произошло не знаю, я сам лично как-о мог что-то сделать не то? В локале, повторюсь, соединение есть и нормальное.