SmartTalk 安定化覚書

格安SIMで050電話(Smarttalk)を安定して使うための覚書となります。

着信問題

Smarttalk純正アプリの問題点

Wi-Fiからモバイルに切り替わったときに着信しなくなる

スリープ時に着信しなくなる問題は、対策されたようですがネットワークが切り替わった際にうまく再接続が行われず、着信しなくなる問題を確認しました。

モバイル回線のみ使用するような設定も見つからないため、純正アプリは、使えません。

Grandstream Wave(GS Wave)

SmartTalk純正アプリが不安定で使えないため、GS Waveを使います。

Grandstream Wave

Wi-Fiとモバイル回線の切替、ルーターからWi-Fiを一時的に無効化して復帰させるなど試したところ、
特に問題なく再接続が行われ着信できることを確認しました。

設定

caption

caption

Register ExpirationだがSIPログを確認したところ、600秒(10分)に補正されるので変更する必要は、ほとんど無い。
詳しく調査はしていないが1200秒に設定したところ600秒に固定されているようだ。

NAT Traversal

NAT環境で使用する場合、極端に言えばWi-Fiを使用するならほぼ必ずNAT環境なのでこれを解決しなければならない。
これに関しては、初期値のKeep Aliveのままで特に問題は無いと思う。

コーデック

IP電話では、お互いのコーデックを照合し、お互いに一致したコーデックを使用する。
従来の固定電話や携帯電話は、PCMU(G.711μ)を使用する。
ひかり電話は、PCMU(G.711μ)が使われている。

Smarttalkで使用できるコーデックは、以下の通り

必要帯域の小さい順にSpeex(8kHz), iLBC, GSM, G711μ(PCMU|PCMA), G.722
名称 必要帯域 備考
Speex(8kHz) 2-24kbps 極端な安定しない回線向け
iLBC 16kbps Smarttalkのデフォルト(LTE)
GSM 13kbps 3G回線・不安定な格安SIM向け
G711μ(PCMU,PCMA) 64kbps LTE回線・Wi-Fi(SmarttalkのWi-Fiのデフォルト)
G.722 64kbps LTE回線・Wi-Fi

GS Waveのコーデックは、Wi-Fi・モバイル問わず上から...
PUMU → PCMA → G722 → iLBC → GSM → G729 → G726_32 → OPUS
...に設定し、すべて有効にしておいた。

一般的に固定電話や携帯電話、すなわち従来型の電話では、PCMUが使われるのでPCMUを最優先にしておけば良いだろう。

caption

スリープ時の着信問題 (Dozeモード回避)

しばらく端末を放置していると深い眠りについて着信しなくなる問題がある。
基本的に端末の設定でバッテリーの最適化の対象外にGS Waveを登録しておくことで回避できる。

Android 6以降

Dozeモード

Androidのバッテリー節約機能である。

  • バッテリーで稼働
  • 端末を動かしていない(机の上に置いたままなど)

このような条件下でDozeモードに入り、ネットワークアクセスなどを制限される。

  1. 画面消灯
  2. 30分後に軽いアイドル状態
  3. 更に30分後に5分間メンテナンスウィンドウ
  4. そして1時間のDozeモード。

という流れらしいので29分毎ぐらいに定期的に画面を一瞬点灯させるマクロを動かしておくのも得策だと思うし、なんだかんだで確実な方法だと思う。

Androidの設定

P20 Liteでの設定だがAndroid端末だとだいたい似たような感じだと思うので参考程度に...

設定 → 電池 → その他の電池設定

端末スリープ時も接続状態を維持を有効にしておく。

設定 → アプリ → 特別なアクセス(...) → 電池の最適化
  1. すべてのアプリ
  2. GS Wave許可しない
  3. Heartbeat Fixer for GCM許可しない (入れてある場合)

adbコマンドが使用できるなら、次のコマンドでホワイトリストに強制的に登録する方法もある。
たぶん電池の最適化で設定するのと同じなのでadbコマンドなど使う必要はないと思う。

adb shell dumpsys deviceidle whitelist +com.grandstream.wave

またMacroDroidなどを使い、30分程度に1回、画面を点灯させるマクロを組んで回避する方法もある。

Heartbeat Fixer for GCM

プッシュ通知されない問題を回避するためのアプリがある。

Heartbeat Fixer for GCM(Google Play)

格安SIMの中には、一定時間通信が無い場合にセッションを切断するものがあるのでこうしたアプリを使うことでそれを回避できる。
正直なところ、効果があるのか不明だが念のために入れておくと良い。
設定は、Wi-Fi・LTEともに初期値の5分で特に問題ないだろう。

Bluetoothオーディオ

おそらく機種依存ではあるが、Bluetoothイヤホンなどを使用していると相手の声を聞き取れない問題を確認した。

そのような場合、Bluetoothのプロファイルの設定で通話の音声を無効化しておくことでBluetooth接続時でも本体から電話の音声を聞くことができる。

検証

端末は、P20 Lite、回線は、0SIMを使用して計測を行った。

  • Heartbeat Fixer for GCMを有効化し、間隔を5分に設定
  • adbコマンドにより、GS Waveをホワイトリストに登録済み

モバイル回線で1時間ほど放置して検証したところ、正常に着信できた。

バッテリー使用量は、GS Wave単位で0.52mAhであった。
スマホのバッテリー表示は、100%のまま変わっていないので気にするほどバッテリーを食っていないと判断して良いだろう。

データ使用量は、上下合わせて約38KBだった。

SIPメッセージのデータ量

サーバーからExpiresの指定があった場合、それの半分の時間毎に更新を行うようになる。
つまり、5分毎にREGISTERリクエストが発生している。
ちなみに1回あたりのデータ量は、2500バイト程度なので1日あたり720KB、月換算で約23MBとなる。
SIPログから推測したものなので目安でしかない

adbコマンドによるDozeモード検証

画面OFFの状態でテストを行うこと

まずは、次のコマンドを実行する

adb shell dumpsys deviceidle enable adb shell dumpsys battery unplug

IDLEになるまで繰り返す(Dozeモードに移行させる)
3回ぐらい繰り返すと良い

adb shell dumpsys deviceidle step

Dozeモードかの確認、mState=IDLE であればDozeモードになってる

adb shell dumpsys deviceidle

GS WaveがDozeモードになってるかの確認。Idle=trueになってればDozeモード状態。

adb shell am get-inactive com.grandstream.wave

電池の最適化で除外している場合は、Dozeモードにならない。

ここで着信できるかなどのテストを行う。

完了したら元に戻す

adb shell dumpsys battery reset adb shell dumpsys deviceidle disable

P20 Liteで上記コマンドを使用してDozeモードに移行し、検証したところだと正常に着信できた。
電池の最適化を有効にした状態でDozeモードに移行した場合は、着信できなかった。
電池の最適化から除外した場合は、着信可

実際に放置することによる検証

1時間20分ほど放置しての検証では、正常に着信できた。

テストケース

Wi-Fi電波切断テスト

画面OFFの状態でWi-Fiルータ側でWi-Fiを切断し、自動復帰されるかをテストしてみた。
スマホに触らずにスマホのWi-Fiを切断、モバイル通信は、無効状態。

Wi-Fi切断方法は、ルータ側でチャネル再割当てを行う。

結果

状況にもよるが3分程度で復帰できた。

1時間10分ほど放置されてのテストでは、正常に復帰し着信できた。