
あいさつ、habrasociety。
1年ちょっと前に、Digium電話用のアプリケーションを
開発しました 。 計画が広範であったという事実にもかかわらず、私たちは次のバリエーションのみで解決しました。
- サイトgismeteoからの天気
- 中央銀行のウェブサイトからの為替レート
- ニュースポータルからのRSSフィード
これらのアプリケーションは、コミュニティをAPIやサンプルに慣れさせるために作成されたものであり、さらに楽しくするためのものです。 ソフトウェアは、それを呼び出すことができる場合、実際のビジネスに役立つユニークなアプリケーションを搭載していません。
今日、このトピックに戻って、ユーザーが同じピックアップグループにいる場合に電話画面に通話を表示し、それを傍受できるようにする、もっと興味深いアプリケーションを共有することにしました。
詳細-> Habrakat
電話機自体がHTTPを介してアスタリスクにアクセスできないため、クライアント/サーバー構造が選択されました。 呼び出し時にアスタリスクからのCURLリクエストを「キャッチ」し、電話でjavascriptを「キャッチ」するPythonのサーバーは、一定の周期で新しいレコードの可用性についてポーリングします。
server.pyfrom BaseHTTPServer import BaseHTTPRequestHandler,HTTPServer import urlparse import json import shelve import datetime import sys import os TIME_FORMAT = '%d.%m.%Y %H:%M:%S.%f' DB_NAME = "db.db" class HttpProcessor(BaseHTTPRequestHandler): def do_GET(self): if "/get" in self.path: fields = self.get_fields() if not fields: print "There are no parameters" return callgroup = fields.get("callgroup") pickupgroup = fields.get("pickupgroup") if callgroup is None or pickupgroup is None: print "There are no pickupgroup or no callgroup" self.send_error(404) return None db = shelve.open( DB_NAME) data = [] for key in db.keys(): if "callgroup" in db[key] and "pickupgroup" in db[key] and str(db[key]["callgroup"]) == str(callgroup) and str(db[key]["pickupgroup"]) == str(pickupgroup): entry = db[key] data.append(entry)
このファイルに実行権限(chmod + x)を付与し、実行して自動実行に追加することを忘れないでください。
電話へのアプリケーションのインストール
ご存じのように、または聞いたことがあると思いますが、Digium電話はWebインターフェイスを使用するか、独自のDPMAプロビジョニングを使用して設定できます。 (Digium Phone Moduleアスタリスク)。
最も簡単なセットアップ(Web経由)がある場合は、システムツールの電話メニューに移動して[アプリ開発を有効にする]をクリックし、
phone_ip-address / app_devで電話にログインする必要があります(デフォルト:ユーザー:管理者、パスワード:789)大きな緑色の[アプリの追加]ボタンをクリックします。

アプリケーション自体をダウンロードするための実際のファイルは次の
とおりです
。pbxware.ruコード自体 var incomingGroupCall = {} var screen = require('screen');
新しいアプリケーションの設定では、次のオプションを指定する必要があります。
コールグループ:1
ピックアップグループ:1
サーバー:
192.168.1.254 :8000(または、pythonスクリプトが実行されているその他のIP)
プレフィックス:* 8(通話を傍受するためのプレフィックス)
言語:ru(en / ruサポート)
DPMAを使用する場合、この
手順を使用してアプリケーションを電話にダウンロードする必要があります
アプリケーションを起動します。 開いたままにするか、背景に折りたたむことができます。

アスタリスクダイヤルプランの変更
そのため、電話でアプリケーションを記録し、サーバーでリレーも開始しました。 アスタリスクダイヤルプランに変更を加えて、必要なcallgroupおよびPickupGroupパラメータを使用してコールが内線に到着したことを報告するようにします。
たとえば、作業用のダイヤルプランを使用できます。
exten => _7XX、1、NoOp($ {CALLERID(num)}から$ {EXTEN}への呼び出し)
同じ=> n、設定(CallGroup = $ {SIPPEER($ {EXTEN}、callgroup)})
同じ=> n、NoOp(Callgroup = $ {CallGroup})
同じ=> n、設定(PickupGroup = $ {SIPPEER($ {EXTEN}、pickupgroup)})
同じ=> n、NoOp(PickupGroup = $ {PickupGroup})
same => n、System(curl -i -H "Accept:application / json" -H "Content-Type:application / json" -X POST -d '{"uid": "$ {UNIQUEID}"、 "callgroup ":" $ {CallGroup} "、" pickupgroup ":" $ {PickupGroup} "、" from ":" $ {CALLERID(num)} "、" to ":" $ {EXTEN} "} '
192.168.1.254 : 8000 / put)
同じ=> n、ダイヤル(SIP / $ {EXTEN}、60、Tt)
同じ=> n、設定(CallGroup = $ {SIPPEER($ {EXTEN}、callgroup)})
同じ=> n、ハングアップ()
exten => h、1、NoOp(アプリの終わり)
same => n、System(curl -i -H "Accept:application / json" -H "Content-Type:application / json" -X POST -d '{"uid": "$ {UNIQUEID}"、 "callgroup ":" $ {CallGroup} "、" pickupgroup ":" $ {PickupGroup} "、" from :: $ {CALLERID(num)} "、" to ":" $ {TARGETNO} "} '
192.168.1.254 : 8000 / del)
同じ=> n、ハングアップ()
実行中のアプリケーション

着信コールがあると、アプリケーションが電話スクリーンにポップアップし、このコールグループのコールが表示され、それを傍受することができます。 他のアラームはありません(メロディーやライト表示など)
「上」ボタンと「下」ボタンを使用して番号を移動し、「OK」ボタンをクリックして通話を傍受することができます。強調表示された番号は傍受されるか、番号と*、#を使用します。
アプリケーションを起動し、最小化し、呼び出しを待ちます)。 新しい呼び出しにより、アプリケーションがデプロイされます。 再び折りたたむことができます。