如何在多渠道设备的 Google Smart Home Local Fulfillment 中处理 IDENTIFY 请求?

问题描述

我正在尝试在我的 Google 智能家居操作中实施本地配送。 我的一些设备有 2 个通道(双继电器开关)。
双通道设备在 Google Home 应用中显示为两个独立的设备(light-test123123_0light-test123123_1),并且工作正常。

我已将 customDataotherDevicesIds 添加到我的 SYNC 响应中以启用本地履行并使用 @google/local-home-sdk 构建本地应用程序。 Google Home 识别单通道设备并在本地发送命令。

SYNC 响应正文示例:

{
    "response": {
        "payload": {
            "devices": [
                {
                    "traits": [
                        "action.devices.traits.OnOff","action.devices.traits.Brightness"
                    ],"customData": {
                        "path": "/local-fulfil/0/","port": 3000
                    },"name": {
                        "name": "light","nicknames": [
                            "light"
                        ],"defaultNames": [
                            "light"
                        ]
                    },"id": "light-test123123_0","type": "action.devices.types.LIGHT","deviceInfo": {
                        "hwVersion": "LIGHT","model": "LIGHT","swVersion": "1.0","manufacturer": "MANUFATURER"
                    },"attributes": {},"willReportState": false,"otherdeviceids": [
                        {
                            "deviceid": "light-test123123_0"
                        },{
                            "deviceid": "light-test123123"
                        }
                    ]
                },{
                    "name": {
                        "nicknames": [
                            "light"
                        ],"defaultNames": [
                            "light"
                        ],"name": "light"
                    },"deviceInfo": {
                        "swVersion": "1.0","hwVersion": "LIGHT","manufacturer": "MANUFATURER","model": "LIGHT"
                    },"otherdeviceids": [
                        {
                            "deviceid": "light-test123123_1"
                        },{
                            "deviceid": "light-test123123"
                        }
                    ],"traits": [
                        "action.devices.traits.OnOff","id": "light-test123123_1","customData": {
                        "port": 3000,"path": "/local-fulfil/1/"
                    },"type": "action.devices.types.LIGHT"
                }
            ],"agentUserId": "RuRHipwpD5W23iGiU81A5PoTKqB2"
        },"requestId": "16772679358918515269"
    }
}

当我启动本地 SDK 实现时出现问题,因为即使我的双通道设备发送 2 个不同的 UDP 数据包,具有上述不同的 ID。谷歌忽略了其中之一。看起来不可能有 2 台设备具有相同的 IP 地址。

这是 IDENTIFY 请求正文:

{
    "requestId": "88DB84992F074FF0B408D8383CF198C4","inputs": [
        {
            "intent": "action.devices.IDENTIFY","payload": {
                "device": {
                    "udpScanData": {
                        "data": "6C696768742D6475616C2D3132335F30"
                    }
                },"structureData": {}
            }
        }
    ],"devices": [
        {
            "id": "light-dual-123_0","customData": {
                "path": "/local-fulfil/0/","port": 3000
            }
        },{
            "id": "light-dual-123_1","customData": {
                "path": "/local-fulfil/1/","port": 3000
            }
        }
    ]
}

回复

{
    "intent": "action.devices.IDENTIFY","requestId": "88DB84992F074FF0B408D8383CF198C4","payload": {
        "device": {
            "id": "","verificationId": "light-test123123_0"
        }
    }
}

我编写了一个发送 UDP 广播并输出一个数据的基本应用程序:

sent broadcast packet
192.168.1.235:8888 sent this: light-test123123_0
192.168.1.235:8888 sent this: light-test123123_1

显示了我的设备在收到广播数据包时的行为。

有没有办法解决这个问题?

解决方法

Local Fulfillment 平台目前(从 Local Home SDK 1.4 开始)通过设备的网络地址唯一标识设备,因此它无法处理来自同一物理连接设备的多个广播响应。

然而,您可以让一台设备充当多个终端设备的代理,这是通过以下方式完成的:

Local Home SDK sample 包含一个可以在此配置中运行的虚拟设备: https://github.com/actions-on-google/smart-home-local#set-up-the-virtual-device

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...