Microsoft Azure IoT Hub with Java
2015年12月15日 at 5:24 午後 1件のコメント
Microsoft Azure の IoT Hub が Java でも利用できるということで試しました。Microsoft Azure の IoT Hub に関する詳細な説明はこちらをご参照ください。
Azure IoT Hub とは
IoT Hub と Event Hubs の比較
私がはまったのは1点で、「Device ID」をどうやって作るかという点でしたが、そこも下記にくわしく手順を記載します。
1. 最初に、Microsoft Azure の管理ポータルにアクセスし、新規から IoT Hub を作成します。
Microsoft Azure の管理ポータルへアクセス
「参照 >」から「IoT Hub プレビュー」を選択します。

「新規」ボタンを押下すると、下記の画面が表示されますので「Name」に名前を入力し、利用する規模に応じて価格やプランを選択してください。

次に、リソース・グループ名を新規に作成し、ロケーションとして「東アジア」を選択し最後に「作成」ボタンを押下してください。

2. Windows 環境で DeviceExplorer をインストール
Azure IoT SDKsのサイトにアクセスし、DeviceExplorer のインストーラを入手してください。Windows 環境用に用意されている「SetupDeviceExplorer.msi」をダウンロードします (このリンクから入手できる版は 2015-11-30 版です、最新版はAzure IoT SDKsから入手してください)。
ファイルを入手後、入手したファイル(インストーラ)をクリックしてインストーラを起動してください。

次に、インストール場所や利用者を指定し「Next >」ボタンを押下します。

確認画面が表示されますので、「Next>」ボタンを押下します。

ユーザアカウント制御の確認画面が表示されますので、「はい(Y)」を押下してインストールをはじめてください。

インストールが完了すると下記の画面が表示されますので「Close」ボタンを押下してください。

インストールが完了すると Windows 10 の場合、メニューから「最新追加されたもの」の欄から実行できることを確認できます。

3. Device Explorer から Device ID と接続用文字列を作成
メニューから DeviceExplorer を起動してください。起動すると下記の画面が表示されます。

ここで、DeviceExplorer から Microsoft Azure の IoT Hub に接続し操作できるように、Azure 上で接続用の情報を確認し取得します。Microsoft Azure の管理ポータルに接続し、作成した IoT Hub のサービスを参照してください。

IoT Hub サービスを参照すると「Settings」というボタンがあるので押下します。

「Settings」ボタンを押下すると「Shared access policies」のリンクがあるので選択してください。

「Shared access policies」の POLICY から「iothubowner」を選択してください。
選択すると「Connection string—primary key」の欄があります。記載内容をクリップ・ボードへコピーできるようにコピー・ボタンが右端に用意されていますので、これをクリックしてコピーしてください。

クリップ・ボードへ文字列がコピーされると「コピー済み」と表示されます。

文字列をコピーしたのち、Device Explorer に戻り、文字列を貼り付けてください。

文字列をコピーしたのち、「Update」ボタンを押下してください。正しく設定が更新されると「Settings updated successfully」という画面が表示されます。

続いて、Device Explorer のタブから「Management」を選択し「Create」ボタンを押下してください。

ボタンを押すと、下記の画面が表示されますので、「Device ID」欄にデバイス固有の名前を入力し「Create」ボタンを押下してください。(Primary Key,Secondary Keyは自動的にキーの文字列が入力されています。)

ボタンを押下すると下記の画面が表示されますので「Done」ボタンを押下してください。

デバイス ID を作成すると一覧に1行が追加されます。ここで、追加された行をマウスで右クリックしてください。すると、選択メニューが表示されますので、「Copy connection string for selected device」を選択して接続用の文字列をコピーしてください。

コピーして作成された、接続用の文字列の例は下記のような文字列です。この文字列は後からのプログラム内で記述する必要があります。そこで、この文字列を一時的にテキストファイルなどに保管しておいてください。
HostName=HOSTNAME.azure-devices.net;DeviceId=DEVICE-ID;SharedAccessKey=Wf0o****************************************
※ 補足:Device Explorer の詳しい使い方は下記に記載されていますので、こちらもご確認ください。
How to use Device Explorer for IoT Hub devices
4. Microsoft Azure IoT Hub サンプルコードの作成
それでは、プログラムを組むための環境設定や準備が整いましたので、実際にプログラムを書いてみましょう。本サンプル・アプリケーションは、基本的にこちらに記載されている内容を実際に動作させた物です。
※ 本記事の目的は、IoT Hub の設定方法を説明するのがメインのため、コードの詳細にまでは触れず、MS 社員のどなたかが作成したコードをそのまま記載しています。しかし、この一連の設定ができると色々と面白いことができるので、まずは基本的な手順を理解してください。
Maven の pom ファイルは下記のようになります。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.yoshio3</groupId>
<artifactId>Azure-IoT-Hub</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven-compiler-plugin-version>2.3.2</maven-compiler-plugin-version>
</properties>
<dependencies>
<dependency>
<groupId>com.microsoft.azure.iothub-java-client</groupId>
<artifactId>iothub-java-client</artifactId>
<version>1.0.0-preview.7</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.4.2</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
<configuration>
<finalName>${project.artifactId}-${project.version}</finalName>
<filters>
<filter>
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
</filters>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.6</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>com.yoshio3.Main</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
</project>
Java のサンプル・ソースコードはこちらになります。
package com.yoshio3;
import com.microsoft.azure.iothub.DeviceClient;
import com.microsoft.azure.iothub.IotHubClientProtocol;
import com.microsoft.azure.iothub.Message;
import com.microsoft.azure.iothub.IotHubStatusCode;
import com.microsoft.azure.iothub.IotHubEventCallback;
import com.microsoft.azure.iothub.IotHubMessageResult;
import java.io.IOException;
import java.net.URISyntaxException;
import java.util.Scanner;
public class Main {
protected static class EventCallback
implements IotHubEventCallback {
@Override
public void execute(IotHubStatusCode status, Object context) {
Integer i = (Integer) context;
System.out.println("IoT Hub responded to message " + i.toString()
+ " with status " + status.name());
}
}
protected static class MessageCallback
implements com.microsoft.azure.iothub.MessageCallback {
@Override
public IotHubMessageResult execute(Message msg,
Object context) {
System.out.println(
"Received message with content: " + new String(msg.getBytes(), Message.DEFAULT_IOTHUB_MESSAGE_CHARSET));
return IotHubMessageResult.COMPLETE;
}
}
public static void main(String... args) throws IOException, URISyntaxException {
//Device Explorer で作成してコピーした接続用の文字列をここに記載
String connString = "HostName=HOSTNAME.azure-devices.net;DeviceId=DEVICE-ID;SharedAccessKey=Wf0o****************************************";
IotHubClientProtocol protocol = IotHubClientProtocol.AMQPS;
DeviceClient client = new DeviceClient(connString, protocol);
MessageCallback messageCallback = new MessageCallback();
client.setMessageCallback(messageCallback, null);
client.open();
for (int i = 0; i < 10; ++i) {
String msgStr = "Event Message " + Integer.toString(i);
try {
Message msg = new Message(msgStr);
msg.setProperty("messageCount", Integer.toString(i));
System.out.println(msgStr);
EventCallback eventCallback = new EventCallback();
client.sendEventAsync(msg, eventCallback, i);
} catch (Exception e) {
e.printStackTrace();
}
}
System.out.println("Press any key to exit...");
Scanner scanner = new Scanner(System.in);
scanner.nextLine();
client.close();
}
}
念のため、Maven プロジェクトは Git Hub にもあげておきます。上記をベースに、Microsoft Azure IoT Hub Java Client 1.0.0-preview.7 API を参照しながらプログラムを作ってみてください。
5. デバイスでプログラム実行
プログラムをビルド後、下記のコマンドを IoT デバイス上で実行してください。
# java -jar Azure-IoT-Hub-1.0-SNAPSHOT.jar
実行すると、下記のようなメッセージが表示されます。
|
$ java -jar Azure-IoT-Hub-1.0-SNAPSHOT.jar Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8 12 15, 2015 5:27:38 午後 org.apache.qpid.proton.engine.impl.ssl.SslEngineFacadeFactory getClass 警告: unable to load org.bouncycastle.openssl.PEMReader 12 15, 2015 5:27:38 午後 org.apache.qpid.proton.engine.impl.ssl.SslEngineFacadeFactory getClass 警告: unable to load org.bouncycastle.openssl.PasswordFinder 12 15, 2015 5:27:38 午後 org.apache.qpid.proton.engine.impl.ssl.SslEngineFacadeFactory 警告: unable to load bouncycastle provider Event Message 0 Event Message 1 Event Message 2 Event Message 3 Event Message 4 Event Message 5 Event Message 6 Event Message 7 Event Message 8 Event Message 9 Press any key to exit… IoT Hub responded to message 5 with status OK_EMPTY IoT Hub responded to message 4 with status OK_EMPTY IoT Hub responded to message 7 with status OK_EMPTY IoT Hub responded to message 2 with status OK_EMPTY IoT Hub responded to message 3 with status OK_EMPTY IoT Hub responded to message 6 with status OK_EMPTY IoT Hub responded to message 1 with status OK_EMPTY IoT Hub responded to message 9 with status OK_EMPTY IoT Hub responded to message 0 with status OK_EMPTY IoT Hub responded to message 8 with status OK_EMPTY |
参考:
Microsoft Azure IoT device SDK for Java
IoT Kit ハンズオン トレーニング 初めの一歩モノの接続からデータ分析まで by @embedded_george
最後に、今回は実戦的なアプリまでは作成しませんでしたが、上記をベースに Raspberry Pi や LEGO Mindstorms 上にプログラムを配置し、Azure 上にデータを配信したり、Azure から各種デバイスを操作したりできるようになりますね。
Let’s enjoy IoT with Java on Azure !!
Entry filed under: Microsoft Azure. Tags: Azure, IoT, Java.

1.
WebSocket ハンズオンと Java on Microsoft Azure について | 寺田 佳央 - Yoshio Terada | 2015年12月22日 1:36 午後
[…] Microsoft Azure IoT Hub with Java […]