Estoy tratando de comunicarme con un servidor que se ejecuta localmente en mi máquina. Simplemente no sé cómo escribir el mensaje que espera el servidor. Estoy tratando de hacer esto en una aplicación .Net (C#). Este servidor espera un mensaje de al menos 10 bytes organizado por la siguiente estructura, del manual :
[Manual completo] http://jkca.ca/help/pages/telemetry.html#messageformat
Cada mensaje tiene el mismo formato binario básico. ¡Todos los valores de varios bytes están en orden de bytes de red (big-endian)! El tamaño mínimo del mensaje es de 10 bytes. Los clientes pueden enviar mensajes de solicitud de cliente (consulte la tabla de tipos de mensajes). El servidor responderá con los mensajes de respuesta del servidor correspondientes. El Request ID puede ser asignado libremente por el cliente y no tiene un significado especial. El mensaje de respuesta del servidor utilizará el mismo ID de solicitud en la respuesta correspondiente.
(Parece que no puedo formatear una tabla en esta pregunta, así que estoy omitiendo la tabla que se puede encontrar en el manual)
Me gustaría entender cómo formar estos mensajes. Si alguien pudiera explicarle a un estudiante que no sea de informática cómo formar, por ejemplo, el mensaje para enviar un "comando de pausa" ( http://jkca.ca/help/pages/telemetry.html#msg27 ), sería muy útil.
He probado todo tipo de variaciones de:
string message = N + "27" + "1000" + "01" + "1" + L; Byte[] data = System.Text.Encoding.BigEndianUnicode.GetBytes(message);y (que me doy cuenta de que no es binario)
// N |Type ID(2) | ID (4) |Datasize(2)|Data | L | //Byte[] data = new Byte[] { 0x4E, 0x32, 0x37, 0x31, 0x30, 0x30, 0x30, 0x30, 0x31, 0x31, 0x4C }; // N | 2 | 7 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | L |y enviar los datos con
stream.Write(data, 0, data.Length);Alternativamente, una explicación de cómo solicitar la "versión de software" y cómo leer la respuesta ( http://jkca.ca/help/pages/telemetry.html#msg3 ) podría ser todo lo que necesito para comenzar a comprender cómo hacerlo.
Muchas gracias de antemano.
PD: Encontré este ( https://github.com/bestdani/py_nl2telemetry ) repositorio en python que logra comunicar y recuperar datos de este servidor, pero no puedo seguirlo hasta el punto de entender cómo hacerlo usando .Net. Tal vez sea útil para alguien que elabora una respuesta.
Para ampliar el comentario de Hans, cada letra en un literal de cadena generalmente equivale a un byte. Por ejemplo, A se almacena como 0x41 , B se almacena como 0x42 , 0 se almacena como 0x30 . Busque codificaciones de caracteres ASCII y UTF8 para obtener más información. Cuando escribe una cadena como '1000', luego obtiene los bytes subyacentes, termina con la secuencia 0x31 0x30 0x30 0x30 . El número de bytes aquí es igual al número de dígitos en su cadena. Este es un número de longitud variable y no es una forma muy compacta de almacenar la información, porque en lugar de usar el rango completo de cada byte (00 a FF) para un total de 256 posibilidades por byte, solo usa 10 de los posibilidades (30 a 39). Esta ineficiencia se vuelve más obvia cuando usa números más grandes, por ejemplo, 1000000 ocupa 7 bytes.
El servidor espera la identificación de la solicitud en un formato diferente, int32 , que siempre ocupa 4 bytes. Puede obtener los datos en este formato llamando a BinaryPrimitives.WriteInt32BigEndian(buffer, 1000) . Lo mismo se aplica a la identificación del tipo de mensaje y los campos de tamaño de datos, deben proporcionarse como Int16.
Después de leer la documentación que publicó, parece que los datos esperados para una solicitud de 'Establecer pausa' serían así:
0x4E 'N' ------------------------ 0x00 Set Pause (27) 0x1B ------------------------ 0x00 Request id (1000) 0x00 0x03 0xE8 ------------------------ 0x00 Data size (1) 0x01 ------------------------ 0x01 Data (Enable pause) ------------------------ 0x4C 'L'