GSMゲートウェイを介した発信コールのバランス

私たちの組織はアスタリスクを使用しており、発信通話には、8枚のSIMカードを備えたYeastar TG800 GSMゲートウェイが接続されています。 毎月、SIMカードごとに数分のパッケージを購入します。



発信コールを行うには、通常、無料のSIMカードが見つかるまでsimカードを順番に並べ替えます。



exten => _X.,n,Dial(SIP/gsm1/${EXTEN},,tT) exten => _X.,n,Dial(SIP/gsm2/${EXTEN},,tT) exten => _X.,n,Dial(SIP/gsm3/${EXTEN},,tT)
      
      





など



この場合、ほとんどのコールは最初のSIMカードを通過し、最後のSIMカードを通過します。 したがって、月の半ばまでに、最初のSIMカードの議事録は最後のSIMカードの議事録よりも早く終了し、最初の4分が終了してから8枚のうち4枚のSIMカードを呼び出して電話できる状況が発生します。 8の代わりに4つの発信回線があるため、これは悪いです。



これを回避するには、同じ順序ではなく、SIMカードの残りの時間に従って電話をかける必要があります。



途中で、残りの分、関連性(残りがチェックされた時間)、およびパッケージがMySQLデータベースでアクティブ化された時間を書き留めます。



このページに移動して、残りをすばやく見つけることができます。



画像






残高を確認するには、ゲートウェイでAPIを有効にする必要があります。そのためには、SMSセクションに移動してから、API設定に移動します。 ここではすべてが明確であり、パスワードと接続に許可されたサブネットを使用してログインを設定する必要があります。



1時間ごとに残高を確認します。そのために、クラウンにスクリプト呼び出しを追加します(私は1時間の53分ごとを持っています)。



 53 */1 * * * root php %path-to-script%/getbalance.php
      
      





次に、nc2.txtからnc9.txtまでの名前の8つのテキストファイル(または使用するSIMカードの数)を作成する必要があります。 これらの番号は、ゲートウェイがポートを2〜9のとおりに正確に番号付けするためです。



各コマンドファイルで、ゲートウェイ。 nc2.txtの例:



 action: login username: ****** secret: ******* action: smscommand command: gsm send ussd 2 *255*0# action: logoff
      
      





Tele2の例を示します。 したがって、「ussd 2」ではなく、nc3.txtファイルに「ussd 3」と記述します。 スクリプトはこれらのコマンドをゲートウェイに渡し、それに応じてnc2out.txtからnc9out.txtの名前のファイルを取得します。



答えは次のようになります(Tele2の場合):



 Asterisk Call Manager/1.1 Response: Success Message: Authentication accepted Response: Follows Privilege: SMSCommand 1:Received USSD success on span: 2 USSD Responses: 2 USSD Code: 64 USSD Len: 85 USSD Message: Ostatok v pakete: 968 min./mes., 5000 SMS/mes., 20480 MB/mes. Parametry' tarifa *107# --END COMMAND-- Response: Goodbye Message: Thanks for all the fish.
      
      





明確化:オペレーターの回答を音訳に切り替える必要があります。そうしないと、不便なエンコードでテキストが取得されます。



次に、残りの分数を引き出して、呼び出しの順序を並べ替えて、out1.txtからout8.txtのファイルに書き込みます(これは既にアスタリスク用であるため、番号付けは正常です)。 つまり、呼び出し順序が5、4、3、2、1、7、8、6であることが判明した場合、out1.txtファイルに番号5を書き込み、out2.txtファイルに4などを書き込みます。



ダイヤルプランでこれらのファイルを読み取り、正しい順序で呼び出しを行うことは残ります。



 exten => _X.,n,set(SIMNUM1=${SHELL(/usr/bin/php -f %pathtoscript%/getsim1.php)}) exten => _X.,n,set(SIMNUM2=${SHELL(/usr/bin/php -f %pathtoscript%/getsim2.php)}) exten => _X.,n,set(SIMNUM3=${SHELL(/usr/bin/php -f %pathtoscript%/getsim3.php)}) exten => _X.,n,set(SIMNUM4=${SHELL(/usr/bin/php -f %pathtoscript%/getsim4.php)}) exten => _X.,n,set(SIMNUM5=${SHELL(/usr/bin/php -f %pathtoscript%/getsim5.php)}) exten => _X.,n,set(SIMNUM6=${SHELL(/usr/bin/php -f %pathtoscript%/getsim6.php)}) exten => _X.,n,set(SIMNUM7=${SHELL(/usr/bin/php -f %pathtoscript%/getsim7.php)}) exten => _X.,n,set(SIMNUM8=${SHELL(/usr/bin/php -f %pathtoscript%/getsim8.php)}) exten => _X.,n,Dial(SIP/gsm${SIMNUM1}/${EXTEN},,tT) exten => _X.,n,Dial(SIP/gsm${SIMNUM2}/${EXTEN},,tT) exten => _X.,n,Dial(SIP/gsm${SIMNUM3}/${EXTEN},,tT) exten => _X.,n,Dial(SIP/gsm${SIMNUM4}/${EXTEN},,tT) exten => _X.,n,Dial(SIP/gsm${SIMNUM5}/${EXTEN},,tT) exten => _X.,n,Dial(SIP/gsm${SIMNUM6}/${EXTEN},,tT) exten => _X.,n,Dial(SIP/gsm${SIMNUM7}/${EXTEN},,tT) exten => _X.,n,Dial(SIP/gsm${SIMNUM8}/${EXTEN},,tT)
      
      





はい、私はほとんど忘れていました、getsim1.phpファイル:



 <?php $t = file_get_contents('%pathtoscript%/out1.txt'); echo $t[0]; return $t[0]; ?>
      
      





これで、メインスクリプトgetbalance.php自体になりました。



ゲートウェイ10.10.1.1のIPを取得します。



コピーペーストの代わりにサイクルを作成する必要があることは知っていますが、管理者の黄金律に導かれています:動作します-触れないでください:-)



 <?php include '/var/lib/asterisk/agi-bin/lib.php'; $s=0; a2: $s++; if ($s>10) exit; system('nc 10.10.1.1 5038 < %pathtoscript%/nc2.txt > %pathtoscript%/nc2out.txt'); $text = file_get_contents('%pathtoscript%/nc2out.txt'); if(preg_match('/te:\ (.*)\ min/',$text,$matches)) $text2 = $matches[1]; else goto a2; $s=0; a3: $s++; if ($s>10) exit; system('nc 10.10.1.1 5038 < %pathtoscript%/nc3.txt > %pathtoscript%/nc3out.txt'); $text = file_get_contents('%pathtoscript%/nc3out.txt'); if(preg_match('/te:\ (.*)\ min/',$text,$matches)) $text3 = $matches[1]; else goto a3; $s=0; a4: $s++; if ($s>10) exit; system('nc 10.10.1.1 5038 < %pathtoscript%/nc4.txt > %pathtoscript%/nc4out.txt'); $text = file_get_contents('%pathtoscript%/nc4out.txt'); if(preg_match('/te:\ (.*)\ min/',$text,$matches)) $text4 = $matches[1]; else goto a4; $s=0; a5: $s++; if ($s>10) exit; system('nc 10.10.1.1 5038 < %pathtoscript%/nc5.txt > %pathtoscript%/nc5out.txt'); $text = file_get_contents('%pathtoscript%/nc5out.txt'); if(preg_match('/te:\ (.*)\ min/',$text,$matches)) $text5 = $matches[1]; else goto a5; $s=0; a6: $s++; if ($s>10) exit; system('nc 10.10.1.1 5038 < %pathtoscript%/nc6.txt > %pathtoscript%/nc6out.txt'); $text = file_get_contents('%pathtoscript%/nc6out.txt'); if(preg_match('/te:\ (.*)\ min/',$text,$matches)) $text6 = $matches[1]; else goto a6; $s=0; a7: $s++; if ($s>10) exit; system('nc 10.10.1.1 5038 < %pathtoscript%/nc7.txt > %pathtoscript%/nc7out.txt'); $text = file_get_contents('%pathtoscript%/nc7out.txt'); if(preg_match('/te:\ (.*)\ min/',$text,$matches)) $text7 = $matches[1]; else goto a7; $s=0; a8: $s++; if ($s>10) exit; system('nc 10.10.1.1 5038 < %pathtoscript%/nc8.txt > %pathtoscript%/nc8out.txt'); $text = file_get_contents('%pathtoscript%/nc8out.txt'); if(preg_match('/te:\ (.*)\ min/',$text,$matches)) $text8 = $matches[1]; else goto a8; $s=0; a9: $s++; if ($s>10) exit; system('nc 10.10.1.1 5038 < %pathtoscript%/nc9.txt > %pathtoscript%/nc9out.txt'); $text = file_get_contents('%pathtoscript%/nc9out.txt'); if(preg_match('/te:\ (.*)\ min/',$text,$matches)) $text9 = $matches[1]; else goto a9; $text10 = "0"; system('echo "'.date('l dS FY h:i:s A').' '.$text2.' '.$text3.' '.$text4.' '.$text5.' '.$text6.' '.$text7.' '.$text8.' '.$text9.'" >>%pathtoscript%/balance.txt'); $row = mysql_query("select minutes from `lines` where clid like '%2636'",$link); $row1 = mysql_fetch_assoc($row); $old1 = $row1['minutes']+0; $new1 = $text2+0; if ($old1 < $new1) $row = mysql_query("update `lines` set balancedate=NOW()",$link); $row = mysql_query("update `lines` set balance=".$text10.", minutesdate=NOW(), minutes=".$text2." where clid like '%2636'",$link); $row = mysql_query("update `lines` set balance=".$text10.", minutesdate=NOW(), minutes=".$text3." where clid like '%4036'",$link); $row = mysql_query("update `lines` set balance=".$text10.", minutesdate=NOW(), minutes=".$text4." where clid like '%4977'",$link); $row = mysql_query("update `lines` set balance=".$text10.", minutesdate=NOW(), minutes=".$text5." where clid like '%2414'",$link); $row = mysql_query("update `lines` set balance=".$text10.", minutesdate=NOW(), minutes=".$text6." where clid like '%2451'",$link); $row = mysql_query("update `lines` set balance=".$text10.", minutesdate=NOW(), minutes=".$text7." where clid like '%2536'",$link); $row = mysql_query("update `lines` set balance=".$text10.", minutesdate=NOW(), minutes=".$text8." where clid like '%2581'",$link); $row = mysql_query("update `lines` set balance=".$text10.", minutesdate=NOW(), minutes=".$text9." where clid like '%4056'",$link); $n[1] = $text2+0; $n[2] = $text3+0; $n[3] = $text4+0; $n[4] = $text5+0; $n[5] = $text6+0; $n[6] = $text7+0; $n[7] = $text8+0; $n[8] = $text9+0; $p[1] = 1; $p[2] = 2; $p[3] = 3; $p[4] = 4; $p[5] = 5; $p[6] = 6; $p[7] = 7; $p[8] = 8; for($i=1;$i<=7;$i++) for($j=$i+1;$j<=8;$j++) if ($n[$i]<$n[$j]) { $t = $n[$i]; $n[$i] = $n[$j]; $n[$j] = $t; $t = $p[$i]; $p[$i] = $p[$j]; $p[$j] = $t; } system('echo "'.$p[1].'" >%pathtoscript%/out1.txt'); system('echo "'.$p[2].'" >%pathtoscript%/out2.txt'); system('echo "'.$p[3].'" >%pathtoscript%/out3.txt'); system('echo "'.$p[4].'" >%pathtoscript%/out4.txt'); system('echo "'.$p[5].'" >%pathtoscript%/out5.txt'); system('echo "'.$p[6].'" >%pathtoscript%/out6.txt'); system('echo "'.$p[7].'" >%pathtoscript%/out7.txt'); system('echo "'.$p[8].'" >%pathtoscript%/out8.txt'); system('asterisk -rx "dialplan reload"'); ?>
      
      





lib.phpの内容(MySQLへの接続があります):



 <?php $dbuser = "*******"; $dbpass = "*******"; $dbserv = "localhost"; $dbname = "*******"; $dbengn = "mysql"; function sql_connect($host, $login, $password, $dbname) { $link = mysql_connect($host, $login, $password, true); mysql_select_db($dbname, $link); mysql_query("SET NAMES cp1251"); return $link; } function sql_query($query, $link) { $res = mysql_query($query, $link); return $res; } function sql_fetch_assoc($result) { return mysql_fetch_assoc($result); } $link = sql_connect($dbserv, $dbuser, $dbpass, $dbname); ?>
      
      





もう少し説明。



各SIMカードで、残高を確認するために10回試行されます(これは常に可能とは限りません)。そのうちの少なくとも1つが失敗した場合、終了して1時間で試行します。



text10 = "0"なのはなぜですか? 以前は、MTS SIMカードが使用され、残高が(ルーブルで)返されていました。 Tele2では、共通のアカウントが使用されますが、特定のSIMカードにはお金が入らないため、常に0が存在します。



また、残高をbalance.txtファイルに追加して、履歴を表示し、費用の統計を計算できるようにします。



SIMカードへの着信を失わないように気をつけている人がいます。SIMカードについて既に話している場合は、コメントで質問してください(記事は掲載しません)。



ご清聴ありがとうございました!



All Articles