Photon

いつだったか…完全に忘れた頃にpre-orderしておいたParticle Photonが届いた。

これで$19というのはpre-orderした時は驚異的な値段で、前バージョンのSpark Coreも含めて先達感があるんだけど、今はこの手の小さい端末はやたらとあるし、既見感は否めない…
ただ、Web上でビルドしてコードを流し込めるお手軽感、Android/iPhoneのアプリが最初からあったりするのは便利な感じ。

まずは外身の箱。

開けるとブツ一覧

one centとのサイズ比較

Spark Core(白いやつ)とPhoton比較

まず届いたら最新の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追加機能は気が向いたら…って感じで。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください