Двосторонній зв'язок
Номер, яким керує signal2sip, є повноцінним учасником обох світів - на нього можна подзвонити з будь-якого боку, і дзвінки, здійснені з будь-якого боку, доходять до іншого.
Дзвінок Signal → АТС
Коли хтось дзвонить на акаунт signal2sip у Signal, демон відповідає лише після того, як АТС справді підняла слухавку (він не перехоплює дзвінок у ваших інших реальних/зв’язаних пристроїв Signal завчасно), а потім з’єднує аудіо з тим призначенням, яке налаштоване для цього акаунта:
sip_bridge_destination- набрати конкретний екстеншн напряму.sip_bridge_did- набрати DID і дозволити вхідному маршруту вашої АТС самому вирішити реальне призначення (черга дзвінків, IVR, часові умови, резервування) - корисно, якщо хочете, щоб ця логіка жила у конфігурації АТС, а не в signal2sip.
Дзвінок з АТС → Signal
Наберіть номер через власний SIP-екстеншн акаунта signal2sip, як будь-який інший вихідний дзвінок, і він розмістить справжній дзвінок у Signal на набраний номер. Призначення розпізнається через сервіс пошуку контактів Signal так само, як це робить справжній клієнт Signal, тож жодного ручного зіставлення номерів телефону з ідентичностями Signal не потрібно.
DTMF (набір цифр в IVR)
У власних застосунках Signal взагалі немає тонального набору під час
дзвінка, тож signal2sip використовує той самий підхід, який уже
доведений у спорідненому мосту цього проєкту для Telegram
(tg2sip-webrtc), де та сама
проблема: поки дзвінок із кимось триває, надішліть цифри звичайним
текстовим повідомленням у той самий чат - воно зчитується і
передається як справжня подія SIP DTMF (RFC 2833) у дзвінок, без
потреби в інтерфейсі набору, якого в Signal просто немає. Працює будь-яка
комбінація 0-9, *, # і A-D (регістр не важливий), до 32 символів
на повідомлення.
Завершення дзвінка поширюється в обидва боки
Завершення дзвінка з будь-якого боку - Signal чи АТС - завершує його і з іншого боку, замість того, щоб залишати наполовину з’єднаний дзвінок висіти на одному плечі.
Здоров’я з’єднання: Signal - джерело істини, а не АТС
Залежність між двома сторонами навмисно однонаправлена:
- Якщо з’єднання з Signal обривається, демон одразу знімає SIP-реєстрацію цього акаунта - чесний статус “не зареєстровано” кращий за застарілий “зареєстровано”, на який насправді нічого не можна замаршрутизувати. Він продовжує в фоні пробувати відновити з’єднання з Signal і автоматично відновлює SIP-реєстрацію, щойно воно повертається.
- Якщо стає недоступною сторона SIP/АТС (перезапуск АТС, збій мережі), демон не чіпає з’єднання з Signal - акаунт залишається онлайн і доступним у Signal незалежно від цього, а окремий, незалежний watchdog самостійно продовжує пробувати відновити SIP-реєстрацію, доки АТС знову не стане доступною.
Ця асиметрія навмисна: мертве з’єднання з Signal означає, що акаунт взагалі не може зробити нічого корисного (без нього неможливий жоден дзвінок у будь-якому напрямку), тож прив’язка стану SIP до нього уникає ситуації, коли реєстрація виглядає здоровою, хоча насправді ні. А мертва АТС - це лише тимчасова недоступність вихідного плеча одного конкретного акаунта - вона не повинна обвалювати інакше здорове з’єднання з Signal, яке може досі обробляти повідомлення чи дзвінки інших акаунтів.