Alexa 智能家居技能 - 需要帮助才能发出 http 请求

如何解决Alexa 智能家居技能 - 需要帮助才能发出 http 请求

我正在尝试自己构建一个家庭自动化系统。为此,我使用 Blynk 服务器来控制我的硬件。我可以通过请求 blynk 服务器的 URL 来控制我的硬件。

例如:当我向 https://139.59.206.133/myprivatekey/update/V1?value=1 发出请求并将虚拟 Pin 图更新为“1”时,我的灯亮了。

我用它来制作一个 Alexa 自定义技能,它能够通过向 Blynk 服务器发出 HTTPS 请求来打开我的灯。例如,当我说“Alexa 要求我的房间开灯”时。自定义技能正常工作。

但是自定义技能并不是我真正想要的,所以我决定构建一个 Alexa 智能家居技能。因此,我设置了一个并尝试在调用“TurnON”或“TurnOFF”时发出 HTTPS 请求。

我的问题是,每次我尝试发出 HTTPS 请求时,Alexa 都说设备没有响应。

我尝试了很多方法,但我无法自己解决问题。

代码

代码来自 node.js Alexa 智能家居示例。

    exports.handler = function (request,context) {
    if (request.directive.header.namespace === 'Alexa.discovery' && request.directive.header.name === 'discover') {
        log("DEBUG:","discover request",JSON.stringify(request));
        handlediscovery(request,context,"");
    }
    else if (request.directive.header.namespace === 'Alexa.PowerController') {
        if (request.directive.header.name === 'TurnOn' || request.directive.header.name === 'TurnOff') {
            log("DEBUG:","TurnOn or TurnOff Request",JSON.stringify(request));
            handlePowerControl(request,context);
        }
    }

    function handlediscovery(request,context) {
        var payload = {
            "endpoints":
            [
                {
                    "endpointId": "demo_id","manufacturerName": "Smart Device Company","friendlyName": "Zimmerlicht","description": "Smart Device Switch","displayCategories": ["SWITCH"],"cookie": {
                        "key1": "arbitrary key/value pairs for skill to reference this endpoint.","key2": "There can be multiple entries","key3": "but they should only be used for reference purposes.","key4": "This is not a suitable place to maintain current endpoint state."
                    },"capabilities":
                    [
                        {
                          "type": "AlexaInterface","interface": "Alexa","version": "3"
                        },{
                            "interface": "Alexa.PowerController","version": "3","type": "AlexaInterface","properties": {
                                "supported": [{
                                    "name": "powerState"
                                }],"retrievable": true
                            }
                        }
                    ]
                }
            ]
        };
        var header = request.directive.header;
        header.name = "discover.Response";
        log("DEBUG","discovery Response: ",JSON.stringify({ header: header,payload: payload }));
        context.succeed({ event: { header: header,payload: payload } });
    }

    function log(message,message1,message2) {
        console.log(message + message1 + message2);
    }

    function handlePowerControl(request,context) {
        // get device ID passed in during discovery
        var requestMethod = request.directive.header.name;
        var responseHeader = request.directive.header;
        responseHeader.namespace = "Alexa";
        responseHeader.name = "Response";
        responseHeader.messageId = responseHeader.messageId + "-R";
        // get user token pass in request
        var requestToken = request.directive.endpoint.scope.token;
        var powerResult;

        if (requestMethod === "TurnOn") {
            const Http = new XMLHttpRequest();
            const url='https://139.59.206.133/myprivatekey/update/V1?value=1';
            Http.open("GET",url);
            Http.send();
            // Make the call to your device cloud for control
            // powerResult = stubControlFunctionToYourCloud(endpointId,token,request);
            powerResult = "ON";
        }
       else if (requestMethod === "TurnOff") {
            var xmlHttp = new XMLHttpRequest();
            xmlHttp.open( "GET",'http://myprivatekey/update/V0?value=0',false ); // false for synchronous request
            xmlHttp.send( null );
            // Make the call to your device cloud for control and check for success
            // powerResult = stubControlFunctionToYourCloud(endpointId,request);
            powerResult = "OFF";
        }
        var contextResult = {
            "properties": [{
                "namespace": "Alexa.PowerController","name": "powerState","value": powerResult,"timeOfSample": "2017-09-03T16:20:50.52Z",//retrieve from result.
                "uncertaintyInMilliseconds": 50
            }]
        };
        var response = {
            context: contextResult,event: {
                header: responseHeader,endpoint: {
                    scope: {
                        type: "BearerToken",token: requestToken
                    },endpointId: "demo_id"
                },payload: {}
            }
        };
        log("DEBUG","Alexa.PowerController ",JSON.stringify(response));
        context.succeed(response);
    }
};

我的要求:

    if (requestMethod === "TurnOn") {
            const Http = new XMLHttpRequest();
            const url='https://139.59.206.133/myprivatekey/update/V1?value=1';
            Http.open("GET",request);
            powerResult = "OFF";
        }

附加信息:

  • 编程语言 node.js
  • 帐户关联、IAM 角色以及创建智能家居技能的一切都应该正确设置

我对 Alexa 技能建设比较陌生,而且我也不太擅长 JavaScript。

解决方法

如果请求通过了,我的意思是您的代码正在被调用,并且灯正在打开/关闭,问题出在响应上。

我的猜测是您缺少相关性 ID。

您需要添加如下内容:

responseHeader.correlationToken = request.directive.header.correlationToken;

您还应该实现 EndpointHealth:https://developer.amazon.com/en-US/docs/alexa/device-apis/alexa-endpointhealth.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?