WiFi NFC App を公開しました

tap-to-connect

WiFi 接続設定を NFC でやりとりする規格を Wi-Fi Alliance が策定していて、一部の Android スマートフォンでは既に何のアプリもインストールせず、かざすだけで WiFi 接続設定が終わるんですよ。わたしこれに感動しまして、ついては iPhone でもぜひほしいと思った次第です。で、作っちゃいましたので要点をまとめます。

アプリから WiFi アクセスポイントの接続設定を行う

とにもかくにも、アプリから WiFi 接続設定ができなければお話になりません。iOS 10 以前では、プログラマブルに WiFi アクセスポイントに接続することができず、どうしてものときは以下の手順が必要でした。

  1. WiFi アクセスポイントへの接続設定を記述した構成プロファイル( XML ファイル)を用意する。
  2. アプリ内で Web サーバを起動して構成プロファイルをダウンロードできるようにする。
  3. アプリから Web ブラウザに遷移させ、 localhost の構成プロファイルをダウンロードさせる。
  4. 設定アプリに遷移するので、構成プロファイルのインストールを完了する。

とんでもなく筋の悪い方法です。当時、調べたときには絶望しました。

しかし、iOS 11 で大きな変化があり、 NEHotspotConfigurationManager によって WiFi 設定がプログラムから行えるようになりました。これにもいくつか罠がありまして、みなさまに共有しておきたい事柄としては、 iOS では接続中のアクセスポイントの SSID がアプリから取得できないので、意図したアクセスポイントに接続できたかどうか明示的にはわかりません。なので、エラーが発生せず WiFi 接続できた(切り替わった)ことをもって、成功したとみなすより他ないです。もうひとつ、アプリを消すとそのアプリで設定したアクセスポイントの設定も消えます。接続したあと、よかったよかったと思ってアプリをアンインストールすると接続できなくなります。

とはいえ、iOS 10 以前に比べて遥かにまともになりました。

NFC タグの読み込み

執筆時点で iPhone 7 以降に発売された iPhone はすべてNFCが使えます。 iPad と iPod touch では使えません。対応している iPhone でもできるのは読み込みだけで、書き込みはできません。なかでも書き込みできないというのが一番残念で、このアプリで書いたNFCタグをこのアプリで読めればエコシステムが完結できるのですが、タグの書き込みには Android の NFC ライターアプリが必要です。とはいえ書き込まれた WiFi 接続設定を読み込むことはできます。

審査に通るのか

この手のアプリがほとんどなかったので、審査に通るのかまで確認したかったことも開発した動機の一つです。 WiFi 接続設定や NFC の読み込みにあたり、なにか指摘されるかと憂慮していたのですが、特別なことを訊かれることもなく審査を通過しました。デモビデオはこちら。

多言語対応

今のところ英語のみです。ボタン 1 つの UI なのでとくに迷うことはないとは思っているのですが、今後のアップデートでローカライズも入れようと思います。

Pythonの辞書に dot notation でアクセスする

Javascript のハッシュマップはドット・ノーテーション ( dot notation )でアイテムにアクセスできますよね。でも Python の辞書ではそれができません。できたら便利だなーと考えていたらひらめいたので、 dict クラスを継承した dict2 クラスを作りました。

class dict2(dict): 
    def __init__(self, *args, **kwargs): 
        super().__init__(*args, **kwargs) 
        self.__dict__ = self 

コンストラクタ __init__() をオーバーライドして self.__dict__ に self を代入する行を加えました。ただそれだけです。

__dict__ はオブジェクトの書き込み可能なアトリビュートを格納するために使用される辞書またはその他のマッピングオブジェクトです。 self はまさに dict を継承したマッピングオブジェクトなので、アトリビュートを格納する __dict__ に self を代入すれば、ドット・ノーテーションでアトリビュートとして辞書のアイテムにアクセスできるようになるってわけです。

ピンとこなくても、とりあえず動作を見てみましょう。

Continue reading →

Raspberry Pi で気圧測定

Raspberry Pi Zero WPIMORONI Enviro pHAT という Raspberry Pi 用の環境センサを使って台風が接近する過程の気圧を測定してみました。

平成30年台風第24号が埼玉に接近した9月29日12:00から10月2日6:00まで10分毎の気圧をプロットしたグラフがこちら。縦軸が hPa 横軸が時刻です。

縦軸原点を0Paに取っていますが、変化がわかりにくいので原点を950hPaにしたグラフがこちら。

期待以上に精度良く測定できます。気圧変化の傾きを見ているだけで、台風が近づいて離れていくのがわかるので防災に役立ちます。オススメです。

ちなみに、 Enviro pHAT は Raspberry Pi の上に重ねるように接続すると、温度計が Raspberry Pi が発する熱に影響されるので、40ピンのケーブルで Enviro pHat と Raspberry Pi に距離を開けたほうがよいです。

スレッド間でカウンタを共有する(再び)

これまでも話してきたとおり、スレッド間でオブジェクトを共有することはハイコストなので、可能な限りオブジェクトを共有しない設計にすることが性能においても品質においても重要です。しかし、どうしてもオブジェクトを共有したい場合は、昨今の処理系にはそれを保証する機能が用意されているのでそれを使って安全を担保します。

Continue reading →