【问题标题】:Arduino Ethernet Access-Control-Allow-Origin issuesArduino 以太网访问控制允许来源问题
【发布时间】:2014-02-27 10:25:58
【问题描述】:

嘿,我正在尝试将数据发布到 arduino 以太网微处理器,但是当我尝试使用 Jquery AJAX 在我的应用程序中调用该函数时,它似乎不起作用。

这里是ajax代码:

function sendToArduinoEthernet(whatsBeingSent) {
    jQuery.support.cors = true;

    $.ajax({
        crossDomain: true,
        async : true,
        type: "POST",
        headers: {
            'Access-Control-Allow-Origin': '*'
        },
        url: "http://192.168.9.199:199/?r=" + whatsBeingSent,
        data: '{}',
        contentType: "text/html",
        dataType: "html",
        success: OnSuccessCallArduino,
        error: OnErrorCallArduino
    });      
}

这是 Arduino 代码:

#include <Ethernet.h>
#include <SPI.h>

boolean reading = false;
char c;
EthernetClient client;
String readString = String(30); //string for fetching data from address

///////////////////////////////////////////////////////////////////////////////////////////
//Ethernet CONFIGURE
///////////////////////////////////////////////////////////////////////////////////////////
  byte ip[] = { 192, 168, 9, 199 };   //Manual setup only 421
  byte gateway[] = { 192, 168, 9, 1 }; //Manual setup only
  byte subnet[] = { 255, 255, 255, 0 }; //Manual setup only
  byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // if need to change the MAC address (Very Rare)
  EthernetServer server = EthernetServer(199); //port 199
///////////////////////////////////////////////////////////////////////////////////////////
//CONFIGURE for relays
///////////////////////////////////////////////////////////////////////////////////////////
  //(analog->digital output)
  int relay1 = 14; //Android phone USB power (turn on to shut off power to phone)
  int relay2 = 15; //Bluray eject
  int relay3 = 16; //PC power button
  int relay4 = 17; //Android Phone Power button

void setup(){
    Serial.begin(9600);

    pinMode(relay1, OUTPUT);
    pinMode(relay2, OUTPUT);
    pinMode(relay3, OUTPUT);
    pinMode(relay4, OUTPUT);
    pinMode(fan1, OUTPUT);
    pinMode(fan2, OUTPUT);

    analogWrite(fan1, pwmVal);
    analogWrite(fan2, pwmVal);
    digitalWrite(relay1, HIGH);
    digitalWrite(relay2, HIGH);
    digitalWrite(relay3, HIGH);
    digitalWrite(relay4, HIGH);

    Ethernet.begin(mac, ip, gateway, subnet); //for manual setup  
    server.begin();
    Serial.println(Ethernet.localIP());
}

void loop(){
    checkForClient();
}

void checkForClient(){
    client = server.available();

    if (client) {
      boolean currentLineIsBlank = true;
      boolean sentHeader = false;

      while (client.connected()) {
          if (client.available()) {  
              if(!sentHeader){
                // send a standard http response header
                client.println("HTTP/1.1 200 OK");
                client.println("Content-Type: text/html");
                sentHeader = true;
              }

              c = client.read();

              if (readString.length() < 16)
              {
                readString += String(c);
              }

              if(reading && c == ' ') reading = false;
              if(c == '?') reading = true; //found the ?, begin reading the info 
              if (c == '\n' && currentLineIsBlank) break;

              if (c == '\n') {
                currentLineIsBlank = true;          
              }else if (c != '\r') {
                currentLineIsBlank = false;
              }
          }
      }  
      delay(1);   
      switchStuff(readString);
      client.stop();
      readString = "";
      c = ' ';
      reading = false;
    }
}

void switchStuff(String stuff) {
  stuff.toLowerCase();
  //client.println(stuff);

  if (stuff.indexOf("r1on") > 0) {    
    digitalWrite(relay1, LOW); //Turn 5v USB power ON
  } else if (stuff.indexOf("r1off") > 0) {
    digitalWrite(relay1, HIGH); //Turn 5v USB power OFF
  } else if (stuff.indexOf("r2") > 0) {
    digitalWrite(relay2, LOW); //Eject bluray Disc
    delay(500); //pause for 1/2 second
    digitalWrite(relay2, HIGH);
  } else if (stuff.indexOf("r3") > 0) {
    digitalWrite(relay3, LOW); //"Push" the pc power button
    delay(500); //pause for 1/2 second
    digitalWrite(relay3, HIGH); //"Release" the pc power button
  } else if (stuff.indexOf("r4") > 0) {
    digitalWrite(relay4, LOW); //"Push" phone power button down
    delay(7000); //pause for 7 seconds
    digitalWrite(relay4, HIGH); //"Relese" phone power button
  } else if (stuff.indexOf("r5") > 0) {
    digitalWrite(relay4, LOW); //"Push" phone power button down
    delay(500); //pause for 1/2 second
    digitalWrite(relay4, HIGH); //"Relese" phone power button
  }
}

【问题讨论】:

    标签: c++ ajax arduino cors access-control


    【解决方案1】:

    这是因为 Access-Control-Allow-Origin 标头必须由 HTTP 服务器发送。

    Cross-Origin Resource Sharing 是嵌入在每个最近的网络浏览器中的安全功能,它定义了浏览器和服务器可以交互以确定是否允许跨域请求的方式。

    对服务器公开的资源的访问由他在响应您的请求时定义的CORS 策略决定。因此,您可能希望在服务器端返回此标头,而不是在请求客户端中使用它。否则将导致您的浏览器抛出错误,指出您无权访问给定资源。

    您将找到更多详细信息和此here 的直接示例。

    【讨论】:

    • 标头不是 Arduino 返回的 HTML 文档的一部分。您需要做的是,将适当的标头(通常是 Access-Control-Allow-Origin: *,如果您希望允许跨域访问使用每个 HTTP 动词公开的资源)与您发送回客户端的 HTTP 响应一起发回。跨度>
    • 我想这可以通过在给定代码中添加类似于client.println("Access-Control-Allow-Origin: *") 的内容来实现。
    猜你喜欢
    • 2020-10-16
    • 2013-11-15
    • 2023-04-01
    • 2015-12-26
    • 2016-05-07
    • 1970-01-01
    • 2021-09-07
    相关资源
    最近更新 更多