繁体   English   中英

如何使用 AWS CLI 为 IoT 设备发送十六进制字符串?

[英]How do I send a hex string with AWS CLI for IoT devices?

我正在尝试将 stream 数据发送到 IoT 设备。 一般数据流为:

  • 通过 AWS CLI 或同事编写的自定义工具发送有效负载。
  • Lambda function 接收 base64 编码的有效载荷,转换为十六进制字符串,并将数据转发到设备。
  • 设备对数据进行转义,然后对其进行解析以运行命令。

我遇到的问题是:我们希望摆脱使用非常脆弱的自定义工具,因为我们是一个小团队,并且编写它的开发人员已经继续前进。 AWS CLI 只接受原始或 base64 数据编码,我当前的输入是一个十六进制字符串,如“C00020000000ff64”。 我可以在 powershell 脚本中使用以下命令发送数据:

$tmp="<SOME_HEX_STRING>"
$tmp -split '(.{2})' | %{ if ($_ -ne "") { $payload += [CHAR]([CONVERT]::toint16("$_",16)) }}
aws --region <SOME_AWS_REGION> iot-data publish --topic "<TOPIC_ID_HERE>" --cli-binary-format raw-in-base64-out --payload "$payload"

但是,lambda function 解析的 base64 似乎对这种方法感到厌烦,我在物联网设备上得到了错误的数据。 我目前没有对我们服务器的调试访问权限来检查日志,但实际解析是在节点中作为简单的Buffer.from(event.payload, 'base64')完成的,然后将其解析为包含十六进制字符串的 object . 我的印象是,我使用 CLI 进行输入的编码方法可能是错误的(老实说,我强烈怀疑 [CHAR] 转换),但在这种情况下我知道的不够多,无法确定在哪里问题出在我的代码中,并且 Python(AWS CLI 的代码库)不是我的强项,因此查看他们的 repo 只会导致死胡同,而且因为没有使用aws iot-data publish示例。

所以我的问题是:

有没有人有可靠的方法将十六进制字符串转换为 base64 或 AWS CLI 输入的原始二进制文件?

如果十六进制字符串被传递给 Python,我相信它期待一个 UTF8 Base64 编码字符串。 您当前的$payload绝对不是 Base64。

这是您可以对有效负载进行编码的方式:

$tmp = 'C00020000000ff64'

$payload = [convert]::ToBase64String(
    [System.Text.Encoding]::UTF8.GetBytes($tmp)
)

python3 ./decode.py $payload # => Decoded from Python: b'C00020000000ff64'
  • 解码.py
import base64, sys

print(
    'Decoded from Python: {0}'.format(base64.b64decode(sys.argv[1]))
)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM