OScam fallback reader: настройка резервного reader

Главная Статьи OScam fallback reader: настройка резервного reader

Дата публикации

05.06.2026

OScam fallback reader: настройка резервного reader

Если ваш основной источник декодирования иногда падает и картинка замирает — значит, у вас нет нормально настроенного резерва. OScam fallback reader решает эту проблему на уровне конфигурации, без сторонних скриптов и костылей. Ниже — как это работает и как настроить правильно.

Что такое fallback reader в OScam и как он работает

OScam не опрашивает все reader подряд при каждом ECM-запросе. Есть чёткая иерархия: сначала идут основные (primary) reader, и только если они не отдали валидный CW в пределах таймаута — подключается резервный. Это и есть механика fallback.

Схема прохождения запроса примерно такая: клиент (dvbapi или CCcam-клиент) шлёт ECM → OScam смотрит, какие reader подходят по caid и group → опрашивает primary reader → если таймаут или rejection — передаёт запрос fallback reader. Всё это происходит в рамках одного ECM-цикла.

Логика приоритетов: primary, fallback и порядок опроса

По умолчанию OScam опрашивает reader в том порядке, в котором они перечислены в oscam.server, с учётом group. Если у reader стоит fallback = 1, он исключается из первичного опроса и резервируется. То есть он физически не участвует в гонке за CW, пока есть живые primary.

Порядок внутри primary-группы при отключённом lb_mode определяется позицией в конфиге. При включённом load balancing логика меняется — об этом отдельно в разделе про тонкую настройку.

Чем fallback отличается от обычного reader и от cache

Обычный reader участвует в опросе всегда, когда совпадают caid и group. Fallback reader — нет: он молчит, пока primary справляются. Это важно для понимания времени отклика: переход на резерв всегда даёт небольшую задержку, это нормально.

Cache (cwcache / cacheex) — отдельная история. Кэш отдаёт уже расшифрованный CW из памяти, без обращения к reader вообще. Fallback — это именно живой reader, который делает реальный ECM-запрос к источнику.

Когда OScam переключается на резервный reader

Переключение происходит в трёх случаях: основной reader не ответил в пределах ctimeout, вернул rejection (нет подписки или неверный ident), или ушёл в статус OFFLINE. В первых двух случаях OScam сразу пробует fallback в рамках того же ECM-запроса. В третьем — на следующем запросе, после того как пометит primary как недоступный.

Настройка fallback reader в oscam.server

Конфиги OScam обычно лежат в /etc/tuxbox/config/oscam/ (Enigma2-боксы) или /var/etc/oscam/. На Linux-серверах чаще всего /etc/oscam/. Файл с reader — oscam.server.

Минимальный рабочий блок для CCcam-источника выглядит так:

[reader]
label        = main_cccam
protocol     = cccam
device        = 192.168.1.10,12000
user          = myuser
password      = mypassword
group         = 1
caid          = 1830,0604
fallback      = 0

И резервный reader к нему:

[reader]
label        = backup_cccam
protocol     = cccam
device        = 10.0.0.5,12000
user          = backupuser
password      = backuppassword
group         = 1
caid          = 1830,0604
fallback      = 1

Ключевая строка — fallback = 1. Всё остальное стандартно.

Параметр fallback и fallback_percaid

fallback = 1 делает весь reader резервным для всех его caid. Это грубый инструмент: если у reader несколько caid, он становится резервом по всем сразу.

fallback_percaid работает тоньше. Пример:

fallback_percaid = 1830:1

Это значит: reader является резервным только для caid 1830, а по остальным caid он работает как обычный primary. Удобно, когда у вас один источник хорошо держит один пакет и посредственно — другой.

Можно комбинировать несколько caid через запятую:

fallback_percaid = 1830:1,0604:1

Связь group в oscam.server и oscam.user

Вот где большинство застревает. Параметр group в блоке [reader] и параметр group в блоке [account] файла oscam.user должны пересекаться. Если они не совпадают — ECM-запрос от клиента просто не дойдёт до reader, и fallback никогда не сработает.

Пример oscam.user:

[account]
user         = client1
password     = clientpass
group         = 1

Если у вас reader в group = 2, а клиент в group = 1 — связи нет. Это самая частая причина, почему fallback "не работает", хотя конфиг reader выглядит правильно.

Пример блока [reader] для CCcam-источника

Полный рабочий пример с типичными параметрами:

[reader]
label            = fallback_cccam
protocol         = cccam
device            = backup-server.example.com,12000
user              = fbuser
password          = fbpass
group             = 1,2
caid              = 1830,0604,09C4
ident             = 1830:000000,0604:000000
fallback          = 1
cccmaxhops        = 2
cccwantemu        = 0
connectoninit     = 1
reconnecttimeout  = 15

cccmaxhops = 2 ограничивает глубину прыжков в CCcam-сети, что снижает latency. cccwantemu = 0 отключает запрос эмуляторов — для легальных карт это правильно.

Тонкая настройка: таймауты, приоритеты и group

Настройка OScam fallback reader не ограничивается одной строкой в oscam.server. Чтобы резерв срабатывал быстро и без фриза, нужно покрутить несколько параметров в oscam.conf.

Параметры ctimeout и lb_reopen_seconds

ctimeout в секции [global] определяет, сколько миллисекунд OScam ждёт ответа от reader, прежде чем считать его таймаутом. Дефолт — 5000 мс (5 секунд). Это много: при таймауте в 5 секунд картинка замирает заметно.

[global]
ctimeout         = 3500
zapping          = 1

На практике 2500–3500 мс — нормальный компромисс. Если ваши reader пингуются до 200–300 мс — можно ставить 1500–2000 мс. Слишком мало — начнут отваливаться медленные, но рабочие источники.

lb_reopen_seconds управляет тем, через сколько секунд OScam снова попробует reader, помеченный как нерабочий. Дефолт обычно 900 секунд (15 минут). Если основной источник вернулся через 2 минуты, а OScam будет ждать 15 — вы всё это время сидите на fallback. Для динамичных ситуаций стоит снизить до 120–300 секунд.

Взаимодействие fallback с load balancing (lb_mode)

При lb_mode = 1 (или выше) OScam сам решает, какой reader опрашивать первым, основываясь на статистике ответов. Это меняет логику: fallback reader не просто "ждёт своей очереди", он исключён из lb-выборки вообще — до момента, пока все primary не исчерпаны.

Проблема возникает, когда несколько fallback reader попадают в одну group при включённом lb_mode. OScam будет опрашивать их последовательно, и суммарный response time может вырасти до неприемлемого. Рекомендация: держите не больше одного-двух fallback reader на группу.

Параметр lb_nbest_readers в секции [global] задаёт, сколько primary reader OScam держит "в активной ротации" по lb-статистике. Если поставить слишком мало — часть primary просто не будет опрашиваться, и fallback будет срабатывать чаще, чем нужно.

Раздельный fallback по caid через fallback_percaid

Допустим, у вас два пакета: Viasat (caid 0604) и Tricolor (caid 4B02). Основной reader хорошо держит оба. Резервный хорошо держит только Viasat. Тогда правильная конфигурация резерва:

fallback_percaid = 0604:1

По caid 4B02 этот reader будет работать как обычный primary (если есть подписка). По caid 0604 — только как fallback. Это позволяет точечно распределять нагрузку без лишних таймаутов.

Важный edge case: если у основного и резервного reader совпадает caid, но разный ident — резерв не отдаст CW. OScam сматчит reader по caid, попробует запрос, получит rejection из-за несовпадения ident и в лучшем случае попробует следующий reader. В худшем — залогирует timeout. Всегда проверяйте параметр ident в обоих блоках.

Проверка работы fallback через веб-интерфейс и логи

Прежде чем считать настройку завершённой — проверьте. Теория без теста не стоит ничего.

Раздел Readers в webif и статус ENTITLEMENT

Включить веб-интерфейс OScam просто. В oscam.conf:

[webif]
httpport     = 8888
httpuser     = admin
httppwd      = yourpassword
httprefresh  = 10

После перезапуска OScam открываете http://<ip>:8888 и видите раздел "Readers". Там отображается статус каждого reader: CONNECTED, OFFLINE, CONNECTING. Для fallback reader должно быть CONNECTED и в колонке "FB" — отметка, что это резерв.

В разделе ENTITLEMENT для каждого reader видны доступные caid. Если у резервного reader caid не отображается — значит, либо он не получил ENTITLEMENT от сервера, либо не прошла авторизация. Это объяснит, почему он молчит при переключении.

Чтение oscam.log: строки fallback и timeout

Включите детальный лог в oscam.conf:

[global]
logfile      = /var/log/oscam/oscam.log
debuglevel   = 64

В логе ищите строки вида:

2026/03/15 14:22:31 c [dvbapi] ECM 1830 > backup_cccam (fallback) <-- 350ms

Метка (fallback) рядом с именем reader — подтверждение, что запрос ушёл на резерв. Если метки нет, а reader name — это ваш backup, что-то пошло не так с конфигурацией.

Строка timeout выглядит так:

2026/03/15 14:22:28 c [dvbapi] ECM 1830 > main_cccam timeout (3500 ms)

Именно после такой строки должна идти строка с fallback reader. Если её нет — OScam не нашёл подходящего резерва.

Тест: принудительное отключение основного reader

Самый честный тест. В webif нажмите "Disable" на основном reader или временно измените его group на несуществующую (например, group = 99) и сохраните конфиг через oscam.conf reload. Запустите видео.

Если fallback настроен правильно — картинка на секунду подвиснет (это нормальный ctimeout) и восстановится. В логе появится строка с (fallback). Response time при этом будет выше обычного — это тоже норма, не пугайтесь.

Если картинка не восстановилась — смотрите лог: до какого reader дошёл ECM-запрос и что он вернул.

Troubleshooting: почему fallback reader не срабатывает

Разберём конкретные сценарии, потому что "не работает" — это не диагноз.

Несовпадение group между reader и user

Это причина номер один. Проверяется за 30 секунд: откройте oscam.server, найдите блок fallback reader, запомните значение group. Откройте oscam.user, найдите нужный аккаунт, проверьте его group. Они должны иметь хотя бы одно общее значение.

Reader с group = 2 и клиент с group = 1 — запросы до reader не дойдут никогда. В логе это выглядит как ECM без ответа, без строки с именем reader вообще.

fallback reader без валидной подписки или caid

Резерв подключён, CONNECTED, group совпадает — но CW не приходит. Скорее всего, у резервного reader нет активной подписки на нужный caid, или caid не указан в его блоке.

В логе это будет выглядеть как rejection:

2026/03/15 14:23:01 r [backup_cccam] ECM 1830 rejected (no entitlement)

Решение: проверить ENTITLEMENT в webif и убедиться, что в блоке [reader] перечислены нужные caid. Если caid есть, но ident отличается от основного — прописать правильный ident явно.

Конфликт с lb_mode и nofallback в oscam.user

В oscam.user есть параметр nofallback. Если он выставлен в 1 для конкретного аккаунта — fallback для этого клиента отключён полностью, независимо от настроек reader. Проверьте oscam.user.

При lb_mode = 1 бывает ситуация: OScam по lb-статистике считает primary reader "плохим" и перестаёт его опрашивать, но в fallback так и не уходит, потому что ждёт lb_reopen_seconds. В итоге вы получаете паузы без переключения. Лечится снижением lb_reopen_seconds до 60–120 секунд и проверкой lb_nbest_readers.

Ещё один кейс: после рестарта OScam fallback reader долго висит в CONNECTING. Это происходит из-за lb_reopen_seconds — сервер ждёт, прежде чем "доверять" reader снова. В этот период, если упал primary, fallback тоже недоступен. Workaround: в webif нажать "Reconnect" на нужном reader вручную, или снизить lb_reopen_seconds.

Сколько fallback reader можно настроить в OScam одновременно?

Жёсткого ограничения нет — можно поставить fallback = 1 хоть у десяти reader. Но каждый лишний резерв добавляет время к потенциальному response time при переключении: OScam перебирает их по очереди. На практике двух-трёх fallback reader достаточно для любой схемы резервирования.

Чем отличается fallback = 1 от fallback_percaid?

fallback = 1 переводит reader в режим резерва по всем его caid сразу. fallback_percaid = 1830:1 делает его резервным только для caid 1830, оставляя остальные caid в режиме primary. Если у reader несколько пакетов и он хорошо справляется с одним из них — логично оставить его primary по сильному пакету и fallback по слабому.

Почему запрос не доходит до fallback reader?

В 80% случаев — несовпадение group между [reader] в oscam.server и [account] в oscam.user. Остальное: нужный caid не указан в блоке reader, reader в статусе OFFLINE, или в oscam.user выставлен nofallback = 1. Диагностика — смотреть oscam.log: если в строке ECM нет имени reader вообще, значит, OScam не нашёл подходящего по group/caid.

Работает ли fallback при включённом load balancing (lb_mode)?

Да, работает, но логика другая. Сначала lb-алгоритм перебирает primary reader по своей статистике. Fallback включается только после их исчерпания или общего таймаута. При этом lb_reopen_seconds влияет на то, как быстро OScam снова попробует "упавший" primary — и косвенно на то, как долго сидит на fallback.

Какой таймаут ставить, чтобы OScam fallback reader не вызывал фриз картинки?

Дефолтный ctimeout в 5000 мс — это слишком много для нормального просмотра. При таком значении переход на резерв даёт заметный фриз. Начинайте с 3000–3500 мс и снижайте, ориентируясь на реальный пинг до источников. Если reader пингуется до 100 мс — можно ставить 1500 мс. Главное не опускаться ниже 3×RTT до самого медленного из ваших reader.

Можно ли использовать fallback reader разных протоколов (CCcam и newcamd)?

Да, без проблем. OScam fallback reader может работать на любом поддерживаемом протоколе: cccam, newcamd, mgcamd, cs357x и других. Протокол не влияет на механику резервирования — главное совпадение group и наличие нужного caid. Можно держать основной reader на CCcam, а резерв на newcamd — OScam переключится корректно.

О статье

  • Практические советы и инструкции
  • Материалы по спутниковому ТВ
  • Поддержка и помощь 24/7