IRISにてMQTTブローカーから気象データを取得しデータベースに格納する
前回のつづきとして、いよいよIRISのインターオペラビリティ機能を使ってMQTTブローカーからメッセージを受信し、データベースに格納する方法について解説したいと思います。IRISのインターオペラビリティ機能につきましてはこちらをご参照ください。
ネームスペース作成
インストール時に作成されているUSERネームスペースはInteroperabilityに必要なライブラリを参照するためのマッピングができていません。
そのため、新たにネームスペースを作成する必要があります。
作成方法は、以下の通りです。
- システム管理ポータルを起動し、「システム管理」「構成」「システム構成」「ネームスペース」をクリックします。
- 以下のようなネームスペース一覧画面が表示されますので、上にある「新規ネームスペース作成」ボタンをクリックします。
- 以下のような新規ネームスペース作成画面が表示されますので、「ネームスペース名」欄にネームスペースの名称を入力し、「グローバルのための既存のデータベースを選択」欄、「ルーチンのための既存のデータベースを選択」欄で共にデータベース「USER」を選択します。
「相互運用プロダクション用にネームスペースを有効化」欄にチェックが付いていることを確認の上、画面上の「保存」ボタンをクリックします。
- 以下のような処理ログが表示されますので、画面下の「閉じる」ボタンをクリックします。
以上でネームスペースが作成できました。
気象データテーブルの作成
以下のように観測地点、取得時刻、気温、湿度、気圧を格納するクラス(MQTT.Data.WeatherInfo)を作成します。
/// 気象データ Class MQTT.Data.WeatherInfo Extends %Persistent { /// 観測地点 (ClientID) Property PointName As %String; /// 取得時刻 Property MeasureTime As %TimeStamp; /// 気温 Property Temperature As %Numeric; /// 湿度 Property Humidity As %Numeric; /// 気圧 Property Pressure As %Numeric; Index PointDate On (PointName, MeasureTime); }
気象データ格納オペレーションの作成
以下のように、MQTT.BO.StoreDataというビジネスオペレーションクラスを作成し、MQTTメッセージ(EnsLib.MQTT.Message)からデータを取得しMQTT.Data.WeatherInfoクラスに格納するStoreData()メソッドを追加します。MessageMapの設定も忘れずに追加してください。
/// MQTTメッセージのデータベースへの保存 Class MQTT.StoreData Extends Ens.BusinessOperation [ Language = objectscript ] { Parameter INVOCATION = "Queue"; Method StoreData(pRequest As EnsLib.MQTT.Message, Output pResponse As Ens.Response) As %Status { set obj=##class(MQTT.Data.WeatherInfo).%New() set obj.MeasureTime=$zdatetime($horolog,3) set obj.Temperature=$piece(pRequest.StringValue,",") set obj.Humidity=$piece(pRequest.StringValue,",",2) set obj.Pressure=$piece(pRequest.StringValue,",",3) set obj.PointName=$piece(pRequest.Topic,"/",2) return obj.%Save() } XData MessageMap { <MapItems> <MapItem MessageType="EnsLib.MQTT.Message"> <Method>StoreData</Method> </MapItem> </MapItems> } }
プロダクションの作成
システム管理ポータルより「Interoperability」「構成」「プロダクション」メニューをクリックします。以下のようにインターオペラビリティ機能を実行するネームスペースを聞いてきますので、先ほど作成したネームスペース(TEST)を選択します。
以下のようにプロダクション構成画面が表示されますので、画面中央上にある「プロダクション設定」リンクをクリックし、右にある「アクション」タブをクリック、「新規」ボタンをクリックします。
以下のようなダイアログボックスが表示されますので、パッケージ名、プロダクション名を入力し、「OK」ボタンをクリックします。
ビジネスオペレーションの作成
アイテムが無いプロダクション構成画面が表示されますので、画面上の「オペレーション」の右にある「+」ボタンをクリックします。
クリックしますと以下のようなダイアログボックスが表示されますので、「オペレーションクラス」欄に先ほど作成したMQTT.BO.StoreDataクラスを選択し、「オペレーション名」欄にオペレーション名(メッセージ保存)、「有効にする」にチェックを入れ、「OK」ボタンをクリックします。
ビジネスサービスの作成
MQTTブローカーからメッセージを受信するMQTTサービスを作成します。画面左上の「サービス」の右にある「+」ボタンをクリックしますと、以下のようなダイアログボックスが表示されます。
ここで「サービスクラス」欄にて「EnsLib.MQTT.Service.Passthrough」を選択します。
「サービス名」欄にサービス名(MQTTサービス)を入力し、「有効にする」をチェック、「OK」ボタンをクリックします。
MQTTに接続するための設定
最初の記事にて設定したMQTTブローカー(mosquitto)にアクセスするには認証や暗号化通信が必要です。認証に必要な認証情報は以下の手順で作成します。
- 管理ポータルより「Interoperability」「構成」「認証情報」メニューをクリックします。
- 以下の画面が表示されますので、「ID」欄にMQTTAccess、「ユーザ名」欄に「iris」、「パスワード」欄に最初の記事で入力したユーザirisのパスワードを入力し、保存ボタンをクリックします。
認証の次は暗号化です。暗号化通信を行うにはCAの証明書が必要になりますので、以下の手順でSSL/TLS構成を作成します。
- 管理ポータルより「システム管理」「セキュリティ」「SSL/TLS構成」メニューをクリックします。
- 以下のようにSSL/TLS構成一覧が表示されますので、画面上の「新規構成の作成」ボタンをクリックします。
- SSL/TLS構成編集画面にて以下のように構成名(mqtt_srv)、タイプ(クライアントをチェック)、サーバ証明書の検証(必須をチェック)を入力し、「信頼済み認証局の証明書を含むファイル」欄に最初の記事の中で作成した自己認証局の証明書のファイルを設定、「保存」ボタンをクリックします。
サービスの設定
前のトピックで作成した認証情報やCAの証明書を使い、MQTTサービスの設定を行います。
以下のようなプロダクション構成画面にて「MQTTサービス」をクリックし、右にある「設定」をクリックします。
ここで以下の項目を設定し、画面上の「適用」をクリックします。
- 基本設定 - ターゲット構成:「メッセージ保存」
- MQTT - ClientID:「MQTTSRV1」
- MQTT - CredentialsName: 「MQTTAccess」
- MQTT - SSLConfigName:「mqtt_srv」
- MQTT - Topic:「point/#」
- MQTT - Url:「ssl://localhost:8883」
プロダクションの起動
以上で設定は完了しましたので、プロダクション構成画面から「開始する」ボタンをクリックします。
管理ポータルより、「システムエクスプローラ」「SQL」メニューをクリックし、「クエリ実行」タブをクリック、以下のSQLを実行させて、1分おきにレコードが増えていれば成功です。
select * from MQTT_Data.WeatherInfo
まとめ
3回にわたって、Mosquittoの設定やESP8266 ( arduino )などのマイコンのプログラミング、IRISのプログラム例を紹介しました。
このことから、マイコンからInterSystems IRISにデータが渡せることをご理解いただけたかと思います。
また、IRISの公開鍵基盤を使用して証明書等作成できることもご確認いただけたかと思います。
ご意見、ご質問等ございましたら、ご遠慮なくコメントに追加いただければと思います。
最後までお読みいただきありがとうございました。