2022/12/05

テクノロジー

電話の仕組みとつくり方を調べてみた

この記事の目次

    はじめに

    皆さん、こんにちは。ITディベロップメント1部のI.Kです。
    何気なく普段使っている電話ですが、これってどんな仕組み何だろう?とふと思ったので、「電話ってそもそもどんな仕組み?」「エンジニアでも作れるの?」を調べてみました。

    電話の種類(固定電話とIP電話)について

    電話には「固定電話(さらにアナログ電話とひかり電話の2種類がある)」と「IP電話」の2種類があります。2種類の違いは何かと言うと、音声通話を行うネットワークの接続方法が異なります。
    固定電話は、従来の固定電話回線)を用いて電話と電話を接続しますが、IP電話は主にインターネットを構成する時に用いられるIPネットワークを利用して音声通話を実現します。

    IP電話の仕組みをもう少し詳しく説明すると、
    SIP(Session Initiation Protocol)サーバーに、自分と通話相手の電話番号とIP情報を保持し、SIPサーバーにIPを指定してリクエストすることで電話の発信を可能にしています。

    電話ってシステムエンジニアに作れるのか?

    固定電話は流石に作れませんが、IP電話であれば何と作れてしまいます!!
    (もちろんそれなりの知識やスキルは必要ですが)

    ここでは2種類の例を使って、少し詳しく解説していきます。

    方法①オープンソースソフト「Asterisk」等を使ったSIPサーバーから構築する

    一つ目のやり方は「オープンソースソフト「Asterisk」等を使ったSIPサーバーから構築する」です。
    過去の実装例で、とある自治体がIP電話500端末を外注すると2億円かかるところ、内製で構築を行い820万で完成させた事例がありました。2億→820万ってすごいですね・・。

    ざっくり実装イメージは以下の通りです。
    (参考サイト:http://st-asterisk.com/archives/22

    Lunixサーバーの設定ファイルに下記のような記載をすることで、内線同士の発信が可能になります。

    [default]
    exten => 201,1,Dial(SIP/201,30,r)
    exten => 201,2,Hangup()
    
    exten => 202,1,Dial(SIP/202,30,r)
    exten => 202,2,Hangup()
    • exten => のあとに、内線番号,処理順番,処理コマンドを書きます
      • Dial():発信する。
      • Answer():着信に応答する。
      • Playback():サウンドファイルを再生する。
      • Hangup():通話を切断する。

    調べた感じ、難易度が高そう(内線の構築方法は簡単そうだが、外線の設定が大変そう)だと感じました。
    通話料が掛からないことがメリットですが、サーバー代金はかかります。そうなると保守作業も大変そうだなという印象です。

    方法②CPaaS(Communications Platform as a Service)を利用する

    二つ目のやり方は「CPaaS(Communications Platform as a Service)を利用する」です。
    CPaaSは通信機能をAPIで接続するクラウドサービスのことで、音声通話やSMS、映像会議、通話録音・音声認識を実行するAPIを従量課金で買う形になります。安く簡単に始められますが、通話時間が長いと費用は高くつく恐れもあります。

    有名どころですと「AmazonConnet」です。
    SFA連携、録音、通話モニタリング機能あり、音声分析、文字起こし機能のある電話基盤サービスとなります。
    他にも「Twilio」「pluscomm」「Bandwidth」などがあります。

    ざっくり実装イメージは以下の通りです。
    ※Pythonの実装サンプル

    ▼Twilio

    ▼Bandwidth

    インポートを行って、call関数に引数を渡すと電話をかけられる形になります。
    これであればWEBアプリを作る感覚に近いなと感じました。

    おわりに

    今回は「電話」について取り上げました。
    普段何気なく使っているものですが、仕組みは案外知らないものなので、一つ勉強になって良かったです。

    最後までお読みいただきありがとうございました。

    引用

    ※本記事は2022年12月時点の情報です。

    著者:マイナビエンジニアブログ編集部