使用 Pyspinel 進行封包取樣

在 GitHub 上查看來源

本指南將說明如何設定 Wireshark 並執行 Pyspinel,以便從 Thread 網路嗅探封包。

如要使用 Wireshark extcap 外掛程式進行封包偵測,請參閱「使用 extcap 進行封包偵測」。

設定嗅探器環境

在開始之前,請先完成下列步驟:

建構嗅探器

使用 ot-rcp 二進位輸出內容,建構並刷新 NCP 裝置,以便做為嗅探器。

Nordic nRF52840

如要設定 Nordic nRF52840 範例,以便做為嗅探器使用,請複製 openthread/ot-nrf528xx 並設定建構環境:

git clone https://github.com/openthread/ot-nrf528xx --recursive
./script/bootstrap

將波特率設為 460800。在 src/nrf52840/transport-config.h 中找出 #define UART_BAUDRATE NRF_UARTE_BAUDRATE_115200 行,然後將其替換為 #define UART_BAUDRATE NRF_UARTE_BAUDRATE_460800

建構二進位檔:

./script/build nrf52840 UART_trans

ot-rcp 二進位輸出內容轉換為十六進位:

arm-none-eabi-objcopy -O ihex build/bin/ot-rcp ot-rcp.hex

按照「閃記 nRF52840」一文的說明,將 ot-rcp.hex 檔案刷新至 nRF52840 電路板。

請在 nRF52840 上停用大量儲存裝置 (MSD),以免使用偵錯埠時發生資料毀損或遺失的問題:

expect <<EOF
spawn JLinkExe
expect "J-Link>"
send "msddisable\n"
expect "Probe configured successfully."
exit
EOF
spawn JLinkExe
SEGGER J-Link Commander V6.42b (Compiled Feb  5 2019 17:35:31)
DLL version V6.42b, compiled Feb  5 2019 17:35:20
 
Connecting to J-Link via USB...O.K.
Firmware: J-Link OB-SAM3U128-V2-NordicSemi compiled Jan  7 2019 14:07:15
Hardware version: V1.00
S/N: 683411111
VTref=3.300V
 
Type "connect" to establish a target connection, '?' for help
J-Link>msddisable
Probe configured successfully.

Thread 網路屬性

繼續操作前,請先取得要嗅探的 Thread 網路的以下屬性。您需要這些資訊來設定 Wireshark 並執行 Pyspinel 嗅探器。

網格本機前置字串

如要從目標 Thread 網路中的裝置取得 Mesh Local 前置字串,請按照下列步驟操作:

  1. 使用 OpenThread CLI:

    dataset active
    Mesh Local Prefix: fd33:3333:3344:0/64
    

  2. wpanctl 與 NCP 搭配使用:

    wpanctl getprop IPv6:MeshLocalPrefix
    IPv6:MeshLocalPrefix = "fd33:3333:3344:0::/64"
    

  3. 使用 OTBR 網頁 GUI 選取「狀態」。網狀本地前置碼會列為 IPv6:MeshLocalPrefix,類似 wpanctl

頻道

如要從目標 Thread 網路中的裝置取得頻道,請按照下列步驟操作:

  1. 使用 OpenThread CLI:

    channel
    15
    

  2. wpanctl 與 NCP 搭配使用:

    wpanctl getprop NCP:Channel
    NCP:Channel = 15
    

  3. 使用 OTBR 網頁 GUI 選取「狀態」。頻道會列為 NCP:Channel,類似於 wpanctl

網路金鑰

Wireshark 會使用 Thread Network Key 在擷取後解密封包。如何從目標 Thread 網路中的裝置取得網路金鑰:

  1. 使用 OpenThread CLI:

    networkkey
    33334444333344443333444433334444
    

  2. wpanctl 與 NCP 搭配使用:

    wpanctl getprop Network:Key
    Network:Key = [33334444333344443333444433334444]
    

在 OTBR 網頁 GUI 中,無法使用 Thread 網路金鑰。

嗅探器選項

選項
-u or --uart
預設值
None - 如果您使用的是裝置的序列連線 (而非 Socket 連線),則必須提供此值。
說明
-u--uart 旗標,後面接著裝置路徑,例如 /dev/ttyUSB0
-c or --channel
預設值
11
說明
-c--channel 標記,後面接著在 Thread Network 上設定的管道,用於嗅探封包。
--no-reset
預設值
這個標記會覆寫預設行為。
說明
如果 NCP 裝置是透過原生 USB 連線連接至主機,就需要 --no-reset 旗標。
--crc
預設值
這個標記會覆寫預設行為。
說明
--crc 標記適用於 TI 和 Nordic Semiconductor Thread 板等平台。這個旗標會重新計算 CRC,以避免 Wireshark 中的「Bad FCS」(錯誤的封包檢查序列) 警告。
-b or --baudrate
預設值
115200
說明
-b--baudrate 標記可用來覆寫預設的波特率。將這個值設為與 NCP 版本使用的相同鮑率 (建議使用 460800)。
--rssi
預設值
這個標記會覆寫預設行為。
說明
--rssi 標記可用來確保 RSSI 包含在 pcap 輸出內容中。如果在 Wireshark 中啟用 TI CC24xx FCS 格式選項,則必須使用這個旗標。
--tap
預設值
這個標記會覆寫預設行為。
說明
--tap 標記會為影格格式指定 DLT_IEEE802_15_4_TAP(283),其中偽標頭包含含有中繼資料的 TLV (例如 FCS、RSSI、LQI、Channel)。如未指定,系統會預設使用 DLT_IEEE802_15_4_WITHFCS(195),並直接在 PHY 框架後方加入額外的 RSSI 和 LQI,如 TI CC24xx FCS 格式。如果在 Wireshark 中啟用 ITU-T CRC-16 選項,則必須使用此標記。如果 Wireshark 未啟用該選項,請勿使用這個標記。

執行嗅探器

請務必使用 NCP 的特定裝置路徑,以及您嘗試嗅探的 Thread 網路的管道。

如果您按照本指南操作,nRF52840 DK 應透過偵錯埠連接至主機電腦,如「將 nRF52840 進行閃燈處理」一文所述。如要執行 Pyspinel 嗅探器,請使用 -b 旗標指定波特率 (如果已從預設值變更),並省略 --no-reset 旗標。

如果您設定 Wireshark 來顯示 RSSI,則在執行嗅探工具時,也必須加入 --rssi 標記。舉例來說,如要使用掛接在 /dev/ttyACM0 的裝置嗅探第 15 個頻道,並在 Wireshark 輸出內容中加入 RSSI:

cd path-to-pyspinel
python sniffer.py -c 15 -u /dev/ttyACM0 --crc --rssi -b 460800 | wireshark -k -i -

您現在應該可以在 Wireshark 中查看此設定的封包和相關通訊協定:

Wireshark 擷取

如要進一步瞭解如何執行 Pyspinel 嗅探器,請參閱 Spinel 嗅探器參考資料

原生 USB 連線

使用 nRF52840 DK USB 連接埠時,必須使用 USB_trans 建構 OpenThread ot-rcp 二進位檔:

./script/build nrf52840 USB_trans
請對 nRF52840 DK 進行閃燈處理,並透過 USB 連接埠連線至主機,然後在執行嗅探程式時使用 --no-reset 旗標,但省略 -b 旗標:

python sniffer.py -c 15 -u /dev/ttyACM0 --crc --no-reset --rssi | wireshark -k -i -

資源

如需其他 Nordic 工具,請參閱 Nordic Semiconductor - Thread Sniffer based on nRF52840 with Wireshark