Incoming Webhook¶
[更新: 2023年06月29日]
1. サービスアダプタ作成¶
さくらのクラウドコントロールパネルより新規にIncoming Webhookサービスアダプタを作成します。 サービスアダプタの追加画面からIncoming Webhookに必要な情報を入力します。
名前 | サービスアダプタを管理する名前を入力します。 |
プロジェクト | サービスアダプタを接続するプロジェクトを選択します。 作成されたサービスアダプタは、ここで選択したプロジェクトに所属するSIMとのみ通信できます。 |
サービスアダプタ | incoming webhookを選択します。 |
シークレット | 任意に文字列を設定します。Incoming WebhookのURLへ届いたメッセージをIoTクラウドコア側でメッセージの検証を行い、メッセージの改ざんなどを防止します。 リクエストボディをメッセージ、Secret に入力した文字をキーとするHMAC-SHA1を計算し、X-Sakura-Signatureヘッダとして、リクエストを送信してください。 |
各項目を入力し、「作成」ボタンをクリックするとサービスアダプタを作成できます。なお、入力した項目は後からでも変更ができます。
参考
双方向通信を行う Webアプリケーション実装例 にて、Incoming Webhookを用いた作例を参照できます。
2. メッセージの送信¶
Incoming Webhook用のURLにデータを送信することで、デバイス方向へメッセージを送信できます。 URLは暗号化プロトコル(HTTPS)のみ対応しています。
例としてdata.jsonというファイルを準備し、以下のjsonメッセージを記載します。
その際、 <device_id>
は適宜書き換えます、 device_id
はプロジェクトのSIM一覧画面から確認することができます。
{
"device_id":"<device_id>",
"type":"object",
"payload":[
{
"type":"int32",
"tag":"FF",
"value":15
},
{
"type":"float64",
"tag":"00",
"value":3.141592653589793
}
]
}
メッセージデータを送信する前に末尾の改行コードを削除します。
$ sed -i -z 's/\n//g' data.json
また、シークレットを設定している場合リクエストボディをメッセージとしてHMAC-SHA1を計算します。 <secret>は適宜書き換えます。
$ cat data.json | openssl dgst -sha1 -hmac "<secret>"
(stdin)= xxxxxx
上記のHMAC-SHA1を X-Sakura-Signature ヘッダに入れて、POSTリクエストを送ります。 <token>は適宜書き換えます。
正しく送信ができた場合、サービスアダプタはnotifyタイプのデータを応答します。
curl -X POST --header 'Accept: application/json' --header 'X-Sakura-Signature: xxxxxx' -d @data.json 'https://incoming.sipf.iot.sakura.ad.jp/v0/<token>'
{"device_id":"<device_id>","type":"notify","id":"xxxxxxxxxxxxxxxx"}
シークレットに誤りあり送信が失敗した場合、サービスアダプタはerrorタイプのデータを応答します。
curl -X POST --header 'Accept: application/json' --header 'X-Sakura-Signature: xxxxxx' -d @data.json 'https://incoming.sipf.iot.sakura.ad.jp/v0/<token>'
{"device_id":"<device_id>","type":"error","datetime":"<datetime>>","payload":{"error":"Invalid Signature","detail":"invalid signature"}}
参考
3. エラーレスポンスの一覧¶
Incoming Webhook に対してリクエストに誤りがあった場合、以下のようなエラーが返されます。
HTTP Status | エラーの原因と対処法 |
400(Bad Request) | 正しいメッセージフォーマットでリクエストてください |
401(Unauthorized) | 正しいトークンを含めてアクセスしてください |
403(Forbidden) | デバイスID がサービスアダプタと連携されていません |
404(Not Found) | デバイス、もしくはデバイスに対するサービスアダプタが見つかりません |
405(MethodNotAllowed) | POST 以外の HTTP Request は許可されておりません |
422(Unprocessable Entity) | JSON の形式が間違っています。 正しいメッセージフォーマットでリクエストしてください |
429(Too Many Request) | プラットフォームへのリクエストが多すぎます。 時間をおいてリクエストしてください |
500(Internal Server Error) | 内部エラーです。時間をおいてリクエストしてください |