バリアを開く方法

画像



こんにちは、ハブラの住民。



私の意見では、アスタリスクを使用するための興味深いオプションを共有したいと思います。



序文 :クライアントには2つの駐車場があり、入口はgsmモジュールのある障壁で規制されています。 つまり、駐車スペースの所有者は、モジュールにインストールされているSIMカードの番号をダイヤルし、領土に入ります。 しかし、ご存知のように、番号を知っていれば誰もが知っているので、有料駐車場は混oticとして無料駐車場に変わります。 gsmモジュールの機能は、通話が受話器を取ることなく通過するため、通信事業者は番号で通話の詳細を提供できないことです。



ここで、私はそのような初期データを処理しなければなりませんでした。







実装オプションについて考えた後、ここでアスタリスクがこの問題の解決に役立つことを改めて認識しました。 クライアントが最終的に必要とするもの:





プロジェクトの実装スキームは次のとおりです。



  1. 障壁の中でSIMカードが変わる
  2. 番号は、駐車スペースの所有者が呼び出すSIPプロバイダーから購入されるため、新しいレベルの抽象化が追加されます。SIMカードの番号は誰にもわかりません(SIMはバリア内で応答しないため()ので、プロバイダーは私たちはされません)
  3. 「ホワイトリスト」機能を実装します。つまり、保護の2番目のステップを取得します。まず、呼び出すSIP番号を知る必要があり、次に、SIMカードへの呼び出しを許可する必要があります
  4. シンプルなWebインターフェイスを介して「ホワイト」リストを操作する可能性を認識しています
  5. 毎朝、電子メールでアクセス制御を担当する従業員にレポートを送信します




それでは、設定プロセスの説明に直接進みましょう。



LAMPをインストールする


何度も説明しますが、例えばここで見ることができます



ODBCサポートを使用してAsteriskをビルドおよび構成する


Asteriskをインストールするためのマニュアルはたくさんありますが、繰り返しはしません。Asteriskはodbcサポートでビルドする必要があることに注意してください(インストールはUbuntu Server 14.04で説明されています)。



sudo aptitude install unixodbc unixodbc-dev libmyodbc
      
      







そして、res_odbc、func_odbcの反対側のmenuselectにチェックを入れることを忘れずに、アスタリスクを収集します。 次に、odbcモジュールのロードを登録する必要があります。



 vim /etc/asterisk/modules.conf load => res_odbc.so ;;     [modules]
      
      







ファイル/etc/odbcinst.iniに、ドライバーのパスを記述します。

 [MySQL] Description = MySQL driver Driver = /usr/lib/x86_64-linux-gnu/odbc/libmyodbc.so Setup = /usr/lib/x86_64-linux-gnu/odbc/libodbcmyS.so CPTimeout = CPReuse =
      
      







ファイル/etc/odbc.iniで、odbc接続パラメーターを記述します。



 [asterisk-barrier] Driver = MySQL Description = Connector/ODBC 3.51 Driver DSN Server = localhost Port = 3306 User = root Password = VeryStrongPassword Database = barrier Socket = /var/run/mysqld/mysqld.sock Charset = utf8
      
      







ファイル/etc/asterisk/res_odbc.confで、odbc接続パラメーターを記述します。

 [asterisk-barrier] enabled => yes dsn => asterisk-barrier username => root password => VeryStrongPassword pooling => no limit => 1 pre-connect => yes
      
      







ロシア語の文字を正しく表示するには、/ etc / php5 / apache2 / php.iniの行のコメントを解除します。

  default_charset = "UTF-8"
      
      







次に、MySQLで、必要なベースとテーブルを作成します。




 mysql -uroot -pVeryStrongPassword
      
      







 create database barrier; use barrier; CREATE TABLE `numbers` ( `id` int(11) NOT NULL AUTO_INCREMENT, `phone` varchar(30) NOT NULL, `name` varchar(30) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 ;
      
      







作成したプレートに数字の「ホワイト」リストを追加します。



 INSERT INTO `numbers` (`phone`, `name`) VALUES ('79260000000',' '), ('79261111111',' ');   
      
      







その後、アスタリスクを再起動します。



 /etc/init.d/asterisk restart
      
      







そして、odbc設定が正しいことを確認します。これについては、アスタリスクコンソールで次のように記述します。



 odbc show all
      
      







すべてが正しい場合、次のように表示されます。





次に、sip.confでプロバイダーを構成します。
 ;;      ,        register => login:password@sip.provider.com/74990000000 register => login:password@sip.provider.com/74991111111 [prov1] accept_outofcall_messages=no host=sip.provider.com type=peer secret=YourPass defaultuser=YourLogin fromdomain=sip.provider.com fromuser=YourLogin canreinvite=no jbenable=no faxdetect=yes t38pt_udptl=yes,fec,maxdatagram=400 context=from-trunk dtmfmode=auto port=5060 disallow=all allow=g722 allow=ulaw allow=alaw insecure=port,invite qualify=yes sendrpid=yes [prov2] accept_outofcall_messages=no host=sip.provider.com type=peer secret=YourPass defaultuser=YourLogin fromdomain=sip.provider.com fromuser=YourLogin canreinvite=no jbenable=no faxdetect=yes t38pt_udptl=yes,fec,maxdatagram=400 context=from-trunk dtmfmode=auto port=5060 disallow=all allow=g722 allow=ulaw allow=alaw insecure=port,invite qualify=yes sendrpid=yes
      
      









func_odbc.confに、MySQLで呼び出し元の番号を検索し、その名前を返す関数を作成します
 [MOBILE] dsn=asterisk-barrier readsql=SELECT name FROM numbers WHERE phone = '${CALLER}'
      
      









extensions.confでは、ダイヤルプランを作成します。このプランに従って、データベースに番号がある場合は、バリアのSIMカードの番号に呼び出しをリダイレクトし、そうでない場合は終了します
 [from-trunk] ;;    exten => 74990000000,1,NoOp(Incoming call from ${CALLERID(num)} to prov1) same => n,Set(CALLER=${CALLERID(num)}) ;;      CALLER,       func_odbc same => n,Set(result=${ODBC_MOBILE()}) ;; sql-,         same => n,Set(foo=${ISNULL(${result})}) ;;       ,   ISNULL  0,   - 1 same => n,GotoIf($["${foo}" = "0"]?6:7) ;;   ,  0 -    6, 1 -  7 same => n,GoTo(barrier1,s,1) ;;     - same =>n,Hangup() ;; ,       ;;    exten => 74991111111,1,NoOp(Incoming call from ${CALLERID(num)} to prov2) same => n,Set(CALLER=${CALLERID(num)}) same => n,Set(result=${ODBC_MOBILE()}) same => n,Set(foo=${ISNULL(${result})}) same => n,GotoIf($["${foo}" = "0"]?6:7) same => n,GoTo(barrier2,s,1) same => n,Hangup() exten => h,1,System(echo "   ${CALLERID(NUM)}     ${STRFTIME(${EPOCH},,%d.%m.%Y  %H:%M)}" >> /tmp/FAIL.txt) ;;     ,    ,       ,     [barrier1] exten => s,1,Dial(SIP/prov1/79150000000) ;;     ,           -  same => n,Hangup() exten => h,1,System(echo "    ${CALLERID(NUM)} ${result} ${STRFTIME(${EPOCH},,%d.%m.%Y  %H:%M)}" >> /tmp/SUCCESS.txt) ;;       ,       [barrier2] ;;      - exten => s,1,Dial(SIP/prov2/7915111111) same => n,Hangup() exten => h,1,System(echo "    ${CALLERID(NUM)} ${result} ${STRFTIME(${EPOCH},,%d.%m.%Y  %H:%M)}" >> /tmp/SUCCESS.txt)
      
      









メールでレポートを送信する




レポート送信の実装では、ファイルをメールに添付する方法を知っているため、muttメールクライアントを使用します。 muttをインストールします。



 sudo aptitude install mutt
      
      







そして、cronでレポートファイルを送信するためのアクションを追加します(午前9時にこれを行い、午前9時にそれらを削除して、レポート日に新しいデータのみがレポートされるようにします)



 sudo crontab -e 0 9 * * * echo "C.    " | mutt -a "/tmp/FAIL.txt" -s "  " -e "set from="asterisk@domen.ru"" -e "set realname='Asterisk'" -- recipient@client.ru 1 9 * * * rm -rf /tmp/FAIL.txt 0 9 * * * echo ".    " | mutt -a "/tmp/SUCCESS.txt" -s " " -e "set from="asterisk@domen.ru"" -e "set realname='Asterisk'" -- recipient@client.ru 1 9 * * * rm -rf /tmp/SUCCESS.txt
      
      







その結果、クライアントはメールで次のレポートを受け取ります。







ここで、「ホワイト」リストを操作する機能を実装します。 はい、もちろんphpmyadminがありますが、タスクは、オペレーターを「怖がらせる」ことができる余分なフィールドでオーバーロードされない、最も単純なインターフェースを実装することでした。 これを行うために、データベース内の数値を表示、削除、追加できるいくつかの簡単なフォームをphpで作成しました(正しくコーディングするふりはしません。PHPで完全にコーディングすることはできません)。 それの由来-以下のスクリーンショット:



メインページ






データベースへの番号の追加






データベースから番号を削除する






データベース内の数字のリストを表示する






そして、直接コード自体:



index.php
 <!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <title> </title> </head> <body> <p><a href="add_form.php">   </a></p> <p><a href="remove_form.php">   </a></p> <p><a href="show.php">  </a></p> </body> </html>
      
      









add_form.php
 <p> <table width="300" border="1" bordercolor="#630000" cellpadding="3" cellspacing="0"> <tr><td> <font size="2" face="verdana,arial,georgia" color="#630000">   .</font> <form action="insert.php" method="post"> <input type="text" placeholder=".  " name="phonee" value="" /> <input type="text" placeholder=". 79261234567" name="namee" value="" /> <input type="submit" name="send" value="" /> </form> </td></tr> </table> </p> <p><a href="index.php"> </a></p>
      
      









insert.php
 <?PHP $host = "localhost"; $user = "root"; $database = "barrier"; $pass = "mahapharata"; $name = $_POST["namee"]; $phone = $_POST["phonee"]; //    $connect = mysql_connect($host, $user, $pass); mysql_select_db($database); mysql_set_charset( 'utf8' ); mysql_query("INSERT INTO `numbers` (`phone`, `name`) VALUES ('".$name."','".$phone."')"); mysql_close($connect); ?> <input type="button" value="" onclick="history.back()">
      
      









remove_form.php
 <p> <table width="300" border="1" bordercolor="#630000" cellpadding="3" cellspacing="0"> <tr><td> <font size="2" face="verdana,arial,georgia" color="#630000"> ,   .</font> <form action="delete.php" method="post"> <input type="text" placeholder=". 79261234567" name="phonedel" value="" /> <input type="submit" name="send" value="" /> </form> </td></tr> </table> </p> <p><a href="index.php"> </a></p>
      
      









delete.php
 <?php $servername = "localhost"; $username = "root"; $password = "mahapharata"; $dbname = "barrier"; $phone = $_POST["phonedel"]; // Create connection $conn = new mysqli($servername, $username, $password, $dbname); // Check connection if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } // sql to delete a record $sql = "DELETE FROM numbers WHERE phone='".$phone."'"; if ($conn->query($sql) === TRUE) { echo "  \r\n"; } else { echo "    : " . $conn->error; } $conn->close(); ?> <input type="button" value="" onclick="history.back()">
      
      









show.php
 <?php $servername = "localhost"; $username = "root"; $password = "mahapharata"; $dbname = "barrier"; // Create connection $conn = new mysqli($servername, $username, $password, $dbname); $conn->set_charset("utf8"); // Check connection if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); }. $sql = "SELECT id, phone, name FROM numbers"; $result = $conn->query($sql); if ($result->num_rows > 0) { // output data of each row while($row = $result->fetch_assoc()) { echo " " . $row["name"]. " " . $row["phone"]. "<br>"; } } else { echo "   "; } $conn->close(); ?> <p><a href="index.php"> </a></p>
      
      









htaccessを使用して承認をねじ込むことを忘れないでください。

 htpasswd -c passwordfile username
      
      







htpasswdが提供するダイアログにパスワードを入力し、ユーザー「username」と生成された暗号化されたパスワードを含むファイル「passwordfile」を取得します。



私の意見では、アスタリスクが標準のIP-PBXとしてではなく、一種のACSとして使用される適切な実装であることが判明しました。 このプロジェクトに取り組むのは面白かったし、そのような障壁の人気を考えると、誰かにとって便利になるかもしれない:)



All Articles