ZenFone2 Laserで「みちびき」は捕まえられるのか

欧州の衛星測位システムの「ガリレオ」が12月15日からサービスインしたらしい。ガリレオは一応「全地球測位システム」なので日本でも利用できる。ガリレオは米国のGPSと較べて測位が速く精度が高いのが一応売りということになっているので利用できるようになるのが楽しみだが、ガリレオに対応する衛星ナビゲーションシステム用のレシーバー(チップ)とソフトウエアの対応が必須。Androidでは対応チップ搭載で且つOSが7.0 Nougat(ヌガー)以上で利用可能という認識でいるが合ってるかな?
そうだとしたらAndroid6.0止まりの「がとらぼ」の中の人はガリレオは使えない。

そういえば、日本の衛星ナビゲーションシステムの「みちびき」は使えるんだっけ?ということで確認。こちらは現在出回っているAndroidならバージョンは特に気にしなくて良いが、対応チップ搭載は必須。つまりGPS対応のスマートフォンであっても機種によって「みちびき」を使える使えないが発生する。機種のカタログを見る際はQZSS(Quasi-Zenith Satellite System)に対応していることを確認する。
でも、現在は「みちびき」の衛星は1機しか上がってないので「みちびき」だけでは位置を特定できない。複数のGPS衛星と組み合わせて使うことになる。だから「みちびき」の対応有無を重視して機種を選定するというのは意味がない。

「みちびき」は準天頂衛星(QZS)というくらいなので日本で空を見上げた時に真上近くの場所に居ることになっているが、日本は赤道からだいぶ離れているので静止衛星として常時日本上空に留まることができない。そこで非対称の8の字を描くように日本とオーストラリアの間を行ったり来たりする。衛星が数台あれば常に1機以上が日本上空に居るようにできるだろうけど1機しかないので日本の真上には1日に8時間程度しかいない。なお、衛星がオーストラリアの上空に行っても地球からはかなり離れている(地球に最接近時で32000km = 地面から衛星まで地球2個以上が入る距離)ので日本から見て地平線より下になるわけではない。開けた場所であれば常に空に見えるところに居る。要するに真上近くに8時間、残り16時間は斜め上空といった感じ。
既に運用されている1機に追加して一応2017年に3機が上がり、8の字を描く準天頂衛星が3機と静止衛星(3号機)1機の計4機体制になる予定。2023年には7機体制も予定されている。

みちびき 4
「みちびき」は地球からの距離が近地点で約32,000km、遠地点で約40,000km。地球の直径が12,742kmということなので、近くて地球2.5個分、遠くて3.1個分くらいのところをまわっていることになる。画像はhttp://www.lizard-tail.com/isana/tle/misc/what_is_tle.htmlさんのところで国際宇宙ステーションのISSの軌道の3Dマップを表示したものから拝借しています。赤い線が「みちびき」の軌道つもりだが、これは「がとらぼ」の中の人が地球との距離の参考用に勝手に作ったものなので正しい軌道ではない。地球の表面近くを通る緑の線がISS。ISSは地表から400km程度ということなのでそれと比べると「みちびき」はかなり地球から離れたところにあるのがわかる。また、月までの平均距離384,400kmと比べると「みちびき」は月までの10分の1に届かないというのも解る。地球から離れていると思っても月までに比べると全然近いということになる。
ちなみに先のリンクのページには「みちびき」の軌道もあるので上の画像のように「がとらぼ」の中の人が作った軌道よりそちらを見る方が良いかも。

みちびきは国の衛星なので内閣府がウェブサイトで情報を提供している。そこでGNSS ViewでAndroid用、iOS用のアプリが提供されている。ついでにWeb版というのがあるのでアプリが無くてもブラウザで衛星の位置を見ることができる。

みちびき 1
GNSS Viewのウェブ版で現在時刻の測位衛星の位置を見てみる。
円の中心が空の真上、円周が地平線、上が北。かなりいっぱいの測位衛星が居る。

  • 水色の● :   米国のGPS(GPS)
  • 緑色の● :   ロシアのGLONASS(GLO)
  • 紺色の● :   欧州のガリレオ(GAL)
  • ピンクの● :   日本の「みちびき」(GZS)
  • 橙色の● :   中国の「北斗-2(BeiDou,コンパス)」(BDS)
  • 黄色の■ :   日本の衛星航法補強システムのSBAS(SBS)
  • 橙色の■ :   中国の「北斗-2(BeiDou,コンパス)」の静止衛星
  • ピンクの■ :   日本の「みちびき」の静止衛星 (未打ち上げ)

色は関係なく■にはGEOと書いてあるので静止衛星を示しているみたい。
だから、黄色の■のSBASはおそらく「ひまわり」などの運輸多目的衛星を示すと思われる。(未確認)

みちびき 2
余計なのは外して「みちびき」1号機だけにする。ピンク色の193がそれ。円のほぼ中心なのでちょうど真上あたりにいるのがわかる。

みちびき 3
ZenFone2 Laser ZE550KLにGPS Testのアプリを入れて試してみた。
このアプリは国別の衛星補足個数表示があるので解りやすい。(円のすぐ下)
GPSが7個、グロナスが6個、北斗が5個でみちびきが0個、そしてそこに居る筈の円の中心に193(または1)が表示されていないので結果としてはZE550KLは「みちびき」非対応。逆に期待していなかった中国の北斗に対応している。
あと、衛星測位システムだけは降り注ぐ電波を一方的に受信するだけなので機内モードにしていても使える。

あれっ?ZE550KLはQZSS対応って書いてなかったっけ。ZenFone2 (ZE551ML)と情報ごっちゃになってるのかな。それとも、ハードウェアは対応しているけど日本版ファームウェアしか対応していないってことかな?ハードウエアが非対応だった

ZE550KLのSoCはSnapdragon 615だけど、スペックを見るとZQSSには非対応みたい。ZE500KLのSnapdragon 410のスペックも同様。

みちびきの送信信号

L1C/A衛星測位サービス1575.42MHz
L1C衛星測位サービス1575.42MHz
L1Sサブメータ級測位補強サービス
災害・危機管理通報サービス
1575.42MHz
L1SbSBAS配信サービス1575.42MHz
L2C衛星測位サービス1227.60MHz
L5衛星測位サービス1176.45MHz
L5S測位技術実証サービス1176.45MHz
L6センチメータ級測位補強サービス1278.75MHz
Sバンド衛星安否確認サービス2GHz帯
内閣府 みちびき(準天頂衛星システム:QZSS)公式サイトより

2017年前半までに販売されているスマートフォンで「みちびき対応」とされている機種は(おそらく)全てL1C/Aだけの対応なので「みちびき」のウリである測位精度改善はほぼ無い筈。ビルの谷間でも少しだけ衛星を捕まえやすい程度。だから、通り1本違う場所を示すことも十分ありえるレベル。
できたらスマートフォンでもサブメーター級のL1Sには対応して貰いたいところだけど、補強情報を受信するのにバッテリー消費が大きくなる問題があるそうな。あと、みちびき2機以上またはみちびき+GPS1機以上が見える場所にいないとダメらしい。
センチメーター級(L6信号)は測量機器向けっぽいのでスマートフォンでは今後も利用できる機種は出ないかと。専用受信機(とアンテナ)が要るので小型化しにくいし、計測に大きなタイムラグもあるようなのでスマホ向けじゃない感じ。

関連記事:

Z-PushがPHP7に対応したっぽい

Z-Push

Z-Push はオープンソースの Exchange ActiveSync。
個人でメールサーバをやると大抵は POP3 や IMAP4 になるけど POP3/IMAP4 には基本的にはメールサーバにメールが届いた時にそれをメールボックスのオーナーに知らせることができない。 IMAP4 には IMAP_IDLE があるじゃんというのはあるけど、ここではこの記事を成立せさるために口を瞑って欲しい。

個人運営のメールサーバで Push で通知を受ける(送る)方法が欲しいよねってときに意外と選択肢が無い。 ActiveSync というものがあるけどそれを使うのは色んな意味で昔は凄く大変だったというのは話としては聞いている。そんな時(何年も前だが)にひょこっと登場したのが Z-Push 。 IMAP サーバ(他)と PHP が動くウェブサーバがあれば(運が良ければ)簡単に ActiveSync できちゃうというなかなか画期的なもの。

ただし、登場した頃から基本的なインストール自体は簡単なもののまともに動くようになるまでが一苦労。それは8,9年たった現在も全く変わらない。運が良ければというのは自分のサーバー構成とそっくり同じな情報がインターネットのブログ/掲示板で見つけられればということ。そうでないと、そんなに膨大な設定があるわけでもないのに何故かなかなか上手くいかない。

そして、Z-Pushで困っていたのがPHP7登場からこれまで非対応状態が続いていたこと。PHP7対応リクエストはもちろんずっと出ていたし、プロジェクト側もPHP7に対応したいとは言い続けていた。でも、なかなか対応が進まなかったみたい。むしろ、「PHP7では動かないよ」メッセージが出るようにしてお茶を濁してた。一応有志によるパッチのようなものも出てはいたけど、なんかよく解らなくて「これだ!」って感じにはならなかった。
それがようやくVersion 2.3.4でPHP7に対応してきた。ただし、Ver.2.3.4は12月中旬現在ではまだβ1の状態。一応PHP7非対応のエラーが出まくるというのは無いみたいだけど、完全な動作までは期待しない方が良いかも。

インストール & 設定

Z-Pushのアーカイブを展開して /usr/local/www/z-push に置くとする。(この記事でのディレクトリ/ファイルの配置はFreeBSDの流儀なのでLinuxなどはその流儀で読み替える)
ログ用のディレクトリ /var/log/z-push と StateMachines 用のディレクトリ /var/spool/z-push を作成する。
# mkdir /var/log/z-push
# chown www:www /var/log/z-push
# mkdir /var/spool/z-push
# chown www:www /var/spool/z-push

ベースの設定ファイル /usr/local/www/z-push/config.php を編集する。(下は変更行のみ)

1
2
3
4
5
6
7
define('TIMEZONE', 'Asia/Tokyo');             //日本ならこれ
define('STATE_DIR', '/var/spool/z-push/');   //先に作ったディレクトリ
define('LOGLEVEL', LOGLEVEL_DEBUG);           //最初はデバッグログ要るよね
define('LOGAUTHFAIL', true);                  //最初は認証エラーも見るよね
define('PROVISIONING', false);                //クライアントに対して融通するならtrueだが端末がサーバに接続できないことになること多々
define('LOOSE_PROVISIONING', true);           //古いAndroidなどに対応するならtrue
define('BACKEND_PROVIDER', 'BackendIMAP');   //IMAPと連携(この記事の前提)

2017年11月13日修正:
設定例としてPROVISIONINGの値をtrueで書いていたが、端末からサーバへの接続が失敗することが多いようなのでfalseにしておいた。もちろんtrueの方が良い場合もあるはず。

IMAPとの連携用設定ファイル /usr/local/www/z-push/backend/imap/config.php を編集する。(下は変更行のみ)

1
2
3
4
5
6
define('IMAP_SERVER', 'mx.example.com');         //IMAPサーバのIPアドレスかホスト名
define('IMAP_PORT', 993);                        //IMAPサーバのポート番号
define('IMAP_OPTIONS', '/ssl/novalidate-cert');  //IMAPサーバとの接続オプション
define('IMAP_FOLDER_CONFIGURED', true);          //設定したよフラグなので必ずtrueに変更
define('IMAP_SMTP_METHOD', 'smtp');              //メール送信にSMTPサーバを使うなら
$imap_smtp_params = array('host' => 'ssl://localhost', 'port' => 465, 'auth' => true, 'username' => 'imap_username', 'password' => 'imap_password');  //SMTP送信をSSLでやるなら
Nginxの設定
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
server {
  listen 443 default_server ssl http2;
  listen [::]:443 default_server ssl http2;
  server_name mx.example.com;

  ssl_certificate     /usr/local/etc/nginx/ssl/server.crt;
  ssl_certificate_key /usr/local/etc/nginx/ssl/server.key;
  ssl_dhparam         /usr/local/etc/nginx/ssl/dhparams.pem;
  ssl_protocols       TLSv1.2 TLSv1.1 TLSv1;
  ssl_ciphers         EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4;
  ssl_prefer_server_ciphers   on;

  location / {
    root /usr/local/www/mx_example_com;
    index index.html;
  }

  location /Microsoft-Server-ActiveSync {
    root /usr/local/www/z-push/;

    fastcgi_connect_timeout 600;
    fastcgi_send_timeout    600;
    fastcgi_read_timeout    600;
    fastcgi_pass   unix:/var/run/php-fpm.sock;
    include        fastcgi_params;
    fastcgi_param  SCRIPT_FILENAME $document_root/index.php;
    fastcgi_param  SCRIPT_NAME     $fastcgi_script_name;
    fastcgi_param  HTTPS on;
  }
}

設定が済んだらNginxの設定再読込み。

# service nginx reload

確認

ブラウザでZ-Pushが動くサーバのFQDNに /Microsoft-Server-ActiveSync を付けてURL指定。
例: https://mx.example.com/Microsoft-Server-ActiveSync

Z-Push 認証
認証小窓がポップアップで出現するので実在するIMAPユーザーのアカウントとパスワードを入力。
認証小窓がポップアップしないならウェブサーバの設定が不適切かも。
ここで認証が通らなければIMAPサーバとの連携がうまく行っていないと思われる。

Z-Push ウェブ表示
認証後にこの画面が表示されれば取り敢えずは動いているといえる。
あとは ActiveSync 対応のメーラー(MUA)でこのサーバ(mx.example.com)に接続し、アカウントとパスワードは1つ上の画像で認証出来たものを使用してメールの送受信が出来ることを確認。そのメールアドレス宛にメールを送信してメール着信通知が届くか確認。

ただし、1発でサクッと成功することはなかなか無いかと。
Z-Push やウェブサーバの設定だけでなく Z-Push のソースにも手を入れる必要がある場合もある。

取り敢えず「がとらぼ」の中の人の環境では上のような感じでやると Android の Gmail アプリと Exchange(ActiveSync)アカウントで初回の接続は成功してメールを取得し、そのメールを読むこともできるが、次の同期時に同期が終わらなくなってしまう

Androidで同期1
AndroidでExchangeアカウント作成直後はそのアカウントの「カレンダー」と「連絡先」のスイッチがオンになっているので必ず同期失敗になる。「Androidの設定」→「アカウント」→「Exchange」「作成したExchange ActiveSyncのアカウント」をクリックして「カレンダー」と「連絡先」をオフに変更する。

Androidで同期2
メールの同期が失敗したら同期のスイッチをオフにしてもう一度オンに戻す。これで同期できる。
同期異常・メールを読み込み中で停止する状態が発生したら毎回これを行う。

Androidで同期3
「がとらぼ」の中の人の12月19日現在は1つ上の手順で同期をオフ・オンすることで同期に成功するが、その次の同期で異常が発生する。もちろん、もう一度同期のスイッチをオフ・オンすればその時だけ同期に成功する。

以前は Apache2.2 と PHP5.* で Z-Push を使っていたんだけど、現在は Apache を使っておらず Z-Push を Nginx で動かすのは初めて。もしかしたら Nginx の設定が不適切かもしれない。
もう少し情報を集めてトライするつもり。 Z-Push が VerUP で改善されるか若しくは Z-Push or Nginx の設定変更で正常に使えるようになったらこの記事を更新または追記する予定。

2017年5月12日追記:(以下)

/usr/local/www/z-push/backend/imap/config.php

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// Folder prefix is the common part in your names (3, 4)
define('IMAP_FOLDER_PREFIX', '');

// Inbox will have the preffix preppend (3 & 4 to true)
define('IMAP_FOLDER_PREFIX_IN_INBOX', false);

// Inbox folder name (case doesn't matter) - (empty in 4)
define('IMAP_FOLDER_INBOX', 'INBOX');

// Sent folder name (case doesn't matter)
define('IMAP_FOLDER_SENT', 'INBOX.Sent');

// Draft folder name (case doesn't matter)
define('IMAP_FOLDER_DRAFT', 'INBOX.Drafts');

// Trash folder name (case doesn't matter)
define('IMAP_FOLDER_TRASH', 'INBOX.Trash');

// Spam folder name (case doesn't matter). Only showed as special by iOS devices
define('IMAP_FOLDER_SPAM', 'INBOX.Spam');

// Archive folder name (case doesn't matter). Only showed as special by iOS devices
define('IMAP_FOLDER_ARCHIVE', '');

どうも同期が失敗するのはZ-Pushが読み込むためのIMAPサーバのフォルダ名指定の問題だったっぽい。
上はIMAPサーバがCourier-IMAPで正しく動作する指定例となるが、ここの指定がちょっとでも不適切だと同期が失敗するっぽい。
「がとらぼ」の中の人が失敗してたのはIMAP_FOLDER_PREFIXに"INBOX."を指定してIMAP_FOLDER_PREFIX_IN_INBOXを"false" (InboxはINBOX.InboxじゃなくInboxなので)にしていたこと。例えばIMAP_FOLDER_SENTは"INBOX.Sent"でなく"Sent"で大丈夫(設定項目の筋からするとそれで良い筈)と思ったが、どこかがおかしいらしくIMAP_FOLDER_PREFIXを使わずに個別に指定してやらないとダメみたい。
よって他のIMAPサーバでもフォルダ名の部分は十分に注意して指定してやる。当然だが、Courier-IMAP以外で上の指定を真似たらたぶんアウト。

ということで、メールだけなら問題なく使えるみたい。プッシュ通知もOK. (この追記部分の動作確認はZ-Push 2.3.6 final)

2018年8月20日追記:
2.4系について別記事を書いた。(下のリンク)

関連記事:
Up