Asterisk 1,8 à 16

Il y a environ 10 ans, notre société disposait d'une station sans prise en charge de SIP et le premier Asterisk 1.6 était connecté via des flux PRI. Par la suite, je voulais des redirections avec substitution de numéros et gestion des catégories, et chan_ss7 de netfors a été trouvé, qui, après avoir déposé un fichier, pouvait tout faire. Le temps a passé et PJSIP est sorti dans la version 13 d'Aterisk, et chan_ss7 n'a été compilé que sous la version 1.8. Et périodiquement, une fois tous les six mois, il y avait des problèmes d'interruptions, qui se manifestaient par la voix qui disparaissait. Ils sont apparus et sont passés par eux-mêmes.



La station principale a été remplacée et a appris la gorgée et il a été décidé de passer Asterisk à 16.



L'installation a été effectuée sur Debian 10. Les dépôts ont la version 16.2.1, donc nous allons construire à partir des sources. Téléchargez le dernier Asterisk 16, je l'ai eu sur 16.12.0:



cd /usr/src
wget http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-16-current.tar.gz


Décompressez-le dans un dossier et accédez-y:



tar xzvf asterisk-16-current.tar.gz
cd asterisk-16.*


Maintenant, installons toutes les dépendances requises dans Debian. Il n'est pas nécessaire de les parcourir manuellement. Toutes les dépendances sont collectées dans un script qui doit être exécuté.



contrib/scripts/install_prereq install


Ensuite, téléchargez les sources mp3, qui sont nécessaires pour construire le module mp3.



contrib/scripts/get_mp3_source.sh


Toutes les dépendances sont installées et vous pouvez procéder à l'assemblage.



./configure
make menuselect


À ce qui est installé par défaut, j'ajoute:



  • Dans le premier onglet, format_mp3.
  • Dans Core Sound Packages, j'indique les sons russes RU-WAV.
  • Dans Extras Sound Packages, je choisis l'anglais EN-WAV, malheureusement il n'y a pas de russe.


Nous continuons, après avoir accepté les paramètres, en cliquant sur Enregistrer et quitter. Compiler:



./configure
make


Ensuite, construisons et installons le package à l'aide de checkinstall:



checkinstall


Nous remplissons la version, le nom du package, etc. J'écris le nom du package asterisk-16 pour qu'il n'entre pas en conflit avec celui des référentiels.



checkinstall


Ajoutez un utilisateur pour exécuter Asterisk et accorder des autorisations de dossier:



adduser --system --group --home /var/lib/asterisk --no-create-home --gecos "Asterisk" asterisk
usermod -a -G dialout,audio asterisk
chown -R asterisk: /var/{lib,log,run,spool}/asterisk /usr/lib/asterisk /etc/asterisk


Nous configurons Asterisk pour qu'il s'exécute sous cet utilisateur. Pour ce faire, ajoutez les paramètres à la configuration / etc / default / asterisk:



AST_USER="asterisk"
AST_GROUP="asterisk"


Après avoir édité /etc/asterisk/modules.conf. Nous supprimons les choses inutiles, par exemple:



noload => chan_sip.so


Nous démarrons l'astérisque dans la console et vérifions qu'il n'y a pas d'erreur:



asterisk -cvvv


Si tout va bien, ajoutez le service au démarrage et exécutez:



systemctl enable asterisk
systemctl start asterisk


Ceci termine l'installation et procède à la configuration.



Dans PJSIP, la syntaxe a radicalement changé et cela ne fonctionnera pas uniquement pour copier la configuration. Il y a un convertisseur de configuration dans le dossier source contrib / scripts / sip_to_pjsip / sip_to_pjsip.py, mais le format avec aor, identifier, etc. pas pratique et une sortie a été trouvée avec pjsip_wizard. Nous avons juste besoin de créer un transport dans /etc/asterisk/pjsip.conf ajouter:



[transport-udp]
type = transport
protocol = udp
bind = x.x.x.x
external_media_address = x.x.x.x
external_signaling_address = x.x.x.x


Remplacez xxxx par l'adresse IP que vous écouterez.



Nous créons un modèle pour l'utilisateur:



[main-template](!)
type=wizard
transport=transport-udp
accepts_auth = yes
accepts_registrations = yes
aor/qualify_frequency = 100
aor/max_contacts = 1
aor/remove_existing = yes
inbound_auth/auth_type = userpass
endpoint/disallow = all
endpoint/allow = alaw
endpoint/dtmf_mode = rfc4733
endpoint/deny = 0.0.0.0/0
endpoint/context = city_out
endpoint/direct_media = no
endpoint/device_state_busy_at = 1
endpoint/language = ru
endpoint/sdp_session = MySDp


Et puis un utilisateur ordinaire aura déjà une configuration:



[100](main-template)
endpoint/permit=192.168.100.1
inbound_auth/username=100
inbound_auth/password=P@$$Word123
endpoint/callerid='' <100>


Et c'est déjà très similaire au format chan_sip, et on change les noms des paramètres dans l'éditeur en remplaçant les mots.



Pour les clients derrière nat, au lieu de nat = yes, nous allons créer un modèle d'hôtel avec l'ajout de lignes:



endpoint/rtp_symmetric=yes
endpoint/force_rport=yes
endpoint/rewrite_contact=yes


Pour que pjsip se comporte comme chan_sip, i.e. ajoutez un appareil homologue. Certains téléphones chinois envoient parfois pour une raison quelconque une deuxième inscription depuis un autre port lorsque le premier est actif et cela vous permet de contourner ce bogue.



aor/max_contacts = 1
aor/remove_existing = yes


L'une des fonctionnalités de PJSIP est l'enregistrement multiple, qui n'était pas pris en charge dans chan_sip. Remplacez aor / max_contacts par le montant requis et appelez dans le plan de numérotation:



exten => _XXX,1,Dial(${PJSIP_DIAL_CONTACTS(${EXTEN})})


Il est devenu très pratique de pouvoir définir des groupes d'interception par nom et non par numéro comme auparavant:



endpoint/named_call_group = aveks
endpoint/named_pickup_group = aveks


L'ancien chan_sip avait un paramètre de limite d'appels qui limitait le nombre de conversations entre pairs. Le nouveau chan_pjsip n'a pas cela, dans tous les chats, il est recommandé de limiter les appels par le paramètre GROUP. Pour une raison quelconque, nulle part dans les manuels, il n'utilise le paramètre endpoint / device_state_busy_at et ne l'ajoute à extensions.conf au contexte entrant et sortant:



exten => _X.,1,GoSub(subDeviceBusy,s,1(${EXTEN},${CALLERID(num)}))
[subDeviceBusy]
exten => s,1,NoOp(PJSIP/${ARG1} has state ${DEVICE_STATE(PJSIP/${ARG1})})
exten => s,n,NoOp(CallerId is ${ARG2})
exten => s,n,ExecIf($["${DEVICE_STATE(PJSIP/${ARG1})}" = "BUSY"]?Hangup(17))
exten => s,n,Return


Vous pouvez afficher les lignes dans la console Asterisk:



pjsip show endpoint 100
Endpoint:  100/100                                      Not in use    0 of 1
     InAuth:  100-iauth/100
        Aor:  100                                            3
      Contact:  100/sip:100@192.168.0.10:5062       c34b4c2d4d Avail         7.981
  Transport:  transport-udp             udp      0      0  192.168.0.1:5060


Ici, 0 sur 1 montre combien de lignes sont occupées parmi les lignes possibles.



En 16, les macros Asterisk sont devenues obsolètes et ont donc dû être réécrites sur Gosub.



Afin de transmettre le numéro de l'appelant lors de l'appel, ajoutez l'en-tête de déviation à INVITE lors de l'appel:



exten => 2222222,n,Dial(PJSIP/8XXXXXXXXXX@trunk,,tTb(add_diversion^${EXTEN}^1)
[add_diversion]
exten => _XXXXXXX,1,Set(PJSIP_HEADER(add,Diversion)=<sip:XXX${EXTEN}@x.x.x.x>\;reason=unconditional\;screen=yes\;privacy=off)
exten => _XXXXXXX,n,Return()


Ici 2222222 est le numéro de la ville sur laquelle se trouve la redirection, 8XXXXXXXXXX est le numéro vers lequel la redirection est, et si nécessaire, ajoutez l'indicatif régional au lieu de XXX sip: XXX $ {EXTEN} @xxxx>



Il n'y a pas eu de problèmes particuliers avec les fichiers de configuration de la file d'attente, nous changeons uniquement les membres de SIP à PJSIP.



N'oubliez pas d'utiliser la documentation

pjsip_wizard.conf

pjsip.conf



All Articles