2

我用 yaler 创建了一个帐户,以与我的 arduino yun 通信。它工作正常,我可以打开和关闭我的 LED。然后我创建了一个网页,带有一个按钮,该按钮使用 GET 方法调用 ajax 函数到 yaler(yaler Web 服务器接受 URL 上的 REST 样式)

$.ajax({
   url: "http://RELAY_DOMAIN.try.yaler.net/arduino/digital/13/1",
   dataType: "json",
   success: function(msg){
      var jsonStr = msg;
    },
   error: function(err){
       alert(err.responseText);
   }

});

这段代码似乎工作正常,实际上 LED 会关闭和打开,但我希望成功函数(msg)中有一个 json 响应,如下所示:

{
"command":"digital",
"pin":13,
"value":1,
"action":"write"
}

但我得到一个错误(错误函数)。我也试图提醒err.responseText,但它是未定义的......

我该如何解决这个问题?有什么建议么???提前致谢....

4

2 回答 2

2

如果包含上述 Ajax 请求的网页是从不同的来源提供的,则您必须使用 Web 浏览器的相同来源策略。

有两种方法可以做到这一点(基于http://forum.arduino.cc/index.php?topic=304804):

  • CORSAccess-Control-Allow-Origin: * , 即向Yun Web 服务添加标头
  • JSONP,即如果 Ajax 调用带有查询参数的请求,则让 Yun 提供额外的 JS 功能?callback=?

CORS 可能可以在 Yun 的 OpenWRT 部分中配置,而 JSONP 可以添加到 Brige.ino 代码(您似乎正在使用)。

于 2015-03-05T09:22:09.693 回答
0

我有同样的问题。我使用 JSONP 来解决它。JSONP 是带填充的 JSON。基本上意味着您使用某种包装器发送 JSON 数据。您必须发送一个 Java Script 函数而不仅仅是数据,这是互联网允许的。

因此,您的回应不是:

{"command":"digital","pin":13,"value":0,"action":"write"}

它应该是:

showResult({command:"analog",pin:13,value:0,action:"write"});

我改变了 yunYaler.ino 来做到这一点。

所以对于 html :

 var url = 'http://try.yaler.net/realy-domain/analog/13/210';
      $.ajax({
        type: 'GET',
        url: url,
        async: false,
        jsonpCallback: 'showResult',
        contentType: "application/json",
        dataType: 'jsonp',
        success: function(json) {
          console.dir(json.action);
        },
        error: function(e) {
         console.log(e.message);
        }
        });
 
        };
    function showResult(show)
      {
      
          var str = "command = "+show.command;// you can do the others the same way.
          alert (str);
      }

我的 JSON 用 showResult() 包装,所以它是 JSONP 和我在回调中调用的函数。

希望这可以帮助。如果 CORS 对您有用。你能把它的工作原理放在这里吗?

于 2015-04-13T04:46:00.180 回答