serial-discovery
工具是通過STDIO進行交互的命令行程序。它接受命令為終止LF n
的普通ASCII字符串,並將響應發送為JSON。
安裝最近的Golang環境並進行go build
。可執行的serial-discovery
將在您的工作目錄中生成。
啟動後,該工具等待命令。可用命令是: HELLO
, START
, STOP
, QUIT
, LIST
和START_SYNC
。
HELLO
命令用於在客戶端和發現之間建立可插入的發現協議。命令的格式是:
HELLO <PROTOCOL_VERSION> "<USER_AGENT>"
例如:
HELLO 1 "Arduino IDE"
或者:
HELLO 1 "arduino-cli"
在這種情況下,客戶端要求的協議版本為1
(在撰寫本文時,沒有其他修訂版)。對命令的響應是:
{
"eventType" : " hello " ,
"protocolVersion" : 1 ,
"message" : " OK "
}
protocolVersion
是該發現將在其餘的通信中使用的協議版本。
開始START
了尋找端口的發現的內部子例程。必須在LIST
或START_SYNC
之前調用此命令。對開始命令的響應是:
{
"eventType" : " start " ,
"message" : " OK "
}
STOP
命令停止了發現內部子例程並釋放一些資源。如果客戶要暫停發現一段時間,則應調用此命令。對停止命令的響應是:
{
"eventType" : " stop " ,
"message" : " OK "
}
QUIT
命令終止了發現。對退出的反應是:
{
"eventType" : " quit " ,
"message" : " OK "
}
在此之後,輸出工具退出。
LIST
命令返回當前可用串行端口的列表。響應的格式如下:
{
"eventType" : " list " ,
"ports" : [
{
"address" : " /dev/ttyACM0 " ,
"label" : " /dev/ttyACM0 " ,
"properties" : {
"pid" : " 0x804e " ,
"vid" : " 0x2341 " ,
"serialNumber" : " EBEABFD6514D32364E202020FF10181E "
},
"hardwareId" : " EBEABFD6514D32364E202020FF10181E " ,
"protocol" : " serial " ,
"protocolLabel" : " Serial Port (USB) "
}
]
}
ports
字段包含可用串行端口的列表。如果串行端口來自USB串行轉換器,則在properties
內還報告了USB VID/PID和USB序列號屬性。
列表命令是一個單發命令,如果您需要對端口進行連續監視,則應使用START_SYNC
命令。
START_SYNC
命令將工具置於“事件”模式:發現分別每次檢測或刪除新端口時,發現將add
和remove
事件。對命令的直接響應是:
{
"eventType" : " start_sync " ,
"message" : " OK "
}
之後,發現進入“事件”模式。
add
事件如下:
{
"eventType" : " add " ,
"port" : {
"address" : " /dev/ttyACM0 " ,
"label" : " /dev/ttyACM0 " ,
"properties" : {
"pid" : " 0x804e " ,
"vid" : " 0x2341 " ,
"serialNumber" : " EBEABFD6514D32364E202020FF10181E "
},
"hardwareId" : " EBEABFD6514D32364E202020FF10181E " ,
"protocol" : " serial " ,
"protocolLabel" : " Serial Port (USB) "
}
}
它基本上收集了與list
事件相同的信息,但對於一個端口。調用START_SYNC
後,可能會生成一堆add
事件,以報告開始時在開始時報告所有可用端口。
remove
事件看起來像這樣:
{
"eventType" : " remove " ,
"port" : {
"address" : " /dev/ttyACM0 " ,
"protocol" : " serial "
}
}
在這種情況下,僅報告address
和protocol
字段。
發現用法的可能成績單:
$ ./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"
}
$
如果您認為在此項目中發現了漏洞或其他與安全有關的錯誤,請閱讀我們的安全策略,並向我們的安全團隊報告該錯誤嗎?測試謝謝!
電子郵件聯繫人:[email protected]
版權(C)2018 Arduino SA(www.arduino.cc)
該軟件是根據GNU通用公共許可證發布的,該許可涵蓋了串行發現代碼的主體。可以在以下網址找到此許可證的條款
有關詳細信息,請參見License.txt。