C++ Arduino以太网访问控制允许源问题

C++ Arduino以太网访问控制允许源问题,c++,ajax,arduino,cors,access-control,C++,Ajax,Arduino,Cors,Access Control,嘿,我正试图将数据发布到arduino以太网微处理器,但当我尝试使用Jquery AJAX调用我的应用程序中的函数时,它似乎不起作用 以下是ajax代码: function sendToArduinoEthernet(whatsBeingSent) { jQuery.support.cors = true; $.ajax({ crossDomain: true, async : true, type: "POST",

嘿,我正试图数据发布到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;
以太网络客户端;
String readString=String(30)//用于从地址获取数据的字符串
///////////////////////////////////////////////////////////////////////////////////////////
//以太网配置
///////////////////////////////////////////////////////////////////////////////////////////
字节ip[]={192,168,9,199}//仅手动设置421
字节网关[]={192,168,9,1}//仅手动设置
字节子网[]={255,255,255,0}//仅手动设置
字节mac[]={0xDE,0xAD,0xBE,0xEF,0xFE,0xED};//如果需要更改MAC地址(非常罕见)
EthernetServer服务器=EthernetServer(199)//端口199
///////////////////////////////////////////////////////////////////////////////////////////
//为继电器配置
///////////////////////////////////////////////////////////////////////////////////////////
//(模拟->数字输出)
内部关系1=14//Android手机USB电源(打开可关闭手机电源)
int relay2=15//Bluray喷射器
int-relay3=16//电脑电源按钮
int relay4=17//安卓手机电源按钮
无效设置(){
Serial.begin(9600);
引脚模式(继电器1,输出);
引脚模式(继电器2,输出);
引脚模式(继电器3,输出);
引脚模式(继电器4,输出);
pinMode(风扇1,输出);
pinMode(风扇2,输出);
模拟写入(fan1,pwmVal);
模拟写入(fan2,pwmVal);
数字写入(继电器1,高电平);
数字写入(relay2,高);
数字写入(relay3,高);
数字写入(relay4,高);
Ethernet.begin(mac、ip、网关、子网);//用于手动设置
server.begin();
Serial.println(Ethernet.localIP());
}
void循环(){
checkForClient();
}
void checkForClient(){
client=server.available();
如果(客户){
布尔currentLineIsBlank=true;
布尔sentHeader=false;
while(client.connected()){
如果(client.available()){
如果(!sentHeader){
//发送标准http响应头
client.println(“HTTP/1.1200ok”);
client.println(“内容类型:text/html”);
sentHeader=true;
}
c=client.read();
if(readString.length()<16)
{
readString+=字符串(c);
}
如果(读取和&c='')读取=false;
如果(c==“?”)reading=true;//找到了?),则开始读取信息
如果(c='\n'&¤tLineIsBlank)中断;
如果(c=='\n'){
currentLineIsBlank=true;
}如果(c!='\r'),则为else{
currentLineIsBlank=false;
}
}
}  
延迟(1);
switchStuff(readString);
client.stop();
readString=“”;
c='';
阅读=错误;
}
}
void开关填充(字符串填充){
stuff.toLowerCase();
//client.println(stuff);
如果(stuff.indexOf(“r1on”)>0{
digitalWrite(继电器1,低);//打开5v USB电源
}else if(stuff.indexOf(“r1off”)>0){
数字写入(继电器1,高);//关闭5v USB电源
}else if(stuff.indexOf(“r2”)>0){
digitalWrite(relay2,低);//弹出bluray光盘
延迟(500);//暂停1/2秒
数字写入(relay2,高);
}else if(stuff.indexOf(“r3”)>0){
数码写入(relay3,低);/“按下”电脑电源按钮
延迟(500);//暂停1/2秒
数码写入(relay3,高);/“释放”电脑电源按钮
}else if(stuff.indexOf(“r4”)>0){
数码写入(relay4,低);/“按下”手机电源按钮
延迟(7000);//暂停7秒
数码写入(relay4,高);/“释放”手机电源按钮
}else if(stuff.indexOf(“r5”)>0){
数码写入(relay4,低);/“按下”手机电源按钮
延迟(500);//暂停1/2秒
数码写入(relay4,高);/“释放”手机电源按钮
}
}

这是因为
访问控制允许源站
头必须由HTTP服务器发送

是嵌入在每个最新web浏览器中的安全功能,它定义了浏览器和服务器可以交互以确定是否允许跨源请求的方式

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


您将看到更多详细信息和一个简单的示例。

标题不是Arduino返回的HTML文档的一部分。您需要做的是用发送回客户端的HTTP响应发送回相应的头(通常是
Access Control Allow Origin:
如果您想允许跨域访问您使用每个HTTP动词公开的资源)。我想这可以通过添加类似于
client.println的内容来实现(“访问控制允许源代码:”
到您给定的代码。