SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Bluemixではじめてみよう! 「IoT→クラウド」データ活用アプリケーション開発(AD)

やっぱりモノをつなげて体験しよう! Arduino YUNとBluemixではじめるIoT入門

Bluemixではじめてみよう! 「IoT→クラウド」データ活用アプリケーション開発 【第1回】

  • X ポスト
  • このエントリーをはてなブックマークに追加

昨年秋から急速に現実味を帯びてきた「IoT(Internet of Things)」。2016年も注目技術の中心にすわりそうです。本連載では、センサでデータを取得するところから、クラウド上にデータを蓄積し、分析して活用するアプリケーションの作り方を4回にわたって解説します。その第1回となる今回は、Arduino YUNをセンサデバイスの例として、IoTアプリの開発・実行に必要な環境のセットアップを説明します。クラウド側には、IBMのPaaS「Bluemix」を利用します。

  • X ポスト
  • このエントリーをはてなブックマークに追加

IoTとは

IoTとは「Internet of Things」の頭文字を取った略語で、色々なものがインターネットにつながることをいいます。

これまでにもPCや携帯電話以外のデバイスをインターネットに接続することはありましたが、コストやデータ保管などの問題から必要最小限にとどまっていました。近年、様々なセンサデバイスを搭載したスマートフォンの普及により、センサ自体がより小さく、より安くなってきました。また、ビッグデータ技術やクラウドコンピューティングの普及・発展により、これまで捨てざるを得なかったデータについても安価なコストで活用できるようになり、IoTに注目が集まるようになってきました。

次のリストはIoT活用例です。活用対象は、大規模なものから個人向けのものまで多岐にわたっています。

IoTは、業種や業務問わず活用できる可能性があります。アイディア次第で、考えもしなかった新たなビジネスチャンスを発見することがあるかもしれません。

もし、あなたがIoTを活用するユニークなアイディアを見つけた時、実際に実現する方法がわからないと、せっかくのチャンスを逃してしまうことだってあります。

センサをインターネットの世界につなぐ方法

IoTを実現するには、まずセンサなどのデバイスをインターネットの世界とつなぐ必要があります。

「センサ」は、人間の感覚に代わって温度や圧力などを検知する器具です。電気信号に変換するものが多く、センサによる検知には通常電力が必要です。IoTにおける「センサデバイス」は、センサに給電して取得した検知データをインターネット経由で送信する役割を担当します。センサデバイスは、センサからインターネットへ送信するまでをひとつのデバイスでおこないます。

センサデバイスの例:最新の掃除ロボット
センサデバイスの例:最新の掃除ロボット

センサデバイスのデータを、いったん「ゲートウェイ」と呼ばれる機器に集約してから送信する場合もあります。センサデバイスとゲートウェイの間は、ZigBeeやBLEといった省電力近距離通信技術を使って通信をおこない、ゲートウェイがインターネットへ送信する役割を担当します。センサデバイスの設置場所によって給電が難しい場合や、インターネット回線を用意できない場合があるなどに有効です。

センサデバイスとゲートウェイを分ける例:RFIDタグとRFIDリーダ
センサデバイスとゲートウェイを分ける例:RFIDタグとRFIDリーダ

IoT活用のスタートアップ時期は、センサデバイスやゲートウェイとして汎用的なワンボードのマイコンボードを使うことが多くなってきました。マイコンボードにはGPIO(General Input/Output)と呼ばれるインターフェイスを搭載しており、比較的自由にセンサを取り付けることができるからです。

Arduinoに接続可能なデバイスのキット
Arduinoに接続可能なデバイスのキット

マイコンボードには様々な種類がありますが、IoTを始める際によく使用されるのが「Raspberry Pi」「Intel Edison」「Arduino」です。

Raspberry Pi

Raspberry Piは、すでに500万台以上販売されている、英国ラズベリーパイ財団によって開発された教育用シングルボードコンピュータです。

いくつかのバージョンがありますが、Raspberry Pi2 Model B(35米ドル)というモデルの場合は、Linux系OSやMicrosoftから無償提供されているWindows10 IoT Coreが動作します。JavaScript(Node.js)やJavaScript、C/C++など様々な言語でプログラミングをおこなうことができます。

Raspberry Piは一部モデルを除き、ネットワークインターフェイスを標準装備しています。また、USBポートを使って、Wi-FiやBluetooth通信デバイスを接続することも可能です。

GPIOがピンコネクタ形状なのでセンサとの結線も簡単で、日本語の市販書籍やブログ記事も豊富なので、IoTのスタートアップに活用されることが増えてきています。

透明ケース入りRaspberry Pi2 Model Bを開梱した状態
透明ケース入りRaspberry Pi2 Model Bを開梱した状態

Intel Edison

Intel Edisonは、米国Intelが開発したシングルボードコンピュータです。EdisonはIoT向けに開発されているため、本体は切手大のサイズにまとめられています。Intel Atom 500MHzを搭載しており、本体価格は約1万円です。

Intelが提供するXDE IDEを使えばJavaScript(Node.js)による開発が可能ですが、購入時点ですでにLinuxが動作しており、様々な開発言語をあつかうことができます。

ただし、インターフェイスが小さくGPIOの取り回しが難しいため、Arduino拡張ボードやBreakoutボードを使って開発します。

Intel Edison Kit for Arduinoに光センサを接続したところ
Intel Edison Kit for Arduinoに光センサを接続したところ

販売開始は2014年9月と後発で、Raspberry Piと比較すると日本語書籍の数も少ないこともあって、初心者にはやや難しいデバイスかもしれません。しかし、小さいサイズの本体にBluetooth/Wi-Fiを標準装備していることから、本格的な活用はこれから増えてくると思います。

Arduino

Arduinoは、イタリアArduino社が2005年にロボット制御ボードのプロトタイプを開発するためのマイコンボードとして開発しました。オープンソースハードウェアとして設計情報が公開されており、Arduino社以外からの派生ボードも複数販売されています。

開発には、C++に似た独自開発言語Sketchを使います。統合開発環境もあわせて提供されており、ボタン1つでボードへアップロードすることができます。

最も多く販売されているArduino UNOには標準でネットワーク通信のためのデバイスが搭載されていません。このためシールドと呼ばれる拡張ボードを装着するか、ネットワーク機能を標準装備している派生ボードを使用します。ネットワーク機能を持つArduino YUNの場合、約1万円で入手可能です。

日本では電子工作分野で多く使われているため、市販書籍も多数出版されており、初心者にもあつかいやすいマイコンボードです。

水位センサをArduinoのGPIOに接続したところ
水位センサをArduinoのGPIOに接続したところ

IoTは世間に馴染んできたようです?

先日たまたま見ていたTV番組「TBS がっちりマンデー!!2015年儲かりキーワード」で、「IoT」という単語が登場してびっくりしました。

TBS がっちりマンデー!! 2015年12月20日放送回「2015年儲かりキーワード」
TBS がっちりマンデー!! 2015年12月20日放送回「2015年儲かりキーワード」

流行っているのはIT業界の中や一部の範囲だけなのかと思っていたのですが、一般の人も視聴する番組で紹介されるほどIoTがメジャーになりつつあるとは知りませんでした。

IoTを始めたい方も・本格導入を検討中の方も:おすすめソリューションのご紹介

ビジネスのパフォーマンスを高めようとさまざまな業種・企業で、IoT活用を前提とするプロジェクトが動き始めています。ただし、検討を始めて最初に出てくるのは、こんな要望ではないでしょうか。

「最初は実験的にスタートしたいから、小さく簡単に素早く始めたい」
「実運用に移ったときには10万・100万単位のセンサ/デバイスに対応できるスケーラビリティも確保したい」

これにお応えできるサービス・製品がIBMにあります。ぜひ、下記の資料をご覧ください。(編集部)

MQTTとは

IoT活用におけるセンサデバイスやゲートウェイからインターネットへの通信は、小さいサイズのデータを大量に送信することが想定されます。このような通信形態に合うプロトコルの一つに「MQTT」(MQ Telemetry Transport)があります。

MQTTは、IoTやM2M[1]の実現に適したシンプルで軽量なプロトコルで、Facebook Messengerでも使用されています。

[1]: Machine to Machineの略。機械間でネットワークを介して互いにデータをやりとりすること。

MQTTでは、送信元を「Publisher」、受信先を「Subscriber」と呼びます。また、MQTTの通信は、PublisherとSubscriberの間に「MQTTブローカ」と呼ばれるサーバを置き、それを経由しておこないます。

PubSubモデル
PubSubモデル

Publisherが送信するデータのことを「メッセージ」と呼びます。Publisherは、トピックという文字列を指定してMQTTブローカへメッセージを送信します(①)。

MQTTブローカには、あらかじめどのトピックをどのSubscriberが受信するかを定義しておきます。

メッセージを受信したMQTTブローカは、受信メッセージのトピックを受信登録しているすべてのSubscriberに向けてメッセージを送信します(②)。

受信対象を指定する際には、トピックに指定した文字列に完全一致するものだけでなく、一部が合致するものも指定することができます。

トピックによる振り分け
トピックによる振り分け

なお、MQTTブローカは、受信したメッセージを永続的に保持する責任を持ちません。このためメッセージを保管したい場合は、Subscriber以降でデータストアへ格納する処理を実行しなくてはなりません。

MQTTには、次のような特徴があります。

通信量が少ない

基本的にTCP/IP上で動作を前提としており、インターネットとの親和性も高く、HTTP通信と比較すると通信量が少なくなります。通信量が10分の1になると仮定すると、同じ電力でMQTTはHTMLの10倍の通信量を送信可能ということとなります。

IoT活用では、センサデバイスの配置場所により給電が難しい場合もあるため、電力消費の節約は優先度の高い問題になります。

QoSが選択可能

QoSとは、Quality of Serviceの略で、通信品質のことを指します。MQTTでは送信時にQoSを0から2の3段階から指定することができます。

QoS 説明
0 At most once: 送信は1回だけ実行されるが、到着する保証はされない
1 At least once: 到着は保証されるが、同一メッセージを複数受信する可能性がある
2 Exactly once: 1件のみの受信が保証される

Publisherの生死を判断できる

PublisherはMQTTブローカと接続したときに「Will(遺言)」情報を追加することができます。意図しない理由でPublisherが接続できなくなった場合、MQTTブローカはWillに定義されたメッセージをSubscriberへ送信します。Subscriberはこのメッセージを受信することで、Publisherが停止していることがわかります。

認証機能を持つ

MQTTブローカに接続する際に認証確認をおこなうことができます。認証方法はMQTTブローカ側の実装によって異なります。

IoT活用において、個人のライフログを取り扱う場合などは、セキュリティ要件の優先度が高くなることが考えられます。

主なMQTTブローカ

主なMQTTブローカとして、次のようなものがあります。SaaS形式で提供されているものが多いのは、ベンダ側もおそらくIoT活用ケースとしてデバイスをインターネットに直接接続することが多いと想定しているからだとおもいます。

名称 説明
Mosquitto BSDライセンス準拠のオープンソース。主要なLinuxディストリビューションやWindows上で動作する。執筆時点で入手した Intel Edisonには購入した状態でMosquittoがインストールされていた
Akane 時雨堂社の有償ソフトウェア、クラスタ構成を取ることができる。Ubuntu/CentOSで動作する
Sango AkaneのSaaS版。無料のライトプランもあり
CloudMQTT Mosquittoを使ったSaaS。動作環境としてAmazon Web Service(AWS)を使用しており、無料版含む4種類のプランを提供している
AWS IoT Amazon社がAWSの新たなサービスとして提供。2015年12月18日正式リリース
ニフティクラウド MQTT(β) ニフティクラウドのサービスの1つとして2015年5月11日にリリース。執筆時点では無料プランのみ
IBM MessageSight M2Mとモバイル環境向けに特別に設計されたIBM社のメッセージングアライアンス。ハードウェアだけでなく仮想アプライアンス版も提供されている
IBM Watson IoT Platform IoT活用を前提としたIBM社提供のSaaS型MQTTブローカ。無料版を含む4種類のプランを提供

今回は、これらの中から、アプリケーション開発環境との親和性も高く、無料で使うことができる「IBM Watson IoT Platform」を試してみることにします。

IoTを始めたい方も・本格導入を検討中の方も:おすすめソリューションのご紹介

ビジネスのパフォーマンスを高めようとさまざまな業種・企業で、IoT活用を前提とするプロジェクトが動き始めています。ただし、検討を始めて最初に出てくるのは、こんな要望ではないでしょうか。

「最初は実験的にスタートしたいから、小さく簡単に素早く始めたい」
「実運用に移ったときには10万・100万単位のセンサ/デバイスに対応できるスケーラビリティも確保したい」

これにお応えできるサービス・製品がIBMにあります。ぜひ、下記の資料をご覧ください。(編集部)

IBM Watson IoT Platform

IBM Watson IoT Platform(以下、Watson IoT Platform)を使ってPublisherからSubscriberまでの一連のMQTT通信を実行する場合、次のような手順を踏みます。Watson IoT Platformでは、Publisherを「デバイス」、Subscriberを「アプリケーション」と呼びます。

Watson IoT PlatformとQuickstartの作業の流れ
Watson IoT PlatformとQuickstartの作業の流れ

また、Watson IoT Platformは「Quickstart」という環境を提供しており、誰でも一部の機能を試すことができます。

Publisherとなるデバイスがない場合でも、「IoT Sensor」というダミーセンサを提供しているため、Quickstart上で試すことができます。

IoT Sensor

IoT Sensorは、Quickstartの機能の1つで、ブラウザから操作可能なダミーセンサーです。Publisher用のデバイスを持っていない場合でもQuickstartを使うことができます。

IoT Sensor 温度センサ画面
IoT Sensor 温度センサ画面

画面右上の12桁の文字列はMACアドレスです。MACアドレスは毎回異なる文字列が表示されます。

画面両端の[<][>]ボタンをクリックすると、タイトルが「Temperature」(気温:単位摂氏)、「Humidity」(湿度:単位%)、「Object Temperature」(物体温度:単位摂氏)に変わります。また、画面下部の[↑][↓]ボタンをクリックすると数値を上下に自由に変えられます。

Quickstart

Watson IoT Platformを使用するには、「組織ID」を取得しなければなりません。組織IDは、MQTTブローカごとに一意となる6桁の文字列です。組織IDを取得すると、「<組織id>.messaging.internetofthings.ibmcloud.com」というホスト名のMQTTブローカが使用可能になります。

Quickstartを使う場合は、すでに用意されている組織ID「quickstart」を使用します。ただし、Quickstartが提供するMQTTブローカでは、QoSは0(At most once)のみであり、毎秒1回を超える頻度で送信されたデータはドロップする場合があるなど、一部の機能が制限されています。

また、通常のWatson IoT Platformでは、MQTTブローカごとに「ダッシュボード」と呼ばれる管理用のWebページが用意されています。ダッシュボードを開くには、ブラウザから「http://<組織id>.internetofthings.ibmcloud.com/dashboard/」を開きます。

機能制限されているQuickstartには、ダッシュボードサイトは用意されていません。代わりに、次のようなデバイスID入力欄のみのQuickstartサイトが提供されています。

Quickstartサイト
Quickstartサイト

今回は、デバイスなしの場合、デバイスありの場合両方のQuickstart試行手順を紹介します。

デバイスなしでQuickstartを試行

まず、IoT Sensorをブラウザから開きます。ここで、画面右上のMACアドレスを書き留めておきます(下の画面ではモザイクになっています)。

IoT Sensor画面からMACアドレスを取得
IoT Sensor画面からMACアドレスを取得

次にブラウザを別途起動し、「Quickstart」を開きます。

Quickstart画面でIoT SensorのMACアドレスを入力
Quickstart画面でIoT SensorのMACアドレスを入力

デバイスID入力欄にIoT SensorのMACアドレスを入力し、[進む]ボタンを押すと、画面左下にグラフとして表示されます。

IoT Sensorのデータグラフ表示
IoT Sensorのデータグラフ表示

IoT Sensorを表示しているブラウザから温度を上下させると、やや遅れて画面上のグラフに反映されます。グラフの動きを見るとIoT Sensorからほぼ1秒ごとにセンサデータがQuickstartへ送信されていることがわかります。

なお、湿度や物体温度のグラフに変更したい場合はグラフ下の表の該当行をクリックします。

IoT Sensorを表示しているブラウザを終了させると、Quickstart画面上で切断されたことを示すメッセージが表示され、MQTTを用いるとデバイスの生死確認可能であることがわかります。

IoT Sensorを停止した際のQuickstart画面
IoT Sensorを停止した際のQuickstart画面

IoTを始めたい方も・本格導入を検討中の方も:おすすめソリューションのご紹介

ビジネスのパフォーマンスを高めようとさまざまな業種・企業で、IoT活用を前提とするプロジェクトが動き始めています。ただし、検討を始めて最初に出てくるのは、こんな要望ではないでしょうか。

「最初は実験的にスタートしたいから、小さく簡単に素早く始めたい」
「実運用に移ったときには10万・100万単位のセンサ/デバイスに対応できるスケーラビリティも確保したい」

これにお応えできるサービス・製品がIBMにあります。ぜひ、下記の資料をご覧ください。(編集部)

デバイスを使ってQuickstartを試行

次にマイコンボードを使ってQuickstartを試す手順を紹介します。今回用意したものは、次のリストのとおりです。

Arduino YUN本体 1台
Arduino YUNは、シールドなしでもWi-Fi/Ethernet接続が可能なArduino派生ボードです。Amazonなどの大手通販サイトでも入手できます。ただし、並行輸入品の場合は、技適マークを取得していない製品の可能性があります。執筆時点では、アマゾンなど大手通販サイトでも取り扱っていました。
USB2.0ケーブル(A-microB) 1本
開発環境の入ったPCとArduino YUNを接続するためにUSBケーブルが必要です。Arduino UNOはBタイプのコネクタでしたが、YUNはmicroBタイプのコネクタに変わっています。microBタイプのケーブルはAndroid携帯のコネクタにも使用されているので入手しやすいと思います。300円程度で入手可能です。
インターネット接続可能なWi-Fi環境(UQ WiMAXルータ HWD15)
インターネット接続可能なWi-Fi環境が必要となります。記事では私物のUQ WiMAXルータ「HWD15」を使って説明しています。なお、HWD15上の設定は、デフォルトのままの前提とします。
Wi-Fi接続可能なPC(Windows 7) 1台
Watson IoT Platformへの接続だけでなく、Arduino YUN上で動作するプログラムを開発するためにも使用します。USBコネクタを1つ使用します。Arduino開発ツール(Arduino IDE)はWindows、Linux、MacOS Xであれば動作します。今回はWindows 7導入済みのPCを使って説明しています。
用意したもの
用意したもの

IBM developerWorksサイトでは、Arduino YUN以外のマイコンボードを使った例をいくつか紹介しています。英語サイトですが、サンプルコードも公開されているレシピもあるので、参考になると思います。

Wi-Fiルータの設定確認、変更作業

Wi-Fi接続のためのSSID名、パスワードを確認します。Wi-FiルータHWD15では、本体のタッチパネルの[クイックメニュー]>[SSID情報]から参照することができます。

SSID情報の確認
SSID情報の確認

今回の接続では、デバイスからWatson IoT Platform側のポート番号1883番へTCP接続をおこないます。Wi-Fiルータによっては、ポート番号1883番の通信を、デフォルトでは許可していないことがあります。今回使用するWi-Fiルータ HWD15も、デフォルトでは1883番経由の通信を許可していません。設定を変更する必要があります。

HWD15の設定を変更する場合は、次のように設定を変更します。なお、他のWi-Fiルータを使用する場合は、各マニュアルを確認の上、必要があれば設定を変更してください。

HWD15のWi-FiにPCをいったん接続し、PC上のブラウザからWi-Fiルータの管理画面を開いて、管理者ユーザでログインします。HWD15の管理者ユーザ名は「admin」デフォルトパスワードは本体裏面のHMEI番号末尾5桁となっています。

HWD15管理画面へログイン
HWD15管理画面へログイン

設定タブを開き、[ファイアウォール設定]>[特定アプリケーション]を選択して、1883番ポートの接続を許可する設定を実施します。

HWD15 MQTT接続許可設定
HWD15 MQTT接続許可設定

追加および適用をおこなったら、いったんログアウトし、念のためWi-Fiルータを再起動しておきます。

IoTを始めたい方も・本格導入を検討中の方も:おすすめソリューションのご紹介

ビジネスのパフォーマンスを高めようとさまざまな業種・企業で、IoT活用を前提とするプロジェクトが動き始めています。ただし、検討を始めて最初に出てくるのは、こんな要望ではないでしょうか。

「最初は実験的にスタートしたいから、小さく簡単に素早く始めたい」
「実運用に移ったときには10万・100万単位のセンサ/デバイスに対応できるスケーラビリティも確保したい」

これにお応えできるサービス・製品がIBMにあります。ぜひ、下記の資料をご覧ください。(編集部)

Arduino YUNのWi-Fi設定

購入直後のArduino YUNは、次の手順でWi-Fi接続をおこなう必要があります。

最初に、PC上にArduino開発環境をインストールします。Arduino YUNを使う場合、http://arduino.cc/からではなく、http://arduino.org/からダウンロードする必要があります。

ブラウザから「http://arduino.org/」を開き、「Software」を選択します。

arduino.orgのトップページ
arduino.orgのトップページ

Arduino End-User License Agreementを確認し、Arduino IDEセクションの「Windows: Zip file(for non-administrator install)」リンクを押下して、Zipファイルをダウンロードします。

Arduino IDEのダウンロード
Arduino IDEのダウンロード

取得したZipファイルを展開し、c:\tools\arduino-1.7.8など適当なディレクトリへ配置します。

次に Arduino YUNを開封し、マイコンボード裏面のシールに書かれたMACアドレスを書き留めておきます。次の写真右上部12桁がMACアドレスです。

Arduino YUNのMACアドレスを確認
Arduino YUNのMACアドレスを確認

Arduino YUN側のmicroBコネクタとPC側のUSBコネクタをケーブルで接続します。ドライバへのパスを要求された場合、Arduino IDEの展開先ディレクトリ内にあるdriversディレクトリを指定してください。

Arduino YUNが正常に接続されたことを確認したら、PCのWi-Fi接続先を「Arduino Yun-<macアドレス>」に変更します。

Arduino YUNと直接Wi-Fi接続
Arduino YUNと直接Wi-Fi接続

ブラウザから「http://arduino.local/」もしくは「http://192.168.240.1/」を開きます。インターネット接続設定でプロクシを設定している場合は、解除してください。

Arduino YUNパスワード入力画面
Arduino YUNパスワード入力画面

PASSWORD欄にデフォルトパスワード「arduino」と入力し、[LOG IN]ボタンを押します。

Arduino YUN接続状況確認画面
Arduino YUN接続状況確認画面

[CONFIGURE]ボタンを押して、設定変更画面へ遷移します。

YUN BOARD CONFIGURATIONセクションのPASSWORD欄とCONFIRM PASSWORD欄に新しいパスワード文字列を入力し、TIMEZONE欄を「Asia/Tokyo」に変更します。

WIRELESS PARAMETERSセクションのDETECTED WIRELESS NETWORKS欄から接続先Wi-FiルータのSSID名を選択します。SSID選択後、WIRELESS NAME欄、SECURITY欄は自動的にセットされます。

WIRELESS PARAMETERSセクションの設定
WIRELESS PARAMETERSセクションの設定

PASSWORD欄へパスワード文字列を入力し、[CONFIGURE & RESTART]ボタンを押します。

プログレスバーが埋まるまで待機
プログレスバーが埋まるまで待機

プログレスバーが右端まで埋まったことを確認したら、ブラウザを終了します。

Wi-Fiを誤って設定してしまった場合は、Arduino YUN本体のUSBポート横にある[WLAN RST]ボタンを押して設定をリセットしてください。

Wi-Fi設定のリセット
Wi-Fi設定のリセット

IoTを始めたい方も・本格導入を検討中の方も:おすすめソリューションのご紹介

ビジネスのパフォーマンスを高めようとさまざまな業種・企業で、IoT活用を前提とするプロジェクトが動き始めています。ただし、検討を始めて最初に出てくるのは、こんな要望ではないでしょうか。

「最初は実験的にスタートしたいから、小さく簡単に素早く始めたい」
「実運用に移ったときには10万・100万単位のセンサ/デバイスに対応できるスケーラビリティも確保したい」

これにお応えできるサービス・製品がIBMにあります。ぜひ、下記の資料をご覧ください。(編集部)

Arduino YUN側プログラムのコンパイル・ダウンロード

Arduino系列のマイコンボードは、Arduino IDEを使ってArduino系列ボード上のプログラムを開発・コンパイルし、ダウンロードすることができます。開発にはSketchという独自言語を使う必要がありますが、Publisherとしてのプログラムを作成する場合、長いソースコードを記述することはまれです。

今回は「PubSubClientライブラリ」を使ったサンプルコードを全行掲載しています。開発経験の少ない方でも、動作確認まで作業することができるとおもいます。

最初にPubSubClientライブラリをダウンロードします。ブラウザを起動し、
http://pubsubclient.knolleary.net/」を開きます。

PubSubClient GitHubリンクを選択
PubSubClient GitHubリンクを選択

Downloadセクションの「GitHub」リンクを押します。

PubSubClient GitHub source codeリンクを選択
PubSubClient GitHub source codeリンクを選択

最新バージョンのSource Code(Zip)リンクを押し、Zipファイルをダウンロードします。ダウンロードが終わったらそのファイルを展開し、Arduino IDE展開先ディレクトリ内のlibrariesディレクトリ内に配置します。

PubSubClientライブラリの配置
PubSubClientライブラリの配置

PCとArduino YUNとの間のケーブルをいったん外し、再度接続します。

Arduino YUNを再度PCが認識したら、IDEの展開先ディレクトリ内にあるarduino.exeを実行し、Arduino IDE開発画面を開きます。それから、Arduino IDE開発画面の[ツール]>[ボード]>[Arduino YUN]を選択します。

ボードの選択
ボードの選択

続いて、[ツール]>[ポート]を開き、Arduino YUNが接続されたシリアルポート番号を選択します。シリアルポート番号は接続ごとに変わる可能性があります。PCと接続済みの場合、次のようにどのポートに接続しているかがわかるように表示されます。

ポートの選択
ポートの選択

そして、いよいよプログラムです。次のサンプルプログラムは、5秒間隔でWatson IoT Platform[Quickstart]へダミーデータを送信しており、送信に成功すると、シリアルモニタ画面に「successfully sent」というメッセージを表示するというものです。

次のソースコードを、Arduino IDE中央部分のコードに貼り付けます。

pub_sample.ino
#include <SPI.h>
#include <Bridge.h>
#include <Console.h>
#include <YunClient.h>
#include <PubSubClient.h>
//#include <DHT.h>

// MAC アドレス/デバイスID(要書き換え)
char macstr[] = "xxxxxxxxxxxx";

// 環境系データ(ダミー)
float temp = 15.0;
float humid = 40.0;

// ネットワーククライアント(YUN専用)
YunClient c;

// MQTTブローカエンドポイント
char serverName[]="quickstart.messaging.internetofthings.ibmcloud.com";
// クライアントID
String clientName = String("d:quickstart:arduino:") + macstr;
// トピック
String topicName = String("iot-2/evt/status/fmt/json");

// PubSubClient
PubSubClient client(serverName, 1883, 0, c);

//#define DHTPIN A0
//#define DHTTYPE DHT22
//DHT dht(DHTPIN, DHTTYPE);

// 初期化処理
void setup() {
  // シリアルモニタ準備
  Serial.begin(9600);
  while (!Serial);
  Serial.println("start serial");

  // ネットワーク準備(YUN)
  pinMode(13, OUTPUT);
  digitalWrite(13, HIGH);
  Bridge.begin();
  Serial.println("start bridge");
  delay(2000);
  digitalWrite(13, LOW);

 //dht.begin();
}

// ループ処理
void loop() {
  // char配列化
  char clientStr[34];
  clientName.toCharArray(clientStr,34);
  char topicStr[26];
  topicName.toCharArray(topicStr,26);

  // センサデータ取得
  getData();

  // MQTTブローカへ接続
  if (!client.connected()) {
    Serial.print("Trying to connect to: ");
    Serial.println(clientStr);
    client.connect(clientStr);
  }

  // メッセージ送信
  if (client.connected() ) {
    // メッセージ作成
    String json = buildJson();
    char jsonStr[300];
    json.toCharArray(jsonStr,300);

    // MQTTブローカへメッセージ送信
    boolean pubresult = client.publish(topicStr, jsonStr);
    Serial.print("attempt to send ");
    Serial.println(jsonStr);
    Serial.print("to ");
    Serial.println(topicStr);
    if (pubresult)
      Serial.println("successfully sent");
    else
      Serial.println("unsuccessfully sent");
  }

  // 5秒待機
  delay(5000);
}

// メッセージ用文字列作成処理
String buildJson() {
  String data = "{";
  data+="\n";
  data+= "\"d\": {";
  data+="\n";
  data+="\"myName\": \"Arduino YUN\",";
  data+="\n";
  data+="\"temp\": ";
  data+= (int)temp;
  data+= ",";
  data+="\n";
  data+="\"humid\": ";
  data+=(int)humid;
  data+="\n";
  data+="}";
  data+="\n";
  data+="}";
  return data;
}

// センサデータ取得
void getData() {
  //humid = dht.readHumidity();
  //temp = dht.readTemperature(false);
}

サンプルコード上の「xxxxxxxxxxxx」部分は、Arduino YUNのMACアドレスに変更してください。MACアドレスが「A1:B2:C3:D4:E5:F6」であれば、次のように変更します。

// MAC アドレス/デバイスID(要書き換え)
char macstr[] = "a1b2c3d4e5f6";

[→]ボタンを押し、プログラムをArduino YUNへ書き込みます。

Arduino YUNへの書き込み
Arduino YUNへの書き込み

Arduino IDE上に「マイコンボードへの書き込みが完了しました。」と表示されたら、[ツール]>[シリアルモニタ]を選択してシリアルモニタ画面を開きます。

シリアルモニタ画面上に「successfully sent」という文字列が表示されるまで待機します。

シリアルモニタによる動作確認
シリアルモニタによる動作確認

Quickstart上で受信確認

次に、Quickstart側で受信していることを確認します。

ブラウザを起動し、「Quickstart」を開きます。

デバイスID入力欄にサンプルソース上にMACアドレスとして記述した文字列をそのまま入力し、進むボタンを押します。

Quickstart MACアドレスの入力
Quickstart MACアドレスの入力

しばらくすると、デバイスID入力欄の下にグラフが表示され、約5秒間隔でデータが1件ずつ追加されていることがわかります。

Quickstart Arduino YUNデータのグラフ表示
Quickstart Arduino YUNデータのグラフ表示

IoTを始めたい方も・本格導入を検討中の方も:おすすめソリューションのご紹介

ビジネスのパフォーマンスを高めようとさまざまな業種・企業で、IoT活用を前提とするプロジェクトが動き始めています。ただし、検討を始めて最初に出てくるのは、こんな要望ではないでしょうか。

「最初は実験的にスタートしたいから、小さく簡単に素早く始めたい」
「実運用に移ったときには10万・100万単位のセンサ/デバイスに対応できるスケーラビリティも確保したい」

これにお応えできるサービス・製品がIBMにあります。ぜひ、下記の資料をご覧ください。(編集部)

サンプルコードの動作

サンプルコード pub_demo.inoは、developerWorksで紹介されていた Arduino UNO + Ethernetシールド ベースのサンプルコードをArduino YUN向けに書きなおしたものです。

setup()とloop()

Sketchプログラムは、基本的にsetup()loop()という2つの関数上にプログラムを記述します。

Arduinoに対して給電が開始されると、最初にsetup()を1回だけ実行します。その後、loop()を電源停止まで繰り返し実行します。

サンプルコードでは、setup()にMQTT通信のための初期化処理を、loop()にMQTT通信を1回実行し5秒待機する処理を記述しています。

また、setup()loop()の中から呼び出す関数としてbuildJson()getData()という関数を定義しています。このように独自の関数を定義することも可能です。

シリアル操作

setup()loop()の中には、「Serial」から始まる関数を呼び出している行がいくつかあります。これはシリアルポートに対する操作をおこなっています。

Arduinoを開発する場合、PCと本体をUSBケーブルで接続しますが、このときPCのシリアルポートに接続しています。シリアルポートは、プログラムのアップロードに使用しますが、プログラムの中から操作することも可能です。Arduino IDEには、シリアルモニタという機能があり、シリアルポートに対して読み書きをおこなうことができます。

Serial.print()Serial.println()は、引数として与えられた文字列をシリアル出力に書き出すことができるので、サンプルコードのように動作中のログ出力として使用することができます。

setup()内で、次のような行がありますが、シリアルモニタ画面が表示されるまでループを繰り返す処理をあらわします。

シリアルモニタ画面が表示されるまでループを繰り返す
  while(!Serial);

USB接続したPC上でシリアルモニタ画面を開くまで次の処理へ進まないため、ユーザの準備が整うまで一時停止する機能として使用しています。

グローバル変数

temphumidなど、関数の外に定義された変数を「グローバル変数」と呼びます。グローバル変数は、プログラムのあらゆるところから参照できます。一方、関数内で宣言された変数を「ローカル変数」といいます。ローカル変数は、関数の中でのみ参照可能です。

サンプルコードでは、MQTT接続を確立するために、いくつかの項目をグローバル変数として定義しています。

MQTTブローカエンドポイントのホスト名(グローバル変数serverName)

PublisherやSubscriberが指定する通信先のホスト名として、Watson IoT Platformでは「<組織id>.messaging.internetofthings.ibmcloud.com」を指定します。

組織IDは、Watson IoT Platformへ最初にサインインした際に割り当てられる6桁の文字列です。Quickstartの組織IDは「quickstart」を指定します。

クライアントID(グローバル変数clientName)

Watson IoT Platformでは、PublisherやSubscriberといったMQTTブローカと通信をおこなう対象を「クライアント」と呼びます。クライアントIDは、クライアントに対して一意となる文字列です。

文字列の書式は決まっています。クライアントがデバイス[Publisher]である場合には「d:<組織id>:<デバイスタイプ>:<デバイスid>」、アプリケーション(Subscriber)である場合には「a:<組織id>:<アプリケーションid>」とします。

「デバイスタイプ」は、型番のようなデバイスの種類をあらわす文字列のことで、開発者側で決めることができます。サンプルコードでは「arduino」を指定しています。

「デバイスID」は、シリアルナンバーのようなデバイスを一意にあらわす文字列のことで、やはり開発者側で決めることができます。サンプルコードではデバイスのMACアドレスを指定しています。

「アプリケーションID」は、Subscriberを一意であらわす文字列のことで、これも開発者側で決めることができます。

トピック(グローバル変数topicName)

Watson IoT Platformでは、トピックについても書式が決められています。サンプルコードのように、MQTTブローカへイベントのPublishingする場合は、「iot-2/evt/<イベントid>/fmt/<フォーマット形式>」とする必要があります。

「イベントID」は、デバイス側が送信の起点となったイベントをあらわす文字列のことで、開発者側で決めることができます。サンプルコードでは「status」を指定しています。

「フォーマット形式」は、メッセージとして送信されるデータ(メッセージペイロードと呼びます)の形式をあらわす文字列のことで、開発者側で決めることができます。サンプルコードでは「json」を指定しています。

関数buildJson()

buildJson()loop()内から呼び出され、メッセージペイロードとなる文字列を作成・返却する処理が実装されています。サンプルコードでは、毎回次のようなダミーデータを返却しています。

ダミーデータ
{
"d": {
"myName": "Arduino YUN",
"temp": 15,
"humid": 40
}
}

Watson IoT Platformでは、メッセージペイロードに対する形式は定められていませんが、次のような要件を満たす「IoTF JSON ペイロード仕様」を推奨しています。

  • メッセージは、dおよびtsの2つのトップレベル要素のみを含む有効なJSONオブジェクト(配列ではない)でなければならない
  • メッセージは、UTF-8でなければならない
  • d要素には、メッセージ入れて送信されるイベント(もしくはコマンド)のすべてのデータを格納する
  • d要素は必須であり、送信するデータがない場合でも必ず存在しなくてはならない
  • ts要素を使用すると、イベント(もしくはコマンド)にタイムスタンプを関連付けることができる
  • ts要素はオプションであり、値としてISO8601エンコードのタイムスタンプ文字列として有効なもの(例:”2014-12-30T14:47:36+00:00”)を指定する

Quickstart上のグラフを正しく表示させるには、このIoTF JSONペイロード仕様を満たす必要があります。

なお、Watson IoT Platform が受信可能なメッセージペイロードサイズは4KBとなっています。4KBを超えるメッセージを送信すると、通信が切断されます。

おわりに

センサデータをインターネット上に取り込むには、Subscriber側を実装する必要がありますが、残念ながらQuickstartでは試すことができません。Subscriber側も試してみたい方は、Quickstartとは別に用意されているWatson IoT Platformの無料プランを使ってみてください。無料プランの場合、最大20台までのデバイスに対して月100MBまでのデータ通信という制限付きですが、Watson IoT Platformのすべての機能を使うことができます。

Watson IoT Platformダッシュボード(デバイス1台登録済み)
Watson IoT Platformダッシュボード(デバイス1台登録済み)

また、Arduinoにセンサを接続して計測結果を取得する方法を知りたい方は、Sketchサンプルプログラム付きのブログ記事などをご覧ください。市販書籍も刊行されていますので、それらも参考に色々試してみてください。

IoTを始めたい方も・本格導入を検討中の方も:おすすめソリューションのご紹介

ビジネスのパフォーマンスを高めようとさまざまな業種・企業で、IoT活用を前提とするプロジェクトが動き始めています。ただし、検討を始めて最初に出てくるのは、こんな要望ではないでしょうか。

「最初は実験的にスタートしたいから、小さく簡単に素早く始めたい」
「実運用に移ったときには10万・100万単位のセンサ/デバイスに対応できるスケーラビリティも確保したい」

これにお応えできるサービス・製品がIBMにあります。ぜひ、下記の資料をご覧ください。(編集部)

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加

【AD】本記事の内容は記事掲載開始時点のものです 企画・制作 株式会社翔泳社

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/9233 2016/03/16 20:38

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング