VISCA 指令產生器 / 封包解析器

選指令就組出 hex,貼上 hex 就看懂欄位——含合規檢查、錯誤碼解釋與 VISCA over IP 封裝

100% 瀏覽器運算,封包內容不上傳
預期回覆:
VISCA over IP(UDP 52381)

VISCA 是怎麼運作的(實作說明)

1. 一個封包只有三段

Header(1 byte)+ Message(最多 14 bytes)+ Terminator(0xFF),總長 3~16 bytes。Header 的 bit 7 固定為 1,bit 6~4 是發送端位址,bit 3 是廣播旗標,bit 2~0 是接收端位址。所以控制器(位址 0)送給裝置 1 的封包開頭是 0x81,裝置 1 回給控制器的則是 0x90(裝置位址 + 8)。

2. MSB 規則是整個協定的鑰匙

Message 的每個 byte 都必須小於 0x80。這條規則保證 0xFF 只可能出現在終止符,接收端任何時候失去同步,只要往前掃到下一個 0xFF 就能重新對齊。代價是參數的有效範圍只有 0~127,而 16-bit 數值必須拆成 4 個 nibble byte——這就是為什麼變焦位置要寫成 0p 0q 0r 0s。

3. 命令回兩次,查詢只回一次

送出命令(com-mode 01)會先收到 ACK(90 4Y FF)代表「收到了,開始做」,馬達實際跑完之後才收到 Completion(90 5Y FF)。查詢(com-mode 09)則不回 ACK,直接回 Completion 帶資料。這一點是實作 parser 時第二常見的錯誤——等 ACK 才處理的話,所有查詢都會逾時。

4. 只有兩個 socket,所以要等

相機端只有兩個命令緩衝區。沒等 Completion 就連送第三個命令,會收到 90 60 03 FF(Command buffer full)。搖桿控制若每個 tick 都送 Pan/Tilt Drive 而不等回覆,兩個 socket 會在 100 毫秒內用完。查詢不佔 socket,可以與命令交錯發送——這是位置回授迴路能高頻執行的前提。

5. 接收端不能用 0xFF 切包

這個頁面的解析器是離線分析已知內容,才允許用 0xFF 分段。但真實的 UART 接收不行:只要掉一個 byte,兩個封包就會黏成一包,而黏起來的那一包同樣以 0xFF 結尾、看起來完全合法,無法從錯誤中恢復。正確做法是狀態機——

SYNC      逐 byte 掃描,直到遇到合法 Header(MSB = 1)
CLASSIFY  讀第 2 個 byte 決定類型與期望長度:
            0x40~0x4F → ACK,3 B
            0x50~0x5F → Completion,長度由「送出的是哪個查詢」決定
            0x60~0x6F → Error,4 B
            0x01/0x09 → 命令/查詢(通常只有裝置端會收到)
COLLECT   收滿期望長度後驗證:
            (a) Terminator 前每個 byte 都 < 0x80
            (b) 最後一個 byte 是 0xFF
          任一失敗 → 丟棄、記錄、回到 SYNC

查詢回覆的長度無法從封包本身推得——同樣是 90 50 開頭,Power 查詢回 4 bytes、變焦位置回 7 bytes、Pan/Tilt 位置回 11 bytes。所以控制端必須維護一個「待回覆佇列」:送出查詢時記下期望長度,收到 90 5Y 時據以判定。

6. 位置是有號數

Pan/Tilt 位置是 16-bit 二補數有號數。把 4 個 nibble 還原成 16-bit 之後,必須轉成 int16 才正確;用 uint16 接會讓左半邊或下半邊的所有位置變成三萬多、六萬多。這通常是位置回授迴路第一次跑就會炸的地方,而且症狀是「雲台突然往一個方向衝到底」,不容易一眼看出是型別問題。

7. 廠商差異是整合失敗的主因

  • 波特率:Sony EVI 系列預設 9600、BRC 可切 38400,第三方(PTZOptics、AVer 等)常見 115200。
  • 預設點數量:EVI-D30 只有 0~5、BRC-X400 為 0~99、部分第三方到 0~254。超出範圍是 Syntax Error 而不是被截斷。
  • 速度階數:標準 Pan 是 0x01~0x18、Tilt 是 0x01~0x14,但有些機種只到 0x0E,超出時的行為各家不一致。
  • 位置單位:絕對位置的角度換算完全是機種相關,不可移植,一定要查該機種的命令表。
  • 方向定義:Pan 正方向左右相反的機種確實存在;吊掛安裝(Picture Flip)又會再翻一次。

8. VISCA over IP 只是多一個標頭

指令層完全不變,只在原封包前面加 8 bytes:Payload Type(2)+ Payload Length(2)+ Sequence Number(4),以 UDP 送到預設埠 52381。Payload Type 常見值為 01 00(命令)、01 10(查詢)、01 11(回覆)。因為是 UDP,沒有重送機制——掉了就是掉了,逾時重送要自己做;序號的用途是把回覆配對回請求,不是用來重排順序。

如何使用?

1

選指令

在產生器選擇指令與參數,hex 封包即時產生

2

貼 hex

把抓到的封包貼進解析器,逐欄位看懂它在做什麼

3

查合規

長度與 MSB 規則會自動檢查,錯誤碼附上實際成因

常見問題

什麼是 VISCA?
VISCA(Video System Control Architecture)是 Sony 於 1990 年代為專業攝影機制定的控制協定,至今仍是 PTZ 攝影機控制的事實標準。一個封包由 Header(1 byte)、Message(最多 14 bytes)與 Terminator(0xFF)組成,總長 3~16 bytes。
為什麼 VISCA 的參數只能到 127?
因為 Message 部分每個 byte 的最高位元必須為 0(即全部小於 0x80)。這條規則保證 0xFF 只可能出現在終止符,讓接收端在失去同步時可以靠 0xFF 重新對齊。代價是 16-bit 數值必須拆成 4 個 nibble byte 傳送。
為什麼查詢位置回來的數字是六萬多?
Pan/Tilt 位置是 16-bit 二補數有號數。用無號整數接收會讓所有負向位置變成 32768 以上的大數字。還原 4 個 nibble 之後必須轉成 int16 才正確。
收到 90 60 03 FF 是什麼意思?
Command buffer full——相機只有兩個命令 socket,兩個都在忙時再送第三個命令就會收到這個錯誤。正確做法是等到前一個命令的 Completion 再送下一個。查詢不佔用 socket,可以與命令交錯發送。
可以直接用 0xFF 當作切包的依據嗎?
離線分析已知內容可以,但即時接收不行。串流中只要掉一個 byte,兩個封包就會被黏成一包,而且看起來完全合法,無法從錯誤中恢復。實作上必須用狀態機:先找 Header,再依第二個 byte 分類決定期望長度。
VISCA over IP 跟序列埠版本差在哪?
指令層完全相同,只是在原封包外面加一個 8-byte 標頭(Payload Type 2 bytes、Payload Length 2 bytes、Sequence Number 4 bytes),以 UDP 傳送,預設埠 52381。因為是 UDP,沒有重送機制,逾時重送要由控制端自行處理。