いつだったか…完全に忘れた頃にpre-orderしておいたParticle Photonが届いた。
これで$19というのはpre-orderした時は驚異的な値段で、前バージョンのSpark Coreも含めて先達感があるんだけど、今はこの手の小さい端末はやたらとあるし、既見感は否めない…
ただ、Web上でビルドしてコードを流し込めるお手軽感、Android/iPhoneのアプリが最初からあったりするのは便利な感じ。
まず届いたら最新のfirmwareに上げる事を本当にオススメ。いやー、安定させるまで色々とあった。
自分はMacがメインで、入れておいた方が良いと思うのが particle-cli, brew, dfu-util, openssl。既にbrew周りを入れていたら、必ずbrew update/upgradeはしておいた方が良い。特にopensslは少し古いバージョンだと、次に行う証明書の差し替え時にコケて動かない事が発生して、わりと悩ましかった。
まず喰らったのが、端末登録が出来ない…これは泣けた。最新のファームにしても全く効果無し。端末登録が出来ないとGUIでプログラムをサクっと流し込めるという利点が無くなって、photonを使う意味が無くなる。コミュでもスレが上がっている通り、わりと高い頻度で発生する。自分が行った解決方法はこちら。
証明書を再作成してサーバに再登録するという方法で。この時にOpenSSLのバージョンが少し古いとエラーで登録出来なくなるから、事前にbrew update/upgradeかましておく。あとは以下の通り。
wget https://s3.amazonaws.com/spark-website/cloud_public.der dfu-util -d 2b04:d006 -a 1 -s 2082 -D cloud_public.der particle identify # これで device_id を控えておく particle keys doctor [device_id]
次にハマったのが…UDPがヤバい。これも端末依存なのか、コミュでUDPが受信できないってスレが上がっている。これはfirmwareのgitにissueで上がっていて、修正版のパッチがあって上手く動いた。多分、そのうちファームアップで対応されると思われ。今はpre-orderで速攻ゲットした人柱版だと思っているから、まぁ今は仕方ないかな…そのうち多分、治るんじゃないかなー
んで、Spark Core/Photon向けにCoAPのライブラリを作ってアップ/contributeした。これでCore/PhotonともにMQTT/CoAPのどちらもサクッと使える環境に。一応、microcoap/libcoapの両方で動作確認、サーバ、クライアント共にしているから基本的な所は大丈夫と思われ。以下、サンプルコード。
#include "coap/coap.h" // サーバとしてエンドポイント light のコールバック void callback_light(CoapPacket &packet, IPAddress ip, int port); // クライアントとして動作する時の共通コールバック void callback_response(CoapPacket &packet, IPAddress ip, int port); Coap coap; // light コールバックの実装部。受信したCoAPパケと、送信元クライアントip/portが貰える。 void callback_light(CoapPacket &packet, IPAddress ip, int port) { Serial.println("[Light]"); // サーバとしてのレスポンス coap.sendResponse(ip, port, packet.messageid, (uint8_t *)"1", 1); } // クライアントの共通コールバック実装部。受信したCoAPパケと、通信したサーバのip/portが貰える。 void callback_response(CoapPacket &packet, IPAddress ip, int port) { Serial.println("[Coap Response got]"); char p[packet.payloadlen + 1]; memcpy(p, packet.payload, packet.payloadlen); p[packet.payloadlen] = NULL; Serial.println(p); } void setup() { Serial.begin(9600); // サーバとして動作する時のコールバック // 例みたいく、複数のコールバックを追加して定義できる // exp) coap.server(callback_switch, "switch"); // coap.server(callback_env, "env/temp"); // coap.server(callback_env, "env/humidity"); coap.server(callback_light, "light"); // クライアントとして動作する時の共通コールバックを追加 coap.response(callback_response); // サーバ・クライアントとして起動 coap.start(); } void loop() { // CoAPサーバに向かってgetリクエストを送信 // putリクエストはこんな感じで。 // int msgid = coap.put(IPAddress(10, 0, 0, 1), 5683, "light", "1", 1); // msgidはCoAPのrequest/responseで利用するmessage id。これがあれば再送もOK。 int msgid = coap.get(IPAddress(10, 0, 0, 1), 5683, "light"); delay(1000); // コールバックのループが走るloop coap.loop(); }
Arduino向けのCoAPライブラリはあって参考にしてみたけど、「これって…プロトコルの仕様分からないと使えないんぢゃね?」って感じで、どれもこれもヒトクセあったりして、同じくcontributeしているMQTTと同じような簡単なノリで使えるようにしてみた。Arduino向けのCoAPライブラリも、このノリで作ってアップしようかしら…
Spark Core/Photonともにpub/subでCoAPを使って参照できるぜ!!っては書いてはあるものの、Spark Protocolの皮を被って使うのが面倒だと思うから、サクッと簡単に使うならこっちの方が良いと思われ。クライアントだけじゃなく、CoAPサーバとしての特定URLのコールバックも出来るから、CoAPの思想の一つでもある端末間のNWによる制御もCoAPを使って出来る。
とりあえず、MQTT/CoAPの両方対応ってことで、あとは使われてbug fixed追加機能は気が向いたら…って感じで。