[英]How do I send a hex string with AWS CLI for IoT devices?
我正在尝试将 stream 数据发送到 IoT 设备。 一般数据流为:
我遇到的问题是:我们希望摆脱使用非常脆弱的自定义工具,因为我们是一个小团队,并且编写它的开发人员已经继续前进。 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'
import base64, sys
print(
'Decoded from Python: {0}'.format(base64.b64decode(sys.argv[1]))
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.