obnizをセキュアに、トラブル少なく本格運用をするには、いくつかプログラムの書き方を注意する必要があります。
アクセストークンを発行する
他人がobnizを勝手に動かさないようにセキュリティレベルを上げましょう。アクセストークンを発行することで、このトークンを知らない人からはアクセスができなくなります。
/reference/cloud/device-management/security-setting/
切断時、再接続時の挙動をきちんと明確にする
obnizとの接続が切れた場合、その後にobnizとの通信は行うことができません。無限ループなどでセンシングを行っていると、この部分の考慮が不足する場合があります。 obniz.onloop
を使って安全にループ管理を行うことができます。
/guides/basics-of-html-and-javascript/how-to-loop/
コールバック関数内でobnizを使う場合は、obnizのステータスを確認する
たとえば、HTTPリクエストが来た際など、任意のタイミングで実行される関数ではobnizのステータスがオフラインの可能性があります。オフライン状態のobnizやパーツに命令を送ることはできませんので、 obniz.connectionState === "connected"
を確認してから命令を送るようにしましょう
予期せぬプロセスが終了時に、再起動するように
obnizに限ったことではないですが、プログラムに予期せぬエラーはつきものです。予期せぬエラーが発生してもサービスを継続させるために、pm2やforeverなどの永続化サービスを活用しましょう。
上記を踏まえたサンプルプログラムがこちらです。
const Obniz = require("obniz");
initDb();
// access_tokenを設定します。
const obniz = new Obniz("obniz_id_here", { access_token:"xxxxxxxxxxx" })
obniz.onconnect = async ()=>{
// 接続時処理(初期設定など)
await saveObnizStatusToDb("connected");
const tempSensor = obniz.wired("LM35DZ", { gnd:0 , output:1, vcc:2});
obniz.onloop = async ()=>{
//繰り返し処理:obniz.onloopを使うことでオフライン時はループを抜ける
const temp = await tempSensor.getWait();
console.log(temp);
await saveTempToDb(temp);
};
}
obniz.onclose = async ()=>{
// 切断時処理(コールバックのリセットなど)
await saveObnizStatusToDb("disconnected");
}
// コールバック関数内でobnizを使う場合はstateを確認する
function onSomeCallback(){
if(obniz.connectionState === "connected"){
obniz.display.clear();
obniz.display.print(text);
}else{
// obnizがオフラインだったときにどうするか
}
}
function initDb(){
}
async function saveTempToDb(temp){
}
async function saveObnizStatusToDb(status){
}