gpt4 book ai didi

java - 智能家居应用程序 : reportState on Java always returning INVALID_ARGUMENT

转载 作者:行者123 更新时间:2023-11-30 05:36:33 29 4
gpt4 key购买 nike

每当我从 SmartHomeApp 上的某个设备获得更新时,我都会运行一个 reportState 调用,但总是出现 io.grpc.StatusRuntimeException 并显示“INVALID_ARGUMENT:请求包含无效参数”。消息。

我已按照 https://developers.google.com/actions/smarthome/develop/report-state 上的说明进行操作和Java实现。唯一的区别是,我不使用与执行调用相同的 requestId,因为通常在从物理设备本身进行 MQTT 更新后调用 reportState 方法。

public void reportState(Device device) {
User user = device.getHub().getUser();
String requestId = UUID.randomUUID().toString();
String agentId = user.getId().toString();
Struct.Builder stateBuilder = Struct.newBuilder();
if (device.getType().getTraits().contains(GoogleDeviceTrait.ON_OFF)) {
boolean state = "on".equalsIgnoreCase(device.getState());
stateBuilder.putFields("on", Value.newBuilder().setBoolValue(state).build());
}
if (device.getType().getTraits().contains(GoogleDeviceTrait.OPEN_CLOSE)) {
int openPercent = device.getState() != null ? Integer.valueOf(device.getState()) : 0;
stateBuilder.putFields("openPercent", Value.newBuilder().setNumberValue(openPercent).build());
}
try {
smartHomeApp.reportState(ReportStateAndNotificationRequest.newBuilder()
.setRequestId(requestId)
.setAgentUserId(agentId)
.setPayload(StateAndNotificationPayload.newBuilder()
.setDevices(ReportStateAndNotificationDevice.newBuilder()
.setStates(stateBuilder.build())
.build()
)
.build()
)
.build()
);
} catch (Exception ex) {
ex.printStackTrace();
}
}

我猜问题是我没有传递设备名称或任何设备标识符,但构建器上似乎没有为此的方法。

最佳答案

Java 库使用 protobuf Struct 对象来创建状态对象。在这方面,文档实际上似乎是不正确的,就好像您要比较您的代码片段创建的 Java 代码一样:

{
requestId: '123ABC',
agentUserId: 'user-123',
payload: {
devices: {
states: {
on: true,
openPercent: 50
}
}
}
}

虽然我们确实提供了状态,但没有设备 ID,因此不清楚该状态属于哪个设备。因此,这将导致无效的参数。

您需要将状态对象包装在另一个包含设备标识符的结构中。

Struct.Builder deviceStateBuilder = Struct.newBuilder()
.putFields("device1", stateBuilder.build()
.build()

smartHomeApp.reportState(ReportStateAndNotificationRequest.newBuilder()
.setRequestId(requestId)
.setAgentUserId(agentId)
.setPayload(StateAndNotificationPayload.newBuilder()
.setDevices(ReportStateAndNotificationDevice.newBuilder()
.setStates(deviceStateBuilder.build())
.build()
)
.build()
)
.build()

随着 Java/Kotlin 库中智能家居支持的首次发布,我们在很大程度上推迟了底层的 protobuf 对象,以减少创建和审查的 API 数量。随着我们的前进,看看我们可以在哪些方面改进开发人员体验可能是个好主意。如果您有反馈意见,我邀请您访问图书馆的GitHub page并提出问题。

关于java - 智能家居应用程序 : reportState on Java always returning INVALID_ARGUMENT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56494220/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com