أداة serial-discovery
هي برنامج سطر أوامر يتفاعل عبر stdio. يقبل الأوامر كأسلاك ASCII العادية التي تم إنهاءها مع LF n
ويرسل استجابة باسم 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
من الروتين الفرعي الداخلي للاكتشاف وتحرير بعض الموارد. يجب استدعاء هذا الأمر إذا أراد العميل إيقاف الاكتشاف لفترة من الوقت. الاستجابة لأمر 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 ، يتم أيضًا الإبلاغ عن خصائص الرقم التسلسلي 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
انظر الترخيص. txt للحصول على التفاصيل.