Particle Meshというデバイスが10月にいよいよ発送される。
Meshという名前のとおり、Bluetoothでメッシュネットワークを構築して、WiFi/LTEでインターネットに抜けていく。メッシュネットワークはThread(6LoWPAN: IPv6)で構成される。各端末のスペックはリンク先を見れば分かるとおり、何気にすごい。Bluetoothのみの端末Xeon、WiFi/Bluetoothで構成されるArgon、LTE/Bluetoothで構成されるBoron(2G/3G版もあり)という3種類。BluetoothはNordic nRF52840、WiFiはESP32という最近流行りの構成な感じ。そして現在のところ、最初のオーダーは送料無料で安い!!
■ ギテキというもの…
このParticle、昔はSpark CoreというArduinoコンパチ風な端末(ギテキあり)を出していて日本国内でも使えた。そして次に出してきたPhotonという端末が主力になっている。ただ、このPhotonはギテキが無いくて国内では使えない。自分はこのSpark CoreのときにMQTT ライブラリをcontributeしたせいで、次のような現象が起きている。
1. Spark Core(ギテキあり)にライブラリを公開
2. ライブラリがめちゃ使われる
3. Particle Photon(ギテキ無し)が主流になる
4. Spark Coreはほぼディスコン状態
5. ライブラリのメンテ・サポートを続ける…
ギテキ無しの端末のライブラリをメンテ・サポートを続けているという状態だ。現在のところ約12万アプリがライブラリを利用している。恐らくIoT的な側面で考えると、かなり使われている方だと思う。まぁ国内で使われなくても、世界中で使われるとそんな感じかなと。たまに、「2Gの端末で何かおかしいんだけど?」と聞かれるけど、そもそも日本には2Gは無いしデバックをお願いしていたりもする。
ここで思ったのが次のMeshだ。ギテキ無いんじゃね?みたいな(お約束)。ざっくりこんな素敵な構成が出来るのに…
コミュニティに上がっている最新情報で、実際に動いているネットワークのトポロジなんかを見るとわりと感動するものがある。国内で使えるよう、どこか持ってきてくれないかしら…まぁ、自分は10個ほどプレオーダーしちゃってるんだけどね。どうせ、またメンテしないといけないし(白目)。
this pic from Particle community site.
■ WebからOTA、IDE環境、NodeJS、iOS/Android…etc
このParticleがイケているのが、周辺環境が恐ろしく充実しているという点もある。Web IDE上でコードを書いてWiFi経由でアプリを流し込めて、端末やライブラリの管理を行える。ログもWeb上で確認できる。これがSpark Core(2013年)時点から使えているのだけど、何気にこれが良い感じだったりする。
さらに面白いのがMQTTのようなPublish/Subscribeの環境が利用できる。正確に言うとMQTTではなく、CoAPをDTLS上で動かして実現している。このWebIDEはよくあるAzure,Google Cloud、Webhookにデータを流すように利用することができて、大抵のクラウド環境との疎通もParticle上を経由してデータのやりとりをすることが出来る。あとSIMの管理とかもあったりする。
つまり…端末をネットワークに接続すれば、あとはすべてWeb上からコードを書いて、ログを見てデバックして(もちろん、PCにUSB経由でシリアルも出力)、NodeJSやWebAPIを使って自前のシステムを作ったり、iOS/AndroidのアプリもOKと…かなり充実した環境になっている。
NodeJSはこんな感じでParticle CloudとのPub/Subをサクッと書ける。
var Particle = require('particle-api-js'); var particle = new Particle(); var token; // データのPublish particle.publishEvent({ name:"banjo_normal/get", data: "test val", isPrivate: false, auth: 'auth token' }); // SubscriveしたEvent情報ほ処理 particle.getEventStream({ deviceId: 'banjo_normal', auth: 'auth token' }).then( function(stream) { stream.on('event', cloudEventHandler); }, function(err) { console.log("error starting event listener", err); process.exit(1); }); cloudEventHandler = function(data) { console.log("Event", data); }
そして端末側はこんな感じ。A0からアナログデータを読んで、Publishする。コードはArduino likeに書ける(C++)。
#include "application.h" String deviceName = ""; void subscribeHandler(const char *event, const char *data) { Serial.print(event); Serial.print(", data: "); if (data) Serial.println(data); else Serial.println("NULL"); // publish sensor data to "[device_name]/put/val" endpoint int val = digitalRead(A0); char buffer[128]; sprintf(buffer, "%d", val); Particle.publish(deviceName + "/put/val", buffer); } void namehandler(const char *topic, const char *data) { // get device name deviceName = String(data); Particle.unsubscribe(); Serial.println("This device name is : " +deviceName); // subscribe devicename/data endpoint Particle.subscribe(deviceName + "/get", subscribeHandler); } void setup() { Serial.begin(9600); // get device name from cloud Particle.subscribe("particle/device/name", namehandler); Particle.publish("particle/device/name"); } void loop() { }
自分がcontributeしているMQTT(TLS)を使うと直接外部のクラウド(Azure, Cloud Core, IoT Core…etc)と接続して通信を行うことが出来る。逆にParticleのPub/Subはサービスとしてエレガントになっていて、端末の起動・停止といった情報をとって既に用意されているSDKを使って開発を進められることが出来る。外部との疎通はどちらを使っても大丈夫になる。
このPub/Subは現在のところ、MQTT・Particleのどちらを使おうとしてもサーバーを経由したメッセージのやりとりになる。次のMeshになるとThread(6LoWPAN)上のメッシュネットワークに閉じたメッセージングと、今までと同様のインターネット上のゲートウェイに投げるメッセージの両方が使えるようになる。
これはかなり面白い。インターネットへの疎通がなくてもメッシュネットワークを構成して、WPAN上でのメッセージングが出来る。また、自身はインターネットに接続していなくても、メッシュネットワーク経由で上位のエッジ(Argon, Boron)を経由してインターネットに抜けることが出来る。
人が多くて混雑した所での利用、大量の端末・制御を使いたいときは有効に働くと思われ。
■ ギテキ、うまいのそれ?
当初のSpark Core, Particle Photonのfirmwareは色々あって、UDPパケットを投げると端末が停止したり、メモリリーク、とあるクラスを使うとメモリフラグメント、端末の認証(priavate 証明書)を差し替えるとネットワークに接続不能になったり…いまでも謎の現象が起きたりもする。この辺はgithub上のソースコードが丸々上がっていて、自分で書き換えたりもできる。あと自分で作ったlibをcontributeして使ってもらうことも。まぁ、最初のMesh firmwareはちゃんと動かないとは思うけど、将来的な期待感がめちゃ高い。
ただ、問題はギテキ、これに尽きる…