2017-06-21

転送って、難しい

電話を転送すると、大抵の場合、番号表示は転送先の番号が通知されます。

 A →(転送)→ B に設定

この状態で、

 C → Aを呼び出し(Aは転送設定されているので B を呼び出す)→ B

となるわけですね。

でも、このときに B には C の電話番号が表示されて欲しいのですが、多くの「転送」機能では、A の電話番号が通知されてしまいます。
これでは、大もとの番号(C)が表示されませんから、着信があった時点で C かどうかがわからないわけです。

Asterisk でも転送をトライしましたが、やはり、上の例と同じく A が表示されてしまいます。

携帯電話からひかり電話に発信したとします。ひかり電話の着信時のエクステンションは、次のように設定したとします。

 exten => s,1,Ringing()             ; 発信側に呼び出し音を出します。
 exten => s,n,NoOp(${CALLERID(num)}) ; Asteriskの実行ログに記録します。
 exten => s,n,Dial(SIP/201,30)  ; 内線201を30秒間呼び出します
 exten => s,n,Hungup               ; 通話終了時、オンフック(切断)します。

この場合、内線 201 には Caller-ID(発信者番号)が引き継がれ、201 番を設定したスマホ子機には、ひかり電話着信時は、発信者番号がきちんと表示されます。
内線呼び出し(ひかり電話に着信して内線 201 に無条件転送と等価)の場合です。

これを、外線への無条件転送として、同じ Dial アプリケーションのエクステンションを下記のように書き換えて、転送先のブラステル2 の番号からブラステル1 を呼び出します。

 exten => s,1,Dial(SIP/${BRASTELNUM1}@brastel2-trunk)

つまり、

 外線 → ひかり電話(着信)→ 転送(ブラステル2)→ ブラステル1

としたいわけです。

冒頭のケースでいえば A がひかり電話、B がブラステル1 です。
C(別の番号、例えばスマホの携帯番号)からひかり電話を呼び出します。

NoOp での確認では、確かに発信した携帯番号です。
しかし、ブラステル1 に表示されるのは、ブラステル2 の番号です。
これでは、やりたいことが実現できません。転送はできるものの、最終的に着信した電話に大もとの発信者番号が表示されないのです。試しに呼出時の番号を 03-1234-5678 に設定してみます。

 exten => s,n,Set(${CALLERID(num)=0312345678)

を Ringing() の後に記述しても、Dail アプリケーションで無視されて、結局ブラステル2 の番号になってしまうのです。

実は、いまはなりすまし防止のために、事業者側がこういう動作になるようにしているようです。内線なら実害は無い、ということでしょう。外線だと、なりすましができる、ということなんですかねぇ。

ホントは、ブラステル2 は余計で、本来はブラステル1 への転送設定でなくてはいけないのですが、Asterisk で外線発信するには、間に、発信できる番号をかます必要があります。ここに問題があるかもしれません。

いくつかのサービス事業者の転送機能を試してみましたが、殆ど同じです。
着信を取ってみれば誰かはわかるのですが、最初の発信者が勧誘電話だったり、詐欺電話だったら、無視して取りたくはありません。即切りですよね。
あるいは、あらかじめ拒否設定しますよね。

これが機能しないわけです。

FUSION IP-Phone SMART はなんと、C が表示されるのです。

ひかり電話の転送サービスでも無条件転送だと C になるようです。
でも、ひかり電話の転送サービスは 500円/月額利用料がかかります。
番号表示・キャッチホン・転送サービスのセットでも 800円/月額利用料です。

FUSION ならタダです。

番号表示もそうですが、ひかり電話はばかばかしいと思いませんか? 
やらずぼったくりのような気がしています。
キャリア商売は 3日やったらやめられない、みたい。
総務省に注意されても無視して、利用者を騙すような、詐欺まがいがどうも横行していますよね。

ワタシの使っているブラステルの転送も、A が表示され、誰からかは取ってみないとわかりません。

FUSIONは どうやっているのでしょうか。CallerID の書き換えだけではうまく行きません。でも実際、FUSION は実現しているわけで、非常に優秀といえます。

FUSION も Asterisk ベースらしいので、なにか手があるはずなんですが、わかりません。

誰か教えていただきたいものです。

留守電にしても転送と組み合わせると誰がかけてきたかは留守電を聞かないとわかりません。留守電に録音されていないと、着信があったことはわかりますが、誰かはわからずじまいです。

Asterisk では、ログをみたり、転送前の着信番号をメモし、それをコンソールに表示する、ということはできますが、肝心の転送先に通知するすべがわからないのです。

誰か教えてくださ〜〜〜い。


本件は現在は解決済みで、大もとの電番が転送先に通知されるようにできています。
これは、Asterisk の sip.conf に1行付け加えることで可能です。





6 件のコメント:

bike86-3 さんのコメント...

FUSIONは、転送専用の発信番号を使っているのでしょうか? そのときにヘッダーに発信者番号を強制的に埋め込みでもしているのでしょうか

bike86-3 さんのコメント...

わかりました。
sip.confの [general]セクションに、sendrpid=yes としたら、大もとの発信者番号が通知されるようです。
事業者は、sendrpid=pai だと、Caller-ID に何をセットしても、発信に使った転送用の番号を通知するようですが、yesだと着信した Caller-ID を使うようです。

Bチーム さんのコメント...

今まであきらめていたのですが、転送もとの発信元番号通知が可能とのこと、びっくりしました。
さっそくsip.confの [general]セクションに、sendrpid=yesをしてみましたが、当方の環境では
実現しません。set(CALLERID(num)=XXXXXXXXXX)の記述は何か特別なことが必要なのでしょうか?
ご享受いただければ幸いです。

bike86-3 さんのコメント...

Bチームさま extensions.conf は、「Raspberry Pi 3へAsteriskを構築する -- その3」に記載のEXTEN 番号300に記述のとおりです。特別なこともCALLERIDも設定していません。Asteriskのバージョンはいくつでしょうか。わたしは14.0.2ですけど。sendrpid=yesはRemote-Perty−IDを使用の意味です。これは発信元電番を使用ということです。paiですとP-Asserted-IdentifyつまりCALLERID(num)=xxx...xxxを使用の意味です。しかしながらこの場合は事業者側でなりすまし防止で書き換えられてしまいます。逆にいいますとCALLERIDを設定しないということだと思います。P-Asserted-Identifyは書き換えられてしまうが、Remote-Perty-IDは書き換えられない、ということだと考えています。

Bチーム さんのコメント...

819-86さま Asteriskのバージョンは11.16.0です。さきほどCALLERIDの設定なしで試してみましたが元の発信者番号は通知しませんでした。やはりバージョンの問題なのでしょうか?今度バージョンを変えて試してみたいと思います。ありがとうございました。

bike86-3 さんのコメント...

バージョンを最新にされてみたらいいかも知れません。日本の voip.org は正確ではありません。「asterisk sendrpai」で英文のサイトを参照なさってください。SIP URI に変換する際の元の情報をこのsendrpaiから得ているようですので。