从Pebble到Wemo交换机的SOAP请求返回状态500

从Pebble到Wemo交换机的SOAP请求返回状态500,soap,xmlhttprequest,pebble-watch,pebble-sdk,pebble-js,Soap,Xmlhttprequest,Pebble Watch,Pebble Sdk,Pebble Js,一直在尝试为wemo交换机编写pebble应用程序,目前我正在使用以下代码: function WemoRequest(callback) { if (SOAPData === false || SOAPData === undefined) { console.log("Invalid SOAP data: " + JSON.stringify(SOAPData)); return; } var url = "http://192.168.1.

一直在尝试为wemo交换机编写pebble应用程序,目前我正在使用以下代码:

function WemoRequest(callback) {
    if (SOAPData === false || SOAPData === undefined) {
        console.log("Invalid SOAP data: " + JSON.stringify(SOAPData));
        return;
    }

var url = "http://192.168.1.230:49153/upnp/control/basicevent1";

try {
    var request = new XMLHttpRequest();
    request.open("POST", url, false);
    request.setRequestHeader("SOAPAction", "urn:Belkin:service:basicevent:1#GetBinaryState");
    request.setRequestHeader("Content-Type",  "text/xml; charset=utf-8");
    request.onreadystatechange = function() {
    if (request.readyState == 4 && request.status === 200 && callback) {
            callback(request, SOAPData);
            }else{console.log("Status: "+request.status + " State: "+request.readyState+" Callback: "+callback);}
    };
    var packet = '<?xml version="1.0" encoding="utf-8"?>'+
            '<s:Envelope xmls:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">'+
        '<s:Body>'+
            '<u:GetBinaryState xmlns:u="urn:Belkin:service:basicevent:1"></u:GetBinaryState>'+
        '</s:Body>'+
    '</s:Envelope>';

    request.send(packet);
} catch (error) {
    console.log("Error in XMLHttpRequest: " + error);
}}
函数WemoRequest(回调){
if(SOAPData==false | | SOAPData===未定义){
log(“无效的SOAP数据:+JSON.stringify(SOAPData));
返回;
}
变量url=”http://192.168.1.230:49153/upnp/control/basicevent1";
试一试{
var request=new XMLHttpRequest();
打开(“POST”、url、false);
setRequestHeader(“SOAPAction”,“urn:Belkin:service:basicevent:1#GetBinaryState”);
setRequestHeader(“内容类型”,“text/xml;charset=utf-8”);
request.onreadystatechange=函数(){
if(request.readyState==4&&request.status==200&&callback){
回调(请求、SOAPData);
}else{console.log(“状态:+request.Status+”状态:+request.readyState+”回调:+Callback);}
};
var数据包=“”+
''+
''+
''+
''+
'';
请求发送(数据包);
}捕获(错误){
log(“XMLHttpRequest中的错误:+错误”);
}}

我目前从OnReadyStateChange获得状态500,不知道我做错了什么。如果这还不够代码,应用程序代码可以在这里找到:

所以…我知道这是4年前的lol,但我在谷歌搜索中发现了这个,并找到了答案,所以我想我会回应这个原因:我想你的标题只需要在“urn:Belkin:service:basicevent:1#SetBinaryState”周围加上一组引号因此,指定soapaction的字符串以引号开始和结束

我在用Python工作(因为现在所有的孩子似乎都在这么做),但我也遇到了500个错误,直到我做了一个非常微妙的改变(双引号周围的单引号),当我的灯熄灭时,我几乎高兴得流下了眼泪:

"SOAPACTION": '"urn:Belkin:service:basicevent:1#SetBinaryState"'
下面是代码的工作版本(在Python lol中):

导入http.client
#变量(值=开/关,ipaddress=wemo的地址)
值=0#1=开,0=关
ipAddress=“192.168.0.108”
#构建SOAP信封(数据)
数据=''+str(值)+''
#构建标题(标题)
headers={“内容类型”:“text/xml;charset=“utf-8”,“SOAPACTION”:“urn:Belkin:service:basicevent:1#SetBinaryState”,“内容长度”:len(数据)}
#发送请求和检查响应数据(响应数据)
conn=http.client.HTTPConnection(ipAddress,49153)
conn.request(“POST”、“/upnp/control/basicevent1”、数据、标题)
response=conn.getresponse()
resp_data=response.read()
如果response.status==200:
康涅狄格州关闭
打印(“成功!”)
elif response.status==403:
打印(“错误:403(禁止)”)
其他:
打印(“错误:+str(响应状态))

500是一种非常通用的状态。根据您在本地计算机上调用webservice的IP判断-您可以检查该计算机上的事件日志吗-它可能记录了更详细的错误。本地IP是一个wemo设备,它不包含我可以查看的日志
import http.client

#Variables (value=on/off, ipaddress=address of your wemo)
value = 0 #1=ON, 0=OFF
ipAddress = "192.168.0.108"

#Build the SOAP Envelope (data)
data = '<?xml version="1.0" encoding="utf-8"?><s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Body><u:SetBinaryState xmlns:u="urn:Belkin:service:basicevent:1"><BinaryState>' + str(value) + '</BinaryState></u:SetBinaryState></s:Body></s:Envelope>'

#Build the Header (headers)
headers = {"Content-type" : 'text/xml; charset="utf-8"', "SOAPACTION": '"urn:Belkin:service:basicevent:1#SetBinaryState"', "Content-Length": len(data)}

#Send request and check response data (resp_data)
conn = http.client.HTTPConnection(ipAddress, 49153)
conn.request("POST", "/upnp/control/basicevent1", data, headers)
response = conn.getresponse()
resp_data = response.read()

if response.status == 200:
    conn.close()
    print("SUCCESS!")
elif response.status == 403:
    print("ERROR: 403 (FORBIDDEN)")
else:
    print("ERROR: " + str(response.status))