Pérdida de datos confidenciales al intentar enviarlos a través de GSM

Estoy trabajando en un sistema que recopila datos de un conjunto de sensores ultrasónicos. Esos sensores funcionan a una frecuencia de 40 Hz y todos los datos que envían son valiosos para mí. Necesito enviar esos datos a un corredor mqtt usando el protocolo mqtt. Uso la conexión TCP/UDP de SIM900 para enviar datos. Hay dos escenarios para hacer que mi sistema funcione:

1- Envío los datos tan pronto como los leo de los sensores. Significa que debo conectarme a un servidor, enviar datos y desconectarlo en menos de 1/40 segundos. No sé, pero usando comandos AT con SIM900; me parece bastante imposible.

2- Recojo los datos por un tiempo (digamos por un minuto) y luego envío los datos al servidor de forma masiva. Pero surge otro problema: me enfrento a la pérdida de datos confidenciales que recopilo del sensor mientras realizo una conexión TCP/UDP.

Mi hardware consta de SIM900, un arduino y un montón de sensores ultrasónicos que funcionan a 40 Hz (HR-SC04)

¿Hay alguna manera de guardar cada bit de datos que leo de los sensores y enviarlos al servidor Mqtt, sin pérdidas?

Existen varios métodos y protocolos de protocolo de enlace que, si se implementan correctamente, garantizarán que no pierda ningún dato. Esto suena más como un error en su firmware.
¿Parece que está utilizando una estructura de programa de un solo subproceso sin interrupciones, y su software TCP/UDP tiene retrasos de bloqueo? En ese caso, esa no es una estructura de programa apropiada. Use subprocesos separados, interrupciones o incluso controladores separados.
@WoutervanOoijen No sabía que podía usar hilos separados en Arduino. Definitivamente buscaré eso.
¿Por qué la votación cerrada? M2M (máquina a máquina) GSM es definitivamente un tema integrado.
Hola, @EkremDoğan, ¿cómo se usa la conexión TCP/UDP de SIM900 para enviar datos a un corredor MQTT? ¿Hay algún código que puedas compartir?
¡@NK2020 seguro! ¿Cuál es su dirección de correo electrónico?

Respuestas (1)

Probablemente haya una manera de hacer esto usando "multitarea cooperativa", un bucle principal que llama a funciones sin bloqueo (posiblemente usando máquinas de estado). Blink Without Delay muestra los primeros pasos en esta dirección.

Por desgracia, se ha escrito mucho código con funciones de bloqueo, por lo que, en lugar de volver a escribir ese código para que no bloquee, a menudo las personas:

  • hacer las cosas más sensibles al tiempo en una rutina de interrupción (la "tarea de primer plano").
  • manejar las cosas menos sensibles al tiempo en el ciclo principal () (la "tarea de fondo").

A menudo, el código tiene 2 búferes separados, por lo que puede hacer doble búfer : el proceso de escritura llena lentamente un búfer. Cuando está lleno, el proceso de lectura procesa los datos en ese búfer; mientras tanto, el proceso de escritura llena lentamente el otro búfer. Con suerte, el proceso de lectura se realizará con ese búfer mucho antes de que el otro búfer esté completamente lleno, aunque esperamos que el escritor escriba algo en ese otro búfer antes de que finalice el proceso de lectura. En su caso, mientras realiza la conexión TCP y envía los datos en un búfer, el procesador puede interrumpirse ocasionalmente para permitir que la rutina de interrupción agregue otro elemento de datos al otro búfer.