Arduino Due✖️Ethernet shield2をつかってNode.js✖️ExpressでAPIをたたく

# はじめに
最近は、ESP32でWiFi通信をして何か作ってばかりです。
そういえば有線LANにつないでインターネット接続したことがあまりありませんでした。
なので、有線LANをつなぎNode.jsとExpressをつかったAPIをArduino Dueからたたいてみます。

# 必要なもの、環境
- Arduino Due(Ethernet shield2がつかえれば良いのArduino Unoでも構いません)
- Ethernet shield2
- Node.js (v12.13.0)
- Express

# プログラム
## Node.js側のプログラム
node.jsをインストールしている前提です。
適当なディレクトリに下記を実行します。そしてプログラムはindex.jsに書きます。

```
npm init
npm i express
touch index.js
```

```javascript
var express = require('express');
const bodyParser = require('body-parser');
var http = require("http"),
    url  = require("url"),
    server;

var app = express();
app.use(express.json());
const port = process.env.PORT || 3200;
app.listen(port, () => console.log(`Listening on port ${port}...`));

app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());

app.get('/', (req, res) => {
   res.setHeader('Content-Type', 'text/plain');
   res.json("Hello World !!");
   //res.sendStatus(200);
});

app.post('/api', (req, res) => {
  //Arduinoからの送られたデータvalをコンソール画面に表示する
  console.log(req.query.val);
  res.setHeader('Content-Type', 'text/plain');
  res.json("Hello");
  //res.sendStatus(200);
});
```

## Arduino側のプログラム
```c++


#include <SPI.h>
#include <Ethernet2.h>

// Arduino Due : SerialUSB
// Arduino Uno : Serial
// 参考
// https://www.arduino.cc/reference/en/language/functions/communication/serial/
#define SERIAL SerialUSB

// Ethernet shield2のMACアドレス
// シールドの裏面に記載してある番号の前に0xをつける
byte mac[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED 
};

// Arduinoの固定IP
 // ここを適当なIPアドレス（ルーター内で空いているもの）に変更
IPAddress ip(192, 168, 1, 177);

// PCのIPアドレスを入力
char server[] = "192.168.11.66"; 
// クライアント
EthernetClient client;

int val  = 0;

// POSTする間隔
int INTERVAL = 500;

bool post(int val) {
  //データを送るのでメソッドはPOST
  String header = "POST /api/?val=";

  header += String(val);
  header += " HTTP/1.1";

  SERIAL.println("connecting...");

  //今回は3200番のポート番号を使った
  if (client.connect(server, 3200)) {
    SERIAL.println("connected");
 
    client.println(header);
    client.println("Host: 192.168.11.66");
    client.println("Content-Type: application/x-www-form-urlencoded");
    client.println("User-Agent: Arduino Post Client");
    client.println("Connection: close");
    client.println();
    client.print("");
    client.stop();
    SERIAL.println("disconnecting.");
    
    return true;
  } else {
    SERIAL.println("connection failed");
   
    return false;
  }
}

void setup() {
  SERIAL.begin(115200);

  while (!SERIAL) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }

  if (Ethernet.begin(mac) == 0) {
    SERIAL.println("Failed to configure Ethernet using DHCP");
    Ethernet.begin(mac, ip);
  }

  delay(1000);
}

void loop() {
  val = random(255);
  
  SERIAL.println(val);
  
  //ランダムな数をPOST
  post(val);
  
  delay(INTERVAL);
}

```

## 動作確認
Node.jsのindex.jsを

```
node index.js
```

で動作させ、Arduino Dueにプログラムを書き込み電源をいれれば、コンソール画面にランダムな数がPOSTされます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212276/67ca966a-f43a-1f18-4ec9-5aeb09f4eb33.png)

# 所感
POSTだけでなくGETや他のメソッドも簡単に実装できそうです。

# 参考
https://kimizuka.hatenablog.com/entry/2016/07/12/235535