ThingConnect
Go Up to メインページ
ThingConnect デバイスでは、次のいずれかの技術を使用します。
目次
Z-Wave
Z-Wave プロトコルは、相互運用性を持つ RF ベースの無線通信技術であり、住居/軽商業環境での制御/監視/状態読み取りアプリケーション専用に設計されています。Z-Wave 技術の詳細は、「About Z-Wave Technology(Z-Wave 技術について)」を参照してください。
Z-Wave の概要
Z-Wave デバイスを使用するには、コントローラの役割を果たすデバイスが必要です。弊社では VeraLite スマート ホーム コントローラを使ってデバイスをテストしていますが、互換性のある Z-Wave コントローラであればどれを使用してもかまいません。
Z-Wave コントローラのセットアップ手順については、製造元の公式ドキュメントを参照してください。たとえば VeraLite スマート ホーム コントローラの場合は、Vera ユーザー ガイドを参照してください。
Z-Wave IoT フレームワークの使用
Z-Wave IoT フレームワークは、HTTP を使用したもので、ユーザーとデバイスの間のレイヤとして動作し、容易かつ透過的な対話を可能にします。Z-Wave IoT フレームワークを使用すると、プロパティにアクセスすることによってデバイスと対話できます。これらのプロパティには、読み取りが可能なもの、書き込みが可能なもの、両方が可能なものがあります。詳細と例については、「ThingConnect デバイスの操作」と「チュートリアル:ThingConnect IoT アプリケーションを作成する」を参照してください。
Z-Wave デバイスの検出メカニズム
Z-Wave デバイスに接続するには、以下を行う必要があります。
- Z-Wave コントローラの IP アドレスを指定する: IP アドレスをコンポーネントの URL プロパティに設定します。
- デバイスの一意識別子を指定する: デバイスの一意識別子をコンポーネントの DeviceNum プロパティに設定します。この識別子は、Z-Wave コントローラの Web インターフェイスで確認(および変更)することができます。たとえば VeraLite の場合は、デバイスの[Advanced]セクションの
id
フィールドです。 - コンポーネントをアクティブ化する: コンポーネントの Active プロパティを
True
に設定します。
IPAddress = '192.168.1.99'; //IP address of the Z-Wave controller
DeviceID = 1234; //The unique identifier of the device
FVeraAeotecLEDBulb.URL := 'http://' + IPAddress + '/port_3480';
FVeraAeotecLEDBulb.DeviceNum := DeviceID;
FVeraAeotecLEDBulb.Active := True;
IPAddress = "192.168.1.99"; //IP address of the Z-Wave controller
DeviceID = 1234; //The unique identifier of the device
FVeraAeotecLEDBulb->URL = "http://" + IPAddress + "/port_3480";
FVeraAeotecLEDBulb->DeviceNum = DeviceID;
FVeraAeotecLEDBulb->Active = True;
キャラクタリスティックの読み取りまたは書き込み
キャラクタリスティックの読み取りや書き込みは簡単です。コンポーネントに用意されているプロパティを使用するだけです。たとえば、Aeon Labs 電球の色を取得するには、次のようなコードを使用します。
Value := FVeraAeotecLEDBulb.Color;
Value = FVeraAeotecLEDBulb->Color;
キャラクタリスティックのサブスクライブ
Z-Wave 技術では、BLE の場合のようにキャラクタリスティックをサブスクライブする手段が用意されていません。"サブスクライブ" と同様の機能を実現するには、コントローラに対して定期的にクエリを実行し、アラートを受信していないかを確認します。
たとえば、Honeywell サーモスタットの温度の読み取りを "サブスクライブ" したい場合は、次のようなコードを使用します。
procedure THoneywellThermostatApp.Timer1Timer(Sender: TObject);
begin
InsideTempLabel.Text := FloatToStr(FVeraHoneywellThermostat.TemperatureValue) + '°F';
end;
void __fastcall THoneywellThermostatApp::Timer1Timer(TObject *Sender)
{
InsideTempLabel->Text = FloatToStr(FVeraHoneywellThermostat->TemperatureValue) + "F";
}
アラートの受信
Z-Wave デバイスの中にはアラートを発生させるものがあります。そのようなデバイスでアラートが発生すると、Z-Wave コントローラはそのアラートを受信します。アラートを "サブスクライブ" するには、コントローラに対して定期的にクエリを実行します(そのためのタイマまたはスレッドを使用します)。
たとえば、Fibaro 窓センサのアラートを "サブスクライブ" したい場合は、次のようなコードを使用します(抜粋)。
var
XMLNodeList: IXMLNodeList;
XMLDocument: IXMLDocument;
...
...
XMLDocument := LoadXMLData(FibaroWindowSensorApp.FVeraFibaroWindowSensor.Xmlfile);
if XMLDocument <> nil then
begin
XMLNodeList := XMLDocument.DocumentElement.ChildNodes['alerts'].ChildNodes;
for I := XMLNodeList.Count - 1 downto 0 do
if (XMLNodeList[I].Attributes['PK_Device']) = DeviceID then
break;
Date = '';
Date := XMLNodeList[I].Attributes['LocalTimestamp'];
...
end;
...
String XMLData, Date;
_di_IXMLNode XMLNodeList, XMLNodeListChild;
_di_IXMLDocument XMLDocument;
...
XMLDocument = LoadXMLData(FibaroWindowSensorApp->FVeraFibaroWindowSensor->Xmlfile);
if (XMLDocument)
{
XMLNodeList = XMLDocument->DocumentElement->ChildNodes->FindNode("alerts");
for (I = XMLNodeList->ChildNodes->Count - 1 ; I >= 0; I--)
{
XMLNodeListChild = XMLNodeList->ChildNodes->Get(I);
if ((XMLNodeListChild->Attributes["PK_Device"]) == (DeviceID))
break;
}
Date = "";
Date = XMLNodeListChild->Attributes["LocalTimestamp"];
...
Z-Wave Android の[使用する権限]
Android で Z-Wave デバイスを使用する場合、[使用する権限]のデフォルト設定を変更する必要はありません。
Bluetooth LE
Bluetooth LE(ブランド名は Bluetooth Smart)は、転送データ量と消費電力が少ないデバイスのための新しい環境を提供します。
Bluetooth LE の概要
汎用アクセス プロファイル(GAP)
汎用アクセス プロファイルは、Bluetooth における接続とサービスのアドバタイズを制御するものです。Bluetooth LE デバイスの汎用アクセス プロファイルにより、そのデバイスと他のデバイスとのやり取りの方法が決まります。
汎用アクセス プロファイルには、下記のデバイスのさまざまな役割が定義されます。
- 転送データ量と消費電力が少ない周辺デバイス。周辺デバイスは自らのサービスをアドバタイズするほか、強力な中央デバイスに接続できます。周辺デバイスの実例としては、心拍数モニタや血圧モニタなどがあります。
- より処理能力が高く搭載メモリが多い中央デバイス(周辺デバイスの接続先となります)。中央デバイスは他のデバイスを検索し、1 つの周辺デバイスとの接続を確立します。
プラットフォーム サポート
プラットフォーム | Bluetooth LE | |
---|---|---|
中央 | 周辺 | |
Windows* |
8+ |
|
Mac OS X |
10.7+ |
10.9+ |
iOS |
5+ |
6+ |
Android |
4.3+ |
* Windows Server では Bluetooth をサポートしていません(「General Bluetooth Support in Windows(Windows における Bluetooth のサポート状況概要)」を参照)。
GATT(汎用属性プロファイル)プロファイル
プロファイルは、アプリケーションでの標準サービスの使用方法を高レベルで定義したものです。たとえば、健康管理アプリケーションに使用される Heart Rate(心拍数)プロファイルがあります。心拍数センサを備えたサーバー デバイスから標準の Heart Rate サービスが公開されているため、Bluetooth LE クライアントでは、そのサービスを検出しデータ(たとえば拍動数/分など)の収集を開始します。
GATT プロファイルは、サービスとキャラクタリスティックを組み合わせたものです。
GATT プロファイルの公式ページは Bluetooth 開発者向けポータルの[GATT Specifications|Profiles]ページです。
Bluetooth LE サービス
サービスは他のサービスとの関係とキャラクタリスティックの集まりで、デバイスの構成要素の動作をカプセル化したものです。
GATT プロファイルには、番号で識別される標準サービスが 1 つ以上含まれています。たとえば、Heart Rate サービスには "0x180D" という公式番号が割り当てられています。
標準サービスの公式ページは Bluetooth 開発者向けポータルの[GATT Specifications|Services]ページです。
Bluetooth LE キャラクタリスティック
キャラクタリスティックは、単一の論理値を格納した属性型を定義しています。
1 つのサービスには、その特定のサービスの情報を提供するキャラクタリスティックが 1 つ以上含まれています。それぞれのキャラクタリスティックは公式番号で識別されます。たとえば、Heart Rate サービスには、心拍数を測定するためのキャラクタリスティック Heart Rate Measurement があります。
採用されているキャラクタリスティックの公式ページは Bluetooth 開発者向けポータルの[GATT Specifications|Characteristics]ページです。
Bluetooth LE IoT フレームワークの使用
Bluetooth LE
ベースのデバイスの IoT フレームワークでは、TBluetoothDeviceDiscoveryManager
を使用して、IoT デバイスとの接続を Bluetooth LE
ベースの一般的な接続メカニズムとして管理し、各デバイスをコンポーネントとしてラップします。たとえば、TWahooTICKRHeartRateMonitor
コンポーネントは Wahoo TICKR 心拍数モニタをラップしたものです。
TBluetoothDeviceDiscoveryManager
コンポーネントは、Bluetooth LE
ベースのデバイスに接続するための基本メカニズムを提供するものです。TBluetoothDeviceDiscoveryManager
コンポーネントでは、これらのデバイスに接続する際のタイムアウトと再試行回数を定義することができます。
Bluetooth LE デバイスの検出メカニズム
Bluetooth LE デバイス検出マネージャに用意されている検出メカニズム メソッド
TBluetoothDeviceDiscoveryManager
コンポーネントでは、次のように、検出メカニズム(DiscoveryMethod
プロパティ)の複数の選択肢をサポートしています。
検出メソッドの種類 | 説明 |
---|---|
Connect
|
中央デバイスが指定の周辺デバイスに直接接続します。 |
ScanResponse
|
中央デバイスが、周辺デバイスからアドバタイズされたデータを使用して、その周辺デバイスに高速に接続します。 |
ScanResponseAllDevices
|
アドバタイズするデータに同じプライマリ サービスを含んでいる周辺デバイスを中央デバイスがすべて検索します。 |
- メモ:
- 32 ビット Windows および 64 ビット Windows プラットフォームのアプリケーションの場合は、検出メソッドの種類として Connect を設定する必要があります。
- 一部のデバイスでは、アドバタイズするデータで自分の名前やサービスをブロードキャストしません。その場合は、代わりに検出メソッド Connect を使用し、接続先のデバイスの名前を手動で設定する必要があります。
ScanResponse
メソッドでは、指定されたプライマリ サービスを持つ ThingConnect デバイスのうち、最初に見つかったものに接続します。
ThingConnect コンポーネントの検出メカニズム イベント
TBluetoothDeviceDiscoveryManager
に設定されているどの検出メソッドについても、すべての Bluetooth LE コンポーネントに次のイベントが用意されています。
イベント名 | 説明 |
---|---|
OnDeviceConnected
|
コンポーネントがデバイスを検出しそれに接続したときに発生します。 |
OnDeviceDisconnect
|
デバイスとの接続が解除されたことをコンポーネントが検出したときに発生します。 |
OnDeviceDiscovered
|
コンポーネントが新しいデバイスを検出したときに発生します(複数回発生することがあります)。 |
TBluetoothDeviceDiscoveryManager
の検出メソッドが ScanResponseAllDevices
に設定されている場合は、ThingConnect デバイスに接続する前に次のイベントが発生することがあります。
イベント名 | 説明 |
---|---|
OnDeviceListDiscovered
|
コンポーネントが検出したデバイスをすべてリストに追加し終わったときに発生します。 |
コンポーネントが検出したデバイスをすべてリストに追加し終わる(かつ、OnDeviceListDiscovered
イベントが発生する)と、次のコンポーネント プロパティが更新され、それらを使用してデバイスに接続することができます。
DiscoveredDeviceCount
: リストに含まれている検出済みデバイスの総数が格納されています。DiscoveredDevice
: 検出したデバイスのリストから特定のデバイスを返します。
これらのプロパティの詳細については、「検出メカニズム メソッド ScanResponseAllDevices を使用する」を参照してください。
ThingConnect デバイスに接続する
検出メカニズムに応じて、次のいずれかを使って ThingConnect デバイスに接続できます。
Connect
メソッドの場合は、コンポーネントのDeviceName
プロパティを自分自身のコンポーネントの名前に設定します。ScanResponseAllDevices
メソッドの場合は、ConnectDevice
メソッドを使用して、指定のDiscoveredDevice
に接続します。詳細については、「検出メカニズム メソッド ScanResponseAllDevices を使用する」を参照してください。
Bluetooth LE デバイス検出マネージャのエラー イベント
TBluetoothDeviceDiscoveryManager
には次のイベントが用意されています。
イベント名 | 説明 |
---|---|
OnGeneralDiscoveryError
|
接続先となるデバイスをデバイス マネージャが検出できないときに発生します。 手続きには TGeneralDiscoveryErrorEvent = procedure(const Sender: TObject; const AException: Exception; var Handled: Boolean) of object;
|
ThingConnect コンポーネントのエラー イベント
すべての Bluetooth LE コンポーネントには次のイベントが用意されています。
イベント名 | 説明 |
---|---|
OnDeviceConnectionError
|
デバイスのサービスをコンポーネントが取得できないとき(デバイスが接続解除されているとき)に発生します。 |
イベントが発生した場合に対応するイベント ハンドラを実装する必要があります。
キャラクタリスティックの読み取りまたはサブスクライブ
いったんアプリケーションがデバイスに接続したら、サービスのキャラクタリスティックに格納されている情報を読み取ることができます。あるいは、キャラクタリスティックをサブスクライブして、それが変わるたびにその情報を取得することもできます。
読み取り専用のキャラクタリスティックのみ、それに対応するプロパティが Bluetooth LE コンポーネントにあります。
- メモ: サブスクリプション キャラクタリスティックには
PropertyName
値もありますが、これはあくまでドキュメントのためのものです。サブスクリプション キャラクタリスティックのプロパティ名値はコンポーネントのプロパティではありません。
どのキャラクタリスティックにもイベントがあります。イベントの名前はすべて On<PropertyName>Update
の形式に従います。イベント ハンドラは、プロパティ値の読み取り後にトリガされます。
- 読み取り専用キャラクタリスティックのデータを読み取るには、
Refresh<PropertyName>
メソッドを呼び出します。 - キャラクタリスティックをサブスクライブし、データ更新の受信を開始するには、
Subscribe<PropertyName>
メソッドを呼び出します。 - キャラクタリスティックのサブスクライブを解除し、データ更新の受信を停止するには、
Unsubscribe<PropertyName>
メソッドを呼び出します。
ここで、Zephyr 心拍数モニタを例に、BatteryLevel
プロパティの読み取りと Heart Rate Measurement キャラクタリスティック(HeartRateMeasurement
プロパティ)のサブスクライブおよびサブスクライブ解除に使用されるメソッド名を次の表に示します。
サービス | キャラクタリスティック | プロパティ | イベント名 | 読み取りメソッド | サブスクライブ メソッド | サブスクライブ解除メソッド |
---|---|---|---|---|---|---|
Battery Service | Battery Level | BatteryLevel
|
OnBatteryLevelUpdate
|
RefreshBatteryLevel
|
||
Heart Rate | Heart Rate Measurement | HeartRateMeasurement
|
OnHeartRateMeasurementUpdate
|
SubscribeHeartRateMeasurement
|
UnsubscribeHeartRateMeasurement
|
これらを操作するには、アプリケーションの uses 句に次のユニットを追加する必要があります。
- Iot.Family.BluetoothLE.GattTypes
- カスタムの Types ユニット(コンポーネントでカスタム データ型を定義する場合)
キャラクタリスティックの書き込み
サービスの対応キャラクタリスティックを書き込むことにより、デバイスにデータを送信することができます。
- イベントの名前は
On<PropertyName>WriteStatus
の形式に従います。デバイスに命令を送信してキャラクタリスティックに書き込んだ後で、イベント ハンドラがトリガされます。 - キャラクタリスティックに書き込むには、プロパティに正しい値を割り当てます。キャラクタリスティックへの書き込み方法の詳細については、「キャラクタリスティックへの書き込み」を参照してください。
サービスのキャラクタリスティックが更新されたかどうかを確認するには、別のデータ型の通知をサブスクライブするか、プロパティの現在値を読み取る必要があります(どちらにするかは、使用しているデバイスによります)。
Bluetooth LE アプリケーションのトラブルシューティング
標準の Bluetooth LE サービスが Mac OS X および iOS アプリケーションで表示されない
Bluetooth LE の標準サービスである Generic Attribute Profile サービスと Generic Access Profile サービスは、Mac OS X アプリケーションと iOS アプリケーションには表示されません。
Mac OS X および iOS オペレーティング システムでは、これらのサービスに関する情報は内部的に使用され、Generic Attribute サービスと Generic Access サービスは、検出されたサービスのリストから除外されます。
Windows 版の Bluetooth LE アプリケーションで接続できない
32 ビット Windows および 64 ビット Windows 版の Bluetooth LE アプリケーションでは、デバイスへの接続を試みる前にそれらのデバイスとペアにする必要があります。
Windows では、周辺デバイスを見つけるための検出メカニズムとして ScanResponse
や ScanResponseAllDevices
をサポートしていません。代わりに、TBluetoothDeviceDiscoveryManager
コンポーネントで検出メカニズムとして Connect を使用し、DeviceName
プロパティに自分自身のデバイスの名前を設定する必要があります。
Android 版の Bluetooth LE アプリケーションでは[使用する権限]の構成が必要
Android 版 Bluetooth LE アプリケーションの場合は、[使用する権限]プロジェクト オプション([プロジェクト|オプション...|使用する権限])で次の必須権限を有効にする必要があります。
- [Bluetooth]
- [Bluetooth 管理]