Ruang pertemuan berdasarkan Asterisk

Kata Pengantar


Selamat siang

Ada 2 hal yang mendorong saya untuk menulis artikel ini: sejumlah kecil atau kurangnya contoh kerja modern pada "chip" Asterisk, serta keengganan spesialis untuk berbagi "chip" yang sama ini dengan yang lain. Inilah saya sekarang tentang komunitas RU. Segala macam "Kakek" di forum lebih cenderung menghujani Anda dengan slop dan mengirim Anda membaca buku sepuluh tahun yang lalu daripada memberikan sedikit informasi yang bermanfaat. Topik-topik forum itu sendiri, dibuat pada 2005-2010, sudah sangat ketinggalan zaman dan kadang-kadang ada sesuatu yang telah digergaji dari versi asterisk saat ini, dan sesuatu perlu dikerjakan ulang untuk membuatnya berfungsi.

Jadi disini.
Sebagai akibat dari pengabaian CUCM demi Asterisk, manajemen ditugasi menjaga layanan paling populer di kalangan pengguna dalam bentuk paling asli, agar tidak membuat orang frustrasi. Salah satunya adalah penciptaan konferensi. Pada saat itu, saya sudah terbiasa dengan Asterisk, tetapi tidak terlalu dalam, jadi saya butuh sekitar satu setengah minggu untuk memilah-milah semua jenis opsi konferensi, dan tugas yang berbeda muncul dengan keputusan akhir.

Masalahnya adalah bahwa dari solusi yang mirip dengan itu ada artikel dengan meetme yang sudah ketinggalan zaman, serta beberapa jenis monster yang saya masih belum bisa mulai bekerja. Saya menyarankan sesuatu yang tidak terlalu besar.

Bubur kertas


Saya tidak akan menjelaskan apa itu jembatan, bagian mana dalam konfigurasi tertentu yang bertanggung jawab dan apa opsi ini, saya hanya akan memiliki informasi ini dan mutakhir. Sekarang tentang keputusan secara keseluruhan.

Tujuan: membuat konferensi dimungkinkan untuk dibuat selama percakapan, dan kemudian mengundang lebih banyak pelanggan di sana. Masalah utama adalah bahwa fungsi channelredirect tidak berfungsi seperti yang kita inginkan. Artinya, jika Anda menjalankannya dari dialplan selama percakapan, maka salah satu saluran akan terbang di mana diperlukan, dan yang kedua akan runtuh, dan memanjat seluruh dialplan menjadi 2 baris dan mendaftarkan opsi g pada Dials adalah malas. Dan saya tidak mengerti mengapa dalam kebanyakan manual semua orang mencoba menyelesaikan masalah hanya melalui dialplan, mengabaikan kemampuan asterisk untuk bekerja dengan skrip eksternal dan ami.

Jadi Asterisk 14.4.0

Skrip konferensi untuk 2 opsi (dengan komentar):

conference.php
<?php //    $host = "192.168.1.1"; $port = "5038"; $timeout = "10"; $user = "conference"; $pass = "1111"; // ,    1   2  $kusok = $argv[1]; //       if ($kusok == 1){ //  $channel = $argv[2]; $bridgepeer = $argv[3]; $confnum = $argv[4]; print_r($bridgepeer); print_r($confnum); // $sconn = fsockopen ($host, $port, $timeout) or die ("Connection to $host:$port failed!"); fputs ($sconn, "Action: Login\r\n"); fputs ($sconn, "Username: $user\r\n"); fputs ($sconn, "Secret: $pass\r\n\r\n"); //   fputs ($sconn, "Action: Setvar\r\n"); fputs ($sconn, "Channel: $channel\r\n"); fputs ($sconn, "Variable: CONFNUM\r\n"); fputs ($sconn, "Value: $confnum\r\n\r\n"); fputs ($sconn, "Action: Setvar\r\n"); fputs ($sconn, "Channel: $bridgepeer\r\n"); fputs ($sconn, "Variable: CONFNUM\r\n"); fputs ($sconn, "Value: $confnum\r\n\r\n"); // fputs ($sconn, "Action: Redirect\r\n"); fputs ($sconn, "Channel: $bridgepeer\r\n"); fputs ($sconn, "ExtraChannel: $channel\r\n"); fputs ($sconn, "Context: service_code-ael\r\n"); fputs ($sconn, "Exten: conference\r\n"); fputs ($sconn, "Priority: 1\r\n\r\n"); fputs($sconn, "Action: Logoff\r\n\r\n"); sleep(2); fclose ($sconn); } //     if ($kusok == 2) { //  $confnum = $argv[2]; $inviten = $argv[3]; $sconn = fsockopen ($host, $port, $errno, $errstr, $timeout) or die ("Connection to $host:$port failed!"); // fputs ($sconn, "Action: Login\r\n"); fputs ($sconn, "Username: $user\r\n"); fputs ($sconn, "Secret: $pass\r\n\r\n"); //     fputs ($sconn, "Action: Originate\r\n"); fputs ($sconn, "Channel: Local/".$inviten."@out-ael\r\n"); fputs ($sconn, "Context: service_code-ael\r\n"); fputs ($sconn, "Exten: conference\r\n"); fputs ($sconn, "Priority: 1\r\n"); fputs ($sconn, "Variable: CONFNUM=".$confnum."\r\n\r\n"); fputs($sconn, "Action: Logoff\r\n\r\n"); sleep(2); fclose ($sconn); } } 


Pemrograman guru dapat memperbaiki kode dengan membuat permen dari itu, saya menulis sebaik mungkin.
Selanjutnya, kita mulai menggunakan skrip ini secara langsung di Asterisk itu sendiri.

Untuk membuat konferensi, saya memilih kombinasi * 1. Secara singkat dan tidak berpotongan dengan penomoran utama.

Tambahkan panggilan skrip ke features.conf dengan variabel yang diperlukan diteruskan ke sana

 [applicationmap] conference => *1,self,System(/usr/bin/php /home/script/conference.php 1 ${CHANNEL} ${BRIDGEPEER} ${CALLERID(num)}) 

Kemudian, agar ini berfungsi, buat variabel di dialplan di bagian [global] dan tambahkan fitur kami

 DYNAMIC_FEATURES=conference 

Untuk menambahkan peserta baru ke konferensi yang sudah dibuat, Anda harus mendaftarkan kode di confbridge.conf

 [default_menu] type = menu *1=dialplan_exec(service_code-ael,conference_add,1) 

Nah, sekarang bagian terbaiknya adalah extensions.ael:

Untuk membuat konferensi (skrip php membahas kedua saluran bicara di sini):

  conference => { ConfBridge(${CONFNUM},,,default_menu); } 

Untuk menambahkan pengguna baru (alamat dialplan_exec di sini):

 conference_add => { Read(INVITEN,dial,11,i); System(/usr/bin/php /home/script/conference.php 2 ${CALLERID(num)} ${INVITEN}); } 

Itu saja. Tidak ada kode dalam dialplan. Semuanya luas. * 1 dalam percakapan dan Anda berada di sebuah conf, lagi * 1 bip dan panggilan, siapa yang akan ditambahkan.

Pertumbuhan


Bingung dengan keinginan pengguna, saya mulai mengembangkan fitur ini.

Yang berikutnya adalah kesempatan untuk membuat konferensi dari awal (bukan dari percakapan), serta pergi ke konferensi yang sudah dibuat dengan nomor mereka, dan tidak menunggu panggilan undangan

Tambahkan ke dialplan:

 _*1XXXX => { NoOp(${CONFCHAN}); Set(__CONFNUM=${EXTEN:2}); System(/usr/bin/php /home/script/conference.php 3 ${CONFCHAN} ${CONFNUM} ); } 

Tambahkan ke skrip:

conference.php
 //     if ($kusok == 3){ //  $channel = $argv[2]; $confnum = $argv[3]; // $sconn = fsockopen ($host, $port, $timeout) or die ("Connection to $host:$port failed!"); fputs ($sconn, "Action: Login\r\n"); fputs ($sconn, "Username: $user\r\n"); fputs ($sconn, "Secret: $pass\r\n\r\n"); //   fputs ($sconn, "Action: Setvar\r\n"); fputs ($sconn, "Channel: $channel\r\n"); fputs ($sconn, "Variable: CONFNUM\r\n"); fputs ($sconn, "Value: $confnum\r\n\r\n"); // fputs ($sconn, "Action: Redirect\r\n"); fputs ($sconn, "Channel: $channel\r\n"); fputs ($sconn, "Context: service_code-ael\r\n"); fputs ($sconn, "Exten: conference\r\n"); fputs ($sconn, "Priority: 1\r\n\r\n"); fputs($sconn, "Action: Logoff\r\n\r\n"); sleep(2); fclose ($sconn); 


Saya juga harus memodifikasi baris _ * X.

  _*X. => { set(__CONFCHAN=${CHANNEL}); Dial(Local/${EXTEN}@service_code-ael); 

Sekarang, untuk memasuki konferensi atau membuatnya dari awal, Anda cukup melakukan panggilan ke * 1 dan nomor, misalnya * 15234.

Mutasi terakhir dari layanan ini adalah apa yang disebut "konferensi kelompok". Ini adalah saat bos besar terlalu malas untuk menambahkan semua orang secara manual, tetapi saya ingin menekan satu tombol dan semuanya sudah terpasang. Untuk melakukan ini, saya memutuskan untuk membuat kode layanan terpisah (* XXX) sehingga orang-orang itu sendiri tidak akan bingung. Untuk organisasi kami, lebih dari 1000 grup konferensi kemungkinan tidak diperlukan dalam 100 tahun ke depan, jadi harus ada stok penomoran yang cukup. Di rumah, Anda dapat menambahkan awalan yang berbeda, jadi pilih kapasitas penomoran yang berbeda.

Dialplan:

  _*XXX=> { Set(CONFNUM=${CALLERID(num)}); System(/usr/bin/php /home/script/groups.php ${EXTEN:1} ${CONFNUM}); ConfBridge(${CONFNUM},,,default_menu); } 

Derit peserta sendiri:

groups.php
 //  function call ($group, $confnum) { $many = count($group); //       for ($i=0; $many>$i; $i++) { //    $num = trim(array_shift($group[$i])); // system("asterisk -rx \"channel originate Local/$num@out-ael application ConfBridge $confnum\""); } } //    function conf_group ($groupid) { //   $opt = array( PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC ); $pdo = new PDO("odbc:mssql_asterisk, "asterisk, "121212", $opt); //   $sql = "SELECT extension FROM [asterisk].[dbo].[conf_groups] where groupid = $groupid"; $select = $pdo->query($sql); $result = $select->fetchAll(); // $pdo = NULL; return $result; } //  ,    $groupid = $argv[1]; //   $confnum = $argv[2]; //   $group=conf_group($groupid); // call($group, $confnum); } 


Semua grup disimpan dalam database sesuai dengan struktur "Grup, nomor, nama, deskripsi". Jika grup baru muncul, maka cukup tambahkan ke database.

Sekarang, untuk mengumpulkan, misalnya, semua direktur untuk rapat, sang jenderal hanya perlu menekan * 100. Dan sebagai aturan, bos besar memiliki telepon besar. Oleh karena itu, kami mengikat * 100 ke tombol speeddial apa pun, kami menandatanganinya sebagai "direktur" dan pengguna tidak peduli apa yang harus diketik. Saya menekan tombol - saya mengumpulkan pertemuan.

Sekarang mengantisipasi pertanyaan Anda:

Mengapa skrip dan ami? Karena dengan dialplan saya tidak berhasil membuat pengalihan yang waras dari kedua saluran tanpa kehilangan mereka di sepanjang jalan. Di ami, pada fungsi redirect, Anda dapat melampirkan saluran tambahan + mengatur variabel untuknya (misalnya, nomor konferensi, sehingga ia juga dapat menambahkan seseorang ke dalamnya).

Anda juga dapat memperhatikan bahwa saya menempatkan fitur dalam konteks service_code-ael yang terpisah. Ini nyaman ketika Anda memiliki lebih dari beberapa fitur. Saya memutuskan untuk membuatnya melalui *, oleh karena itu, dalam konteks apa pun, saya hanya menulis _ * X. dan alamatkan dalam konteks ini. Mungkin seseorang akan menemukan solusi yang lebih elegan, tetapi saya belum menemukannya selama beberapa bulan. Dan fungsi ini menarik bagi pengguna.

Kenapa ael, bukan conf? Ya, karena lebih terstruktur dan lebih mudah dibaca.
dan lebih bisa dimengerti. Satu fungsi gotoif sepadan. Saya belum mencapai lua.

Mengapa dalam pengumpulan massal, contoh berasal dilakukan melalui bash dan bukan melalui AMI? Masalahnya adalah bahwa dengan mengeksekusi sekelompok berasal dari satu baris melalui ami, sistem menunggu yang sebelumnya untuk menyelesaikan untuk memberikan yang berikutnya. Dan jika tidak ada yang mengangkat telepon, dan ada 20 detik no_ans dan 5 buah lainnya? Anda bisa menunggu sampai malam untuk mengumpulkan.

Yah, mungkin itu saja. Saya harap artikel ini akan membantu para pencari yang sama seperti saya ketika semua ini perlu dilakukan dengan cepat, nyaman bagi pengguna, dan yang paling penting, di masa depan untuk menjaga sistem ini nyaman bagi saya sendiri, sehingga untuk berbicara, dengan cadangan untuk masa depan.

Source: https://habr.com/ru/post/id427117/


All Articles