#python #node.js #amazon-web-services #powershell #aws-cli
#питон #node.js #amazon-веб-сервисы #powershell #aws-cli
Вопрос:
Я пытаюсь отправить поток данных на устройство интернета вещей. Общий поток данных таков:
- Отправляйте полезную нагрузку через интерфейс командной строки AWS или пользовательский инструмент, написанный коллегами.
- Лямбда-функция получает полезную нагрузку в кодировке base64, преобразует ее в шестнадцатеричную строку и пересылает данные на устройство.
- Устройство распечатывает данные, а затем анализирует их для выполнения команды.
Проблема, с которой я сталкиваюсь, заключается в следующем: мы хотели бы отказаться от использования очень хрупкого пользовательского инструмента, поскольку мы небольшая команда, и разработчики, написавшие его, пошли дальше. Интерфейс командной строки AWS принимает только исходные кодировки или кодировку base64 для данных, и мой текущий ввод представляет собой шестнадцатеричную строку, например «C00020000000ff64». Я могу отправлять данные с помощью следующих команд в сценарии powershell:
$tmp="lt;SOME_HEX_STRINGgt;" $tmp -split '(.{2})' | %{ if ($_ -ne "") { $payload = [CHAR]([CONVERT]::toint16("$_",16)) }} aws --region lt;SOME_AWS_REGIONgt; iot-data publish --topic "lt;TOPIC_ID_HEREgt;" --cli-binary-format raw-in-base64-out --payload "$payload"
Тем не менее, анализ base64 с помощью функции lambda, похоже, вызывает рвоту при таком подходе, и я получаю искаженные данные на устройстве интернета вещей. В настоящее время у меня нет отладочного доступа к нашему серверу для проверки журналов, но фактический анализ выполняется в узле простым Buffer.from(event.payload, 'base64')
, который затем анализируется в объект, содержащий шестнадцатеричную строку. У меня сложилось впечатление, что метод кодирования, который я использую для ввода командной строки, вероятно, не так (я сильно подозреваю, что [чар] чугун, честно говоря), но я не знаю, достаточно ли в такой ситуации быть в состоянии определить, где проблема в моем коде, и Python (базы кода для AWS CLI) это не моя сильная сторона, поэтому, глядя на их РЕПО привела лишь к тупикам, в большей степени, поскольку нет примеров использования aws iot-data publish
.
Итак, мой вопрос заключается в следующем:
У кого-нибудь есть надежный метод преобразования шестнадцатеричной строки в base64 или необработанный двоичный файл для ввода с помощью интерфейса командной строки AWS?
Комментарии:
1.
$payload
Хорошо ли вам выглядит этот код PowerShell после запуска? Если вы пытаетесь преобразовать$tmp
в байты Base64 или необработанные байты, вам не следует подходить к коду таким образом.2. Да, все выходит именно так, как я ожидаю.
3. Вот как
$payload
выглядит для меня после запуска вашего PS-кода:À ÿd
использованиеC00020000000ff64
as$tmp
.
Ответ №1:
Если шестнадцатеричная строка передается в Python, я полагаю, что она ожидает строку в формате UTF8 Base64. Ваш текущий $payload
определенно не Base64.
Вот как вы можете кодировать свою полезную нагрузку:
$tmp = 'C00020000000ff64' $payload = [convert]::ToBase64String( [System.Text.Encoding]::UTF8.GetBytes($tmp) ) python3 ./decode.py $payload # =gt; Decoded from Python: b'C00020000000ff64'
- decode.py
import base64, sys print( 'Decoded from Python: {0}'.format(base64.b64decode(sys.argv[1])) )
Комментарии:
1. Приносим извинения за задержку с ответом — сегодняшнее отключение AWS затруднило проверку вашего ответа. Это определенно, кажется, отлично работает для кодирования в base64, но по какой-то причине интерфейс командной строки AWS еще больше искажает принимающую сторону, когда я указываю, с помощью чего читать base64
aws --region lt;REGIONgt; iot-data publish --topic "lt;TOPICgt;" --payload "$payload"
. Конечно, в моем случае я тестируюсь противus-east-1
, поэтому я не могу сбрасывать со счетов проблемы там, по крайней мере, не сегодня.