Как отправить шестнадцатеричную строку с помощью интерфейса командной строки AWS для устройств интернета вещей?

#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 , поэтому я не могу сбрасывать со счетов проблемы там, по крайней мере, не сегодня.