0

一直在尝试为 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);
}}

我目前从 OnReadyStateChange 获得状态 500 并且不知道我做错了什么。如果这还不够代码,可以在此处获得应用程序代码:https ://github.com/dmf444/Webble

4

1 回答 1

0

所以...我知道这是从 4 年前开始的,哈哈,但我在谷歌搜索中发现了这个并且刚刚找到了答案,所以我想我会因为这个原因做出回应:我认为你的标题只需要一组额外的引号"urn:Belkin:service:basicevent:1#SetBinaryState" 以便指定soapaction 的字符串字面上以引号开头和结尾。

我正在使用 Python 工作(因为这些天所有孩子似乎都在这样做),但我也遇到了 500 错误,直到我做了一个非常微妙的改变(我的双引号周围的单引号)并且几乎哭了当我的灯熄灭时的喜悦:

"SOAPACTION": '"urn:Belkin:service:basicevent:1#SetBinaryState"'

所以这是代码的工作版本(在 Python 中):

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))
于 2020-06-19T06:44:00.887 回答