es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo envío una cadena hexadecimal con AWS CLI para dispositivos IoT?

Estoy tratando de enviar un flujo de datos a un dispositivo IoT. El flujo de datos general es el siguiente:

  • Enviar carga a través de AWS CLI o una herramienta personalizada escrita por mis compañeros.
  • La función Lambda recibe la carga codificada en base64, la convierte en una cadena hexadecimal y reenvía los datos al dispositivo.
  • El dispositivo desescapa los datos y luego los analiza para ejecutar un comando.

El problema al que me enfrento es el siguiente: nos gustaría dejar de usar una herramienta personalizada muy frágil, ya que somos un equipo pequeño y los desarrolladores que la escribieron se han ido. AWS CLI solo acepta codificaciones de datos en crudo o en base64, y mi entrada actual es una cadena hexadecimal como “C00020000000ff64”. Soy capaz de enviar datos con los siguientes comandos en un script de Powershell:

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

Sin embargo, parece que la función Lambda tiene problemas al analizar la base64 de esta forma y obtengo datos distorsionados en el dispositivo IoT. Actualmente no tengo acceso de depuración a nuestro servidor para verificar los registros, pero el análisis real se realiza en Node como un simple Buffer.from(event.payload, 'base64'), que luego se analiza en un objeto que contiene una cadena hexadecimal. Mi impresión es que el método de codificación que estoy utilizando para la entrada con la CLI probablemente esté incorrecto (sospecho fuertemente de la conversión [CHAR], para ser honesto), pero no tengo suficiente conocimiento en esta situación para poder identificar dónde está el problema en mi código, y Python (la base de código para AWS CLI) no es mi punto fuerte, por lo que mirar su repositorio solo ha llevado a callejones sin salida, especialmente porque no hay ejemplos para usar aws iot-data publish.

Entonces, mi pregunta es la siguiente:

¿Alguien tiene un método confiable para convertir una cadena hexadecimal a base64 o binario sin formato para utilizarlo con AWS CLI?</topic_id_aquí>

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Solución para convertir una cadena hexadecimal a base64/binario sin procesar para la entrada con AWS CLI

    Existen varias formas diferentes de abordar este problema, pero una posible solución es:

    $hex_string = "C00020000000ff64" # reemplazar con tu cadena hexadecimal
    $bytes = [byte[]]@(0..($hex_string.Length-1) | % { [convert]::ToByte($hex_string.Substring($_,2),16) })
    
    # Opción 1: Convertir a base64
    $base64_string = [convert]::ToBase64String($bytes)
    aws --region <some_aws_region> iot-data publish --topic "<topic_id_here>" --cli-binary-format raw-in-base64-out --payload $base64_string
    
    # Opción 2: Convertir a binario sin procesar
    $binary_string = [System.Text.Encoding]::ASCII.GetString($bytes)
    aws --region <some_aws_region> iot-data publish --topic "<topic_id_here>" --cli-binary-format raw-in-binary --payload $binary_string
    

    El código de PowerShell anterior primero convierte la cadena hexadecimal en un arreglo de bytes, y luego ofrece dos opciones para convertirlo a un formato que puede ser utilizado con AWS CLI:

    • Opción 1: Convertir el arreglo de bytes en una cadena base64 y usar --cli-binary-format raw-in-base64-out con AWS CLI. Esto es similar a lo que estabas haciendo con tu enfoque anterior, pero utiliza un método diferente para convertir la cadena hexadecimal en bytes.
    • Opción 2: Convertir el arreglo de bytes en una cadena codificada en ASCII y usar --cli-binary-format raw-in-binary con AWS CLI. Esto envía los datos como binario sin procesar en lugar de datos codificados en base64.

    Cualquiera de estas opciones debería funcionar con la función Lambda que tienes implementada para manejar la carga de la AWS CLI.

Comments are closed.