CTIシステムと連携する社内システムを自作する覚書。
やりたいことは、電話がかかってきたらその電話番号で顧客マスタを検索して、
その結果を、受付や電話を受ける人にポップアップで知らせるというシステム。
業者に頼んだら結構な初期費用とランニングコストだったので、
なんとか安くすませないかと試行錯誤した結果、Fullfreeというソフトを使うことにした。
基本無料のシステムだけども、社内のビジネスフォンと接続するのは業者頼み・・。
そのため、数万円で業者に依頼しナンバーディスプレイアダプタを挟む方法で接続。
あと、無料のFullfreeだと着信件数に制限があるので、一つだけ8,640円のPROを購入。
クライアント・サーバーの環境はC#で自作する。
サーバーはコンソールアプリでプロジェクトを作成し、
サーバープログラムはこれで。
SynchronizedCollectionは、参照の追加でSystem.ServiceModelを追加。
Ctrl + C でプログラムを終了するように、ハイライトの行を追加。
// Ctrl+Cが押された場合はソケットを閉じる Console.CancelKeyPress += (sender, args) => { foreach (var clientSocket in this.ClientSockets) clientSocket?.Close(); // 終了処理 Console.WriteLine($"終了します ..."); Environment.Exit(0); };
クライントから受信するためのポートはコマンドプロンプトを起動して下記コマンド。
> netstat -nao
現在使ってるポート番号が表示されるので、自由に使える49152 ~ 65535の空きを確認。
今回は49192を使うことにして、メインプログラムを作成。
static void Main(string[] args) { var server = new Server(49192); server.Run(); }
実行してみる。
49192のポートを開いて待ってるかさっきのコマンドで確認。
> netstat -nao
よし、問題なさげなので、Ctrl + C を押してみる。
よし、消えた!
次はクライアントプラグラム。
さっきと同様にここに習って、C#のフォームアプリで作成。
サーバーへの接続用、文字送信用、切断用のボタンを設置。
実際クライアントから文字は送信しない予定なので、
文字送信用のボタンを押した時は固定でHOGEHOGEを送信するようにしてみる。
送信後のメッセージ表示はコンソールではなくメッセージボックスに変更。
ではまず同じマシンで実験。
サーバー用コンソールを起動して、クライアントのフォームを起動。
STARTボタンを押してみる。
おお、クライアントからの接続が確認された!
SENDボタンを押してみる。
サーバー側で認識!
クライアント側にも無事に返ってきた
さて、次にサーバープログラムを実際のサーバーで動かしてみよう。
サーバー側は、デフォルトだとローカルホストのクライアントしか受け付けないので、
コンストラクタを下記ハイライトのように変更。
public Server(int port) { //this.IPEndPoint = new IPEndPoint(IPAddress.Loopback, port); this.IPEndPoint = new IPEndPoint(IPAddress.Any, port); }
クライアントは、Clientクラスのコンストラクタ内をハイライトのように修正。
public Client() { // this.ServerIPEndPoint = new IPEndPoint(IPAddress.Loopback, 49192); this.ServerIPEndPoint = new IPEndPoint(IPAddress.Parse("123.123.123.123"), 49192); }
123.123.123.123には実際のサーバーのIPアドレスを設定。
これでまずサーバー側を起動。
0.0.0.0のIPになっているところがポイント。
これがデフォルトの127.0.0.1だとローカルホストのみになってしまい、
”対象のコンピュータによって拒否されたため・・・”というエラーが出る原因となる。
クライアントを起動してSTARTボタン。
よし!接続確認できた!
続いてSENDボタン。
無事メッセージの送受信も完了!
Fullfreeで電話を受信した時は、クライアントを起動してメッセージを送信する仕組みにする。
コンソールアプリで新しいプロジェクトを作成し、クライアントで作成したClientクラスを追加。
ネームスペース等を修正し、Main()の中でConnect()、Send()、Disconnect()するようにしてみる。
FullfreeのCTI設定のカスタム通知にて通知方法を”プログラムを実行”にし、パスにはこのアプリ。
パラメータには電話番号を渡すように”{Tel}”とする。
これで電話がかかってくるとこのアプリに電話番号が渡り、
電話番号で社内システムの顧客マスタを検索し、顧客名や担当が取得できる。
そしてサーバーに結果を渡すことで、他のクライアントすべてにその結果が出ることになる。
実現できそうだ!!!!!