Spresense+LTE拡張ボード で IIJ Machinist を使用する

# サービス終了のお知らせ
IIJ Machinist はサービスを終了いたしました。ご愛顧ありがとうございました。  
   
以下の記事は過去の記録として残してありますが、現在は動作させることが出来ません。ご了承ください。

# この記事について
Spresense+LTE拡張ボード を使用して、[IIJ Machinist](https://machinist.iij.jp/) を利用して値を可視化します。
以前投稿した [ESP-WROOM-02/32 で IIJ Machinist を使用する](https://qiita.com/nara256/items/3b9c40f59ab742222d62) の更新版です。

# IIJ Machinist Client ライブラリ
簡単に使うためのライブラリを作成してあります。
ESP32/ESP8266に加えて Spresense でも使用できるようにバージョンアップしました。

## 使用方法
### ライブラリのインストール方法
https://github.com/nara256/IIJMachinistClient

上記ページより、緑の "Clone or download" のボタンを押し、続いて "Download ZIP"のリンクをクリックして、ファイルをダウンロードしてください。
Arduino IDE より、メニューの スケッチ → ライブラリをインクルード → zip形式のライブラリをインストール を選択し、ダウンロードしたzipを選択すれば使用可能になります。

### 事前準備(Arduino IDE)
Spresense+LTE拡張ボードを使用して IIJMachinistClient のライブラリを使用するには、[NTPClient](https://github.com/arduino-libraries/NTPClient) と [ArduinoHttpClient](https://github.com/arduino-libraries/ArduinoHttpClient) を追加する必要があります。
以下の手順で、ライブラリを追加します。

1. Arduino IDE のメニューから、ツール→ライブラリを管理... を選択します。
2. 「ライブラリマネージャ」のダイアログが開くので、"NTPClient" を検索してインストールします。
3. 同様に、"ArduinoHttpClient" を検索してインストールします。

### 事前準備(Machinist)
以下のことをやっておきます。

- [Machinist](https://machinist.iij.jp/) にサインアップして、アカウントを作成します（現時点では無料です）。
- Machinistのマニュアル([Getting Started](https://machinist.iij.jp/getting-started/))を軽く読んでおきます。
- Machinistにログインし、管理UIからプロフィールの画面からAPIキーを取得しておきます。
- Machinistの管理UIから、エージェントを1つ作成しておきます。

### 実装
Arduino IDE のメニューから、ファイル→スケッチ例→`IIJMachinistClient`→`random_value_sendor_for_spresense`を選択します。
スケッチ例を開くと以下のようなコードが表示されます。
これは、乱数を Machinist にデータ送信するだけのプログラムです。

```cpp:random_value_sender_for_spresense.ino
#include <LTE.h>
#include "IIJMachinistClient.h"

#define LTE_APN       "apn"      // replace your APN
#define LTE_USER_NAME "user"     // replace with your username
#define LTE_PASSWORD  "password" // replace with your password

#define MACHINIST_API_KEY "YOUR Machinist API KEY here"

LTE lteAccess;
IIJMachinistClient c(MACHINIST_API_KEY);

void setup()
{
  Serial.begin(115200);
  Serial.println();
  delay(3000);

  while (true) {
    if (lteAccess.begin() == LTE_SEARCHING) {
      if (lteAccess.attach(LTE_APN, LTE_USER_NAME, LTE_PASSWORD) == LTE_READY) {
        Serial.println("attach succeeded.");
        break;
      }
      Serial.println("An error occurred, shutdown and try again.");
      lteAccess.shutdown();
      sleep(1);
    }
  }

  randomSeed(analogRead(A0));
  c.setDebugSerial(Serial);
  c.init();
}

void loop()
{
  float value = (float)random(10000) / 100.;

  //あらかじめ Machinist の UI から "test" という名称の Agent を作成しておきます。
  int s = c.post("test", "NAMESPACE", "NAME", value, "KEY", "VALUE");
  if (s == 200)
    Serial.println("OK");
  else
    Serial.println("NG status=" + String(s));
  delay(60 * 1000);
}
```

### ポイント解説
サンプルのコードはわかりにくいかもしれませんが、やるべきことは非常にシンプルです。
#### ライブラリのinclude
```
#include "IIJMachinistClient.h"
```

#### インスタンス生成 & 初期化
`IIJMachinistClient` のインスタンスをグローバルで生成しておきます。引数は Machinist の UIから取得したAPIキーの文字列です。
`setup()`関数内で、LTE回線を接続後、`c.init()` 関数で IIJMachinistClientの初期化を行います。

```
IIJMachinistClient c(MACHINIST_API_KEY);

void setup()
{
  // ここでLTEを接続しておく
    ....
  // Machinist Clientの初期化
  c.init();
}
```

#### 値の送信
`c.post()`関数を使用してMachinistへ値を送信します。センサなどから取得した値を送ればOKです。
`post()`関数は引数により何種類かありますので、詳細は [githubの説明ページ](https://github.com/nara256/IIJMachinistClient) をご参照ください。

```
void loop()
{
  ...
  // 単純な値送信
  int s = c.post("Agent文字列", "namespace文字列", "name文字列", 送信値);
  // タグ付きでの値送信
  int s = c.post("Agent文字列", "namespace文字列", "name文字列", 送信値, "Tagキー文字列", "Tag値文字列");
  // 時間を指定しての値送信
  int s = c.post("Agent文字列", "namespace文字列", "name文字列", 送信値, "Tagキー文字列", "Tag値文字列", unixtime値);
  ...
}
```

# さいごに
このライブラリはIIJ非公式です。私が勝手に作ったものですので、ご質問・ご要望はIIJに送らないで、この記事なりgithubのページの方にいただけるとありがたいです。