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シリアルコンバーターから来る場合、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]
Copyright(c)2018 Arduino SA(www.arduino.cc)
このソフトウェアは、GNU General Public Licenseの下でリリースされ、シリアル発見コードの本体をカバーしています。このライセンスの条件は、https://www.gnu.org/licenses/gpl-3.0.en.htmlにあります。
詳細については、license.txtを参照してください。