VoIPパート1

友人、妻、夫などが話していることを聞きたいと思ったことがある場合は認めてください。 あなたなしで? 電話番号をダイヤルすると、接続が自動的に確立され、ユーザーが呼び出しに応答するのを待たずに済むようになります。 私はすでにこの機能を積極的に使用していますが、これは中毒性があります。 1つのモバイルアプリケーションのフレームワーク内で実装するため、私は長い間既製のソリューションを探していましたが、もちろん何も見つかりませんでした。 その結果、2晩(6時間)でこのタスクを実現することができました。 しかし、まず最初に...







タスクを策定します。VoIPネットワーククライアントへの強制呼び出しの可能性の実現。 クライアントはiOSおよびAndroid携帯電話で動作します。



従来は、タスクを北側とクライアントに分割します。 この部分では、サーバーについて書きます。 それでは始めましょう...



自分のサーバーを展開する前に、無料の類似物を探していました。 プロバイダーがVoIPネットワーク内でお金を取らず、APIクライアント登録機能を提供しないことが必要でした。 いいえ、これはそうではないか、どちらか一方です。 まあ、私は毎分0.003ドルでさえ支払う準備ができていません、私はすぐにすべてを無料で手に入れるでしょう。 唯一の解決策は、VoIPプロバイダーになることです。



仮想マシンを展開する

まず、サーバーが何をするかを決めることをお勧めします。 私は電話での会話を記録しなかったため、小さなハードドライブ、必須の静的IPアドレス、CPU:400 MHz、RAM:512 MBを備えた通常の仮想マシンに限定することにしました。

私はその上でDebianをロールし、いくつかの標準コマンドを実行しました



apt-get update && apt-get upgrade-パッケージのバージョンを更新します。



apt-get install asterisk-リポジトリからテレフォニーの最新バージョンをインストールします。



apt-get install asterisk-mysql-データベースにユーザーを保存し、アスタリスクと同期する機能



apt-get install mysql-server5 -MySQLデータベースサーバーをインストールします。



apt-get install mc-構成ファイルを編集するために、真夜中の司令官をインストールします。



この段階でエラーが発生したか、何かが機能しなかった場合、これ以上読むことはできません。まずDebianでのパッケージのインストールについて読んでください。



アスタリスクを展開して構成する

パッケージのアスタリスクは完全に機能するので、個人的にソースからビルドする必要はありませんでした。 設定する前に、私たちが彼に何を望むかを決めましょう。

VoiPネットワーク内でコールを受信する機能。

加入者はどこにいても、ゲートウェイ、NAT、さらには地獄でさえも知っている、サーバーとクライアントの間の物理的に同じサブネット上にいる必要はありません。

特別なデータベース内のユーザーのストレージ。

私の場合の美しい名前(電話番号)ivan@bestmyfamily.com



要件が決定したら、構成に進みましょう。

MCを開き、/ etc /アスタリスクディレクトリに移動します



asterisk.confファイルを見つけ、f4を押してこれらの行をファイルの最後に追加します



[互換]

pbx_realtime = 1.6

res_agi = 1.6

app_set = 1.6



これにより、データベースとリアルタイムで同期できます。 すぐに別のデータベースにユーザーのストレージを作成した理由の質問に答えます。 すべてが非常に単純です。別のサーバーからの単純なPHPスクリプトを使用してそれらを追加します。 これは、私のサーバーが1分あたり10人の新しいユーザーを受信する場合に非常に必要です。 それらをすべて構成ファイルに物理的に追加することはできません。



[options]セクションのこのファイルの先頭で、次の2つのパラメーターを設定できます。



詳細= 64

デバッグ= 64



コンソールで、 アスタリスク-rコマンドを実行した後、いわば、サーバーで発生するすべての処理がリアルタイムで表示されます。



次に、コールレセプションを設定します。 Asterisk構成ファイルフォルダーで、 extensions.confファイルを見つけて、最後に追加します



[myfamily]#ここには何でも書くことができますが、

#は通話プランの名前、

#ただし、Sip.confのコンテキストフィールドと一致する必要があります



exten => _ [az]。、1、Dial(SIP / $ {EXTEN}、60)

exten => _ [AZ]。、2、Dial(SIP / $ {EXTEN}、60)



通常の呼び出しの例を見てみましょう。

ivan@bestmyfamily.comは彼の妻をZaya@bestmyfamily.comと呼びます



コールがサーバーに到着すると、次のことが発生します。

_ [az]。 -この記録で、アスタリスクはこの電話番号をどうするか探しています。 ここで彼は私たちの「ザヤ」を代用します。 Zayaには大文字が付いているため、次の行に進みます。 シリアル番号付きの小数点の後に、どの行を指定しますか。 したがって、私の場合、すべての呼び出しは番号1の最初の行で実行され、そのような番号が見つからない場合は番号2に転送します。

私たちの場合、Zayaは2番目の行に来て、それで何かをすることができます。たとえば、期待の音楽をオンにしたり、ある部門に送ったり、他の何かに送ったりします。 これはすべて、特別なチームで行うことができます。 最も簡単なのはダイヤルです。 彼女は割り当てられた時間内に設定されたチャンネルでユーザーにリーチしようとしています。

SIPチャネルと60秒間の待機を指定しました。 このSIP行/ $ {EXTEN}、60をロシア語に変換すると、次のようになります。この電話SIP/Zaya@bestmyfamily.comに電話をかけ、60秒待ちます。



SIPテレフォニーの最も重要なファイルであるsip.confを構成することは残ります。 ここで注意する必要があります、私はそれを機能させるために数時間タンバリンでジャンプしなければなりませんでした。 また、すべてが同じサブネットから機能する場合、これは通常、NATの異なるネットワークの2人のサブスクライバーを受け入れたり接続したりできることを意味しません。 次のように作業を構成しました。









[一般]

allowguest = no

allowoverlap = no

コンテキスト= myfamily; 着信コールのデフォルトのコンテキスト

bindport = 5060; アスタリスクをリッスンするUDPポート

bindaddr = 0.0.0.0



教訓的=なし

directmedia = no

rtptimeout = 10

rtpholdtimeout = 300



; リアルタイムで

; アスタリスクキャッシュデータを作成します

; sip show peersコマンドは正常に表示されます

; すべての登録済みリアルタイムユーザー

rtcachefriends = yes

rtcache = yes



; データベースへの接続、一般にバージョン1.2からここに書き込む必要はありません

dbhost = 127.0.0.1

dbname = ***

dbuser = ***

dbpass = ***

dbport = 3306



残りの設定は、各ユーザーのデータベースで既に示しています。



最後のファイルres_config_mysql.cが残っています。ここでは、データベースに接続するための設定を示します。



[一般]

dbhost = 127.0.0.1

dbname = ***

dbuser = ***

dbpass = ***

dbport = 3306



エラーがない場合は、コマンド/etc/init.d/asterisk restartを使用してAsteriskを再起動します。その後、サーバーを構成し、呼び出しを処理する準備ができたことを喜ぶことができます。



MySQLセットアップ

サーバーは呼び出しを受信する準備ができていますが、呼び出し元はいません。 新しいユーザーをどこかに登録して保存する必要があります。 これらの目的のために、次の内容のテーブルを持つデータベースを作成します。



CREATE TABLE `sipusers` (

`id` INT(11) NOT NULL AUTO_INCREMENT,

`accountcode` VARCHAR(20) NULL DEFAULT NULL,

`disallow` VARCHAR(100) NULL DEFAULT 'all',

`allow` VARCHAR(100) NULL DEFAULT 'g729;ilbc;gsm;ulaw;alaw',

`allowoverlap` ENUM('yes','no') NULL DEFAULT 'yes',

`allowsubscribe` ENUM('yes','no') NULL DEFAULT 'yes',

`allowtransfer` VARCHAR(3) NULL DEFAULT NULL,

`amaflags` VARCHAR(13) NULL DEFAULT NULL,

`autoframing` VARCHAR(3) NULL DEFAULT NULL,

`auth` VARCHAR(40) NULL DEFAULT NULL,

`buggymwi` ENUM('yes','no') NULL DEFAULT 'no',

`callgroup` VARCHAR(10) NULL DEFAULT NULL,

`callerid` VARCHAR(80) NULL DEFAULT NULL,

`cid_number` VARCHAR(40) NULL DEFAULT NULL,

`fullname` VARCHAR(40) NULL DEFAULT NULL,

`call-limit` INT(8) NULL DEFAULT '0',

`callingpres` VARCHAR(80) NULL DEFAULT NULL,

`canreinvite` CHAR(6) NULL DEFAULT 'yes',

`context` VARCHAR(80) NULL DEFAULT NULL,

`defaultip` VARCHAR(15) NULL DEFAULT NULL,

`dtmfmode` VARCHAR(7) NULL DEFAULT NULL,

`fromuser` VARCHAR(80) NULL DEFAULT NULL,

`fromdomain` VARCHAR(80) NULL DEFAULT NULL,

`fullcontact` VARCHAR(80) NULL DEFAULT NULL,

`g726nonstandard` ENUM('yes','no') NULL DEFAULT 'no',

`host` VARCHAR(31) NOT NULL DEFAULT 'dynamic',

`insecure` VARCHAR(20) NULL DEFAULT NULL,

`ipaddr` VARCHAR(15) NOT NULL DEFAULT '',

`language` CHAR(2) NULL DEFAULT NULL,

`lastms` VARCHAR(20) NULL DEFAULT NULL,

`mailbox` VARCHAR(50) NULL DEFAULT NULL,

`maxcallbitrate` INT(8) NULL DEFAULT '384',

`mohsuggest` VARCHAR(80) NULL DEFAULT NULL,

`md5secret` VARCHAR(80) NULL DEFAULT NULL,

`musiconhold` VARCHAR(100) NULL DEFAULT NULL,

`name` VARCHAR(80) NOT NULL DEFAULT '',

`nat` VARCHAR(30) NOT NULL DEFAULT 'no',

`outboundproxy` VARCHAR(80) NULL DEFAULT NULL,

`deny` VARCHAR(95) NULL DEFAULT NULL,

`permit` VARCHAR(95) NULL DEFAULT NULL,

`pickupgroup` VARCHAR(10) NULL DEFAULT NULL,

`port` VARCHAR(5) NOT NULL DEFAULT '',

`progressinband` ENUM('yes','no','never') NULL DEFAULT 'no',

`promiscredir` ENUM('yes','no') NULL DEFAULT 'no',

`qualify` CHAR(3) NULL DEFAULT NULL,

`regexten` VARCHAR(80) NOT NULL DEFAULT '',

`regseconds` INT(11) NOT NULL DEFAULT '0',

`rfc2833compensate` ENUM('yes','no') NULL DEFAULT 'no',

`rtptimeout` CHAR(3) NULL DEFAULT NULL,

`rtpholdtimeout` CHAR(3) NULL DEFAULT NULL,

`secret` VARCHAR(80) NULL DEFAULT NULL,

`sendrpid` ENUM('yes','no') NULL DEFAULT 'yes',

`setvar` VARCHAR(100) NOT NULL DEFAULT '',

`subscribecontext` VARCHAR(80) NULL DEFAULT NULL,

`subscribemwi` VARCHAR(3) NULL DEFAULT NULL,

`t38pt_udptl` ENUM('yes','no') NULL DEFAULT 'no',

`trustrpid` ENUM('yes','no') NULL DEFAULT 'no',

`type` VARCHAR(6) NOT NULL DEFAULT 'friend',

`useclientcode` ENUM('yes','no') NULL DEFAULT 'no',

`defaultuser` VARCHAR(80) NOT NULL DEFAULT '',

`usereqphone` VARCHAR(3) NOT NULL DEFAULT 'no',

`videosupport` ENUM('yes','no') NULL DEFAULT 'yes',

`vmexten` VARCHAR(80) NULL DEFAULT NULL,

`useragent` VARCHAR(80) NULL DEFAULT NULL,

`regserver` VARCHAR(80) NULL DEFAULT NULL,

`callbackextension` VARCHAR(80) NULL DEFAULT NULL,

PRIMARY KEY (`id`),

UNIQUE INDEX `name` (`name`),

INDEX `name_2` (`name`)

)

COLLATE='cp1251_general_ci'

ENGINE=MyISAM

ROW_FORMAT=DYNAMIC

AUTO_INCREMENT=1;







そしてすぐに2人のユーザーを追加します。 SIPデータベースを操作するための特別なPHPスクリプトを介して追加します。



 <?php // //    SIP  // class M_SIP { private static $instance; //  . const host = "bestmyfamily.com"; const user = "***"; const password = "***"; const db = "***"; public $dbSIP; //    . // // . // public static function Instance() { if(self::$instance == null) self::$instance = new M_SIP(); return self::$instance; } // //  // function __construct() { //     $this->dbSIP = mysqli_connect(self::host, self::user, self::password) or exit; $result = mysqli_select_db($this->dbSIP, self::db) or exit; mysqli_query($this->dbSIP, 'SET NAMES utf8'); } //     public function RegUserOnServer($pid, $uid) { $arr = array( 'accountcode' => Null, 'disallow' => 'all', 'allow' => 'ulaw;alaw', 'allowoverlap' => 'no', 'allowsubscribe' => 'no', 'allowtransfer' => Null, 'amaflags' => Null, 'autoframing' => Null, 'auth' => Null, 'buggymwi' => 'no', 'callgroup' => Null, 'callerid' => Null, 'cid_number' => Null, 'fullname' => Null, 'call-limit' => 0, 'callingpres' => Null, 'canreinvite' => "no", 'context' => 'myfamily', 'defaultip' => Null, 'dtmfmode' => Null, 'fromuser' => Null, 'fromdomain' => Null, 'fullcontact' => Null, 'g726nonstandard' => 'no', 'host' => 'dynamic', 'insecure' => Null, 'ipaddr' => Null, 'language' => 'en', 'lastms' => 0, 'mailbox' => Null, 'maxcallbitrate' => 384, 'mohsuggest' => Null, 'md5secret' => Null, 'musiconhold' => Null, 'name' => "", 'nat' => 'force_rport,comedia', 'outboundproxy' => Null, 'deny' => Null, 'permit' => Null, 'pickupgroup' => Null, 'port' => '', 'progressinband' => 'no', 'promiscredir' => 'no', 'qualify' => Null, 'regexten' => 1000001, 'regseconds' => 0, 'rfc2833compensate' => 'no', 'rtptimeout' => Null, 'rtpholdtimeout' => Null, 'secret' => $uid, 'sendrpid' => 'yes', 'setvar' => '', 'subscribecontext' => Null, 'subscribemwi' => Null, 't38pt_udptl' => 'no', 'trustrpid' => 'no', 'type' => 'friend', 'useclientcode' => 'no', 'defaultuser' => "", 'usereqphone' => 'no', 'videosupport' => 'no', 'vmexten' => Null, 'useragent' => Null, 'regserver' => Null, 'callbackextension' => Null ); return $this->Insert('sipusers', $arr); } // //   // $table -   // $object -      "  - " //  -    // private function Insert($table, $object, $isReplace = false) { $columns = array(); $values = array(); foreach ($object as $key => $value) { $key = mysqli_real_escape_string($this->dbSIP, $key); $columns[] = "`" . $key . "`"; if ($value === null) { $values[] = 'NULL'; } else { $value = mysqli_real_escape_string($this->dbSIP, $value); $values[] = "'$value'"; } } $columns_s = implode(',', $columns); $values_s = implode(',', $values); //   ? if ($isReplace) $query = "REPLACE INTO $table ($columns_s) VALUES ($values_s)"; else $query = "INSERT IGNORE INTO $table ($columns_s) VALUES ($values_s)"; $result = mysqli_query($this->dbSIP, $query); if (!$result) die($this->SqlError(mysqli_error($this->dbSIP))); $id = mysqli_insert_id($this->dbSIP); return $id; } // //   SQL // function SqlError($error) { return json_encode(array( 'code' => 99, 'error' => $error ) ); } }
      
      







セットアップの最後のステップは、名前を購入してIPアドレスにバインドすることです。 これらの目的でvoip.bestmyfamily.comの第3レベルドメインを開始し、それにIPアドレスを添付しました。 この手順を忘れると、電話番号はそれほど美しくなりませんivan@192.168.1.1:5060



テストのために、任意のSIP電話機をインストールできます。 もちろん、彼らはそれほどクールではなく、私たちが電話する相手を静かに拾わないでしょう。 ただし、通常の電話通信は設定しています。 第2部では、AndroidおよびIOSでマジッククライアントを作成します。

リンゴの承認に問題がある可能性があることをすぐに予約してください。 私たちは非常に長い間、アプリの承認プロセスを経験しました。 これらは標準的な2週間ではありません。アプリケーションを配置する前に、コードを調査し、機能をテストしました。 その結果、子供用モードでのみ盗聴を開始できることに同意しました。



All Articles