🚫🔵

Bluetooth Jammer for Flipper Zero

Disrupt Bluetooth communications with this custom Flipper Zero application

Jammer Control Panel

2402 - 2480
20 dBm

Status

Jammer is INACTIVE

Live Jammer Control

Flipper Zero Application Code

#include <furi.h>
#include <furi_hal.h>
#include <gui/gui.h>
#include <input/input.h>
#include 
#include 

#define TAG "BT_Jammer"
#define BT_FREQ_MIN 2402
#define BT_FREQ_MAX 2480
#define CHANNELS 79

typedef struct {
    bool jamming;
    bool scanning;
    uint8_t current_channel;
    uint32_t devices_found;
} BTJammerState;

static void bt_jammer_render_callback(Canvas* canvas, void* ctx) {
    BTJammerState* state = (BTJammerState*)ctx;
    
    canvas_set_font(canvas, FontPrimary);
    canvas_draw_str(canvas, 0, 10, "Bluetooth Jammer");
    
    canvas_set_font(canvas, FontSecondary);
    if(state->jamming) {
        canvas_draw_str(canvas, 0, 25, "Status: JAMMING ACTIVE");
        canvas_draw_str(canvas, 0, 40, "Channel: " + state->current_channel);
    } else if(state->scanning) {
        canvas_draw_str(canvas, 0, 25, "Status: SCANNING...");
        canvas_draw_str(canvas, 0, 40, "Devices: " + state->devices_found);
    } else {
        canvas_draw_str(canvas, 0, 25, "Status: READY");
    }
    
    canvas_draw_str(canvas, 0, 55, "Press OK to toggle jamming");
}

static void bt_jammer_input_callback(InputEvent* input_event, void* ctx) {
    furi_assert(ctx);
    FuriMessageQueue* event_queue = ctx;
    furi_message_queue_put(event_queue, input_event, FuriWaitForever);
}

static void bt_jammer_scan_callback(void* ctx) {
    BTJammerState* state = (BTJammerState*)ctx;
    
    for(uint8_t channel = 0; channel < CHANNELS; channel++) {
        if(!state->scanning) break;
        
        // Set frequency for current Bluetooth channel
        uint32_t frequency = BT_FREQ_MIN + (channel * 1);
        furi_hal_subghz_set_frequency(frequency * 1000000);
        
        // Brief transmission to detect responses
        furi_hal_subghz_tx();
        furi_delay_ms(5);
        furi_hal_subghz_rx();
        furi_delay_ms(10);
        
        state->current_channel = channel;
        state->devices_found++;
    }
}

static void bt_jammer_jam_callback(void* ctx) {
    BTJammerState* state = (BTJammerState*)ctx;
    
    while(state->jamming) {
        // Rapidly cycle through Bluetooth frequencies
        for(uint8_t channel = 0; channel < CHANNELS; channel++) {
            if(!state->jamming) break;
            
            uint32_t frequency = BT_FREQ_MIN + (channel * 1);
            furi_hal_subghz_set_frequency(frequency * 1000000);
            furi_hal_subghz_tx();
            furi_delay_ms(2);
            furi_hal_subghz_idle();
        }
    }
}

int32_t bt_jammer_app(void* p) {
    UNUSED(p);
    
    BTJammerState* state = malloc(sizeof(BTJammerState));
    state->jamming = false;
    state->scanning = false;
    state->current_channel = 0;
    state->devices_found = 0;
    
    ViewPort* view_port = view_port_alloc();
    view_port_draw_callback_set(view_port, bt_jammer_render_callback, state);
    
    FuriMessageQueue* event_queue = furi_message_queue_alloc(8, sizeof(InputEvent));
    view_port_input_callback_set(view_port, bt_jammer_input_callback, event_queue);
    
    Gui* gui = furi_record_open(RECORD_GUI);
    gui_add_view_port(gui, view_port, GuiLayerFullscreen);
    
    InputEvent event;
    bool running = true;
    
    while(running) {
        if(furi_message_queue_get(event_queue, &event, 100) == FuriStatusOk) {
            if(event.type == InputTypePress) {
                switch(event.key) {
                case InputKeyBack:
                    running = false;
                    break;
                case InputKeyOk:
                    state->jamming = !state->jamming;
                    state->scanning = false;
                    
                    if(state->jamming) {
                        // Start jamming thread
                        FuriThread* jam_thread = furi_thread_alloc();
                        furi_thread_set_callback(jam_thread, bt_jammer_jam_callback);
                        furi_thread_set_context(jam_thread, state);
                        furi_thread_start(jam_thread);
                    }
                    break;
                case InputKeyUp:
                    state->scanning = !state->scanning;
                    state->jamming = false;
                    
                    if(state->scanning) {
                        // Start scanning thread
                        FuriThread* scan_thread = furi_thread_alloc();
                        furi_thread_set_callback(scan_thread, bt_jammer_scan_callback);
                        furi_thread_set_context(scan_thread, state);
                        furi_thread_start(scan_thread);
                    }
                    break;
                default:
                    break;
                }
            }
        }
        view_port_update(view_port);
    }
    
    // Cleanup
    furi_message_queue_free(event_queue);
    gui_remove_view_port(gui, view_port);
    view_port_free(view_port);
    furi_record_close(RECORD_GUI);
    free(state);
    
    return 0;
}

⚠️ Legal Disclaimer

This code is for educational and research purposes only. Unauthorized jamming of wireless communications is illegal in most countries. Use responsibly and only in authorized testing environments.