Unihertz TITANでSMARTalkを使う(GCMタイムアウトをなんとかしてプッシュ通知を受け取る)

やりたいこと

 SMARTalkを実用水準に持っていきたい。あわよくば自宅の@Niftyフォン-Cの番号も持ち歩きたい。

現状

  • 自宅の@Niftyフォン-Cは光回線にぶら下げたWi-Fi経由でGalaxy S2(Android2.3.6)にインストールしてあったSipdroidでレジストして使っている。発着信共に問題なし。
  • Blackberry KEY2にSipdroidを入れてSMARTalkにレジストして使っている。KEY2のマイクの音量が小さすぎて,探し回ったところSipdroidのマイクブーストを最大にすればなんとか音を拾ってくれた。
  • KEY2でレジストしているSMARTalkで着信しない。レジストして10分くらいは着信できるが,スリープに入ると着信しなくなる。復帰しても着信できないまま。

 ということで,最近KEY2のキーボードにも不調が出てきたことなので,予備機として玩具にしていたUnihertz TITANでSMARTalkを使い,あわよくば自宅の@Niftyフォン-Cの番号もまとめて一台にできないかと画策したところ,なかなかうまくいかなかったのでメモを残しておく。
 まずはTITANにSMARTalk標準アプリを入れて設定を行い,ウッキウキで実地試験に臨んだ。

発生した問題

 Unihertz TITANがスリープ状態になると数分~十数分の間のどこかのタイミングでプッシュ通知を受け取れなくなり,SMARTalkの純正アプリで着信ができなくなる。スリープから復帰しても着信できないままになっている。
 この現象自体はBlackberry KEY2でも起きていたのだが,マイクの不調(?)のせいでSMARTalk標準アプリが使えずSipdroidを使っていたので,SMARTalk側が15分くらいでSIPのセッションを切って(プッシュ通知のみにして)留守電に切り替わっているのではないかと思っていた。
 対してTITANではSMARTalk標準アプリならプッシュ通知を受け取れて着信できるだろうと思っていたが,KEY2でSipdroidを使っていたときと同じ現象がおきた。
 さらには着信方式を「通常(セッションを維持したまま着信を待つ)」にしても状況は改善されなかった。
 実際にはどうやらAndroid6から実装されたDozeモードが悪さをしている可能性と,プッシュ通知で使われているGCMがタイムアウトしている可能性,あるいはその両方が考えられる。
 TITANは(この記事の時点で)最新のネットワークアップデートでAndroid10にしてある。

試行したこと

 TITANの省電力機能を片っ端から切っていった。

  1. 設定→アプリと通知→詳細設定→特別なアプリアクセス→電池の最適化 ですべてのアプリを表示させ,SMARTalkが「電池の最適化の使用不可」になっていることを確認した。
  2. 設定→スマートアシスト→アプリ制限 でアプリ制限をオフにした。
  3. 設定→電池→バッテリーセーバー→スケジュールの設定 でスケジュールなしを選択,フル充電で無効をオンにした。
  4. 設定→電池→バッテリーマネージャ でバッテリーマネージャの使用をオフにした。
  5. SMARTalkアプリ側で「スリープ中にWi-Fiを切らない」設定を行った。

参考:

www2.kokoro-navi.com

 これで(おそらく)省電力機能からは解放されたと思われる・・・が,改善してくれなかった。そこで,省電力回りでできることはもう無いと判断。
 スリープモード(Dozeモード)でアプリが切られていなくてもプッシュ通知が取れない,つまりGCMセッションが切れているのではないかと推測。

  • Google Playから「Heartbeat Fixer for GCM」をインストール,上記省電力から除外する手順を踏んで省電力で落ちないように設定。
  • Heartbeat Fixer for GCM の設定で10分毎に設定

play.google.com

 この状態で一時間半放置し,Dozeモードに入っているはずの時間帯で自宅回線から発信し,SMARTalkで着信できることを確認した。

参考:

qiita.com

 ここまではWi-Fi環境での実験だったので,3G(4G)回線でも通用するか試してみる。3G回線はDoCoMoMVNO回線を使っているIIJmioのデータ通信専用格安SIM。これでうまく着信できれば実用上問題はなくなる。
 Wi-Fiを切って一時間半待ち,その後自宅回線から発信して着信を確認。通話品質も問題ない。これでようやくTITANでSMARTalkを持ち運べる。

自宅で使っている番号でも着信したい

 ここまでの手順をSipdroidでも試行して,@Niftyフォンでも発着信できるようになれば,自宅で使っている番号とSMARTalkの番号の両方を一台のすまほに入れられる。ただし,Sipdroidは電話帳機能がなく,SMARTalkを標準の電話アプリの代わりに使っていたらSipdroidを選択して発信できないので,標準の電話アプリを試して発信番号を選択できるかどうかを確認しておきたい。まあ,自宅の番号として使ってきたものを無理やりすまほに突っ込んで持ち歩く必要まではないので,だめならだめでかまわない。
 現在はAndroid2.3.6のGalaxy S2に入れていたSipdroidで@Niftyフォンを使っているため,スリープモードでタスクが死ぬこともなく安定して着信できている。これを一台にまとめて,自宅にいるときは自宅用番号も受けられるようにできれば有難い。
 とはいえそもそも@Niftyフォンは本来自社の回線網(有線)でしか対応していないのを我が家ではWi-Fi環境下のSIPクライアントでつないでいるわけで,そもそもスマートフォンで扱うようにはできていない。

実験1:IIJmioの回線で待ち受けてみる

 Sipdroidに自宅で使っている@NiftyフォンのSIPサーバを登録,別端末でSMARTalkのSIPサーバに登録。上記の省電力機能から除外する設定を一通りSipdroidにも設定しておいて,IIJmioの回線で着信と通話ができることを確認した後,Dozeモードに入ったあたりでSMARTalkから発信。こちらは着信せず。Sipdroidはプッシュ通知を使っていないのでそりゃそうだといったところ。TITANの省電力からは逃げられないのか。

実験2:Wi-Fi環境で待ち受けてみる(本命)

 ということで,Wi-Fiにつないで@Niftyフォンに着信することを確認して,一時間半放置してみる。着信せず。
 どうやらSipdroidは様々な除外設定をしてもDozeモード中に寝てしまうのだろうか。そこで,Doze Busterというアプリを使ってDozeモードに入らないようにしてみる。

play.google.com

 画面を定期的に一瞬点灯させる機能をオンにしてみたが,どうも機能していない。
 ということで画面点灯機能を使わずに試してみたんだけど着信せず。ログを確認してもDozeモードには入っていないので,これはSipdroidとTITANとの相性問題かと思われる。
 自宅番号をTITANに入れて着信させるため,Blackberry KEY2にインストールしたSipdroidでSMARTalkにレジストして,TITANの自宅番号側から発信してみたところ,Doze Busterが生きていれば着信できたので,SipdroidはAndroid8.1ではDoze Busterが生きていれば寝ない。他のSIPクライアントは試していない。
 なお,TITANではAndroid標準の電話アプリからSIPの設定項目自体が消えていた。

結論

 Wi-Fi接続と3G接続(IIJmio)共に以下のような結果となった。

  • Unihertz TITANでSMARTalkを使うためには,各種省電力機能のオフや対象除外の設定と共に,GCMタイムアウトしないように何らかの手当てが必要。
  • GCMタイムアウトを防げれば通常のプッシュ通知着信ができるようになる。これはWi-Fiでも同じことがおきたので,MVNO回線じゃなくても起きると思われる。
  • TITANとSipdroidの相性が悪いのか,スリープに入るとSipdroidで着信できなくなる。

 当面は自宅回線はGalaxy S2のままで誤魔化して,持ち出しは諦める。SMARTalkはUnihertz TITANで持ち出せる。自宅番号の維持にはIP電話対応ルータを入手するのが確実だな。今でも売ってるの?光電話対応ルータあたりでもあればいいんだが。
 入手に難があるなら今のうちにAndroid5.xまでの端末を用意しておいて,Dozeモードの呪縛から逃れる算段をつけておく必要がありそうだ。あるいは,充電中はDozeモードに入らないということなので,自宅番号を着信したい端末は常に充電ケーブルをつないだままにしておいて固定電話のように扱うか。
 (11/27追記)VoIP対応ルータはYAMAHAにある。

network.yamaha.com

 AmazonでもVoIPアダプタはけっこう並んでいた。

www.amazon.co.jp