2015年2月15日日曜日

自撮り棒からフォーンプラグのリモコン制御を調べてみる

 私の住んでいる北海道の地方都市には近年アジアからの観光客が多数来訪しています。特に南方の香港と台湾の方々は冬期になるとよく見かけます。
 そんな彼らは最近自撮り棒を持参していることがよくあります。要は黒板を示すときの延長可能なスティックの先端にスマホを取付可能な構造なのですが、Xperiaの場合は棒の手元のシャッターボタンが動作しないという話があるのでちょっと調べてみました。

1.自撮り棒(有線版)のシャッター制御

フォーンプラグ(イヤホンプラグ)にジャックを差し込んで有線制御するタイプの自撮り棒でXperiaでの動作不能の原因はカメラアプリが標準ではボリウム調整ボタンでズームアップ・ダウンに設定されているためです。
 これはカメラアプリの「音声キー設定」で「シャッター」に設定変更すれば動作します。ま、ズームアップはスワイプで制御しましょう。

2.フォーンプラグでのリモコン制御方法

4極フォーンプラグでマイクが付属されており、さらに3〜4個のボタンが付いているものがあります。最近の4極プラグはCTIAという規格(以前自分が使用していたXperia arcはOMTPという別規格だった)なのは知っていたのですが、このボタンがどのような回路で制御されているかちょっと調べたので記録に残します。
 Androidの場合はWired audio headset specificationで記載のとおりでした。要は再生ボタンはマイクとGNDをそのままショート、240Ωの抵抗値の場合はボリウム+、470Ωの抵抗値の場合はボリウム-制御になるということですね(おまけになりますがボイスコマンド制御は135Ω抵抗値とも書いてます)。

3.自撮り棒用撮影ボタンの作成・入手

 買ったほうが安いと思いますが、もし自分で作るならボタン押し下げでボリウム+と同じ抵抗値になる様に作れば良いと思います。自作するなら、リモコン制御用の中継線を作ると思いますが、どっかに売ってないかなぁってamazon辺り見ていたら有りますね。ただし音が悪くなるとかの書込を見る限りではあまりメリット無いかなぁ。

4.おまけ 4極プラグでの制御について
 2項でも記載しましたが、最近4極プラグに3ボタンのイヤホンが発売されています。店頭での視聴時にボタンアサインが正常に動かない事例があったので、これについておまけを記載したいと思います。
 上記の Wired audio headset specification で記載の内容を参考に治具を作成してみましたが、GNDはそのまま接続しさらにMicも1kΩ以上の抵抗で常時接続状態にしておかないとフォーンプラグは正常に動作しません。
 Micに対して並列の抵抗+スイッチが押された際にMic端子への合成抵抗が上記0・135・240・470(±1%)Ωの際にそれぞれのコマンドを認識するということのようです。今回視聴したイヤホン(ゼンハイザーのMomentum In-Earでした)では真ん中のボタン(Play/Pause/Hook?)がVol-Upとして認識されており、抵抗値があるのかもしれません。

2015年2月3日火曜日

MVNOでドコモから逃げる算段をする(GPS篇)

10年以上ドコモを使ってきたけど、スマートフォンからは迷走が続いてるような気がする。
それ以前は護送船団方式を取らないと自分たちの実現したいサービスを均一に保てないのは当然だったと思うけど、今のスマートフォン戦略は色んな意味で私の望む方向性とは違う。

  • 昔のメーカ製PCじゃないんだからプリインアプリをてんこ盛りにしないで欲しい(しかもバッテリドレインやメモリ大量消費・バグ満載のオマケ付き)。
    特にドコモ専用のホームアプリは不要だと思う。
  • キャリア販売店の保障は要らない。端末メーカからのハードウェア保障は欲しい。
    自分のように端末を弄りたい人間にとってはドコモの端末保障は不要。
    (わかってやっているのだから逃げ道まで塞がないで欲しい)
  • インフラ整備は確かに投資が厳しいのは非常によく分かるのだが、今の料金体系は正直高過ぎと感じる。
    家族3人分で新しいカケホーダイ+パケットシェアパックの見積もりを取ったが、現状より月9千円高くなった(そのうち2台分はパケットを使用していない契約からシェアパックに切替なので高くなるのはわかるとしても)。
というわけで、今まではお世話になったり我慢して使ってきたけど、MVNOという便利な仕組みが出来てキャリアの縛りは不要になってきたので、現状使用しているSO-02Eをそのまま移行する場合はどのようなデメリットが出るかをざっと考えてみた。
あ、あえて言うけど他のキャリア2社との契約はありえない。ドコモと同じく端末の縛りがあるのが一番の理由だけどそれ以外も以下の通り。
  • KDDI:CDMA-Oneの頃の交換網接続にかかる時間が遅過ぎのイメージがあったり、結局万年2位の染み付いたようなプロモのやり方(様子見後追いで同様のサービスを派手に盛り上げようとする態度)が嫌い
  • ソフトバンク:商売は上手だと思うけど、企業倫理的に気に食わない。ゴリ押しと必要性で900MHz帯域を整備出来たのはいいけど、その皺寄せを保守受託先や施工会社に押し付けたのは知ってるぞ。
それにドコモのスマホなのでMVNOで他社キャリアへ乗り換えても電波的にメリットはないから、自ずとドコモ系のMVNOとなる。という訳で以下でMVNO化してサービスが低下しそうな項目を挙げてみた。
  • 電子メール:キャリア独自のものは使えない。もともとそんなに使っていなかったので問題なし。
  • ネットワーク速度:現状はXiのパケホーダイダブルのため、普段はモバイルネットワーク常時無効であった。MVNO化してパケットが使えるのならば通信速度が落ちてもサービスは向上したので問題なし。
  • Felica:ひとつの問題点。ドコモのサービスに直結しているものはどうしようもないだろう(iDとかは使ってないので問題なし)。
    Suicaとかはドコモのサーバとは関係なく独立しているようなので動くようだ。
    正直交通系のうち、使いそうなのは航空会社のモノだけだし、普段は使わないので実害はなさそうだ。
  • GPS:今回の最大の問題点。とは言っても全く使えなくなるわけではない。ColdStartの時に非常に現在値表示までに時間を要するだけ。
という訳で今回はMVNOで問題となっているGPSの件、どうやったら解決できるか考察してみた。

1)問題となるGPSの接続について

 GPSを使用する場合、衛星からすぐに情報自体は受信しているのですが、それが位置情報となるには手順を踏む必要があるようです。
 初期化状態で受信する際はColdStartと言われる手順で衛星の位置情報を収集する必要があります。
 一度位置情報を確立したあとでは、WarmStartHotStartという手順で再測位を高速化可能なのですが、要はColdStart時に出来るだけ測位を早くする仕組みが(A-GPS)現在のスマホは内蔵されています。方法は以下の2種類あるようです。
  • SUPL 通信キャリアが提供するSUPLサーバより補正情報を受信する
  • GPSチップ独自規格 SUPLを使用出来ない環境でも同様のサービスを提供する
 ただし、ドコモのスマホ内部設定ではSUPLにドコモのサーバを指定しその接続にはSPモード(ドコモ内部の通信網)を使用するため、MVNOに移行した端末(普段モバイルネットワークを無効にした端末も)はColdStart時の接続確立に非常に時間がかかります。
 ちなみにSO-02EにはGPSチップ独自規格としてQualcommのgpsOneXTRAが使用できるようですが、これもGPSチップドライバのハードコードで機能自体を無効化されているようです。
 ちなみにMVNOによるGPSの動作に関する詳細はこちらを読むと非常にわかりやすい。MVNOの代表格とも言えるIIJの方が検証した内容なので非常によくまとまっているし、信頼度は高いです。

という訳で以下の通り修正が必要なようです。

2)アプリで何とかする方法

先に紹介したIIJの資料によるとGPS Status and Toolbox を使用すると、直接GPSデバイスドライバへAPIを叩いてA-GPSデータを取得するようです(多分この場合はSO-02Eの場合はgpsOneXTRAのサーバへ問い合わせするのでは?)。
 たしかにこの方法ならインターネット接続さえされていればA-GPS情報を取得可能でしょうし、測位終了後別なアプリを開けばスムーズに使えると思います。
 実際このアプリは常用させて頂いております。現在補足中の衛星を全部表示してくれるため非常に見やすいし、自分の場合はモバイルネットワークを常時切りのためSUPLは取得出来なかったので...。

3)gps.confの書換とルート証明書のインストール

 /system/etc/gps.conf がGPSの設定ファイルです。現状のドコモのスマホの場合は大概以下のとおり記載されているので、これを書換えます(要はSUPLはGoogleのサーバを使用し、gpsOneXTRAの設定を有効化、NTPサーバを日本に変更する)。
変更前(対象箇所のみ抜粋)
SUPL_HOST=dcm-supl.com
SUPL_PORT=7275
SUPL_VER=0x20000

#XTRA_SERVER_1=http://xtra1.gpsonextra.net/xtra.bin
#XTRA_SERVER_2=http://xtra2.gpsonextra.net/xtra.bin
#XTRA_SERVER_3=http://xtra3.gpsonextra.net/xtra.bin

NTP_SERVER=time.gpsonextra.net
変更後
SUPL_HOST=supl.google.com
SUPL_PORT=7276
SUPL_SECURE_PORT=7278
SUPL_NO_SECURE_PORT=3425
SUPL_TLS_CERT=/etc/SuplRootCert

AGPS=http://xtra1.gpsonextra.net/xtra.bin
XTRA_SERVER_1=http://xtra1.gpsonextra.net/xtra.bin
XTRA_SERVER_2=http://xtra2.gpsonextra.net/xtra.bin
XTRA_SERVER_3=http://xtra3.gpsonextra.net/xtra.bin

NTP_SERVER=ntp.nict.jp
NTP_SERVER=jp.pool.ntp.org
NTP_SERVER=0.jp.pool.ntp.org
NTP_SERVER=1.jp.pool.ntp.org
NTP_SERVER=2.jp.pool.ntp.org
NTP_SERVER=3.jp.pool.ntp.org
次に以下のサイトを参考にHTTPSでSUPLを接続する際のSSLルート証明書SuplRootCertを作成します。これは自分のPCの内部でコマンドを実行し、作成します。
wget https://www.geotrust.com/resources/root_certificates/certificates/GeoTrust_Global_CA.pem
openssl x509 -inform PEM -in GeoTrust_Global_CA.pem -outform DER -out SuplRootCert
作成・修正したgps.confとSuplRootCertは実機の/system/etcに複写します。念のため、元のgps.confのバックアップは保存して下さい。

4)ドコモ版ではないGPSドライバをインストール

海外版のC6603のftfファイルをダウンロード後、system.sinを抜き出してその中から/system/lib/hw/gps.default.soを取り出します(ここで前日に書いたftfファイルへのアクセス方法が必要になる)。
 あとは自分の端末の/system/lib/hw/gps.default.soと抽出したものを取り替える。


Linux Mintでftfファイルの中身を見る方法(出来るだけシェルは使用しない)

変態と言われるかもしれないが、自分のメイン環境はLinux Mintです。
PC CompanionのようにどうしてもWindowsでなければ動かない環境時は常にこちらがメインになっております。
という訳で今回、ftfからファイルを取り出す方法をLinux Mintで出来るだけシェルを使わずに行ってみました。


1)ftfファイルから希望のsinファイルの抽出


 アーカイブマネージャを起動し、ftfファイルを読み込みます(ftfファイルの実体はzipファイルです)。
 希望のsinファイルを選択し、「展開」ボタンを押し保存します。

アーカイブマネージャによるftfファイルの展開


2)sinファイルからext4ファイルを抽出


 flashtoolを起動し、「Tools->Sin Editor」でSin Editorのダイアログを表示させます。
 ダイアログの"..."で操作対象のsinファイルを指定し、"Extract data"を押してしばし待つとext4を拡張子にしたext4形式のイメージファイルが生成されます。
flashtoolの初画面
Sin Editorのダイアログ




3)ext4イメージファイルをマウント


 Linux Mint(Ubuntu Linux)の場合、"gnome-disk-image-mounter"というものがインストールされています。これだけは標準ではシェルスクリプトでコマンドを入れないとでませんが、起動後にイメージファイルを選択するとCinammonのウィンドウ左側に指定したイメージがマウントされているのがわかるかと思います。

 なお、"/usr/share/applications/gnome-disk-image-mounter.desktop" ファイルを編集し、"NoDisplay=true"をコメントアウトすると、Cinammonのメインメニュー最上部にあるテキストボックスに"disk"と入力するとディスクイメージマウンターが表示されます。