SoracomBeamのUDP → HTTP/HTTPS エントリポイント + Raspberry Piを使用してAWS API Gatewayからレスポンスを取得する方法をまとめました
はじめに
SoracomBeam UDP → HTTP/HTTPS エントリポイントとは?
SoracomBeamのエンドポイントにUDPリクエストを送るとSoracomBeam側でHttpのPOSTリクエストに変換してくれる機能
この機能では嬉しいことにレスポンスを返してくれるため、UDPを使用しているにも関わらずHTTPのレスポンスを受け取ることができる
詳細は
https://users.soracom.io/ja-jp/docs/beam/udp-http/
に記載されています。
なお、ポイントとしては
リクエストBeam は送信されたメッセージを Base64 エンコードしたうえで以下のような JSON にし、HTTP POST リクエストのボディに設定します。
の2点
- SoracomからはPOSTでメッセージは送られる
- メッセージはBase64にエンコードされる
SoracomBeam とRaspberry Piのセットアップについて
Soracom初期セットアップ
https://soracom.jp/recipes_index/4171/#SORACOM_Air
を参照してセットアップします
API側の用意
以下の記事を参考にAPIGatewayのサンプル環境を作成
https://users.soracom.io/ja-jp/docs/beam/aws/
ただし
- 今回はUDP → HTTP/HTTPS エントリポイントを使用するのでメソッドはPOSTを設定
- メッセージはBase64に変換されてSoracomからAWSに送信されてくるためLambda側でBase64をデコードする必要がある
があるためLambda関数を以下のように変更しました
// initialize SDK and document client
var AWS = require("aws-sdk");
var docClient = new AWS.DynamoDB.DocumentClient();
exports.handler = function(event, context) {
// insert imsi and timestamp into item object
console.log(event);
event.item.imsi = event.imsi;
event.item.timestamp = event.timestamp;
const payload = Buffer.from(event.item.payload, 'base64').toString('ascii');
const obj = JSON.parse(payload);
event.item.a = obj.a;
event.item.b = obj.b;
event.item.c = obj.c;
// build API parameter
var params = {
Item: event.item,
TableName: 'BeamDemo'
};
// call PutItem operation
docClient.put(params, function(err, data){
if (err)
context.fail(err);
else
context.succeed({Item:params, Result:'success'});
});
};
実際にUDPで送信してみる
以下のサンプルプログラムを作成して送信してみます
from datetime import datetime
import socket
print('The client started at', datetime.now())
client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
client.sendto(b'{\"a\":100,\"b\":200,\"c\":30}', ('beam.soracom.io', 23080))
data, addr = client.recvfrom(1024)
print("at", datetime.now(), "data: ", data, "addr: ", addr)
client.close()
レスポンスについて
pi@raspberrypi:~/Downloads $ python3 udp_send.py
The client started at 2021-06-24 00:52:02.142770
at 2021-06-24 00:52:03.846639 data: b'{"Item":{"Item":{"payload":"eyJhIjoxMDAsImIiOjIwMCwiYyI6jjjlkg","imsi":"12345678","timestamp":1624463522314,"a":100,"b":200,"c":30},"TableName":"BeamDemo"},"Result":"success"}'
上記のようにUDPの送信に対してAWSからのレスポンスを受け取れました。
実際にDynamoDB側にも送信した値が保存されています
まとめ
SoracomBeamのUDP → HTTP/HTTPS エントリポイントを使用してRaspberry Pi経由でAWS側からレスポンスを受け取れることをまとめました。
参考になれば幸いです