2017-07-31

梅干し



土用は過ぎていますが、お天気が3日3晩続きそうもなくて干すタイミングがなかなか取れません。

セミも例年よりも鳴き声がおとなしい。多分、まだ雨になると感じているのでしょう。

でもあまり待ってもいられないので干し始めました。

まだ黄色いのですが、干すと赤くなってきます。
自然の赤みです。

紫蘇を漬け込むと鮮やかな赤になるのですが、苦味が入るのでもう何年も紫蘇は使っていません。





2017-07-23

ソフトフォンアプリ・GrandStream Wave の設定をする

まずは、Google Play で「gs wav」または「grandstream」で検索します。



インストールします。
Android 7.0 の場合は自動的に「電池最適化対象外」になるようです。
設定を終えたら確認して見てください。





右下の Settings を押して上図の設定画面を開きます。
アカウントの登録の前にこちらを設定した方がいいと思います。

まずは、Custom Settings でテーマや色を選びますが、これは後でもできますし、好みもありますから、まずはここはパスでいいと思います。

一応、どんなメニューがでるかというと、



このようなメニューです。Languages は残念ながら日本語には対応していませんので、デフォルトの英語のままで進めていきます。

戻って、Advanced Settings を押します。








このような画面になりますので、一番上から、順次設定します。




最初の4つはこのままでいいと思います。Start on Boot はデバイスの起動時に GS Wave を起動するかどうかの設定です。それでよければこのままで結構です。

DND(Do Not Disturb)は着信拒否の設定です。

夜間や、時間帯で着信を受取りたくないときに設定します。
DND Settings は 24時間着信拒否、または ◯◯時〜◯◯時まで着信拒否、のいずれかを設定できます。着信拒否しているときに着信した電話は着信リストの Missed Calls リストには残りますからあとでどこからかは確認できます。

編集はいつでもできますし、いまはこのままオフにしておきます。

DND の下の方に進み、引き続き設定します。
Use hard encoder はこのままでいいと思いますが、コーデックがおかしい場合は外すといいかも知れません。
Noise Reduction Level は Low に設定し直します。
どうも、どのソフトフォンもこの部分はオフの方が素直なのですが、何故かデフォルトではオンもしくは最高レベルの設定が多い。GS Wave はオフはありませんから、Low にしておきます。

Speaker Gain と Microphone Gain は、デバイスの個体差を吸収するものです。
通常はこのままにし、あとで調整します。

Network は、2G/3G/4G/WiFi のどの無線下で使うかの設定です。
デフォルトはすべてオンになっていますので、とくに変更しなくてもいいと思います。
一番下の、Only Use This WiFi to Register Account は特定の WiFi(SSID)でしか使わないときの設定ですから、これもオフのままでいいと思います。





STUN のアドレスは最初から設定されていますが、とくに変更しなくてもいいと思います。
このアドレスの STUN が有効になるのは、アカウントごとに設定する NAT Traversal の項目で NAT または AUTO を選択したときです。デフォルトではこの部分は Keep-Alive です。これについてはアカウント設定で後述します。

STUN を使う場合は、グーグルの STUN がいいと思います。ping 値も一桁違いますし。

参考までに、グーグルは stun.l.google.com:19302 です。

内線のアカウントは、NAT Traversal の項目の設定を NAT NO にしてください。


GS Wave は、標準で NAT Traversal が機能していますので、NAT 越えに問題はありません。WiFi → 3G/4G、または 3G/4G → WiFi でも問題なくレジストが維持されます。

いったんレジストされた IP 電話は、ウチでもソトでもレジストが維持されるということです。携帯性が格段に上がります。


ここらあたりは国産のソフトフォンには実装されていないことが多い機能です。


QoS も変更の必要はありません。


Random Port は通常はオフにします。
サーバー側が複数のポートを使用しているときはオンにしますが、通常は SIP/5060 でしょうからオフで結構です。

アカウントを追加登録していくと、SIP ポートが、5060 から自動的にカウントアップされた値が設定されます。Random Port をオフ後、「アカウント修正」でポートを 5060 に戻してやります。Random port オフでもアカウント追加でなぜかカウントアップされてしまいます。バグではないかと考えますが、少し手間でも仕方ありません。





Validate Server Certificate はサーバーから証明書による認証を受ける必要がある場合のもので、通常はオフのままで結構です。

GDS(Global Distribution System)は航空機予約、ホテル予約、レンタカー予約などのサイトの登録です。
通常は何も設定の必要はないでしょう。

海外で使うことが多い方は登録しておくといいかも知れませんが国内は、それぞれのサイトが専用のアプリなどを持っていることもありますから、とくに利便性がいいとも思いません。

一般的には GDS は消去線の記述の通りなのですが、GS Wave の場合は私の勘違いで、GDS3710 というドアホンとの連携設定のようです。通常は必要ありません。

ちなみに、GDS3710 は家庭用というよりも、企業の玄関などに置いて、内線で映像付きで(映像は受けた内線側のみ見れる)ドアホン呼び出しに対応する装置のようです。




ご覧の通り、あまり関係ないですよね。







LDAP Settings は 連絡先で LDAP を使用する場合の設定ですから、これもこのままでいいでしょう。

BLF は Busy Lamp Field または、Busy Line Feature といわれる、プレゼンスの機能です。
Cisco では前者のいい方をしているようですが、一般的には後者のいい方をするようで、この方がしっくりします。

Cisco のサイトには詳しく記述がありますので、興味のある方は、BLF presence を参照ください。

これは、電番または、SIP URI で指定したユーザーのリアルタイムなプレゼンスを追跡する機能です。

プレゼンスとは、モノやヒト、情報などの状態を指すもので、この場合はその電番を持つヒトを対象とします。

特に ”監視" したいことがある(?)、またはチャットを行う場合などのときは設定しますが、いまは何も設定しなくてもいいでしょう。

国内では圧倒的に LINE ですから。



次に、アカウントを登録していきます。
右上の「+」を押して、登録画面に移ります。





「GENERIC ACCOUNT」→「SIP Account」と進みます。
「VOIP PROVIDERS」は国内のサービス会社はプリセットされていません。
日本のプロバイダーはマイナーなんですね、多分。

UCM Account は「統合的なコンテンツ管理に基づくアカウント」ということのようで、QR コードで読み取って設定する機能のようですが、通常は SIP Account をタップします。




Account Name : 任意名(電番でも入れてください)
SIP Server : ブラステルの場合、softphone.spc.brastel.ne.jp
SIP User ID : ブラステルの場合、カードに記載の8桁の番号
Password : ブラステルの場合、カードに記載の8文字のパスワード
Voicemail User ID : 設定不要

画面では一番下の行が表示サイズの関係で見えていませんが、
Display Name : 任意名(無記入でも結構です)




それぞれ設定し終えたら上にある ✓ を押し前の画面に戻ります。




登録したアカウントの右の ● が点灯すれば正しく登録されています。
レジストに若干時間がかかります(2〜3s)。

ここが にならなければ、どこかの設定を誤っていますので、当該アカウントの修正をします。修正は、当該アカウントを押して、上から3行目に「Edit Account」がありますから、これを修正します。

また、NAT Traversal の設定も内線の場合は NAT NO にしないとうまくないようです。

NAT Traversal については、下記に GS Wave のマニュアルからの抜粋を示します。

 NAT Traversal : デフォルトは "Keep-Alive"
  "STUN" : 
   STUN サーバーが構成されている場合、通話はSTUNサーバーを経由して行われる
   NAT タイプが Full Cone (1対1NAT)、Address-Restricted Cone、またはPort-Restricted Coneの場合、通話はパブリックIPアドレスとポート番号をすべてのSIP&SDPメッセージで使うように試みる
  "Keep-Alive" : 
   NAT ポートの「開」状態を保つために、定期的な空のSDPパケットをSIPサーバーに送信する
  ”NAT NO" :
   NAT を使わない。outbound proxy が使われるならば、これを構成する
  ”UPnP" :
   ルーターがUPnPをサポートしていれば、これを構成する
  ”Auto" :
   Traversal は、どれか有効なものを見つけるまで、上記のすべてのTraversal 方式を試みる


アカウントでほかに設定するのは、着信音(好みで)、コーデック「Preffered Vocorder」くらいです。




コーデックは WiFi および 2G/3G/4G について設定します。上の例と同じでいいでしょう。

コーデックは上位のものが優先されますが、最終的には SDP メッセージのリストと付き合わされて決定されます。つまり相手側リストと上位から突き合わせて一致したものが採用されます。

一般的にいいますと、殆どの通話先とのケースでは G.711μか GSM でしょう。

自分で、複数台のスマホに設定した場合それらの間では、どれを使うかを事実上決めることができます。

私が実際に聞いて試した感じでは、G.722 が一番音質がいいように思いますが、帯域を広く使いますから、オススメではありません。

iLBC は若干ざらつき感があるものの一番上にしているのは、一番遅延が少ないからです。モバイルでも一番安定的に使えます。

G.711μ(PCMU)は、音質はいいのですが iLBC よりは少しだけ遅延が感じられます。Opus もサポートされていてこれも音はいいのですが、まだ相手が少ないので実際的に使われることが少ないと思います。

zoiper の場合は、G.711μ と iLBC は遅延度合いは殆ど同じなので G.711μ がオススメですが、GS Wave は iLBC の方がいいと思います。


G.729 も無料で標準的に使えるのは嬉しい限りですが、高音域がエコーをひく感じがします。GSM/G.711a は互換性のために選択しておきます。

徐々に最強といわれる Opus になっていくと思いますが、いまはまだ利用者が少なくマイナーです。

昨年あたりからいろいろなソフトフォンで Opus が実装されるようになってきましたので、いずれこれが「標準」になるでしょうけど、いまはまだ早いと思います。


LINE も Opus ではないか? との噂がありますし。


あと、zoiper BETA と UI がどことなく似ています。どちらかが参考(マネ、とまではいいません)にしたのではないか、というほどです。

デフォルトアカウントの選択画面は、左エッジからスライドすればアカウント一覧がでますから、この中のどれかを押せば、それがデフォルトアカウントになります。

以上で、GS Wave の設定は終了です。
あなたも是非、IP電話ライフをお楽しみください。



追記:NAT Traversal は Doze 対策のために Auto ?


Android 7.0 で、深い Doze に入ったときにプッシュ着信しない、という事象があります。Deep Doze 中の最初の着信が無視されるようです。その後の着信は正常です。
Android 6.0 でも同様の事象が発生します。


これは、NAT Traversal を Auto に変えると治まった、という報告もあります。

実際、私の場合もこれが有効でした。

なんとなく、わかるようなわからないような・・・(?)
zoiper でも出ていた事象です。まったく同じ、ということではないでしょうけど、契機については同じかもしれませんね。

Settings → Account Settings → [アカウント] → NAT Traversal → Keep-Alive(デフォルト)を、Auto にするといいらしいです。

実は、Auto で確かに治まるのですが、別の問題が発生しました。

Auto は、実際には Traversal は選択し得る中から最適なものを選択しているとのことなので、何が採用されるかはわかりません。

Auto だと UPnP が採用されることがあり、この場合、LTE で発信元不明の攻撃(3〜4桁番号などや、国内番号以外から)を受けることがあります。

ちなみに、ルーターも UPnP は許可してはいけません。
もし、許可設定していると WiFi でも同様の攻撃を受ける恐れがあります。

我が家では、カミさんのスマホが LTE のときにこの攻撃を受けました。実害はありませんでしたけど。

ルーターはもともと UPnP 不許可にしていますから、ウチの中から接続する分には問題なかったのです。

NAT NO、STUN、または Keep-Alive にするのですが、Deep Doze 中の最初の着信をのがしてしまいます。

これについては、少し検証をしてみますので、その後に改めてご報告したいと思います。


それにしても Doze には悩まされます。電池の消費には大きく貢献していますが、そのために Android と同じく Google がサポートしている Gmail さえもリアルタイム着信通知に問題があるのはいただけません。

Disable Doze というアプリがあって、Andoroid 6.0 では有効だという事例もあるほどに( 7.0 では効かないそうです)、Doze=キライ という方も少なからずいらっしゃるようですね。

Doze をやめさせるために、2〜30分ごとに画面表示させ、すぐにロックするという自動化アプリを動かしているヒトも結構いるようですし、中にはその自動化スクリプトの名前に「Doze嫌い」と名付けているヒトもいました。

これはあくまで対処療法なのであって、王道ではありません。


こうなってくると Doze には「本質的」に問題があると思います。「本質的な問題」をおざなりにするとロクなことはありません。私の拙い経験でもそうでした。

とにかく、使う側もアプリ開発する側も皆んな悩まされている、感じなのです。


次期バージョンの Android O(現時点ではベータ版が公開)ではまたこのあたりも変わるようで、となると Nougat では改修される見込みはなさそうです。次期バージョンで「改悪」ではなく「改良」になることを望みますネ。






zoiper から zoier BETA で何が変わったか?

一番変わったのは、ビデオチャットができるようになったということでしょうか。

最初に BETA がデリバリーされたときは、UI がかなり違和感がありました。

はっきりいって、趣味悪う〜〜という感じでしたが、最新版は殆ど zoiper の UI を踏襲しています。

ほかに、「設定」ではテーマを選択して、UI のカラーも変えられるようになった、連絡先の編集方式がよくなった、自動応答機能が付加された、アカウント切り替えや「設定」・通話録音するしない・exit をスライド画面でできるようになった、というあたりです。


ダイヤル画面はこのようになりました。

通知領域に表示されるアイコンは緑色から白色に変わりました。














左エッジから右にスライドするとアカウント選択や、「設定」「通話録音」などができるようになります。

左上のアイコンとアカウントが表示されているところをクリックすると、複数アカウントを登録していたとき、その中のどれをアクティブにするか・しないか、またデフォルトアカウントをどれにするかを選ぶ画面がでてきます。










アカウントの選択画面です。左側の◯印が、デフォルトアカウント選択を示し、右側の✓が有効・無効を設定する部分です。
















「設定」の一覧画面です

















テーマの設定ができるようになりました。

左の例では8番のテーマの例です。















テーマの中で、配色を変えることもできるようになっています。
















連絡帳の編集方針を変更もできるようです。


















これら以外に変わりはないようです。

最初にデリバリーされた BETA はとても使う気になれなくて、すぐにアンインスコしましたが、今回 registration failed の対応として BETA を改めてインスコし眺めてみたら zoiper の UI を踏襲しているので、これなら使えそうです。

BETA なので、「BETA」がとれたときに、いまの本体と変わるということでしょう。あと何ヶ月かのことだと思います。

使った感じでは、いますぐに入れ替えてもいいのではないでしょうか。




GrandStream Wave も zoiper BETA もディープスリープで落ちない

どちらも、落ちないことを確認しました。

ただ、zoiper BETA は起き上がるのに一呼吸どころか、三呼吸くらいある感じです。

まぁ、これで zoiper の registration failed に悩まされた1件は、やっと解決したということでしょう。

消費電力はというと、zoiper BETA < GS Wave です。


ディープスリープで落ちなくなったということは待受けが問題ない、ということですから、信頼度が格段によくなったということです。一昔まえのソフトフォンアプリとは隔世の感があり、ある種感動すら覚えます。


つまり、携帯電話並みになってきたということです。
緊急電話や3桁サービス(IP電話だからできないのではない、法的規制などの対象だからできないサービスです)にはまだ規制がありますが、十分に通常の携帯性を備えたといっても過言ではないでしょう。

思えば IP電話を最初に使った 2014/5月からここまで3年以上経過しています。



回線交換方式の電話は間違いなくなくなります。
交換機自体の開発が10年以上停止していて、いまある交換機はいい加減廃却せざれるを得ないからです。

携帯電話も PoI で交換機に接続していますが、これも VoLTE などの IP電話方式に変わります。

固定電話も幹線は IP化されつつあります。ラスト1マイルの IP 化も時間の問題でしょう。

いまなぜ IP電話かというと、こういう時代背景があるからです。
IP電話って使えないよね、などということがいえなくなってきているのです。

NTTも焦り、キャリアも焦り、行き着く先は IP電話しかないのです。

新しい時代にどういう風に進化するかは予測できませんが、楽しみなことは間違いありません。



2017-07-22

zoiper が切れる -- その後

zoiper がディープスリープ後に切れている(registration failed)状態に陥る件



zoiper community site の中に似た事象を見つけましたが、それによれば 最新版の zoiper BETA を使ったら収まったとの事例がありました。


I confirm that this issue is RESOLVED with the ZOIPER BETA (Zoiper v2.0.19, librairy rev. 2.8.12).
I had the exact same issue: after 10~20 hours, Zoiper (v1.40, library rev. 2.8.9) was remaining stuck in orange state "establishing connection" or red unable to connect. Forcing reconnection from the application was always unsuccessful. The only way I found was the same as upper her: quitting the application (also closing from Android interface) and launching again. 
The new beta version works perfectly without interruption for 72+ hours.
MANY THANKS TO DEVELOPERS!


以下は私の推定なのですが、

zoiper がデフォルトアカウントに対して re-INVITE (keep alive) しているときに、WiFi または LTE の電波をディープスリープ中に失ったタイミングで keep alive の失敗とみなし、再レジストするべきを、registration failed にしてしまっていたようです。

しかも、UI からの再レジスト要求は上記状態では意味なし、ということなのか正しい再レジスト手順を踏んでいなかったと思われます。それで、ポートのリフレッシュか、ネットワーク設定のリフレッシュで初めて正しい再レジスト処理をしていたということのようです。

そのように考えれば、デフォルトアカウントのみがこの事象になるということへの説明がつきます。その後の再レジストの UI からの手順も理解できます。

国内のネットでは、とくに 2ch では本件について喧しいのですが、本命に至ったという解はまだありませんでした。

私も本件で3週間も悪戦苦闘していました。


GrandStream Wave を試行中なので、その後にでも zoiper BETA版を試してみます。

GrandStream Wave がディープスリープ中に着信 OK なら、こちらの方がいいかなと思います。

zoiper の呪縛から逃れる機会かも知れません。

思えば、IP電話にのめり込み始めてから、zoiper が一番しっくりきていましたのに。


GrandStream Wave は、あるサイトでの 2015/8月時点の評価では、
音質:遅延:使い勝手:複数アカウント の各項で、
zoiper が 3〜5+ : 4 : 5 : ◯ だったのに対して GS Wave は 3 : 3 : 3 (評価途中) : ◯
だったのです。

その当時はあまり気にもかけませんでしたが、今回、Adore がいいよ、とか標準SIP は捨てたもんじゃあないよ、とかの 2ch カキコを見て、Adore を Google Play から探していたときに偶然目につき、そういえば、イエデンの ATA もGrandStream 製だったなぁ、と。
それで使ってみることにしたわけです。

上の評価は、私が使った感想では、5 : 5 : 4 : ◯ という感じです。2年前からはさらに進化したのかも知れません。

GrandStream Wave は、設定項目やコーデック選択肢も多く、使いこなすには結構 IP フォンのことを知らないとうまくなさそうなのですが、NAT Traversal も標準装備していますし(zoiper も今回問い合わせして初めて実装していることを知った)、使いこなせば最強の部類かも知れません。





標準SIPいい! GrandStream Wave はもっといい!!

標準SIP は Nougat でもOKです

でも、GrandStream Wave の方が素晴らしい感じがします


WiFi 下で試した限りでは、標準SIP はディープスリープ中でもちゃんと着信します。

ただ、少し気になる動作もありました。ディープスリープ中の最初の着信で、発信側の切断に着信側が切断応答しない、というものです。
その後は大丈夫でしたが。

BYE が送信されていればサーバーの問題になりますが、どうも端末側の問題と思われます。


あと、コーデックはなどは選択の余地がありません。聞いた感じからするに GSM のように思います。

遅延は殆どありません。
非常に優秀ですが、コーデックは 711.μ か、iLBC が好みなんですけど。
音質ならば 711.μ、低遅延と確実性なら iLBC というところかな。

GSM だと、昔の携帯電話を思い出させます。

Adore は、アカウントを一つしか登録できません。遅延も少しあります。
特に、話しはじめの遅延は無視できないほどに大きい。
コーデックが安定すると気にならなくなるレベルですが、話しはじめの遅延を考えると実用にはいま一つです。

GrandStream Wave は素晴らしいと思います。

これも zoiper 並みの低遅延です。
コーデックで少し状況は変わり 711.μ だと若干、遅延が増える感じはします。

iLBC だとまったく問題ないレベルです。
通常使いには iLBC でいいので、あとはディープスリープ中の着信が問題ないかどうかです。

GS Wave は、WiFi と 3G/LTE が切り替わっても自動的に再レジストしてくれ、発着信も問題ありません。
この点は嬉しい限りです。
zoiper を使う理由の一つがこの点だったからです。

遅延に関しては、標準SIP ≒ zoiper ≒ GS Wave < Adore という感じです。

 Adore もコーデックをいろいろ選べていいのですが、話し初めの遅延は、すごく気になります。

コーデックが安定すると、気にならなくなるレベルではあるように思います。



zoiper からは、日本語の問い合わせメールに対して英語で返信がきました。
これは評価できる点ですが、こちらの意図する伝わり方かどうかは、若干気になっています。

英語で問い合わせてもいいのですが、わざと、日本語ではどうかなと思ったのですが、返信までに 24時間かかりませんでした。

ただ、やはりマニュアルがなく、問題はユーザーコミュニティサイトに聞いてみて欲しい、などはチョッとなぁ、と思います。まずはマニュアルを整備してからだと思いますが(PC用はあるので、モバイル用もそんなに難しい問題ではないと思うのは私だけではないと思います)。




2017-07-21

2chから -- 誰かが Android 6.0 標準SIP がいいといってた

標準SIPってこんなによくなってたの?



2ch でたまたま見つけたのですが、標準SIPがいいというので試してみました。
以前、使ってみたときはまったく使えないシロモノでしたが、いつの間にかすごくよくなっています。

ヘンにほかのVoIPアプリ使うくらいならこちらの方がいいかも知れません。
スリープ時の着信がOKで、WiFi / Mobile の両方でOKなら、申し分ないと思われます。

音質も遅延も、少なくとも WiFi では問題ないレベルです。

ずーっと悩まされている、zoiper がディープスリープ時にレジスト失効する件もまだ解決に至っていません。どうも、udp がタイムアウトすることが契機ではないか、と疑っていますが、SIP のプロトコルや、udp timeout の NAPT クリア後の動きも合理的な説明がつくまでには至っていません。

DNS や DHCP リースタイムの問題も一時疑いましたが、これが原因ではないことはわかりました。

zoiper が独自に keep alive しているか、SIPサーバーがしているか、そこらあたりの条件がわからないので、解決の糸口がないのです。


対処療法的な救済手段がないこともないのですが、元技術者のカタワレとしては、この点がはっきりしないと何とも気持ちがよろしくはないのです。


それにしても標準SIP が Android 6.x でこんなによくなっているのなら、Nougat でもいいに違いありません。

少し zoiper から離れてみますか?

ほかにも、我が家のイエデンで使っている ATA のメーカーが出している VoIP アプリもあるし、Adore なるアプリがいいとの 2ch でのカキコもありましたし、しばらく遊んで見ましょうか。




2017-07-16

zoiper その後・顛末記 -- まだ継続課題あり

ディープスリープで zoiper のレジストが外れる問題



    zoiper が切れる でトライした件


Tasker で1時間ごとに自動起動する、ではダメでした。

SIP ソフトフォンの zoiper のレジストが外れる件は、Tasker で1時間ごとに zoiper を起動するようにしたのですが、一晩経ってディープスリープ(Doze モード)に入っていると切れていることが多く、たまに切れていないときもあるので、


考え込んでしまいました。以下はその顛末記です。


Zoiper は、デフォルトアカウントはレジストが一旦失敗するとなぜかやり直してはくれなくて、外れたままになります。デフォルトアカウント以外はレジスト OK にみえますので、これがまた悩ましい点です。

デフォルトアカウントは、Connectivity を Save し直して(udp ポートの設定し直しと等価な処理)初めてレジストが復活します。


そもそも、SIP REGISTER はこれ自体、すでにレジストできていたのに、途中からいきなり失敗することは考えにくい。

ルーターで udp タイムアウトして NAPT が破棄されても、その後の REGISTER では新しく NAPT が張られるので、サーバーからの 200 OK は正しい UAC に戻るハズ。

考えられる原因は、以下のようなケースです。

 ① DNS がなんらかの原因で FQDN から正しく IPアドレス変換できなかったため、UAS は不当要求として registration failed を返した。
 ② うまくいった REGISTER 後、ルーターで udp タイムアウトが発生し、NAPT が破棄された後に registration keep alive で、戻り UAC を失ったので、UAC は応答タイムアウトでレジスト不可を認識した。
 ③ 発生状況からみると、可能性はかなり低いが、UAS 側に障害があった。
 ④ REGISTER 要求した後に、ルーターの DHCP のアドレス有効期限になり、UAC のアドレスが変わったため、NAPT で正しい UAC に戻せず、レジスト不可となった(NAPT が新たなアドレスで動的マスカレードテーブルを書き換えていなければ)。
 ⑤ zoiper 自体に何らかのバグがあり、これが原因で発生している。

などです。registration expiry time は contact ヘッダーに設定してレジストラに REGISTER 要求しますが、レジストラは独自の expiry time を返すことがあります。

① はネットワークの輻輳などで、DNS が詰まることはありえますが、8.8.8.8 なので考えにくい。
② はそもそも expiry time が 60秒の設定なので、udp タイムアウトにはなりません(ルーターの udp タイムアウト時間は 180秒)。レジストラが独自の長い expiry time を返して 180秒よりも大きい時間だと、次の REGISTER 要求は、タイムアウト後の可能性もありますが、例えタイムアウトで NAPT 破棄後であってもこの REGISTER 要求で新たな NAPT が張られるので問題は生じないことになる。
③ は lollipop 以前のスマホではうまくいっているので、これも考えにくい。
④ はあり得るシナリオです。現在のリースタイムは 4時間なので Doze から覚めたときのタイミングで変わっている可能性があります。しかし、レジストラからの keep alive 以外は、このシナリオも成り立ちません。UAC からの keep alive は NAPT は常に最新のハズです。逆にいうと、REGISTER の keep alive をレジストラ側から行っているとするとあり得るシナリオですが、通常サーバー側からは keep alive しません。そもそもレジストラの存在は INVITE 時のロケーション管理であって、UAC の生き死には気にもしません。
⑤ は、以上のことから一番あり得るシナリオとして、zoiper のサポートチームにメールで問い合わせすることにしたのです。

問題は REGISTER なので、非常に発生条件の絞り込みが難しいのです。

なぜ、こういう動作になるのか、zoiper の公式サイトの FAQ でも記述がないのです。

マニュアルはPC用はありますが、Android や iPhone 用はありません。
また、PC用マニュアルでもこのような事への記述はありませんし、PC用以外にマニュアルがない点も大いに不満なところです。

アプリケーション自体は相当にいい出来具合なので、大変残念なところです。

こういう動作も悩む点でした。Android の動きもそうですが、zoiper 自体の動きも物事を複雑にします。解決しなければならないパラメーターが一気に増えてしまいます。

----------◇----------◇----------◇----------

Doze で電池の消耗が減るのはありがたいのですが、SIP 着信などにとっては厄介です。
ネットではディープスリープで Mail や LINE の通知がこない、遅れる、などの相談もみられます。


プッシュ通知は Google Cloud Message(GCM)が受け持っています。
これがうまく働くときと、そうでないときがあるように思えます。

GCM のタイムアウト値はデフォルトでは、

 WiFi       : 15分
 モバイル : 29分(なんか中途半端な時間です)

このタイムアウト時間はスマホ側の設定値で、モバイルに関しては MVNO によってはこれよりも短い時間(数分程度)でセッションを切られるケースもあるそうです。

三大キャリアは 53分だそうです(端末側の設定値の方が小さいのでキャリア側は切らなくても GCM は 29分でタイムアウトすることになります)。

タイムアウトは、この時間内に一度も tcp パケットが流れないときに起こります。


タイムアウト値を三大キャリア並みにして欲しいとのMVNOへの相談には、まじめに設定値を見直ししてくれた事例と、不まじめなところとがあるようで、こういったところは「いいMVNO」「悪いMVNO」の差となって表れます。MVNOを選ぶ際の一つの指標でしょう。

同様のことは、端末メーカーも然りです。


ともあれ、いまはまず WiFi での動作をちゃんとしてモバイルはその後で考えることにしました。


GCM のタイムアウトを防止するために tcp パケットを流すタイミング、つまり「ハートビート時間の設定」をしてくれるアプリ(Push Notification Fixer - no root [以降 PNF]、または Heartbeat Fixer for GCM をインストールして、

 WiFi       : 4 分ごと
 モバイル : 10分ごと

に設定し試したのですが、一晩放置でレジストが OK のときもあれば NG の時もありますので、状況的には変わりません。



これが Push Notification Fixer -- no root の画面です。ハートビート間隔を設定した後に Apply settings をクリックすると GCM のテーブルを書き換えてくれます。
テーブル書き換えだけですので、このアプリが何かほかの動作をするわけではありませんから、設定後はアンインストールしても構いません。ただ、スマホの再起動をするとデフォルトに戻るようです。

Heartbeat Fixer for GCM の場合は再起動でも設定を書き戻してくれるようです。



先に挙げた Mail や LINE のケースはこれで解決したという報告もありますが、zoiper の場合はそういう事例もなく、Connectivity の Save で OK ならそれでいいと諦めているケースが多いと思われます。

PNF -- root 版は、ルートとらないと本来は有効ではありませんが、これには Google play 開発者サービスの動作状況を見られる機能があるので、これもインストールして状況を見てみました。

下記は PNF -- root 版による Google Play開発者サービスの Status画面です。



こちらは同じく Google Play開発者サービスの Event 画面です。





これを見ると、Doze は入ったり出たり(Entering doze/Exiting doze)しているようです。


zoiper はレジスト OK なら、着信はプッシュ通知されるはずです。
着信のプッシュ通知は、zoiper の場合も GCM に依存しています。


さらに調べてみると GCM はタイムアウト期限までに tcp パケットが流れないでセッションタイムアウトすると、NAT を破棄する(NAT テーブルのクリア)らしいことがわかりました。
この NAT 破棄はどのように影響するのでしょうか。

NAT を必要とするのは端末がモバイルルーターの場合です。

普通のスマホは、プラーベートであれ、グローバルであれ IP アドレスは、モバイルキャリアから割り当てられています。

WiFi では、ルーターの DHCP から動的に割り当て、またはスマホの WiFi 設定時に静的に割り当て、のどちらかです。

プライベート IP アドレスの場合は WiFi ルーターまたは、キャリア側で NAT 変換しています。
グローバル IP アドレスの場合は VPN の場合を除けば NAT を必要としないはずです。

したがって、GCM の NAT 破棄は影響しないことになります。
この部分でも余計な情報を得たためにいろいろと遠回りをしてしまいました。


しかし、ここで重要なヒントを得、思いだしました。それはルーターの NAT テーブルはどうか、ということです。

しかも、いまのルーターは NAPT になっていてポート変換までしています。これはローカル網内のどのノードから発信されたパケットかを、同じ宛先への違う発信元を区別するために、発信元ポートも変換して一意に定めるためです。

ところが、この変換テーブルがタイムアウトでクリアされてしまうと、正しく発信元にパケットを返せなくなってしまいます。発信元(スマホ)からみると応答タイムアウトで通信失敗という結果になります。これがレジストエラーの原因だろうと疑いましたが、冒頭のシナリオではあり得ません。

zoiper がなぜ、ローカル網からグローバル網に変わってもレジストを維持できるのか、おそらく zoiper 自身でも NAPT 相当(NATトラバーサル?)を行っているのではないかと想定されます。そう考えると、デフォルトアカウントのレジストエラーが回復しない理由も納得できます。Connectivity を Save によってやり直すと、zoiper 自身の NAT-T がリフレッシュされて、再び通信が復活するのではないかと考えられます。


我が家のルーターの SPI (ステートフル・パケット・インスペクション)のタイムアウト値は tcp ではデフォルトが 3600秒でしたが、あまり深くは考えないで 300秒の設定で使っていました。udp は 180秒(デフォルト値)のままです。

SPI の動作を考えると、短めの方がより安全にフィルタリングできると漠然と考えていました。

300秒(=5分)ですから GCM のタイムアウト云々以前に、パケットが流れない状況、つまり網内のどのノードもスリープ状態のときに、ルーターでタイムアウトしてしまいます。

このときにルーターのダイナミック NAPT はテーブルクリアされます。

そもそも、ウチの Mac は 7:00〜19:00 はスリープタイムではありません。画面オフでも1時間はスリープに入りません。この間は Gmail はほぼリアルタイムにメール着信をチェックしています。したがって、tcp が流れなくなる時間はほぼありません。NAPT テーブルも保持されています。

スマホから見ると、たとえスマホが放置されていても Mac によって、スリープタイム以外は結果的にルーターの NAPT テーブルが保持されていたことになります。

19時以降は Mac はスリープタイム設定してあります。ですから夜間は tcp が流れない時間があるわけです。タイムアウトもするわけです。



そこで、tcp/udp タイムアウト値をそれぞれ、1800秒/900秒に変えました。これにより、少なくともルーターが GCM より先にタイムアウトすることはなくなります。

思うに、スマホの NAT がディープスリープによってタイムアウトして、それが原因で zoiper の 定期的な(Registration expiry time ごとの)レジストが失敗、もしくは keep alive が失敗、その結果レジストが外れるのではないか、と考えたのでした。


ハートビートの方は、PNF no root で WiFi 14分間隔、モバイル 20分間隔で設定し直しました。


ログを見ると、実際のハートビート間隔は最長がこの値で、概ねこの値よりも短い間隔で行われているようです。

この設定見直しにより、ルーターの NAPT テーブルは少なくとも 30分間は保持されます。夜間は、GCM のハートビートも相まってタイムアウトはなくなり、ルーターの NAPT 破棄も起こらないことになるはずです。そうすれば、zoiper のレジストが失敗しないですむはずです。

一晩放置して Doze に入ってもレジストが外れないか様子をみました。


外れ、だったようです。


なお、zoiper は当然「最適化しない」設定に最初からしています。
その後、解決に至ったことは、ここに記述しています。



ところで、

zoiper はバックグラウンドで動いていますから、レジストさえ維持されれば、待受けの問題はなくなるのですが、レジストが外れていると当然ですが着信しません。

このとき、かけた側には「おかけになった電話番号は現在使われておりません」というメッセージが流れてしまいます。

このメッセージは気に入りません。
電話番号を使っていないのではなく、着信しないだけなのですから。

携帯電話への発信だと、「おかけになった電話番号は現在電波の届かないところにあるか、電源が切れているのでかかりません」というメッセージになります。

このあたりは、ブラステルになんとかしてもらいたいところではあります。
電話番号はブラステルが発行しているのですから、着信しない場合は、携帯電話への発信と同様に扱うべきだろうと思います。

いきなり切断状態なので、かけた側は「電話番号が使われていない」と判断してしまいます。


スマホに関していえば、レジストが外れているかどうかは通知領域を見て、初めてわかりますが、いつから外れていたかはわかりません。この間の着信をのがしているかも知れないのです。




上部通知領域の左に、緑色ののマークが見えると思いますが、これが zoiper がレジストOKのときの通知です。レジストが外れると、この表示自体がされません。



イエデンの場合は、Asteriskで 30秒間呼び出しに応答しなかったら留守電メール通知するようにしているので、とくに問題はありませんが、それ以外の持ち歩き用に確保したカミさん用のブラステル番号は、レジストが外れてしまうと、「おかけになった電話番号は現在使われておりません」となってしまいます。

また、娘一家が帰国したときに使う番号も同じ扱いになってしまいます。


携帯電話では、不在着信(圏外または電源オフ)は sms で通知されます。


まったく同じにはできないのですが、持ち歩き用も Asteriskに収容して、擬似的(一定時間呼び出しのあと)に携帯電話と同じメッセージを流すようにし、メールで不在通知しようかと考えています。


このときに、発信側には携帯電話と同じメッセージが流れるようにするのです。

「おかけになった電話番号は現在電波の届かないところにあるか、電源が切れているのでかかりません」



またまた、Asterisk でやることもできました。

というわけで本件は一件落着ですが、新たな課題は継続です。









2017-07-14

GrandStream HT701 の設定

ブラステルのイエデンを電話機で使えるように、ATA(アナログテレフォンアダプター)である HT701 の設定事例を記載します。


スマホなどのIPフォンアプリはすべて終了させてください。HT701に設定のあとで再起動すればいいですから。


HT701をLAN接続します。

HT701 のIPアドレスはデフォルトでは DHCP サーバーから与えられるアドレスになりますから、ルーターの DHCPサーバーが払い出したアドレスを見つけてください。

DHCPの払い出しアドレスの中でMACアドレスが、HT701本体に記述されているものと一致したIPアドレスがそのアドレスになります。

PCのブラウザを開いて(何故かChromeではうまく行かず、Safariで行いました)、このIPアドレスを入力してHT701に入ります。


上に4つ、タグがならんでいると思います。BASIC SETTINGS から順に設定していきます。一番左は状態を示しているだけですから、設定はこのBASIC SETTINGSからです。

最初にユーザーパスワードを求められると思いますから、任意のパスワードを設定してください。
ADVANCED SETTINGSでも管理者パスワード設定を促されます。
同じでも別々でも構いませんが、忘れないでください。


設定内容は、以下のとおりです。
デフォルトの項目も結構ありますから、つきあわせながら設定してください。

【BASIC SETTINGS】タグ
End User Password : 任意
Web Port : 80
Telnet Server : Yes
IP Address :
  ● statically configured as : ➡ 固定アドレスを選択します
  IP Address : 192.168.xxx.yyy ➡ この HT701 の IP アドレスです
  Subnet Mask : 255.255.255.0
Default Router : 192.168.xxx.zzz ➡ デフォルトゲートウェイの IP アドレスです
  DNS Server1 : 192.168.xxx.zzz
  DNS Server2 : 8.8.8.8
 Time Zone : GMT+09:00 (Japan,Korea,Yakutsk)
 Self-Defined Time Zone : デフォルト設定のまま
 Allow DHCP server to set Time Zone : Yes
 Language : English ➡ 日本語はありません
 Reset Type : ISP Data Reset
[Update] ➡ [Apply] ➡ [Reboot]

一旦、リブートし、設定した静的IPアドレスで入り直します。


【ADVANCED SETTINGS】タグ
Admin Password : 任意
Keep-alive Interval : 20 (デフォルトのまま)
Use STUN to detect network connectivity : No
Use DNS to detect network connectivity : No
Firmware Upgrade and Upgrade Via Provisioning : HTTP
  Firmware Server Path : firmware.grandstream.com
  Config Server Path : fm.grandstream.com/gs
  ● Always Check for New Firmware at Boot up
Disable SIP NOTIFY Authentication : No
Authenticate Conf File : No
Periodic Inform Enable : No
Periodic Inform Inerval : 300
Country Specific Deployment : None (Default)
System Ring Cadence : c=2000/4000;
Call Progress Tones :
  Dial Tone : f1=400@-19,c=0/0;
  Ringback Tone : f1=400@-19,f2=385@-20,c=1000/2000;
  Busy Tone : f1=400@-19,c=500/500;
  Reorder Tone : f1=480@-19,f2=620@-19,c=1500/1500;
  Confirmation Tone : f1=600@-16,c=250/250;
  Call Waiting Tone : f1=440@-13,c=300/10000;
  Prompt Tone : f1=350@-17,f2=440@-17,c=0/0;
Prompt Tone Access Code : 空白のまま
Lock Keypad Update : No
Disable Voice Prompt : No
Disable Direct IP Call : No
Disable Attended Transfer : No
NTP Server : ntp.jst.mfeed.ad.jp
Allow DHCP option 42 to override NTP server : Yes
Syslog Level : NONE
Send SIP Log : No
Download Device Configuration : Download
Download Device XML Configuration : Download
Upload firmware : Upload from local directry
[Update] ➡ [Apply]

【FXS PORT】タグ
Account Active : Yes
Primary SIP Server : softphone.spc.brastel.ne.jp
Prefer Primary SIP Server : No
Allow DHCP Option 120(override SIP server): No
SIP Transport : UDP
NAT Traversal : Keep-Alive
SIP User ID : ➡ ブラステルのユーザーID (8桁の数字)
Authenticate Password : ➡ ブラステルのパスワード(8文字)
DNS Mode : A Record
Tel URI : Disabled
SIP Registration : Yes
Unregister On Reboot : No
Outgoing Call without Registration : Yes
Register Expiration : 60 (デフォルト)
Register before Expiration : 0 (デフォルト)
SIP Register Failure Retry Wait Time : 20 (デフォルト)
SIP Register Failure Retry Wait Time upon 403 ~~~ : 1200 (デフォルト)
Enable SIP OPTIONS Keep Alive : No
SIP OPTIONS Keep Alive Interval : 30 (デフォルト)
SIP OPTIONS Keep Alive Interval Max Lost : 3 (デフォルト)
Layer 3 QoS : 26 (デフォルト)
                     46 (デフォルト)
Local SIP Port : 5060 (デフォルト)
Local RTP Port : 5004 (デフォルト)
Use Random SIP Port : No
Use Random RTP Port : No
Hold Target Before Refer : Yes
Refer-To Use Target Contact : No
Transfer on Conference Hangup : No
Disable Bellcore Style 3-Way Conference : No
Remove OBP from Route Header : No
Support SIP Instance ID : Yes
Validate Incoming SIP Message : No
Check SIP User ID for incoming INVITE : Yes
Authenticate incoming INVITE : No
Authenticate server certificate domain : No
Authenticate Server certificate chain : No

Allow Incoming SIP Messages from SIP Proxy Only : Yes
Use Privacy Header : Default
Use P-Preferred-Identity Header : Default
SIP REGISTER Contact Header Uses : LAN Address
SIP T1 Timeout : 0.5 sec
SIP T2 Interval 4 sec
SIP Timer D : 0
DTMF Pat load Type : 101
Preferred DTMF method : Priority 1 : RFC2833
             Priority 2 : RFC2833
             Priority 3 : RFC2833
Disable DTMF Negotiation : No
Generate Continuous RFC2833 : No
Send Hook Flash Event : No
Enable Call Feature : Yes
Flash Digit Control : No

Disable Ring Tone : 3つとも Ring Tone 1
Disable Call-Waiting : No
Disable Call-Waiting Caller ID : No
Disable Call-Waiting Tone : No
Disable Connected Line ID: No
Disable Receiver Offhook Tone : No
Disable Reminder Ring for On-Hold Call : No
Disable Visual MWI : No
Do Not Escape '#' as %23 in SIP URI : No
Disable Multiple m line in SDP : No
Ring Timeout : 60
Delayed Call Forward Wait Time : 20
No Key Entry Timeout : 4
Early Dial : No
Dial Plan Prefix : 空白のまま
Use # as Dial Key : No
Dial Plan : {x+|*x+|*xx*x+}
SUBSCRIBE for MWI : Yes
Send Anonymous : No
Anonymous Call Rejection : No
Special Feature : Standard

Caller Request Timer : No
Callee Request Timer : No
Force Timer : No
UAC specify Refresher : Omit
UAS Specify Refresher : UAC
Force INVITE : No
Enable 100rel : No
Add Auth Header On Initial REGISTER : No

Use First Matching Vocoder in 200OK SDP : No
Preferred Vocoder : choice 1 〜 6 まですべて PCMU
Voice Frames per TX : 2

SLIC Setting : JAPAN CO
Caller ID Scheme : NTT Japan

Enable Pulse Dialing : No
Enable Hook Flash : Yes

Gain : TX = +6db
   RX = -6db default

Disable Line Echo Canceller (LEC) : No
Disable Network Echo Suppressor : No
Outgoing Call Duration Limit : 0
Ring Frequency : 20
Enable High Ring Power : No
Ring Tones : すべて c=2000/4000;

[Update] ➡ [Apply] ➡ [Reboot]

以上で終わりです。
電話機が使えるかどうかを確認してください。






2017-07-11

moto G4 plus のその後

MOTOROLAのサポセンにメールで問い合わせました。

最初にメールで返信くれたヒトは「クズ」で、「真面目に答える気はあるのか?」としたところ、別の人物が返事を寄越し、やっとまともな受け答えになりました。


組織で対応しているのはいいのですが、そもそも、サポセンの教育体制というか、ポリシーを徹底できているか、とかの問題がありそうです。


経営者層の問題だと思います。


実は、サポセンについては、MOTOROLAに限らず、まともなサポセンってないに等しい。LINEモバイルに変わる前のMVNOもそうでした。まともじゃあありませんでした。


アリバイ作りのためだけにサポセンを置いている、という感じがどうも否めません。

国民の「知る権利」を無視するどっかの政党のようです。


どうも、機器不具合のような感じですが、1年未満なら無償修理、以上経過なら有償修理だそうです。これはこれで仕方ありませんが、2〜3週間もスマホを修理にだすのもためらわれ、初期化して送付し戻ってきて、また一から設定し直すのもイヤですから、このままにすることにしました。


ただ、セルスタンバイについてスロット1と2での違いはない、といわれましたが、実際に起こっていることですからバグと考えていて、調査依頼はしました。


昔、どこかで聞いた「仕様どおりです」とか「仕様ではそんな風にはしていません」
とかを思い出してしまいました。

工場サイドとは、何度こういうやりとりをしたことか。


さて、どんな「調査」をしてくれることやら、です。





DDNSサービスのこと

OpenVPNで自宅サーバーに接続時、自宅のグローバルアドレスが変わっても、アドレスの書き換えをしなくてすむようにと、DDNSサービスを使っています。


最初は、No-IPを使っていたのですが、無料版は expiry time が30日で、都度 modify しなくてはいけません(30日経過前にです)。
modify すれば、また有効期限が 30日延びます。

ドメインは一つですから、わざわざそのために有償版にするのもどうかと思い、個人で運用されている iesertver.net のサービスを使わせていただいておりました。

最近、ここのサーバーがトラブったようでして、サイトにも入れず、どうしたのか心配しておりました。


それで、No-IPの方に戻りました。


ieserver.net の方は、サイト運営されている方にメールで連絡したところ、障害であったことが判明、今日現在(2017/07/11時点)では回復しているようです。

再度、ieserver.net に戻します。ただ、バックアップの意味で、No-IPも有効期限の更新はしたいと思います。


実をいえば、OpenVPNは現在は使わなくてすんでいます。

そもそもは、ひかり電話の内線を設定したスマホを外でもひかり電話を使えるようにと、AsteriskサーバーにアクセスするためにOpenVPNを使っていました。


いまは、イエデンをブラステルに変えていますので、スマホにもブラステル番号を設定して、ウチでもソトでも使えていますので、OpenVPNでわざわざ自宅Asteriskサーバーに入る必要がなくなりました。

でも、せっかくなので自宅サーバーに入る道筋は残しておきたくて、こんな些細なことにこだわっています。

ツマラナイお話しでした、スミマセン。



2017-07-09

moto G4 plus がセルスタンバイ?

これからは、nanoSIMが主流だろう、と思って nanoSIMを注文したが、これがどうも失敗の元だったみたいです。


SIMスロット1に純正のアダプターを履かせて nanoSIM挿してもまったく電波を掴まない。

SIMスロット2の方は3G/LTEとも大丈夫だが、スロット1に音声SIM か sms対応SIMがないと、セルスタンバイをおこすようだ。
バグっぽい。

MVNO乗り換え前は SIMスロット1には microSIM を挿していて何も問題はなかった。
素直に mcroSIMにするべきだったかも。

アダプターの奥側をサンドペーパーで削って、LTEは掴むようにはなったが、3G掴まないから、通話がNG。smsは届くのに何で??。

これ以上削るのはアダプターの強度に問題ありそうで、削るのは止めて結局スロット2で使っているけど、セルスタンバイは治らない。

まぁ、待受だけだと4日保つからなんとかなってはいますけどね。
(以前の microSIMをスロット1で使っていたときは10日は保った)

スマホ本体を変えても simはサイズ変更が要らないようにと、nanoSIM にしたけど、余計なことだったか、と少々後悔。





2017-07-06

Asterisk 用の音声ファイルの作成

【追記】

現在は googletts で extensions.conf 内に音声化する文字列を記述できるようになっていますので、本記事は方法の一つとしてとらえてください。

 

Asteriskの音声ファイル


Asteriskの音声ファイルは、/var/lib/asterisk/sounds/ja フォルダーの中に収められています。

また、このフォルダー内に、core-sounds-ja.txt というテキストファイルがあり、これには、収録されている音声ファイルのファイル名と内容を記述したリストが書かれています。

Playbackアプリケーションで再生させる音声を、この中から選ぶことができます。
Playbackアプリケーションに記述の際は、例えば「ただいま電話にでることができません」だと、vm-nobodyavail.wav というファイルがありますので、

  exten => 999,n,Playback(vm-nobodyavail)

のように、拡張子は付けないで記述します。ファイルの形式(コーデック形式)が複数ある場合は、Asteriskは適切なコーデックのファイルを選んでくれます。

しかしながら、適切に使える音声ファイル自体がない場合は自作することになります。

ファイルの自作は、自分の音声をマイクで吹き込んで、これを μlaw 形式で Asteriskの音声フォルダーに入れておけば使えます。

別のやり方、これがいまから記述する方法です。
Macでの事例ですから、Windowsでは別のソフトウェアを使う必要があるかも知れません。

テキストで記述された文章を、kyokoさんという女性が代読して、.aiff 形式ファイルにしてくれる、SpeakLine というソフトウェアがあります。



左下の、「Start Reading」で上のボックスに書かれた文章を読み上げてくれます。
右側の名前のリストが、文章を読み上げる「ヒト」です。日本語の場合は、Kyokoさんになります。
右上の「Preferences」をクリックすると、読み上げるスピードと音量を変えることができます。

合成音声ですから、多少の(?)感はありますが、十分に使えます。

間(無音声の時間)を調整するのは、spwave という別のソフトウェアを使います。
このソフトウェアは、ビットレートやサンプリング周波数などを変換して、目的の形式にしてくれるソフトウェアです。

SpeakLine の結果がよければ、メニューの「Export」→「... as Audio File」で任意のフォルダーに書き出します。形式は .aiff 一択です。

次に、spwave を開き、さきほど保存した .aiff 形式のファイルを開きます。



間を調整するには、赤いカーソルラインを、間をとりたいところに設定して、右クリックで無音挿入時間を設定します。

これを Asteriskの音声ファイルで保存するには、メニューから「ファイル」→「名前を付けて保存」をクリックします。



下の「ファイルの種類」の選択ボックスから、



「AIFC ITU-T G.711 mu-law」を選択し、任意のファイル名を付け、拡張子として「.ulaw」として、任意のフォルダーに保存します。ビットレートも、サンプリング周波数も G.711.μ に合わせてくれます。

あとは、このファイルを smb などで Asteriskサーバーの、冒頭に記載のフォルダーに放り込めば使えるようになります。

ファイル名が既存のものとダブらないようにしてください(例えば、頭に myfile- とかを付加するなど)。


Raspberry Pi 3へAsteriskを構築する -- その3

前回までに、Asteriskインストールと sip.conf について書いてきました。

今回からは、実際の「振る舞い」を記述する、extensions.conf について書いてみたいと思います。

が、その前に留守電を使うための準備をします。
というのも、extensions.conf の実際例の中ではこの留守電を使うからです。

着信があったときに、一定時間内(例えば 30s)に応答しなければ、留守電にする、と言うものです。

留守電は、簡易な方法で擬似的に実現した事例が下記サイトにあります。

  http://blog.jikoman.jp/2015/05/asterisk-rusuden.html

ここでは Asteriskの機能を使用した留守電機能を構築するやり方を記述します。

また、録音された留守電をメールに添付してお知らせしてくれるようにもしたいと思います。
お知らせメールはなくてもいいのですが、留守電が入ったときに知らせてくれますから、ときどき留守電をチェックする、などとしなくてすみます。

そのために、メーラーをAsteriskにプラグインして設定をする必要があります。

メール送信パッケージをインストールします。

  # apt-get update
  # apt-get install ssmtp mailutils

次に ssmtp を設定します。

  #  leafpad /etc/ssmtp/ssmtp.conf ➡  以下をオリジナルと書き換える
   root=メールアドレス(例えば、abcdefgh@gmail.com など)
   Mailhub=smtp.gmail.com:587 ➡ 送信用ドメインのアドレス/ポート
   AuthUser=メールアカウントabcdefghです)
   AuthPass=パスワード ➡ メールパスワード
              (記号が含まれると認証エラーになる)
   AuthMethod=LOGIN
   UseSTARTTLS=Yes
   UseTLS=Yes
   hostname=gmail.com  ➡ ‘localhost’ では hylafax で DNS エラーになる

続いて asterisk.conf  を編集します。以下の箇所を変更します。

  # leafpad /etc/asterisk/asterisk.conf
   languageprefix=yes
   defaultlangeage=ja
  # 

voicemail.conf を編集します。

  # leafpad /etc/asterisk/voicemail.conf 
   [general]
   format=wav49         ; wav形式で録音
   servermail=asterisk  ; メール送信者名
   attach=yes
   maxmsg=999 ; 最大保存メッセージ
   maxsecs=180 ; 最大メッセージ長(録音時間:秒)
   skipms=3000 ; デフォルトのまま
   maxsolence=10 ; 最大無音許容時間
             (この時間内(s)に録音されなければ切断)
   silencethreshold=128 ; 無音検出のスレッショルド
   maxlogins=3 ; 最大ログイン数
   charset=UTF-8 ; 日本語メールのための文字セットをUTF-8にする
   emailsubject=[PBX]: 音声メールボックス: ${VM_MAILBOX} の $ {VM_MSGNUM} 番に新しいメッセージです
    ; メールの題名
   emailbody=電 話 番 号: ${VM_CALLERID}¥n¥nメッセージ長: ${VM_MSGNUM} 秒\n¥n${VM_DATE}¥n¥n¥t¥t--- by Asterisk Server   
   emaildateformat=着 信 日 時: %Y/%m/%d, %r 
   mailcmd=/usr/sbin/sendmail -t ; コメントアウトを外す(sendmailを指定)
   saycid=yes
   sendvoicemail=yes
   [zonemessages]
   japan=Japan|Q PHM ‘jp-ni’ ‘vm-received’
   [default]
   500 => 1111,名前,アカウント名@gmail.com,,tz=japan   ; メッセージを再生するときのパスワード、送信先名前、送信先メールアドレス、タイムゾーン
  #

留守電を記述するには、extensions.conf のエクステンションに Voicemail アプリケーションを記述します。

   exten => 250,n,Voicemail(500) ; 500番のボイスメールボックスに録音する

のように記述します。

また、再生するには VoiceMailMain アプリケーションを使います。

   exten => 260,n,VoiceMailMain(500,s) ; 500番のボイスメールボックスを再生する
  (ボックス番号の後ろの"s"は再生時にパスワード要求しない、の意味です)

   留守録されると、abcdefgh@gmail.com に留守録が添付されてメール送信される。
   また、「260」を呼び出すと、留守電の確認が音声応答でできる。
   (留守電ボックス番号は「500#」、パスワードは「1111#」)。

   留守電内容を「内線260」で確認するときのダイヤル数字のそれぞれの意味

    1: メッセージ聴取
    2: フォルダの変更
     0: 新規メッセージフォルダ
     1: 聴取済みメッセージフォルダ
     2: ワークメッセージフォルダ
     3: 家族メッセージフォルダ
     4: 友人メッセージフォルダ
     #: キャンセル
    3: アドバンスオプション
     1: 返信
     3: 録音メッセージの再生
     5: 録音
     *: メインメニューに戻る
    4: 前のメッセージを再生
    5: 現在のメッセージを繰り返す
    6: 次のメッセージを再生
    7: 現在のメッセージを削除
    8: 他のメールボックスに転送
    9: 他のフォルダに移動
    0: メールボックスオプション
     1: 不在時(呼出タイムアウトや電源未投入等)等の応答メッセージの録音
     2: 話中時の応答メッセージの録音
     3: ユーザ名の録音
     4: パスワードの変更
     *: メインメニューに戻る
    *: ヘルプ/再生中は巻き戻し
    #: 終了/再生中は早送り


実際の extensions.conf の事例を下記に示します。
コメントが記載されていますので、大体はご理解いただけると思います。

extensions.conf

[general]
autofallthrough=yes
writeprotect=no
;
;【ダイヤルプラン】
;    1. ひかり電話の外線着信で、Asterisk内線 11,12 が鳴動
;        ブラステル1 からの着信は設定要求で、次のように設定応答する
;            "#" 設定キャンセル : 設定し直さない => 何もしないで切断
;            "1" 応答          : ブラステル1 への転送設定
;            "7" 応答          : 留守電設定
;        ブラステル1 以外からの着信は、転送または内線鳴動&留守電
;    2. Asterisk内線 99 呼び出しは全員呼び出し
;    3. Asterisk内線から Asterisk内線の相互呼び出しができる
;    4. Asterisk内線から外線発信は 固定電話 (今は、ひかり電話経由で)
;        国内固定、国内携帯、フリーダイヤル、サービス番号(110, 119, 117, 104 など)
;        への発信ができる (海外発信はできない)
;    5. Asterisk内線から 100 を呼び出すと、音声追っかけ再生テストができる
;    6. ブラステル3への着信時は、内線(21--24)を入力してもらい、その番号を呼び出す
; いわゆるダイヤルイン操作。
;        21--24 の番号所有者へは、案内に従い内線(21--24) を入力してもらい、
;        指定のそれぞれの番号につなぐ。つながらないときは留守電Box:500番に録音する
;    7. 音声テスト : 内線で 100番を呼び出すと、話した内容をオウム返しに返してくれる
;    8. FAX送信はブラステル1 から行い、受信はfusionに行う
;       内線 4番への FAX は、スマホの「ひかりFAX」への送信となる
;       これはFAX送受信テストに使う (ブラステル1送信→スマホ、スマホから送信→fusion)
;
; パターンマッチングの意味
;   _1[1-3]  は    11,12,13
;             または [123]     と同じ
;   _1X       は    10--19   と同じ
;   _1Z       は    11--19   と同じ
;   _1N       は    12--19   と同じ
;   _1.        は    1XXX...XXX (X:0〜9,任意の桁数)
;
[globals]
MYNUMBER=0412345678           ; ひかり電話の番号
BRASTELNUMBER1=05023456789    ; brastel-hの番号
BRASTELNUMBER2=05034567890    ; brastel-mの番号 (現在、未設定)
BRASTELNUMBER3=05045678901    ; brastel-zの番号
FUSIONNUMBER=05056789012         ; fusionの番号
;
USEVOICEMAIL=YES
;
[default]
;**** 子機 11--12, 21--24 の呼び出し定義 (内線相互呼び出し)
exten => _1[1-2],1,Dial(SIP/${EXTEN},30)
exten => _1[1-2],n,Hangup()
;
exten => _2[1-4],1,Dial(SIP/${EXTEN},30)
exten => _2[1-4],n,Hangup()

; ボイスメールの再生 (留守電Box: 500番)
;
exten => 20,1,Goto(vm1,1)

exten => vm1,1,Answer()
exten => vm1,n,VoiceMailMain(500,s) ; sオプション : 再生時パスワード要求なし          
exten => vm1,n,Hangup() 
;
;exten => vm1,n,VoiceMailMain(${CALLERID(num)},s) ; 呼び出し番号別のボイスメール録音の場合(未使用)
;
;
;**** 全員呼び出し(30秒間呼び出す)
exten => 99,1,Dial(SIP/11&SIP/12&SIP/21&SIP/22&SIP/23&SIP/24,30)
exten => 99,n,Hangup()
;
;**** 音声再生テスト : コールすると話した内容が、追っかけ再生される
;
exten => 100,1,Answer()
exten => 100,n,Wait(1)
exten => 100,n,Playback(demo-echotest)
exten => 100,n,Playback(beep)
exten => 100,n,Echo
exten => 100,n,Playback(hello-world)
exten => 100,n,Hangup()
;
;;;
;**** ひかり電話への着信
; 発信元番号がブラステル1なら、400 に飛び、処理コード要求する
;     "#"入力時 : 設定キャンセル (設定し直さない => 何もしないで切断)
;     "1"入力時 : 転送モード設定
;     "7"入力時 : 転送モード解除 (留守電設定)
;
; 発信元番号がブラステル1以外なら処理コードに従い、転送または留守電になる

; 留守電モードのとき、留守電に入る前に30秒、子機 #11, #12が鳴動
; いずれの子機もアクティブでないときは、すぐに留守電モードになる
;
; "TRSW"は、Asteriskプロセスの環境変数 ENV(TRSW)として使用
;   環境変数に転送モード ("1")、留守電モード ("7") を外部変数扱いで設定
;   Asteriskは、呼を処理するたびに grobal変数は初期設定値に戻るため、
;   呼と呼の間で有効な外部変数が必要だった (一晩、徹夜で考えた)
;
exten => 200,1,NoOp(${CALLERID(num)})
exten => 200,n,GotoIf($[${CALLERID(num)} = ${BRASTELNUMBER1}]?400,1) ; ブラステル1 からの着信か? -->> 400

exten => 200,n,NoOp(ENV(TRSW))

exten => 200,n,GotoIf($[ENV(TRSW) =1]?300,1)   ; ブラステル1への転送か -->> 300

exten => 200,n(call-in),Dial(SIP/11&SIP/12,30) ; 子機 #11, #12鳴動
; 30秒間の子機呼び出しで無応答、またはいずれの子機もデアクティベーションのときは即時に留守電
;**** 留守電モードのとき
exten => 200,n(rec-voice),Answer() ; 着信に応答
exten => 200,n,Wait(1)                 ; 無音1秒でコーデック安定を待つ
exten => 200,n,Playback(vm-nobodyavail) ;「ただいま電話にでることができません」
exten => 200,n,Wait(1)                 ; 1秒待つ
exten => 200,n,Voicemail(500)      ; Voicemailには"vm-intro&beep"が含まれている
exten => 200,n,Hangup()              ;  「発信音の後にメッセージをお話しください。
;                                                  ;    終わりましたら電話を切るかシャープを押してください。ピーッ!」
;**** 転送モードのとき
; ブラステル3 経由でブラステル1に転送
exten => 300,1,NoOp(${CALLERID(num)})   ; デバッグ用に呼び出し元番号をCLIに表示 (CLIはAsteriskのコマンドラインインターフェース/コンソール)
exten => 300,n,NoOp(${CALLERID(name)})  ; デバッグ用に呼び出し元名前をCLIに表示
exten => 300,n,Dial(SIP/${BRASTELNUMBER1}@brastel-z,30,tT)  ; tT is "rtp via server ( rtp.conf | [general] | rtpstart=10000 | rtpend=10009 )" 訂正
exten => 300,n,Goto(200,rec-voice)             ; 呼び出し無応答は留守電
;
;**** 処理コード要求のとき : ブラステル1からの呼び出し時のみ
;
exten => 400,1,Playback(silence/1)    ; 無音1秒でコーデック安定を待つ
exten => 400,n,Set(TIMEOUT(digit)=5)
exten => 400,n,Set(TIMEOUT(response)=10)
exten => 400,n(retry-exten),Playback(tennsou-rusuden-no-settei) ;「転送は1を、留守電は7を、以前の設定のままは#を押してください」
exten => 400,n,Wait(1)                      ;
exten => 400,n,Playback(beep)          ;「ピーッ!」
exten => 400,n,Set(TRSWVAR="")      ; TRSWVAR: ローカル変数
exten => 400,n,Read(TRSWVAR,,1)    ; 1桁の番号が入力されたら、"#"なしに受け取る
exten => 400,n,GotoIf($[${LEN(${TRSWVAR})}= 0]?${EXTEN},noset-exten) ; "#" -->> no-set
exten => 400,n,GotoIf($[${TRSWVAR}= 7]?${EXTEN},reset-exten)  ; "7" -->> reset
exten => 400,n,GotoIf($[${TRSWVAR}= 1]?${EXTEN},set-exten)  ; "1" -->> set
exten => 400,n,Playback(number&jp-ga&disabled-2)  ;「番号が無効です」
exten => 400,n,Goto(retry-exten)

exten => 400,n(reset-exten),NoOp(${TRSWVAR})
exten => 400,n,Set(ENV(TRSW)=7)
exten => 400,n,Playback(rusuden-ni-settei)             ;「留守電に設定しました」
exten => 400,n,Wait(1)
exten => 400,n,Goto(exit-exten)

exten => 400,n(set-exten),NoOp(${TRSWVAR})
exten => 400,n,Set(ENV(TRSW)=1)
exten => 400,n,Playback(tennsou-ni-settei)              ;「転送に設定しました」
exten => 400,n,Wait(1)
exten => 400,n,Goto(exit-exten)

exten => 400,n(noset-exten),Wait(1)
exten => 400,n,GotoIf($[${ENV(TRSW)}= 7]?${EXTEN},pre-exit)
exten => 400,n,Playback(misettei-tennsou)  ;「設定は変更されません。現在の設定は転送です」
exten => 400,n,Goto(exit-exten)
exten => 400,n(pre-exit),Playback(misettei-rusuden) ;「設定は変更されません。現在の設定は留守電です」

exten => 400,n(exit-exten),Wait(1)
exten => 400,n,Playback(thanks)  ;「ご利用ありがとうございました」
exten => 400,n,NoOp(${ENV(TRSW)})  ; デバッグ用に環境変数(TRSW)の結果内容をCLIに表示
exten => 400,n,Hangup();

;
;**** ひかり電話からの発信
; +++ 10 桁, フリーダイヤルの 11 桁の形式が一致したら発信OK
; +++ 00 発信 (国際電話発信) 不可

exten => _0ZZX.,1,Set(CALLERID(num)=${MYNUMBER})
exten => _0ZZX.,n,Set(CALLERID(name)=${MYNUMBER})
exten => _0ZZX.,n,Dial(SIP/${EXTEN}@hikari-denwa)
exten => _0ZZX.,n,Hangup()
;
; +++ 携帯電話 (スマホ含む) の 11 桁の形式が一致したら発信OK

exten => _0N0X.,1,Set(CALLERID(num)=${MYNUMBER})
exten => _0N0X.,n,Set(CALLERID(name)=${MYNUMBER})
exten => _0N0X.,n,Dial(SIP/${EXTEN}@hikari-denwa)
exten => _0N0X.,n,Hangup()
;
; +++ 1 から始まる 3 桁番号 (警察、消防、時報など NTTのサービスダイヤルなどの形式

exten => _1XX,1,Set(CALLERID(num)=${MYNUMBER})
exten => _1XX,n,Set(CALLERID(name)=${MYNUMBER})
exten => _1XX,n,Dial(SIP/${EXTEN}@hikari-denwa)
exten => _1XX,n,Hangup()
; ***********************************************************************************
; これら以外の番号形式 (例えば海外発信) の発信は Asterisk の内線からはできない
; 海外発信は、ひかり電話本体から行う
; ***********************************************************************************
;
;
;;;;
;; ブラステル3 ダイヤルイン (21--24 振り分け)
;;
;[brastel-z]
exten => 440,1,Set(CNT=1)
exten => 440,n,Set(WHTDIAL=999)
exten => 440,n,Playback(silence/1)   ; 無音1秒でコーデック安定を待つ
exten => 440,n,Set(TIMEOUT(digit)=5)
exten => 440,n,Set(TIMEOUT(response)=10)
exten => 440,n(call-retry),Playback(yobidashitai-bangou) ;「呼び出したい人の内線番号を入力してください」
;                           ;「内線番号は、21がAさん、22がBさん、23がCさん、24がDさん、です」
exten => 440,n,Playback(beep)
exten => 440,n,Read(WHTDIAL,,2)  ; 2桁の番号が入力されたら、"#"なしに受け取る;
exten => 440,n,GotoIf($[${WHTDIAL}=999]?440,err-retry) ; 番号が 999 ならTimeout to Read
exten => 440,n,GotoIf($[${WHTDIAL}= 21]?${WHTDIAL},1)
exten => 440,n,GotoIf($[${WHTDIAL}= 22]?${WHTDIAL},1)
exten => 440,n,GotoIf($[${WHTDIAL}= 23]?${WHTDIAL},1)
exten => 440,n,GotoIf($[${WHTDIAL}= 24]?${WHTDIAL},1)
exten => 440,n(err-retry),GotoIf($[${CNT} > 1]?440,call-invalid)
exten => 440,n,Set(CNT=2)
exten => 440,n,Playback(mukou-bangou)  ;「この番号は無効です」
exten => 440,n,Wait(1)
exten => 440,n,Set(WHTDIAL=999)
exten => 440,n,Goto(440,call-retry)
exten => 440,n(call-invalid),Playback(mukou-bangou)  ;「この番号は無効です」
exten => 440,n,Playback(matigai-rusuden)  ;「内線番号を間違えていますので、留守電にします」
exten => 440,n,Voicemail(500)   ; 2回間違ったらVoicemail
exten => 440,n,Hangup()
;
;;;;
;
;**** FAX受信 : Fusion
;[fusion-fax-in]

exten => 56789012,1,Ringing
exten => 56789012,n,Answer()
exten => 56789012,n,Wait(5)
exten => 56789012,n,Dial(IAX2/iaxmodem)
exten => 56789012,n,Hangup()
;
;
;**** FAX発信 : brastel-h電話 in use
[fax-out]

exten => _0ZZX.,1,Set(CALLERID(num)=${BRASTELNUMBER1})
exten => _0ZZX.,n,Set(CALLERID(name)=${BRASTELNUMBER1})
exten => _0ZZX.,n,Dial(SIP/${EXTEN}@brastel-h)
exten => _0ZZX.,n,Hangup()
;
;
;**** FAXテスト...  ひかり電話から スマホ (内線-4)

exten => _X,1,Set(CALLERID(num)=${MYNUMBER})
exten => _X,n,Set(CALLERID(name)=${MYNUMBER})
exten => _X,n,Dial(SIP/${EXTEN}@hikari-denwa)
exten => _X,n,Hangup()
;
;::: end of extensions ::::

いかがでしょうか。

内線設定したスマホ子機からは、国際電話発信はできないようになっています。
国際電話をかける際は、ひかり電話機か、ブラステル電話機か、ブラステル設定のスマホからのいずれかになります。いまはブラステルも国際電話発信不可の設定です。

結局、フランスの娘一家には LINE で通話もしくはメッセージングしています。

我が家では、FAXも送受信できるように設定してあります。

また、転送時は発信元の電番が転送先に伝わるようにしてあります。
普通に転送だと、転送をリレーした電番(上の例ではブラステル3)が転送先に表示されます。

これらの設定は、extensions.conf だけでは実現できません。

FAXは、IAXmodem、Hylafaxというパッケージをプラグインし、設定する必要があります。
また、PCから送受信できるUIのプログラムも必要です。
(ブラステルでFAX送信の場合は、T.38パススルーの設定も必要です)

転送時の発番を転送先に表示するには、sip.conf への追記が必要です。

電話での応答に使う音声ファイルは、あらかじめ Asteriskにも用意されていますが、いくつかは、適切な音声ファイルがなかったので、作成しました。

作成方法は、次の機会にでも。


》Asterisk構築・終わり

ご質問等は、コメントください。わかる範囲でお応えします。


【修 正】
2017-07-09 転送時、ブラステル1が呼び出しに応じられないときは留守電に設定変更