เครื่องมือ serial-discovery
เป็นโปรแกรมบรรทัดคำสั่งที่โต้ตอบผ่าน STDIO มันยอมรับคำสั่งเป็นสตริง ASCII ธรรมดาที่ถูกยกเลิกด้วย LF n
และส่งการตอบกลับเป็น JSON
ติดตั้งสภาพแวดล้อม Golang ล่าสุดและ Run 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
หยุดรูทีนย่อยภายใน Discovery และใช้ทรัพยากรบางอย่างฟรี คำสั่งนี้ควรเรียกว่าหากลูกค้าต้องการหยุดการค้นพบชั่วคราวสักพัก การตอบกลับคำสั่งหยุดคือ:
{
"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 จะมีการรายงานคุณสมบัติหมายเลขซีเรียล USB VID/PID และ USB ภายใน properties
คำสั่งรายการเป็นคำสั่งเดียว-ช็อตหากคุณต้องการการตรวจสอบพอร์ตอย่างต่อเนื่องคุณควรใช้คำสั่ง 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 ทั่วไปซึ่งครอบคลุมเนื้อหาหลักของรหัสการค้นพบแบบอนุกรม ข้อกำหนดของใบอนุญาตนี้สามารถดูได้ที่: https://www.gnu.org/licenses/gpl-3.0.en.html
ดู License.txt สำหรับรายละเอียด