La herramienta serial-discovery
es un programa de línea de comandos que interactúa a través de STDIO. Acepta comandos como cadenas ASCII simples terminadas con LF n
y envía respuesta como JSON.
Instale un entorno de Golang reciente y ejecute go build
. El serial-discovery
ejecutable se producirá en su directorio de trabajo.
Después del inicio, la herramienta espera comandos. Los comandos disponibles son: HELLO
, START
, STOP
, QUIT
, LIST
y START_SYNC
.
El comando HELLO
se utiliza para establecer el protocolo de descubrimiento conectable entre el cliente y el descubrimiento. El formato del comando es:
HELLO <PROTOCOL_VERSION> "<USER_AGENT>"
Por ejemplo:
HELLO 1 "Arduino IDE"
o:
HELLO 1 "arduino-cli"
En este caso, la versión del protocolo solicitada por el cliente es 1
(en el momento de la escritura, no hubo otras revisiones del protocolo). La respuesta al comando es:
{
"eventType" : " hello " ,
"protocolVersion" : 1 ,
"message" : " OK "
}
protocolVersion
es la versión de protocolo que el descubrimiento usará en el resto de la comunicación.
El START
comienza las subrutinas internas del descubrimiento que busca puertos. Este comando debe llamarse antes de LIST
o START_SYNC
. La respuesta al comando de inicio es:
{
"eventType" : " start " ,
"message" : " OK "
}
El comando STOP
detiene las subrutinas internas de descubrimiento y libera algunos recursos. Se debe llamar a este comando si el cliente desea detener el descubrimiento por un tiempo. La respuesta al comando stop es:
{
"eventType" : " stop " ,
"message" : " OK "
}
El comando QUIT
termina el descubrimiento. La respuesta a dejar de fumar es:
{
"eventType" : " quit " ,
"message" : " OK "
}
Después de esta salida, la herramienta deja de fumar.
El comando LIST
devuelve una lista de los puertos serie disponibles actualmente. El formato de la respuesta es el siguiente:
{
"eventType" : " list " ,
"ports" : [
{
"address" : " /dev/ttyACM0 " ,
"label" : " /dev/ttyACM0 " ,
"properties" : {
"pid" : " 0x804e " ,
"vid" : " 0x2341 " ,
"serialNumber" : " EBEABFD6514D32364E202020FF10181E "
},
"hardwareId" : " EBEABFD6514D32364E202020FF10181E " ,
"protocol" : " serial " ,
"protocolLabel" : " Serial Port (USB) "
}
]
}
El campo ports
contiene una lista de los puertos serie disponibles. Si el puerto serie proviene de un convertidor serie USB, las propiedades USB VID/PID y el número de serie USB también se informan dentro de properties
.
El comando de lista es un comando de una sola vez, si necesita un monitoreo continuo de los puertos, debe usar el comando START_SYNC
.
El comando START_SYNC
coloca la herramienta en modo "eventos": el descubrimiento enviará eventos add
y remove
cada vez que se detecte o elimine un nuevo puerto respectivamente. La respuesta inmediata al comando es:
{
"eventType" : " start_sync " ,
"message" : " OK "
}
Después de eso, el descubrimiento ingresa al modo "Eventos".
Los eventos add
se parecen a los siguientes:
{
"eventType" : " add " ,
"port" : {
"address" : " /dev/ttyACM0 " ,
"label" : " /dev/ttyACM0 " ,
"properties" : {
"pid" : " 0x804e " ,
"vid" : " 0x2341 " ,
"serialNumber" : " EBEABFD6514D32364E202020FF10181E "
},
"hardwareId" : " EBEABFD6514D32364E202020FF10181E " ,
"protocol" : " serial " ,
"protocolLabel" : " Serial Port (USB) "
}
}
Básicamente recopila la misma información que el evento list
pero para un solo puerto. Después de llamar START_SYNC
se puede generar un montón de eventos add
en secuencia para informar todos los puertos disponibles en el momento del inicio.
El evento remove
se ve así:
{
"eventType" : " remove " ,
"port" : {
"address" : " /dev/ttyACM0 " ,
"protocol" : " serial "
}
}
En este caso, solo se informan los campos address
y protocol
.
Una posible transcripción del uso del descubrimiento:
$ ./serial-discovery
START
{
"eventType": "start",
"message": "OK"
}
LIST
{
"eventType": "list",
"ports": [
{
"address": "/dev/ttyACM0",
"label": "/dev/ttyACM0",
"protocol": "serial",
"protocolLabel": "Serial Port (USB)",
"properties": {
"pid": "0x004e",
"serialNumber": "EBEABFD6514D32364E202020FF10181E",
"vid": "0x2341"
},
"hardwareId": "EBEABFD6514D32364E202020FF10181E"
}
]
}
START_SYNC
{
"eventType": "start_sync",
"message": "OK"
}
{ <--- this event has been immediately sent
"eventType": "add",
"port": {
"address": "/dev/ttyACM0",
"label": "/dev/ttyACM0",
"protocol": "serial",
"protocolLabel": "Serial Port (USB)",
"properties": {
"pid": "0x004e",
"serialNumber": "EBEABFD6514D32364E202020FF10181E",
"vid": "0x2341"
},
"hardwareId": "EBEABFD6514D32364E202020FF10181E"
}
}
{ <--- the board has been disconnected here
"eventType": "remove",
"port": {
"address": "/dev/ttyACM0",
"protocol": "serial"
}
}
{ <--- the board has been connected again
"eventType": "add",
"port": {
"address": "/dev/ttyACM0",
"label": "/dev/ttyACM0",
"protocol": "serial",
"protocolLabel": "Serial Port (USB)",
"properties": {
"pid": "0x004e",
"serialNumber": "EBEABFD6514D32364E202020FF10181E",
"vid": "0x2341"
},
"hardwareId": "EBEABFD6514D32364E202020FF10181E"
}
}
QUIT
{
"eventType": "quit",
"message": "OK"
}
$
Si cree que encontró una vulnerabilidad u otro error relacionado con la seguridad en este proyecto, lea nuestra política de seguridad e informa el error a nuestro equipo de seguridad. ¡Gracias!
Correo electrónico Contacto: [email protected]
Copyright (c) 2018 Arduino SA (www.arduino.cc)
El software se lanza bajo la Licencia Pública General de GNU, que cubre el cuerpo principal del código de descubrimiento en serie. Los términos de esta licencia se pueden encontrar en: https://www.gnu.org/licenses/gpl-3.0.en.html
Consulte License.txt para más detalles.