Azure EventHubにHttpでイベントを投げる

Azure EventHubは入力のプロトコルとしてAMQPとHttpsをサポートしています。AMQPは永続通信なので通信が頻繁に発生する場合はAMQPのほうがいいのですがAMQPがすべてのデバイスにSDKが提供されているわけではないので、IoTなどを考えたときHttpでEventHubに投げたくなります。

今回はその手順をnode.jsでやってみました。

すでにEventHubが作成されていてnode.jsを実行できる環境を想定しています。

SAS Tokenを作成する

httpでEventHubに投げるには、まずSAS Tokenを作成する必要があります。

詳しくはこちらのドキュメントをみてください。

今回はnode.jsのサンプルコードを記載しておきます。

let utf8  = require('utf8');
let crypto = require("crypto");

const endpoint = 'sb://{your event hub name space}.servicebus.windows.net/';
const sharedAccessKeyName = '{your shared access key name}';
const sharedAccessKey = '{your shared access key}';

function createSharedAccessToken(uri, saName, saKey) { 
    if (!uri || !saName || !saKey) { 
            throw "Missing required parameter"; 
        } 
    var encoded = encodeURIComponent(uri); 
    var now = new Date(); 
    var week = 60*60*24*7;
    var ttl = Math.round(now.getTime() / 1000) + week;
    var signature = encoded + '\n' + ttl; 
    var signatureUTF8 = utf8.encode(signature); 
    var hash = crypto.createHmac('sha256', saKey).update(signatureUTF8).digest('base64'); 
    return 'SharedAccessSignature sr=' + encoded + '&sig=' +  
        encodeURIComponent(hash) + '&se=' + ttl + '&skn=' + saName; 
}

let token = createSharedAccessToken(
    endpoint,
    sharedAccessKeyName,
    sharedAccessKey
);

console.log(token);

endpoint、sharedAccessKeyName、sharedAccessKeyの3つのパラメータについてはEventhub名前空間の接続文字列に記載されています。

上記コードを実行して得られたSharedAccessSignatureから始まる文字列がSAS Tokenです。

node.jsからイベントを送信する

requestパッケージを利用するのでnpm install requestをしておいてください。

http通信ですが、基本的にheaderのContentTypeに下記コード参照のパラメータを、Authorizationにsas tokenを乗せて、送りたいイベントをjsonとしてpostすればOKです。

詳しくは公式のドキュメントをみてください。

const request = require('request');

let header = {
    'Content-Type':'application/atom+xml;type=entry;charset=utf-8',
    'Authorization':'{your sas token}'
}

let body = {
    "hoge1":"moge1",
    "hoge2":"moge2"
}

let option = {
    url:'https://{your eventhub namespace}.servicebus.windows.net/{your eventhub name}/messages',
    method:'POST',
    json:body,
    headers:header
}

request(option,function(error,response,body){
    if(response.statusCode === 201){
        console.log("成功しました");
    }else{
        console.log(response);
    }
});

EventHubに送信されたことを確認する

EventHubにデータが送信されていることを確認するには、Azureポータルからではなかなか難しいです。

そこでサードパーティのツールを利用します。

ServiceBusExplorerというものを利用することでEventHubに流れてくるイベントをリッスンすることができます。

次回はStreamAnalyticsとつなげます

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください