< >
Home » Arduino库教程 » Arduino库教程-Bridge-Bridge

Arduino库教程-Bridge-Bridge

Bridge

  • 这个Yún设备例子示范了怎么用Bridge函数库REST calls通过来进入开发板数字和模拟引脚。它示范了当通过浏览器用REST style calls时,你可以创建你自己的API。

  • 当运行这个例子时,确保你的电脑和Yún设备连着同样的网络。当你有编译好开发板,你可以请求一个pin上的值,把一个值写入一个pin,和设置一个pin作为输入或者输出。

  • 当REST密码被关闭时,你可以用下面URL结构来使用浏览器:

http://myArduinoYun.local/arduino/digital/13 : calls digitalRead(13);
http://myArduinoYun.local/arduino/digital/13/1 : calls digitalWrite(13,1);
http://myArduinoYun.local/arduino/analog/9/123 : analogWrite(9,123);
http://myArduinoYun.local/arduino/analog/2 : analogRead(2);
http://myArduinoYun.local/arduino/mode/13/input : pinMode(13, INPUT);
http://myArduinoYun.local/arduino/mode/13/output : pinMode(13, OUTPUT);
You can use the CURL command from the command line instead of a browser if you prefer.

硬件要求

  • Yún 开发板 或者 shield

电脑和 Yún 设备要在同一个无线或者连线的网络里。

软件要求

  • 网络浏览器

电路

  • 这个例子没有其他电路
    请输入图片描述
    图由 Fritzing 软件绘制

样例代码

  • 这个例子展示了制作REST请求到Yún设备来在开发板的引脚上读取或者写入信息。

  • 你需要包括Bridge, YunServer, 和 YunClient库文件:

#include <Bridge.h>
#include <YunServer.h>
#include <YunClient.h>

[Get Code]

  • 初始化服务器,使能 Yún 设备来倾听连接好的客户端。
YunServer server;
  • 在setup()里,开始串口通讯来调试目标,并且当Bridge开始时打开pin13的内置LED灯。Bridge.begin()是一个模块,应该要花2秒钟才完成。一旦Bridge开始,熄灭LED灯。
void setup() {
  Serial.begin(9600);
  pinMode(13,OUTPUT);
  digitalWrite(13, LOW);
  Bridge.begin();
  digitalWrite(13, HIGH);

[Get Code]

  • 在setup()的第二部分,告诉YunServer的例子来倾听只来自本地服务器的输入连接。到Linux的连接将会通过32U4 processor,来分析和控制引脚。这会发生在port 5555上。用server.begin()开始运行服务器。
server.listenOnLocalhost();
  server.begin();
}

[Get Code]

  • 在loop()里,你创建一个云客户端的例子来管理连接。如果客户端连接上了,用custom函数(如下所示)处理请求,并且当结束时关闭连接。

  • 把一个延时放在loop()的后面很有帮助,可以防止中央处理器做太多工作。

void loop() {
  YunClient client = server.accept();

  if (client) {
    process(client);
    client.stop();
  }

  delay(50); 
}

[Get Code]

  • 创建一个名为 process 的函数,用来接收云客户端作为其参数。通过创建一个字符串来保存输入信息,然后读取命令。通过函数(digital, analog, and mode) 来分析REST命令,并且发送信息到合适命名的函数。
void process(YunClient client) {
  String command = client.readStringUntil('/');

  if (command == "digital") {
    digitalCommand(client);
  }
  if (command == "analog") {
    analogCommand(client);
  }
  if (command == "mode") {
    modeCommand(client);
  }
}

[Get Code]

  • 创建一个函数来处理数字命令。接受客户端作为其参数。创建一些本地变量来保存引脚和命令的值。
void digitalCommand(YunClient client) {
  int pin, value;

[Get Code]

  • 分析客户端的请求,然后用client.parseInt()来使引脚工作。

  • 如果引脚后面的字符是一个 "/",就意味着URL准备获得下面“1”或者“0”的值。这个值将会为引脚设计一个值,切换它高电平或者低电平。如果尾部没有"/",从特定的引脚读取数值。

pin = client.parseInt();

  if (client.read() == '/') {
    value = client.parseInt();
    digitalWrite(pin, value);
  } 
  else {
    value = digitalRead(pin);
  }

[Get Code]

  • 打印这个值到客户端,并且用当前引脚的值更新数据库钥匙。

  • 通过包装这个值(在F()里)到客户端,你将从闪存里打印。这个对节省SRAM的空间很有用处(当处理像URL这种长字符串时就很有用了)。

  • 钥匙会是这个引脚和类型。例如 D2作为数字引脚2存储。无论这个值是什么,都会设置成引脚的当前值,或者从引脚里读取。

client.print(F("Pin D"));
  client.print(pin);
  client.print(F(" set to "));
  client.println(value);

  String key = "D";
  key += pin;
  Bridge.put(key, String(value));
}

[Get Code]

  • 用同样的方法设置一个函数来控制模拟调用,除了当模拟输入引脚工作时,设置钥匙到A来代替D:
void analogCommand(YunClient client) {
  int pin, value;

  pin = client.parseInt();

  if (client.read() == '/') {
    value = client.parseInt();
    analogWrite(pin, value);

    // Send feedback to client
    client.print(F("Pin D"));
    client.print(pin);
    client.print(F(" set to analog "));
    client.println(value);

    String key = "D";
    key += pin;
    Bridge.put(key, String(value));
  }
  else {
    value = analogRead(pin);

    client.print(F("Pin A"));
    client.print(pin);
    client.print(F(" reads analog "));
    client.println(value);

    String key = "A";
    key += pin;
    Bridge.put(key, String(value));
  }
}

[Get Code]

  • 创建多一个函数来控制引脚mod的改变。接受YunClient作为其参数,并且创建一个本地变量来保存这个引脚的数值。读取引脚值,就像你在数字和模拟函数里那样做。
void modeCommand(YunClient client) {
  int pin;
  pin = client.parseInt();

[Get Code]

  • 检查确保URL是有效的。

    if (client.read() != '/') {
    client.println(F("error"));
    return;
    }

[Get Code]

  • 如果它是一个有效的URL,保存这个URL作为字符串。如果引脚模式是输入或者输出,配置这个引脚,并且报告到客户端。如果字符串不能匹配这些值,返回一个error。
String mode = client.readStringUntil('\r');

  if (mode == "input") {
    pinMode(pin, INPUT);
    // Send feedback to client
    client.print(F("Pin D"));
    client.print(pin);
    client.print(F(" configured as INPUT!"));
    return;
  }

  if (mode == "output") {
    pinMode(pin, OUTPUT);
    // Send feedback to client
    client.print(F("Pin D"));
    client.print(pin);
    client.print(F(" configured as OUTPUT!"));
    return;
  }

  client.print(F("error: invalid mode "));
  client.print(mode);
}

[Get Code]

  • 完整的程序如下:
/*
  Arduino Yún Bridge example

  This example for the Yún101/YunShield/Yún shows how 
  to use the Bridge library to access the digital and
  analog pins on the board through REST calls.
  It demonstrates how you can create your own API when
  using REST style calls through the browser.

  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)

  This example code is part of the public domain

  http://www.arduino.cc/en/Tutorial/Bridge

*/

#include <Bridge.h>
#include <BridgeServer.h>
#include <BridgeClient.h>

// Listen to the default port 5555, the Yún webserver
// will forward there all the HTTP requests you send
BridgeServer server;

void setup() {
  // Bridge startup
  pinMode(13, OUTPUT);
  digitalWrite(13, LOW);
  Bridge.begin();
  digitalWrite(13, HIGH);

  // Listen for incoming connection only from localhost
  // (no one from the external network could connect)
  server.listenOnLocalhost();
  server.begin();
}

void loop() {
  // Get clients coming from server
  BridgeClient client = server.accept();

  // There is a new client?
  if (client) {
    // Process request
    process(client);

    // Close connection and free resources.
    client.stop();
  }

  delay(50); // Poll every 50ms
}

void process(BridgeClient client) {
  // read the command
  String command = client.readStringUntil('/');

  // is "digital" command?
  if (command == "digital") {
    digitalCommand(client);
  }

  // is "analog" command?
  if (command == "analog") {
    analogCommand(client);
  }

  // is "mode" command?
  if (command == "mode") {
    modeCommand(client);
  }
}

void digitalCommand(BridgeClient client) {
  int pin, value;

  // Read pin number
  pin = client.parseInt();

  // If the next character is a '/' it means we have an URL
  // with a value like: "/digital/13/1"
  if (client.read() == '/') {
    value = client.parseInt();
    digitalWrite(pin, value);
  } else {
    value = digitalRead(pin);
  }

  // Send feedback to client
  client.print(F("Pin D"));
  client.print(pin);
  client.print(F(" set to "));
  client.println(value);

  // Update datastore key with the current pin value
  String key = "D";
  key += pin;
  Bridge.put(key, String(value));
}

void analogCommand(BridgeClient client) {
  int pin, value;

  // Read pin number
  pin = client.parseInt();

  // If the next character is a '/' it means we have an URL
  // with a value like: "/analog/5/120"
  if (client.read() == '/') {
    // Read value and execute command
    value = client.parseInt();
    analogWrite(pin, value);

    // Send feedback to client
    client.print(F("Pin D"));
    client.print(pin);
    client.print(F(" set to analog "));
    client.println(value);

    // Update datastore key with the current pin value
    String key = "D";
    key += pin;
    Bridge.put(key, String(value));
  } else {
    // Read analog pin
    value = analogRead(pin);

    // Send feedback to client
    client.print(F("Pin A"));
    client.print(pin);
    client.print(F(" reads analog "));
    client.println(value);

    // Update datastore key with the current pin value
    String key = "A";
    key += pin;
    Bridge.put(key, String(value));
  }
}

void modeCommand(BridgeClient client) {
  int pin;

  // Read pin number
  pin = client.parseInt();

  // If the next character is not a '/' we have a malformed URL
  if (client.read() != '/') {
    client.println(F("error"));
    return;
  }

  String mode = client.readStringUntil('\r');

  if (mode == "input") {
    pinMode(pin, INPUT);
    // Send feedback to client
    client.print(F("Pin D"));
    client.print(pin);
    client.print(F(" configured as INPUT!"));
    return;
  }

  if (mode == "output") {
    pinMode(pin, OUTPUT);
    // Send feedback to client
    client.print(F("Pin D"));
    client.print(pin);
    client.print(F(" configured as OUTPUT!"));
    return;
  }

  client.print(F("error: invalid mode "));
  client.print(mode);
}

[Get Code]

更多

  • Bridge: 从网页浏览器进入开发板的引脚。
  • Console ASCII Table: 示范了怎样打印多种格式到控制台。
  • Console Pixel: 通过控制台控制一个LED灯。
  • Console Read: 从控制台那里分析信息,然后重复发送返回。
  • Datalogger: 在SD卡上保存传感器信息。
  • File Write Script: 示范怎样在Process上写入和执行外壳脚本。
  • HTTP Client: 建造一个简单的客户端,可以下载网页并且打印到串口监视器。
  • HTTP Client Console: 建造一个简单的客户端,可以下载网页并且用控制台通过WIFI打印到串口监视器。
  • Mailbox Read Messages: 用REST API通过一个网页发送文本信息到。
  • Process: 示范怎么用Process运行 Linux 命令。
  • Remote Due Blink: 示范怎么远程上传程序到DUE开发板上。
  • Shell Commands: 用Process 来运行 shell 命令。
  • SpacebrewYun: 在Arduino IDE软件的例子上看更多关于 Spacebrew 文档信息。
  • Temboo: 在Arduino IDE软件的例子上看更多关于 Temboo 文档信息。
  • Temperature Web Panel: 当浏览者要求时,粘贴传感数据到网页上。
  • Time Check: 从网络的时间服务器获得时间,并且打印到串口监视器。
  • WiFi Status: 运行一个预配置的脚本,报告返回当前wifi网络的强度。
  • Yun First Config: 用串口监视器不费力地连接你的云产品到wifi网络,并且在上面回答一些简单的问题。
  • Yun Serial Terminal: 通过串口监视器进入Linux终端。

纠错,疑问,交流: 请进入讨论区点击加入Q群

获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号


标签: arduino库教程, arduino bridge