電子工程系應 用 電 子 組電 腦 遊 戲 設 計 組
使用HTTP RESTfulAPI控制IO
吳錫修November 20, 2015
shap
e th
e fu
ture
電子工程系應 用 電 子 組電 腦 遊 戲 設 計 組
Bridge函式庫提供AVR及Linux處理器之間的介接
Bridge函式庫提供RESTful web service作業,透過REST樣式之URL字串命令,來指示操作動作與回應訊息
REST API
2
shap
e th
e fu
ture
電子工程系應 用 電 子 組電 腦 遊 戲 設 計 組
範例:File/Examples/Bridge/Bridge
展示如何透過HTTP REST calls方式來存取Arduino Yún控制板之IO;我們可以參照Bridge程式,使用REST設計風格來創建自己的Web API
Possible commands created in this shetch: "/arduino/digital/13" -> digitalRead(13)
"/arduino/digital/13/1" -> digitalWrite(13, HIGH)
"/arduino/analog/2/123" -> analogWrite(2, 123)
"/arduino/analog/2" -> analogRead(2)
"/arduino/mode/13/input" -> pinMode(13, INPUT)
"/arduino/mode/13/output" -> pinMode(13, OUTPUT)
線上解說http://www.arduino.cc/en/Tutorial/Bridge
Bridge範例
3
shap
e th
e fu
ture
電子工程系應 用 電 子 組電 腦 遊 戲 設 計 組
登入Arduino Yún,確認網路連線正常
測試Bridge範例 1/3
4
shap
e th
e fu
ture
電子工程系應 用 電 子 組電 腦 遊 戲 設 計 組
使用sswuyun.local/arduino/digital/13/0關閉Arduino Yún D13 LED
測試Bridge範例 2/3
5
shap
e th
e fu
ture
電子工程系應 用 電 子 組電 腦 遊 戲 設 計 組
使用sswuyun.local/arduino/digital/13/1開啟Arduino Yún D13 LED
測試Bridge範例 3/3
6直接指定Arduino Yún IP可加快連線速度
shap
e th
e fu
ture
電子工程系應 用 電 子 組電 腦 遊 戲 設 計 組
#include <Bridge.h>
#include <YunServer.h>
#include <YunClient.h>
YunServer server; //建立YunServer物件
void setup() {
pinMode(13, OUTPUT);
digitalWrite(13, LOW);
Bridge.begin(); //啟動Bridge,約需2秒時間
digitalWrite(13, HIGH); //點亮LED表示完成Bridge啟動作業
server.listenOnLocalhost();//若要從internet連接,須註解此行
server.begin(); //啟動YunServer
}
解析Bridge範例程式碼 1/10
7
shap
e th
e fu
ture
電子工程系應 用 電 子 組電 腦 遊 戲 設 計 組
void loop() {
YunClient client = server.accept(); //取出用戶連線URL字串
if (client) {
process(client); //開始處理,解析URL
client.stop(); //中止連線
}
delay(50); //間隔50ms再重複作業
}
解析Bridge範例程式碼 2/10
8
shap
e th
e fu
ture
電子工程系應 用 電 子 組電 腦 遊 戲 設 計 組
void process(YunClient client) { //處理REST CALL
String command = client.readStringUntil(‘/’); //解析第⼀層
if (command == "digital") {
digitalCommand(client); //處理數位IO指令
}
if (command == "analog") {
analogCommand(client); //處理類比IO指令
}
if (command == "mode") {
modeCommand(client); //處理接腳IO設定指令
}
}
解析Bridge範例程式碼 3/10
9
shap
e th
e fu
ture
電子工程系應 用 電 子 組電 腦 遊 戲 設 計 組
void digitalCommand(YunClient client) {
int pin, value;
pin = client.parseInt(); //讀取腳位編號
//若下⼀個字元為'/',表示URL格式如同"/digital/13/1"
if (client.read() == '/') {
value = client.parseInt(); //讀取設定值
digitalWrite(pin, value); //執行digitalWrite
//在用戶端顯示作業訊息
client.print(F("Pin D"));
client.print(pin);
client.print(F(" set to "));
client.println(value);
}
解析Bridge範例程式碼 4/10
10
shap
e th
e fu
ture
電子工程系應 用 電 子 組電 腦 遊 戲 設 計 組
else {
value = digitalRead(pin); //執行digitalRead
//在用戶端顯示作業訊息
client.print(F("Pin D"));
client.print(pin);
client.print(F(" reads "));
client.println(value);
}
}
解析Bridge範例程式碼 5/10
11
shap
e th
e fu
ture
電子工程系應 用 電 子 組電 腦 遊 戲 設 計 組
void analogCommand(YunClient client) {
int pin, value;
pin = client.parseInt(); //讀取腳位編號
//若下⼀個字元為'/',表示URL格式如同"/analog/5/120"
if (client.read() == '/') {
value = client.parseInt(); //讀取設定值
analogWrite(pin, value); //執行analogWrite
//在用戶端顯示作業訊息
client.print(F("Pin D"));
client.print(pin);
client.print(F(" set to analog "));
client.println(value);
}
解析Bridge範例程式碼 6/10
12
shap
e th
e fu
ture
電子工程系應 用 電 子 組電 腦 遊 戲 設 計 組
else {
value = analogRead(pin); //執行analogRead
//在用戶端顯示作業訊息
client.print(F("Pin A"));
client.print(pin);
client.print(F(" reads analog "));
client.println(value);
}
}
解析Bridge範例程式碼 7/10
13
shap
e th
e fu
ture
電子工程系應 用 電 子 組電 腦 遊 戲 設 計 組
void modeCommand(YunClient client) {
int pin;
pin = client.parseInt(); //讀取腳位編號
//若下⼀個字元不是‘/’,表示URL不符合"/mode/13/input"格式
if (client.read() != '/') {
client.println(F("error"));
return;
}
String mode = client.readStringUntil(‘\r’); //讀取腳位設定
if (mode == "input") {
pinMode(pin, INPUT); //執行pinMode
//在用戶端顯示作業訊息
解析Bridge範例程式碼 8/10
14
shap
e th
e fu
ture
電子工程系應 用 電 子 組電 腦 遊 戲 設 計 組
client.print(F("Pin D"));
client.print(pin);
client.print(F(" configured as INPUT!"));
return;
}
if (mode == "output") {
pinMode(pin, OUTPUT); //執行pinMode
//在用戶端顯示作業訊息
client.print(F("Pin D"));
client.print(pin);
client.print(F(" configured as OUTPUT!"));
return;
}
解析Bridge範例程式碼 9/10
15
shap
e th
e fu
ture
電子工程系應 用 電 子 組電 腦 遊 戲 設 計 組
//若不是“input”或“output”,則表示指令錯誤
client.print(F("error: invalid mode "));
client.print(mode);
}
解析Bridge範例程式碼 10/10
16