2015/08/06

クラウドで「IoT」ことはじめ - デバイス編

こんにちは、f.nagamineです。
私はRaspberry Pi(以下Raspi)を使ったセンサーデバイスの構築を担当しました。
今回はEvent Hubsにデータ送信をするところを中心に、その内容をご紹介したいと思います。

  • 使用した部材類
    • Raspberry Pi2 Model B
      • 6台構築して弊社オフィスの各所に配置しています。
      • 今回は気温センサーだけだったので完全にオーバースペックですね。今後Raspiの機能を使い倒してみたいと思います。このブログでその内容も紹介できればと思います。
    • 無線LAN子機
      • Buffalo社のものとPlanex社のものを使用しています
    • microSDカード
      • Trancend社のTS16GUSDHC10Eと、TS16GUSDU1Eを使用しました。どちらも16GBです
      • SDカードはRaspiとの相性が悪いと動かないなんて情報もネット上にチラホラあって何気に気を使いますよね。弊社のRaspiについてはこれで動いています。(こちらのwikiを参照したりもしました)
      • ちなみにOSは"Rasbian (May 2015)"にしました
    • 気温センサ(TMP102)
      • 今回はSparkfun社のものを使用しました。
      • 下記の回路図ではTMP102のピン配置が両サイドで4本と2本になっています。またSparkfun社のデータシート上もそのようになっていますが、実物は片側に6本のピンが配置されています。どうやら世に出ている情報はバージョンが古いようです。ただ、使用するピンは当然変わらない(VCC, GND, SDA, SCL)のでご容赦下さい。
    • その他(Switch Scienceさんで調達しました)
      • ブレッドボード
      • ジャンパワイヤ
      • ピンヘッダ

  • 回路図と実物画像(ちなみに回路図はfritzingを使用して作成しています)
  • Event Hubsへのデータ送信プログラム(send.py)
    • Azure SDK for Python(Python2.7)で実装しました
    • こちらのブログを参考にさせて頂きました。
    • 送信にはEvent HubsのREST APIを使っています。Microsoft社のこちらのドキュメントも参照しました
    • 3つの引数を持たせて、気温データを取得したホスト、時間、気温を1レコードとした、JSONを送信します
    • このsend.pyに必要な引数を渡して実行する実行プログラムを別に作成し、これを5秒毎にループさせています

#!/usr/bin/python
import sys
import azure
import socket
from azure.servicebus import (
  _service_bus_error_handler
  )
from azure.servicebus.servicebusservice import (
  ServiceBusService,
  ServiceBusSASAuthentication
  )
from azure.http import (
  HTTPRequest,
  HTTPError
  )
from azure.http.httpclient import _HTTPClient

class EventHubClient(object):

  def sendMessage(self,body,partition):

    # aaaaには作成したService Busの名前空間を入れる
    eventHubHost = "aaaa.servicebus.windows.net"

    httpclient = _HTTPClient(service_instance=self)
    # xxxxには送信を許可した共有アクセスポリシーの名前を入れる
    sasKeyName = "xxxx"

    # yyyyには送信ポリシーのプライマリーキーを入れる
    sasKeyValue = "yyyy"

    authentication = ServiceBusSASAuthentication(sasKeyName,sasKeyValue)

    request = HTTPRequest()
    request.method = "POST"
    request.host = eventHubHost
    request.protocol_override = "https"

    # zzzzにはEvent Hubsの名前を入れる
    request.path = "zzzz/publishers/" + partition + "/messages?api-version=2014-05"

    request.body = body
    request.headers.append(('Content-Type', 'application/atom+xml;type=entry;charset=utf-8'))

    authentication.sign_request(request, httpclient)

    request.headers.append(('Content-Length', str(len(request.body))))

    status = 0

    try:
        resp = httpclient.perform_request(request)
        status = resp.status
    except HTTPError as ex:
        status = ex.status
    
    return status

param = sys.argv
body = "{ \"device\": \""
body += param[1]
body += "\", \"time\": \""
body += param[2]
body += "\", \"temperature\": \""
body += param[3]
body += " }"

print(body)

hubClient = EventHubClient()
hostname = socket.gethostname()

hubStatus = hubClient.sendMessage(body,hostname)
print hubStatus

以上、Raspberry PiからEvent Hubsにデータ送信する部分の説明でした。

実験的に取り組んでいるので色々と至らないところはあります。特に送信プログラムに機密情報ベタ書きしているのはちょっと抵抗があります。
こういった部分も、実際にプロジェクトとしてやる場合はケアしないといけない部分だと思います。
そのようなことについても、今後本ブログで紹介していきたいと思います。

【考察】
センサーデバイスとしてRaspberryPi2はやはりリッチすぎると感じました。リッチすぎるというのは一見悪いことではないようにも思えますが、セキュリティ上のリスクを考慮すると、本来の目的以上にリソースを持たせるというのはやはり不安に感じました。セキュリティの担保というのはクラウドIoTにおけるデバイス側の課題としてよく耳にするものですが、適切なリソース配分というのも重要な課題ではないでしょうか。  また、デバイスの数が多くなるとデータ送信先のアドレス変更など、設定の変更が発生した際に作業が大変になることが見込まれるため、あらかじめデバイスがクラウドに設定情報を取得してセンサーデータを送るようなプロビジョニング機構の必要性を強く感じました。Microsoft Azure(※1)では「モバイルサービス」が存在するため、サービスの用意するデバイス種別が適合すればこのサービスは便利なものになると思われます。

0 件のコメント:

コメントを投稿