特にSwiftでやる必要もないんですけど、 Swift愛好会に来てるのでServer Side Swiftで実装してみます。
やりたいこと
デバイス(Nefry BT) -----> Fastsensing
という形でデバイスデータをBIツールになげてリアルタイム可視化です。
ただ、Fastsensing側のAPI側のレスポンスが怪しく、Arduinoのライブラリが途中で死んでしまう問題がありました苦笑。
ということで
デバイス(Nefry BT) ---server side swift--> Fastsensing
こんな感じでトンネルさせるサーバーを用意してみます。
Swift側
/fast/値
の形でHTTPリクエストを受け付けて、来た値をFastSensingのAPI(f-io.net)に対してHTTPリクエストする処理です。
main.swift
・
(省略)
・
・
drop.get("fast", ":id") { req in
guard let id = req.parameters["id"]?.int else {
throw Abort.badRequest
}
print(id)
var json = JSON()
try json.set("hello", id)
let res = try drop.client.get("http://f-io.net/d1/デバイスID?チャンネル名=\(id)")
print(res)
return json
}
・
(省略)
・
・
デバイス側
fast.ino
#include <WiFiClientSecure.h> // HTTPS通信のために必要
String TARGET_HOST = "xxxxxxxxxx"; //Swiftでたてたサーバー
int analog;
void setup() {
Serial.begin(115200);
}
void loop() {
analog = analogRead(A1);
String trainDelayJson = getTrainDelayJson(analog); // JSONを取得する
Serial.print(trainDelayJson);
delay(1000);
}
String getTrainDelayJson(int sendData) {
WiFiClientSecure client; // 変数を宣言
// サーバーにHTTPSのデフォルトポート(443)でアクセスしてみる
if ( !client.connect(TARGET_HOST.c_str(), 443) ) {
Serial.println("接続失敗");
return "";
}
Serial.print("data: ");
Serial.println(sendData);
client.print(String("GET /fast/"+(String)sendData+" HTTP/1.1\r\n") +
"Content-type: application/json \r\n" +
"Host: "+TARGET_HOST.c_str()+"\r\n" +
"Connection: close\r\n\r\n"); // HTTP-GETのリクエストメッセージを書く
// レスポンスが来るまでちょっと待つ
delay(500);
// HTTP-GETのレスポンスを保存しておく変数
String response = "";
// レスポンスを変数に格納する
while (client.available()) {
response += client.readStringUntil('\r');
}
Serial.println("接続成功");
Serial.println(response);
return response;
}
これで起動すると
デバイス -> Server Side Swift -> Fastsensingという流れでモニタリングができました。
動いてる様子はこんな感じ。