セキュアでトラブルの少ないプログラムの書き方

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){

}