AgentStack
Browse Sign in
Browse Why AgentStack Sell Docs
Sign in
SKILL verified MIT Self-run

Rf Jammer Firmware Port

skill-wang200935-security-agent-skills-rf-jammer-firmware-port · by Wang200935

RF Jammer v2 完整移植技術手冊 — 從 RF Jammer 3×nRF24 原始碼深度分析、 sigkill 交叉比較、到 Wang

No reviews yet
0 installs
13 views
0.0% view→install

Install

$ agentstack add skill-wang200935-security-agent-skills-rf-jammer-firmware-port

✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.

Security review

✓ Passed

No issues found. Passed automated security review. · v0.1.0 How review works →

  • Prompt-injection patterns
  • Secret / credential exfiltration
  • Dangerous shell & filesystem operations
  • Untrusted network calls
  • Known-malicious package signatures

What it can access

  • Network access No
  • Filesystem access No
  • Shell / process execution No
  • Environment & secrets No
  • Dynamic code execution No

From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.

View the full security report →

Verified badge

Passed review? Show it. Paste this badge into your README, it links to the public security report.

AgentStack Verified badge Links to your public security report.
[![AgentStack Verified](https://agentstack.voostack.com/badges/verified.svg)](https://agentstack.voostack.com/security/report/skill-wang200935-security-agent-skills-rf-jammer-firmware-port)

Reliability & compatibility

Security review passed
0 installs to date
no reviews yet
20d ago

Declared compatibility

Claude CodeClaude Desktop

Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.

Preview Execution monitoring

We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.

How agent discovery & health will work →
Are you the author of Rf Jammer Firmware Port? Claim this listing to set pricing, connect Stripe payouts, and keep 70% of every sale.
Sign up to claim

About

RF Jammer v2 完整移植技術手冊

🎯 觸發時機

  • user 提到「RF Jammer」「」「多協議干擾器」「OLED 選單 jammer」
  • user 要移植 RF Jammer 到 Wang 現有硬體(雙 nRF24 + OLED + 按鈕)
  • user 問 RF Jammer 內部架構、UI 動畫、頻道定義、nRF24 初始化策略

📊 RF Jammer v2 vs 深度對比

| 特徵 | RF Jammer v2 | | |------|-----------|---------| | GitHub | cifertech/RF Jammer ★1,721 | jbohack/ ★547 | | 框架 | Arduino IDE (.ino) | PlatformIO (src/include) | | nRF24 數量 | 3 (GT24 Mini) | 3 | | 按鈕 | 3 (L=27,R=25,S=26) | 5 (UP=26,DOWN=33,CENTER=32,LEFT=25,RIGHT=27) | | OLED | SSD1306 128×64 I²C (SCL=22,SDA=21) | SSD1306 128×64 I²C | | 狀態 LED | NeoPixel GPIO14 | NeoPixel GPIO14 | | 協議數量 | 8 (WiFi/VideoTX/RC/BLE/BT/USB/Zigbee/NRF24) | 9 (+All mode) | | 按鈕處理 | HW interrupt FALLING + 200ms millis debounce | digitalRead polling + 200ms millis debounce | | UI 風格 | 動畫卡片滑動 + Pill Toggle | 文字選單 + 捲軸 | | 模式切換 | L/R 按鈕切模式 + S 按鈕 ON/OFF toggle | UP/DOWN 切選項 + RIGHT 啟動 + LEFT 返回 | | ESP32 core | 1.0.5 (Arduino IDE 舊版) | 未知 (PlatformIO) | | nRF24 SPI | 3 顆共用 default SPI (只用 VSPI 硬體腳) | 3 顆獨立 SPI? (pindefs 只列 CE/CSN) | | 開源程度 | 完整 (.ino + config.h + setting.cpp/h + neopixel.cpp) | legacy-src 完整 (PlatformIO) | | PCB | 已釋出 Gerber+BOM+Pick&Place+示意圖 | 商業產品,無 PCB |


🔌 RF Jammer v2 完整腳位定義 (config.h)

// 按鈕
#define PIN_BTN_L  27  // 左鍵 = 上一個模式
#define PIN_BTN_R  25  // 右鍵 = 下一個模式
#define PIN_BTN_S  26  // 中鍵 = ON/OFF toggle

// nRF24 (3 顆共用 default SPI = VSPI 硬體腳)
#define NRF_CE_PIN_A    5
#define NRF_CSN_PIN_A   17
#define NRF_CE_PIN_B    16
#define NRF_CSN_PIN_B   4
#define NRF_CE_PIN_C    15
#define NRF_CSN_PIN_C   2
// SCK=18, MOSI=23, MISO=19 (default VSPI pins)

// NeoPixel
// pixels(1, 14, NEO_GRB + NEO_KHZ800) — 1 顆 LED @ GPIO14

// OLED
// U8G2_SSD1306_128X64_NONAME_F_HW_I2C — SCL=22, SDA=21, 400kHz

🏗 RF Jammer 完整 firmware 架構逐行分析

檔案結構

rf-jammer/
├── rf-jammer.ino     ← 主程式 (407 行)
├── config.h        ← 所有 define + include + 頻道陣列 (98 行)
├── setting.h       ← 函式宣告 + extern + OLED 字型 (55 行)
├── setting.cpp     ← nRF24 init + OLED 文字 + 開機畫面 (51 行)
└── neopixel.cpp    ← NeoPixel 顏色設定 + 閃爍 (54 行)

config.h 核心定義

// --- 枚舉 ---
enum OperationMode {
  WiFi_MODULE,         // 0
  VIDEO_TX_MODULE,     // 1
  RC_MODULE,           // 2
  BLE_MODULE,          // 3
  Bluetooth_MODULE,    // 4
  USB_WIRELESS_MODULE, // 5
  ZIGBEE_MODULE,       // 6
  NRF24_MODULE         // 7
};

enum Operation {
  DEACTIVE_MODE,       // 0 = 待機
  ACTIVE_MODE          // 1 = 干擾中
};

// --- 頻道群組 (三 radio 各鎖一群) ---
byte channelGroup_1[] = {2, 5, 8, 11};
byte channelGroup_2[] = {26, 29, 32, 35};
byte channelGroup_3[] = {80, 83, 86, 89};

// --- 各協議頻道陣列 ---
const byte bluetooth_channels[] =        {32,34,46,48,50,52, 0,1,2,4,6,8, 22,24,26,28,30, 74,76,78,80};  // 21 個
const byte ble_channels[]       =        {2, 26, 80};                                                      // 3 個 (廣告通道)
const byte WiFi_channels[]      =        {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};                         // 12 個
const byte usbWireless_channels[] =      {40, 50, 60};                                                      // 3 個
const byte videoTransmitter_channels[] = {70, 75, 80};                                                      // 3 個
const byte rc_channels[]        =        {1, 3, 5, 7};                                                      // 4 個
const byte zigbee_channels[]    =        {11, 15, 20, 25};                                                  // 4 個
const byte nrf24_channels[]     =        {76, 78, 79};                                                      // 3 個

nRF24 初始化流程 (setting.cpp)

// 全域 radio 物件
RF24 RadioA(NRF_CE_PIN_A, NRF_CSN_PIN_A);  // CE=5, CSN=17
RF24 RadioB(NRF_CE_PIN_B, NRF_CSN_PIN_B);  // CE=16, CSN=4
RF24 RadioC(NRF_CE_PIN_C, NRF_CSN_PIN_C);  // CE=15, CSN=2

// 中性狀態 (DEACTIVE_MODE 時呼叫)
void setRadiosNeutralState() {
  RadioA.stopListening(); RadioA.setAutoAck(false);
  RadioA.setRetries(0, 0); RadioA.powerDown(); digitalWrite(NRF_CE_PIN_A, LOW);
  // RadioB, RadioC 同上
}

// 通用設定 (所有 radio 共用)
void configureNrf(RF24 &radio) {
  radio.begin();                             // default SPI
  radio.setAutoAck(false);
  radio.stopListening();                     // TX mode
  radio.setRetries(0, 0);
  radio.setPALevel(RF24_PA_MAX, true);       // +20dBm (PA+LNA)
  radio.setDataRate(RF24_2MBPS);
  radio.setCRCLength(RF24_CRC_DISABLED);     // 純 CW 不需 CRC
}

干擾核心 — configure_Radio() + loop()

// 每個 radio 對其 channelGroup 逐一 startConstCarrier
// ⚠ 最後一個 channel 的 startConstCarrier 覆蓋前面的
void configure_Radio(RF24 &radio, const byte *channels, size_t size) {
  configureNrf(radio);
  radio.printPrettyDetails();  // debug
  for (size_t i = 0; i 
SPIClass *vspi_bus = nullptr;
SPIClass *hspi_bus = nullptr;

void configure_Radio(RF24 &radio, SPIClass *bus, const byte *channels, size_t size) {
  radio.begin(bus);  // 傳入 SPI bus pointer
  radio.setAutoAck(false);
  // ... 其他設定同上
  for (size_t i = 0; i begin(18, 19, 23, -1);  // SCK=18, MISO=19, MOSI=23
    hspi_bus = new SPIClass(HSPI);
    hspi_bus->begin(14, 12, 13, -1);  // SCK=14, MISO=12, MOSI=13

    if (RadioA.begin(vspi_bus))
      configure_Radio(RadioA, vspi_bus, channelGroup_1, sizeof(channelGroup_1));
    if (RadioB.begin(hspi_bus))
      configure_Radio(RadioB, hspi_bus, channelGroup_2, sizeof(channelGroup_2));
  } else {
    RadioA.powerDown(); RadioB.powerDown(); delay(100);
    if (vspi_bus) { vspi_bus->end(); delete vspi_bus; vspi_bus = nullptr; }
    if (hspi_bus) { hspi_bus->end(); delete hspi_bus; hspi_bus = nullptr; }
  }
}
  1. 砍掉 NeoPixel — 改用 4pin LED:
#define LED_PIN 2  // ESP32 內建 LED 或自訂 GPIO
// 代替 setNeoPixelColour():
void setStatusLED(bool on) {
  digitalWrite(LED_PIN, on ? HIGH : LOW);
}
  1. UI 保留 — OLED 128×64 U8g2 完整保留,只改 kMenuLabels (砍掉 NRF24_MODULE? 或保留 8 種全上)

⚠️ 移植 Pitfall 清單

P1: ESP32 core 版本差異 (1.0.5 → 3.3.10)

RF Jammer 用 ESP32 core 1.0.5。Wang 環境用 3.3.10

| API | core 1.0.5 | core 3.3.10 | |-----|-----------|-------------| | esp_bt_controller_deinit() | ✅ | ✅ (仍可用) | | esp_wifi_stop/deinit/disconnect() | ✅ | ✅ | | ieee80211_raw_frame_sanity_check | 弱符號 | 強符號 → linker 會要求 __wrap_ | | WiFi.scanNetworks() | 正常 | 正常 |

解法: 任何 ESP32 core 3.3.10 的 .ino 都要加:

extern "C" int __wrap_ieee80211_raw_frame_sanity_check(int32_t arg, int32_t arg2, int32_t arg3) {
  return 1;
}

(即使完全不碰 WiFi raw TX,linker 也強制要求)

P2: RF24 ≥1.6 startConstCarrier 回 void

RF Jammer 寫的時候可能是 RF24 1.4.x(startConstCarrierbool)。 Wang 環境是 RF24 1.6.1(回 void)。

移植時不需要改 — RF Jammer 原始碼的 configure_Radio() 沒有檢查回傳值(直接 radio.startConstCarrier(...)),所以相容 ✅。但如果自己加的 code 有 if (!radio.startConstCarrier(...)) 就會編譯失敗。

P3: ESP32-D0WD-V3 需要 FlashMode=dio

Wang 的 ESP32 是 D0WD-V3 rev3.0,不支援 QIO flash。編譯時必須加:

arduino-cli compile --fqbn esp32:esp32:esp32:FlashMode=dio 

P4: Arduino sketch 目錄必須等於 .ino 檔名

rf-jammer_multi.ino 必須在 rf-jammer_multi/rf-jammer_multi.ino

P5: 分次燒錄 @230400 baud 最可靠

# Step 1: bootloader (保持 stub)
esptool.py --chip esp32 --port $PORT --baud 230400 --before default-reset --after no-reset \
  write-flash 0x1000 .ino.bootloader.bin

# Step 2: partitions + app (從 stub 繼續,最後 hard-reset)
esptool.py --chip esp32 --port $PORT --baud 230400 --before default-reset --after hard-reset \
  write-flash 0x8000 .ino.partitions.bin 0x10000 .ino.bin

P6: INPUT_PULLUP vs 外部上拉電阻

RF Jammer 用 pinMode(PIN_BTN_L, INPUT_PULLUP) — ESP32 內建上拉,不用外部電阻。 移植時直接用 INPUT_PULLUP(省零件)。但 GPIO 34/35/36/39 是 input-only,沒有內部 pull-up — 如果按鈕接這些腳,必須外加 10kΩ 上拉電阻到 3.3V。

P7: SPI 三線 (SCK/MOSI/MISO) 接錯 = 最常見 ERR

nRF24 begin() 失敗 90% 是 SPI 線接錯。遠端診斷時叫 user 逐條唸出接線對照檢查。

P8: 每顆 nRF24 VCC-GND 必並 10µF 電容

不加電容 → nRF24 在 CW 模式隨機 reset 或 power drop → begin() 成功但干擾時有時無。

P9: 三 radio 共用 SPI vs 獨立 SPI

RF Jammer 用 3 顆 nRF24 共用 default SPI(VSPI 硬體腳)。Wang 硬體目前用 VSPI+HSPI 獨立。 移植時兩種做法都可以:

  • A) 保持獨立 (不改線):RadioA.begin(vspi_bus) + RadioB.begin(hspi_bus)
  • B) 共用 VSPI (改線,像 RF-KILL):把 nRF24 #2 的 SCK/MOSI/MISO 改接到 VSPI GPIO (18/23/19)

推薦 A (不改線,直接移植) — Wang 硬體已經有穩定的獨立 SPI 接法。

P10: 兩顆 nRF24 vs 三顆 nRF24 頻道策略

RF Jammer 用三顆 radio 各有固定頻道群組。移植到兩顆時:

  • 方案 A:radioA 鎖廣告通道 (2/26/80),radioB 做 RF-KILL 混亂掃描 (全 0-79)
  • 方案 B:雙 radio 同步隨機跳頻,像 sigkill 做法(每模式各有頻道陣列)
  • 方案 C:照 RF Jammer 原設計,砍掉 RadioC,RadioA/B 各自鎖一半頻道群組

推薦 方案 B ( 風格) — 最簡單、最符合 user 描述的多協議選單行為。


🔧 編譯燒錄 SOP (macOS, 2026-07)

環境確認

arduino-cli version      # ≥1.5.1
arduino-cli core list    # esp32:esp32 3.3.10
arduino-cli lib list     # RF24 ≥1.6.1, U8g2

編譯

arduino-cli compile \
  --fqbn esp32:esp32:esp32:FlashMode=dio \
  --build-path bin/build \
  --output-dir bin \
  rf-jammer_multi/rf-jammer_multi.ino

燒錄

ESPPORT=$(ls /dev/cu.usbserial-* | head -1)

# bootloader
~/.hermes/hermes-agent/venv/bin/python3 -m esptool \
  --chip esp32 --port $ESPPORT --baud 230400 \
  --before default-reset --after no-reset \
  write-flash 0x1000 bin/rf-jammer_multi.ino.bootloader.bin

# partitions + app
~/.hermes/hermes-agent/venv/bin/python3 -m esptool \
  --chip esp32 --port $ESPPORT --baud 230400 \
  --before default-reset --after hard-reset \
  write-flash 0x8000 bin/rf-jammer_multi.ino.partitions.bin \
  0x10000 bin/rf-jammer_multi.ino.bin

Serial 驗證

python3 -c "
import serial, time
s = serial.Serial('$ESPPORT', 115200, timeout=1)
deadline = time.time() + 10
while time.time() < deadline:
    data = s.read(1024)
    if data: print(data.decode('utf-8', errors='replace'), end='', flush=True)
    else: time.sleep(0.1)
s.close()
"

📡 各協議 nRF24 channel 對照總表

| 協議 | 頻道陣列 | 數量 | nRF24 channel → 實際頻率 | |------|---------|------|-------------------------| | BLE 廣告通道 | {2, 26, 80} | 3 | 2402MHz / 2426MHz / 2480MHz | | Bluetooth Classic | {32,34,46,48,50,52, 0,1,2,4,6,8, 22,24,26,28,30, 74,76,78,80} | 21 | 分散 2400-2480MHz | | WiFi 2.4GHz | {1..12} | 12 | 2412-2484MHz | | Video TX (FPV) | {70, 75, 80} | 3 | 2470/2475/2480MHz | | RC (遙控器) | {1, 3, 5, 7} | 4 | 2401/2403/2405/2407MHz | | USB Wireless | {40, 50, 60} | 3 | 2440/2450/2460MHz | | Zigbee | {11, 15, 20, 25} | 4 | 2411/2415/2420/2425MHz | | NRF24 通用 | {76, 78, 79} | 3 | 2476/2478/2479MHz |

nRF24 channel → 頻率公式:2400 + channel (MHz)


🛡 操作守則(必讀)

  1. 只在法拉第籠內操作(鋁箔紙箱即可)
  2. 只用電池供電(鋰電 + TP4056,不要一邊充電一邊用)
  3. 只測自有舊設備
  4. 連續不超過 5 分鐘(nRF24 PA 發燙)
  5. 絕不在公共空間開機

台灣「電信管理法」第 66/67 條:製造、持有、使用干擾器均違法。本 skill 僅供自有設備、受控實驗室環境、學術研究用途。


📁 專案位置

  • RF Jammer 完整 clone: ~/projects/RF Jammer-study/
  • 研究報告: ~/projects/multi-protocol-jammer-guide/RESEARCH.md
  • Wang 現有 jammer 專案: ~/projects/esp32-nrf24-jammer/ (esp32-nrf24-jammer-builder skill)

📚 來源

  • cifertech/RF Jammer (GitHub, ★1,721): https://github.com/cifertech/RF Jammer
  • jbohack/ (GitHub, ★547): https://github.com/jbohack/
  • RF Jammer 官方文件: https://cifertech.net/RF Jammer-your-portable-ble-bluetooth-jamming-tool/
  • 商店: https://nyandevices.com

Source & license

This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.

Install and usage instructions live in the source repository linked above.

Reviews

No reviews yet, be the first.

Versions

  • v0.1.0 Imported from the upstream source.