当前位置: 首页 > 知识库问答 >
问题:

AWS IoT DynamoDB规则无法读取从topic()函数中选择的值

方安怡
2023-03-14

我试图使用规则将数据从AWS IoT MQTT主题获取到DynamoDB。一个示例主题是cooler/cooler42/sensors和示例消息

{“watertemp”:10,“timestamp”:1580370731383}

我定义了如下查询,以便从主题中提取devicename(例如cooler42)并将其插入到JSON中:

我的理解是,所有3个字段现在都可以在我的DynamoDB规则中使用,如下所示:

但是,我可以从CloudWatch中看到规则失败,错误,一个或多个参数值无效:AttributeValue可能不包含空字符串(服务:AmazonDynamodbv2;状态代码:400;错误代码:ValidationException,分区键(又名哈希键)为空:

{“ItemRangeKeyValue”:“1580370731383”,“IsPayloadJson”:“true”,“ItemHashKeyField”:“DeviceName”,“操作”:“插入”,“ItemRangeKeyField”:“Timestamp”,“Table”:“SensorDataTest2”,“ItemHashKeyValue”:“<---Empty}

我是否不能使用刚刚从规则中的主题名称中选择的devicename?如果没有,有没有其他方法提取它?

NB如果我在主题上手动发布一条消息,其中已经包含devicename,那么它确实工作得很好,但是我在一个受限的环境中工作,不想要额外的负载大小。

共有1个答案

邢小云
2023-03-14

键值使用的替换模板不能引用devicename别名(*)。

AWS文档强调了这一点:

由于替换模板中的表达式是与“SELECT...”语句分开计算的,因此不能引用使用AS子句创建的别名。除了受支持的函数和操作符之外,您只能引用原始有效负载中存在的信息。

另一种选择是将规则重新发布到负载中带有devicename的另一个主题。处理此主题的规则/操作可以写入DynamoDB。然后,该操作将有权访问重新发布的有效负载中可用的devicename属性。

*文档提到键值语法是替换模板。

上面的链接说明:

例如,使用包括一些别名的规则:

将该操作配置为使用${encode(*,'base64')}排序键值,该值将把整个有效负载编码为base64字符串。

发布消息时:

{
  "DateTime": "ewogICJtZXNzYWdlIjogIkhlbGxvIGZyb20gQVdTIElvVCBjb25zb2xlIgp9",
  "Payload": {
    "arrivalTime": 1581082253585,
    "myField": "Hello from AWS IoT console",
    "payload": {
      "message": "Hello from AWS IoT console"
    }
  },
  "Topic": "blt/test"
}
 类似资料:
  • 问题内容: 我有两个查询: 首先不起作用: 因为我得到错误: 第二部作品: 结构: 问题答案: 在两个表上使用。Hotels.TargetCode上的排序规则与on上的排序规则不同,因此DB不知道如何处理结果。 您可以强制其中一个排序规则与另一个排序规则匹配,或者将结果放入已定义排序规则的预定义临时表中。 编辑: 您可以使用类似…的方法来覆盖现有的排序规则。 …在查询中。这将使用带有collat​

  • 我遇到的问题是,使用下面显示的以下Firebase规则,经过身份验证的用户可以成功写入数据库,但无法从中读取,因为我在控制台中获得了“拒绝权限”。当我将读取和写入设置为true(公共)时,读取和写入功能都正常工作。我从数据库中读取的代码也显示如下: 规则: 示例数据库: 以下是确切的错误:

  • 选择器使用规则 1. 可以使用 * 通用选择器。 * 通用选择器效率低是一个误区,如有必要可以使用。测试文章关于css通配符性能问题不完全测试 例如: * { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } 2. 不要在选择器末尾使用 * 通用选择器。 CSS

  • 我已经记录了用于从日期选择器中选择日期的selenium代码。在运行测试用例时,日期选择器会弹出并正确突出显示所选日期。但是没有选择日期。代码如下所示:- 此异常仅出现在记录的代码中。我使用的是selenium-server-standalone-2 . 45 . 0 jar。

  • 问题内容: 我正在尝试从以下查询中获取行数。我只得到行计数为1,但有35条记录。您能否让我知道如何从内部查询中获取计数? 谢谢 问题答案: 您缺少FROM,需要为子查询指定别名。

  • 在我的phonegap应用程序(android版本4.4.2)中,我需要选择图像形式sdcard。在这种情况下,我无法读取图像大小和名称。我的代码就像。 在我的Android设备(v 4.4.2)专辑中显示“最近”,“驱动器”,“图像”,“图库”,...当从图库中选择图像时,只有图像大小是得到的。除了图库图像大小是无法得到.. 参考了这个,但没有获得成功 Cordova/PhoneGap照片文件大