C++ Arduino以太网访问控制允许源问题
嘿,我正试图将数据发布到arduino以太网微处理器,但当我尝试使用Jquery AJAX调用我的应用程序中的函数时,它似乎不起作用 以下是ajax代码: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",
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的内容来实现(“访问控制允许源代码:”
到您给定的代码。