FJCT_ニフクラ mobile backend(mBaaS)お役立ちブログ

スマホアプリ開発にニフクラ mobile backend(mBaaS)。アプリ開発に役立つ情報をおとどけ!

ニフティクラウド mobile backend × ArduinoでできるFelica通知システム

IoTとmBaaSは相性が良いというのは前回の記事で書きましたが、実際どういったことができるのか一例を紹介したいと思います。以前の記事でArduinoからプッシュ通知を行うというテクニックを紹介しましたが、その応用になります。

用意するもの

ハードウェアは次のように配線します。

WiFiシールドはArduinoの上に被せています。

Arduinoのコード

Arduinoのコードは次のようになります(一部です)。

void get(String message) {
  connecting = 1;
  // Make a TCP connection to remote host
  Serial.print("Performing HTTP GET of: ");
  Serial.println(server);
  if ( !client.connect(server, 80) ) {
    Serial.println("Error: Could not make a TCP connection");
  }
  // Make a HTTP GET request
  client.println("GET /?m=" + message + " HTTP/1.1");
  client.print("Host: ");
  client.println(server);
  client.println("Connection: close");
  client.println();
  Serial.println();
  delay(3000);
  while(client.available()){
    char c = client.read();
    Serial.print(c);
    if ( !client.connected() ) {
      Serial.println("disconnected.");
      Serial.println();
      //connecting = 0;
      // Close socket
      if ( !client.close() ) {
        Serial.println("Error: Could not close socket");
      }
      break;
    }
  }
  client.close();
  Serial.println("Finished WebClient test");
}

void loop() {
  int ret, i;
  String s = "";
  rcs620s.timeout = COMMAND_TIMEOUT;
  ret = rcs620s.polling();
  if(ret && connecting == 0) {
    for(i = 0; i < 8; i++)
    {
      s.concat(rcs620s.idm[i]);
    }
    get(s);
    connecting = 0;
  } else {
  }
  Serial.println("");
  delay(POLLING_INTERVAL);
}

loop処理はArduinoが待機中に実行され続けます。この中でFelicaリーダーからデータの読み取りを行っています。

for(i = 0; i < 8; i++)
{
  s.concat(rcs620s.idm[i]);
}

そして8byte分のデータを読み取ったら、それをget関数に送っています。この処理は指定したURLをリクエストするだけです。Webアクセスしている間もloop関数が呼ばれますので、その間は処理をしないために connecting のフラグを立てています。

データを受け取ったサーバはニフティクラウドのプッシュ通知を作成しています。

class Server < Sinatra::Base
  get '/' do
    NCMB.initialize application_key: ENV['APPLICATION_KEY'] || "",  client_key: ENV['CLIENT_KEY'] || ""
    @push = NCMB::Push.new
    @push.immediateDeliveryFlag = true
    @push.target = ['ios']
    @push.message = params["m"]
    @push.deliveryExpirationTime = "3 day"
    if @push.save
      status 201
      body ''
    else
      status 403
      body ''
    end
  end 
end

アーキテクチャとしては次のようになります。

Webサーバを経由しているのはProcessingの中で署名処理など複雑なことを行うとコード量や読み込むライブラリが増えてしまうのでWebサーバを経由する方がシンプルに実装できます。

これらを実装した結果が次の動画になります。Pasmoをリーダーに読み取ってしばらくするとiPhoneにプッシュ通知が届くのが確認できます。この時にはUSBケーブルでつないでいますが、電源さえ確保できればポータブルに利用できます。

https://www.youtube.com/watch?v=orROiRVNf2k


今回はFelicaリーダーを使っていますので、同じような仕組みで会社の簡易出退勤システムもできそうです。プッシュ通知だけでなくデータストアを使って出勤、退勤のタイミングで記録することもできるでしょう。また、他のシールドを使うことで(スイッチや接触など)必要なタイミングでデータをニフティクラウド mobile backendに蓄積できます。

IoTデバイスから直接プッシュ通知を作成するというのは大変ですが、ニフティクラウド mobile backendを経由すればHTTPアクセス一つで済むようになります。IoTデバイスとスマートフォン、Webブラウザなどを連携させる際にはこのような手法を使ってみてはいかがでしょう。

なお今回のコードはGitHubにアップロードしてあります。動かないところがあったら参考にしてください。

f:id:mbaasblog:20180927104348p:plain