如何通过AWS CLI向IoT设备发送十六进制字符串
问题原因
你原有脚本的错误根源是[CHAR]类型转换默认使用UTF-16LE编码生成双字节字符,最终拼接出的payload和你预期的十六进制对应原始字节完全不符,导致Lambda端base64解析后得到乱码。
解决方案
最稳妥的方式是直接将十六进制字符串转换为base64格式后传入AWS CLI,完全规避编码兼容问题,适配Lambda端的原生解析逻辑:
兼容所有PowerShell版本的写法
# 替换为你的十六进制字符串 $hexStr = "C00020000000ff64" # 十六进制转字节数组 $byteLength = $hexStr.Length / 2 $bytes = [byte[]]::new($byteLength) for ($i = 0; $i -lt $byteLength; $i++) { $bytes[$i] = [Convert]::ToByte($hexStr.Substring($i * 2, 2), 16) } # 字节数组转base64 $base64Payload = [Convert]::ToBase64String($bytes) # 调用AWS IoT发布接口,无需加raw-in-base64-out参数 aws --region <SOME_AWS_REGION> iot-data publish --topic "<TOPIC_ID_HERE>" --payload $base64Payload
PowerShell 7+ 简化写法
如果你的运行环境是PowerShell 7及以上版本,可以直接调用系统内置的十六进制转换方法:
$hexStr = "C00020000000ff64" $base64Payload = [Convert]::ToBase64String([System.Convert]::FromHexString($hexStr)) aws --region <SOME_AWS_REGION> iot-data publish --topic "<TOPIC_ID_HERE>" --payload $base64Payload
验证方法
你可以本地先验证转换逻辑的正确性:取转换得到的$base64Payload值,在Node.js环境中执行Buffer.from(base64Payload, 'base64').toString('hex'),输出结果和你输入的原始十六进制字符串完全一致即可。
内容的提问来源于stack exchange,提问作者mdhansen
相关产品推荐
相关产品推荐

