Probando una conexión a un socket TCP a través del módulo celular SIM5320A

Estoy usando un módulo SIMCOM 5320A como este para intentar establecer una conexión TCP.

Instanciación SIMCOM5320A de Adafruit.

Estoy revisando la nota de aplicación de SIMCOM sobre TCP/IP como referencia.

Es muy posible que los comandos AT que estoy usando estén funcionando, pero no estoy seguro de cuál es la mejor manera de verificar esto. Más tarde planeo construir sobre esta conexión TCP para agregar una conexión de protocolo MQTT a los servidores AWS de Amazon para IoT. Pero me gusta hacer "pruebas unitarias" más pequeñas y construir mi camino, de modo que cuando llego al MQTT y no funciona, sé que mi base TCP en la que está construido no es el problema.

Creo que mis pasos preliminares para esto están funcionando bien (registrarse en GPRS, conectarse a través de APN, establecer un contexto PDP, abrir una conexión de red, abrir un socket TCP). Al menos, parecen estar dándome los valores esperados de retorno del comando AT que indican que están bien. Es a partir de ahí donde tengo mis dudas.

Actualmente, lo que estoy haciendo es simplemente conectarme a un servidor web (sucede que estoy usando la dirección IP de Adafruit) y envío un mensaje simple, como:

AT+CIPSEND=0,5   // send 5 chars to link 0
> HELLO
OK

Cuando envío el comando para ver enviado/recibido, informa que se enviaron 5 caracteres, 0 recibidos. No creo que el servidor de Adafruit esté configurado para hacer nada en respuesta a mis datos enviados, como si no estuviera haciendo una solicitud HTTP GET ni nada, por lo que no hace nada. Entonces, de nuevo, podría estar funcionando, pero no lo sé.

Pensé que la mejor manera de probar esto podría ser un servidor de eco. Busqué durante bastante tiempo tratando de encontrar servidores de eco en línea gratuitos a los que pudiera intentar conectarme, que simplemente me devolvieran mi "HOLA" muy cortésmente. Hay todo un protocolo UNIX para esto, pero parece que ha quedado obsoleto.

Luego traté de configurar un servidor de eco local en mi PC y conectarme a él. Creo que lo configuré bien, porque cuando ejecuté tanto un servidor como un cliente (en la misma máquina, conectado a la dirección IP del host local ), obtuve ecos en ambas terminales. Pero cuando intenté conectarme desde mi módulo SIMCOM, no pude establecer ninguna conexión. Jugué con la configuración del firewall para siempre, y probablemente abrí todos los puertos a los piratas informáticos en el proceso, pero nada.

Estoy un poco fuera de mi experiencia con estas cosas de Internet (más bien un tipo de circuitos / integrado), así que espero que alguien pueda ayudarme a orientarme en la dirección correcta.

Finalmente, hay dos preguntas similares a esta en Stack Exchange, pero tengo problemas para comunicarme con ellos para ver cómo configuraron sus pruebas.
¿Es posible enviar comandos AT a través de TCP?
¿Cómo envío datos a través de TCP desde un SIM5320A?

Esencialmente, solo quiero conectarme a un socket TCP en modo transparente (frente al modo de datos), enviar algunos datos de una manera y leer algunos datos correctamente, luego cerrar la conexión. Cualquier ayuda muy apreciada.

¿Ha abierto el receptor el puerto utilizado en el canal? ¿Está enrutado? reenviado?
Después de establecer una conexión TCP, cualquier mensaje que envíe debe tener una respuesta devuelta, que debería ser "solicitud incorrecta" en su caso. ¿Ha agregado el carácter "ctrl+z" (0x1A) al final de su mensaje? Puede hacerlo agregando $1A al final de su mensaje.
@BatuYıldız Vea mi comentario a continuación para tcrosley. Estoy enviando $1A después de cada comando en RealTerm usando el botón "Enviar números". ¿Es esto correcto?
@JoelWigton sí, eso era lo que quise decir. Como ya lo está haciendo (lo que puede ser redundante como dicen las personas a continuación, pero lo estaba usando), parece ser un callejón sin salida. "OK" regresa después de su proceso de envío, pero de acuerdo con la hoja de datos , antes de OK, debe obtener +CIPSEND: 5,5, lo cual es intrigante. ¿Has probado a enviar AT+CIPSEND=? y AT+CIPSEND? para posibles errores de IP/CME?
Entonces Joel? ¿Logró implementar MQTT en el sim5320?
No, resultó que también necesitábamos una capa TSL 1.2 segura que se ejecutara encima de esto, que para la MCU que estábamos usando usaba demasiada SRAM y potencia de CPU ya que no tenía hardware criptográfico incorporado y una biblioteca de software tomaría> 2 MB de código espacio. Terminamos usando la seguridad integrada en el propio módulo SIM5320 al ejecutar comandos HTTPS POST en lugar de MQTT. Lo siento.

Respuestas (2)

La forma más fácil de obtener una respuesta de un servidor es realizar una solicitud HEAD.

Por ejemplo, abra un socket en el puerto 80 de www.stackexchange.com

A continuación, enviar:

HEAD /about HTTP/1.1
Host: www.stackexchange.com
(blank line)

Debería recibir una respuesta, pero solo los encabezados, no toda la página.

Algo como:

HTTP/1.1 200 OK
Date: Tue, 31 Oct 2016 22:44:11 GMT
Server: Apache

etc.

He usado esto solo para obtener la hora actual fuera de la red.

Intentando eso. Uso de RealTerm. Puedo abrir una conexión a stackexchange.com en modo transparente (me informa: "CONECTAR 4800"). Tengo entendido que, en este punto, todo lo que se envía actúa de manera transparente y no como los comandos AT. Puse cada una de esas líneas que escribiste y "Enviar ASCII" (sin caracteres EOL) y luego, en un envío separado, ingreso $1A y presiono "Enviar números", que debería enviar CTRL+Z después de cada mensaje. Después de mucho tiempo sentado, no pasa nada en la terminal. Me pregunto si esta idea es correcta, pero me siento obstaculizado por la forma en que lo estoy haciendo.
@JoelWigton Debe enviar un retorno de carro (0x0D) después de cada una de las dos líneas, y luego una tercera sola (para la línea en blanco).
Se agregó +CR (0x0D) para las tres líneas principales (HEAD, Host, en blanco). Luego envío $1A para CTRL-Z. Mi hoja de datos dice que finalice los comandos de envío de TCP con CTRL-Z, pero los ejemplos de hacerlo son en un comando AT + CIPSEND, no en modo transparente. No está claro si necesito $1A en modo transparente. También habla de <ETX><CTRL-Z>, que es $03 $1A. Intenté ambas variaciones, ninguna respuesta hasta que se agotó el tiempo de espera de mi conexión TCP.
@JoelWigton No debería necesitar Ctrl-Z, recuerdo que solo lo necesitaba para SMS. Han pasado un par de años desde que estuve trabajando con esto, pero parecía sencillo, aunque nunca lo probé de forma interactiva, solo desde el firmware. Pero eso no debería hacer una diferencia.
@JoelWigton Asegúrese de ir al puerto 80
@JoelWigton Acabo de probar el comando HEAD con netcat para Windows y funcionó como se esperaba, devolviendo la línea HTTP/1.1 200 OK seguida de unas 16 líneas más de encabezados. El comando de la línea de comando (Windows 7 PowerShell) que usé fue: .\nc stackexchange 80; luego ingresé las tres líneas en mi respuesta.
Quise decir .\nc stackexchange.com 80 en mi comentario anterior.
¡Funcionó! Lo probé de muchas maneras diferentes. Si solo hice <CR> o solo <LF>, no sucedió nada hasta que se agotó el tiempo. Si hice ambos <CR><LF> después de cada línea, obtuve una respuesta HTTP 400 "Solicitud incorrecta" (al menos es una respuesta del servidor, ¡lo que valida mi conexión!). Resulta que si hice <CR><LF><CR><LF> después de cada línea, por cualquier motivo, funcionó. Obtuve la información del encabezado del sitio. ¡Gracias!

Recomendaría probar primero el modo no transparente para ver si todo está configurado. Puedes probar con arduino.cc/asciilogo.txt.

  • Primero, conéctese usando CIPOPENel puerto 80 arduino.ccusando la dirección IP que obtiene pingde Windows. El módulo también tiene un comando para convertir nombres en direcciones.
  • Para OBTENER el contenido del archivo txt, la solicitud HTTP debería verse así:

    GET /asciilogo.txt HTTP/1.1\r\nHost: arduino.cc\r\n\r\n
    

    La longitud total es 49. Por lo tanto, su próximo comando debería ser: AT+CIPSEND=0,49.

  • La parte importante ahora es enviar los datos al módulo. Debe asegurarse de que se envíe esta solicitud exacta; un carácter menos o más, y obtienes nada o Bad Request. Haga que el programa de monitoreo en serie trabaje para usted aquí. No tengo RealTerm, así que no puedo decir exactamente cómo hacerlo allí, aunque presumiblemente tiene alguna opción para agregar CRLF a los comandos. Si tiene el IDE de Arduino, con su monitor serie configurado en BOTH NL & CR, puede enviar la solicitud pieza por pieza. Básicamente es: escriba GET /asciilogo.txt HTTP/1.1, Enter, escriba Host: arduino.cc, presione Enter dos veces. No es Ctrl+Znecesario.

Si todo salió bien, debería ver esto en su pantalla.

Gracias, esto también podría funcionar, pero como realmente necesito que se valide el modo transparente, la solución de tcrosley funcionó para mí.