A ferramenta serial-discovery
é um programa de linha de comando que interage via stdio. Ele aceita comandos como strings ASCII simples terminados com LF n
e envia resposta como JSON.
Instale um ambiente recente de Golang e o Run go build
. A serial-discovery
executável será produzida no seu diretório de trabalho.
Após a startup, a ferramenta aguarda comandos. Os comandos disponíveis são: HELLO
, START
, STOP
, QUIT
, LIST
e START_SYNC
.
O comando HELLO
é usado para estabelecer o protocolo de descoberta flugable entre o cliente e a descoberta. O formato do comando é:
HELLO <PROTOCOL_VERSION> "<USER_AGENT>"
por exemplo:
HELLO 1 "Arduino IDE"
ou:
HELLO 1 "arduino-cli"
Nesse caso, a versão do protocolo solicitada pelo cliente é 1
(no momento da redação, não houve outras revisões do protocolo). A resposta ao comando é:
{
"eventType" : " hello " ,
"protocolVersion" : 1 ,
"message" : " OK "
}
protocolVersion
é a versão do protocolo que a descoberta usará no restante da comunicação.
O START
inicia as sub -rotinas internas da descoberta que procura portas. Este comando deve ser chamado antes LIST
ou START_SYNC
. A resposta ao comando inicial é:
{
"eventType" : " start " ,
"message" : " OK "
}
O comando STOP
interrompe as sub -rotinas internas da descoberta e libera alguns recursos. Este comando deve ser chamado se o cliente quiser pausar a descoberta por um tempo. A resposta ao comando STOP é:
{
"eventType" : " stop " ,
"message" : " OK "
}
O comando QUIT
encerra a descoberta. A resposta a sair é:
{
"eventType" : " quit " ,
"message" : " OK "
}
Após essa saída, a ferramenta desiste.
O comando LIST
retorna uma lista das portas seriais atualmente disponíveis. O formato da resposta é o seguinte:
{
"eventType" : " list " ,
"ports" : [
{
"address" : " /dev/ttyACM0 " ,
"label" : " /dev/ttyACM0 " ,
"properties" : {
"pid" : " 0x804e " ,
"vid" : " 0x2341 " ,
"serialNumber" : " EBEABFD6514D32364E202020FF10181E "
},
"hardwareId" : " EBEABFD6514D32364E202020FF10181E " ,
"protocol" : " serial " ,
"protocolLabel" : " Serial Port (USB) "
}
]
}
O campo ports
contém uma lista das portas seriais disponíveis. Se a porta serial vier de um conversor serial USB, as propriedades USB VID/PID e o número de série USB também serão relatadas dentro de properties
.
O comando List é um comando de um tiro, se você precisar de monitoramento contínuo das portas, use o comando START_SYNC
.
O comando START_SYNC
coloca a ferramenta no modo "eventos": a descoberta add
e remove
eventos sempre que uma nova porta é detectada ou removida, respectivamente. A resposta imediata ao comando é:
{
"eventType" : " start_sync " ,
"message" : " OK "
}
Depois disso, a descoberta entra no modo de "eventos".
Os eventos add
parece o seguinte:
{
"eventType" : " add " ,
"port" : {
"address" : " /dev/ttyACM0 " ,
"label" : " /dev/ttyACM0 " ,
"properties" : {
"pid" : " 0x804e " ,
"vid" : " 0x2341 " ,
"serialNumber" : " EBEABFD6514D32364E202020FF10181E "
},
"hardwareId" : " EBEABFD6514D32364E202020FF10181E " ,
"protocol" : " serial " ,
"protocolLabel" : " Serial Port (USB) "
}
}
Ele basicamente coleta as mesmas informações do evento list
, mas para uma única porta. Depois de ligar para START_SYNC
um monte de eventos add
podem ser gerados em sequência para relatar todas as portas disponíveis no momento do início.
O evento remove
se parece com o seguinte:
{
"eventType" : " remove " ,
"port" : {
"address" : " /dev/ttyACM0 " ,
"protocol" : " serial "
}
}
Nesse caso, apenas os campos address
e protocol
são relatados.
Uma possível transcrição do uso da descoberta:
$ ./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"
}
$
Se você acha que encontrou uma vulnerabilidade ou outro bug relacionado à segurança neste projeto, leia nossa política de segurança e relate o bug à nossa equipe de segurança? Obrigado!
Contato por e-mail: seguranç[email protected]
Copyright (c) 2018 Arduino SA (www.arduino.cc)
O software é lançado sob a licença pública geral da GNU, que abrange o corpo principal do código de descoberta serial. Os termos desta licença podem ser encontrados em: https://www.gnu.org/license/gpl-3.0.en.html
Consulte License.txt para obter detalhes.