{"id":1245,"date":"2025-04-02T21:45:55","date_gmt":"2025-04-02T21:45:55","guid":{"rendered":"https:\/\/www.bleuio.com\/blog\/?p=1245"},"modified":"2025-04-03T14:41:44","modified_gmt":"2025-04-03T14:41:44","slug":"how-to-build-your-own-bluetooth-scriptable-sniffer-for-under-30","status":"publish","type":"post","link":"https:\/\/www.bleuio.com\/blog\/how-to-build-your-own-bluetooth-scriptable-sniffer-for-under-30\/","title":{"rendered":"How to Build Your Own Bluetooth Scriptable Sniffer for Under $30"},"content":{"rendered":"\n<p>Bluetooth is commonly used in many products \u2014 from smartwatches and fitness trackers to wireless speakers, beacons, air quality sensors, and beyond. As developers, engineers, or even curious tech enthusiasts, we often would like to analyze what is being transmitted in the air interface between devices.<\/p>\n\n\n\n<p>That\u2019s where a <strong>Bluetooth sniffer<\/strong> comes into play.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">What is a Bluetooth Sniffer?<\/h2>\n\n\n\n<p>A <strong>Bluetooth sniffer<\/strong> is a hardware or software tool that captures and monitors Bluetooth communication between devices. Think of it as a network traffic analyzer, but for Bluetooth instead of Wi-Fi or Ethernet.<\/p>\n\n\n\n<p>It works by listening to Bluetooth advertisement packets or data exchanges, decoding them, and presenting the raw data in a human-readable format. These sniffers can help you:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Discover nearby Bluetooth Low Energy (BLE) devices<\/li>\n\n\n\n<li>Monitor BLE advertisement packets<\/li>\n\n\n\n<li>Analyze signal strength (RSSI)<\/li>\n\n\n\n<li>Debug BLE applications<\/li>\n\n\n\n<li>Reverse engineer custom BLE services<\/li>\n<\/ul>\n\n\n\n<p>There are high-end Bluetooth sniffers on the market \u2014 like those from <strong>Ellisys<\/strong> or <strong>Teledyne LeCroy<\/strong> \u2014 which are powerful but often cost <strong>hundreds or thousands of dollars<\/strong>.<\/p>\n\n\n\n<p>But what if you could build your own for <strong>under $30<\/strong>?<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">BleuIO &#8211; BLE USB Dongle<\/h2>\n\n\n\n<p><a href=\"https:\/\/www.bleuio.com\/\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>BleuIO<\/strong><\/a> is a compact USB dongle that turns your computer into a Bluetooth Low Energy sniffer and data communication tool. It\u2019s built on Dialog Semiconductor&#8217;s DA14683 chip and supports AT command communication over a virtual COM port.<\/p>\n\n\n\n<p>You can plug it into any USB port and control it using a terminal or a script.<\/p>\n\n\n\n<p><strong>Price:<\/strong> <strong>$24.99<\/strong><br><strong>Platform support:<\/strong> Windows, macOS, Linux<br><strong>Protocols supported:<\/strong> Bluetooth Low Energy (BLE)<br><strong>Programming Language Support:<\/strong> Supports almost all major programming languages including C++, C#, Python, Javascript etc<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Build Your Own Scriptable BLE Sniffer with BleuIO<\/h2>\n\n\n\n<h4 class=\"wp-block-heading\">What You\u2019ll Need<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>1x <a href=\"https:\/\/www.bleuio.com\/\" target=\"_blank\" rel=\"noreferrer noopener\">BleuIO USB Dongle<\/a><\/li>\n\n\n\n<li>A computer (Windows\/macOS\/Linux)<\/li>\n\n\n\n<li>Python installed (3.x recommended)<\/li>\n\n\n\n<li>The <code>pyserial<\/code> library<\/li>\n\n\n\n<li>The <code>bluetooth_numbers<\/code> library<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Step 1: Install Required Python Package<\/h4>\n\n\n\n<p>Open your terminal or command prompt and run:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><code>pip install pyserial<\/code><br>pip install bluetooth-numbers <code><br><\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">Step 2: Connect the BleuIO Dongle<\/h4>\n\n\n\n<p>Plug the dongle into a USB port. On Windows, it\u2019ll appear as something like <code>COM3<\/code>. On macOS\/Linux, it will show up as <code>\/dev\/tty.usbmodemXXXX<\/code> or <code>\/dev\/ttyACM0<\/code>.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Step 3: Write the BLE Sniffer Script<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>import serial\nimport time\nimport re\nfrom bluetooth_numbers import company\nimport binascii\n\n# Replace with your actual serial port\n#SERIAL_PORT = 'COM3'      # Windows\nSERIAL_PORT = '\/dev\/cu.usbmodem4048FDE52DAF1'  # For Linux\/macOS\nBAUD_RATE = 9600\n\ndef scan_devices(duration=3):\n    device_list = &#91;]  \n\n    try:\n        with serial.Serial(SERIAL_PORT, BAUD_RATE, timeout=1) as ser:\n            ser.write(f'AT+DUAL\\r\\n'.encode())\n            print(f\"\\nStarting BLE scan for {duration} seconds...\\n\")\n            ser.write(f'AT+GAPSCAN={duration}\\r\\n'.encode())\n            time.sleep(duration + 1)\n\n            print(\"Discovered Devices:\\n\" + \"-\"*50)\n            while ser.in_waiting:\n                line = ser.readline().decode('utf-8', errors='ignore').strip()\n                print(\">>\", line)\n\n                match = re.match(r\"\\&#91;\\d+\\] Device: \\&#91;(\\d)\\](&#91;0-9A-F:]{17})\\s+RSSI:\\s*-?\\d+(?:\\s+\\((.+?)\\))?\", line)\n                if match:\n                    addr_type = int(match.group(1))\n                    mac = match.group(2)\n                    name = match.group(3) if match.group(3) else \"\"\n                    device_list.append((addr_type, mac, name))\n\n        return device_list\n\n    except serial.SerialException as e:\n        print(\"Serial error:\", e)\n        return &#91;]\n\n\n\ndef scan_target_device(mac_address, address_type=1, duration=3):\n    try:\n        with serial.Serial(SERIAL_PORT, BAUD_RATE, timeout=1) as ser:\n            print(f\"\\nScanning target device {mac_address} (Type: {address_type}) for {duration} seconds...\\n\")\n            cmd = f'AT+SCANTARGET=&#91;{address_type}]{mac_address}={duration}\\r\\n'\n            ser.write(cmd.encode())\n            time.sleep(duration + 1)\n\n            print(\"Advertisement Data:\\n\" + \"-\"*50)\n            adv_data = None\n\n            while ser.in_waiting:\n                line = ser.readline().decode('utf-8', errors='ignore').strip()\n                print(\">>\", line)\n\n                if \"Device Data &#91;ADV]:\" in line and adv_data is None:\n                    parts = line.split(\"Device Data &#91;ADV]:\")\n                    if len(parts) == 2:\n                        adv_data = parts&#91;1].strip()\n\n            if adv_data:\n                print(\"\\nDecoding Advertisement Payload...\\n\")\n                decode_ble_adv(adv_data)\n            else:\n                print(\"No ADV data found to decode.\")\n\n    except serial.SerialException as e:\n        print(\"Serial error:\", e)\n\n\nAD_TYPE_NAMES = {\n    0x01: \"Flags\",\n    0x02: \"Incomplete 16-bit UUIDs\",\n    0x03: \"Complete 16-bit UUIDs\",\n    0x08: \"Shortened Local Name\",\n    0x09: \"Complete Local Name\",\n    0x0A: \"TX Power Level\",\n    0x16: \"Service Data\",\n    0xFF: \"Manufacturer Specific Data\"\n}\n\n# Flag bit definitions\nFLAGS_MAP = {\n    0x01: \"LE Limited Discoverable Mode\",\n    0x02: \"LE General Discoverable Mode\",\n    0x04: \"BR\/EDR Not Supported\",\n    0x08: \"Simultaneous LE and BR\/EDR (Controller)\",\n    0x10: \"Simultaneous LE and BR\/EDR (Host)\"\n}\n\ndef decode_ble_adv(hex_str):\n    data = bytearray.fromhex(hex_str)\n    index = 0\n    object_count = 1\n\n    print(f\"Decoding ADV Data: {hex_str}\\n{'-'*50}\")\n\n    while index &lt; len(data):\n        length = data&#91;index]\n        if length == 0 or (index + length >= len(data)):\n            break\n\n        ad_type = data&#91;index + 1]\n        ad_data = data&#91;index + 2: index + 1 + length]\n        type_name = AD_TYPE_NAMES.get(ad_type, f\"UNKNOWN\")\n\n        print(f\"\\nData Object {object_count}:\")\n        print(f\"Length: {length}\")\n        print(f\"Type: 0x{ad_type:02X} ({type_name})\")\n\n        if ad_type == 0x01:  # Flags\n            flags = ad_data&#91;0]\n            print(\"Flags:\")\n            for bit, label in FLAGS_MAP.items():\n                if flags &amp; bit:\n                    print(f\"   - {label}\")\n            print(\"Device Type Inferred:\", end=\" \")\n            if flags &amp; 0x04:\n                print(\"LE Only\")\n            elif flags &amp; (0x08 | 0x10):\n                print(\"Dual Mode (LE + BR\/EDR)\")\n            else:\n                print(\"BR\/EDR Only or Unknown\")\n\n        elif ad_type == 0xFF:  # Manufacturer Specific Data\n            if len(ad_data) >= 2:\n                company_id = ad_data&#91;0] | (ad_data&#91;1] &lt;&lt; 8)\n                company_name = company.get(company_id, \"Unknown\")\n                print(f\"Company Identifier: 0x{company_id:04X} ({company_name})\")\n                manufacturer_data = ad_data&#91;2:]\n                if manufacturer_data:\n                    print(\"Manufacturer Data:\", binascii.hexlify(manufacturer_data).decode())\n            else:\n                print(\"Malformed Manufacturer Specific Data\")\n\n        elif type_name == \"UNKNOWN\":\n            print(f\"This script is currently unable to decode this type.\")\n            print(\"Raw Data:\", \"0x\" + binascii.hexlify(ad_data).decode())\n\n        else:\n            print(\"Raw Data:\", \"0x\" + binascii.hexlify(ad_data).decode())\n\n        index += length + 1\n        object_count += 1\n\n\n\nif __name__ == \"__main__\":\n    devices = scan_devices()\n\n    if devices:\n        print(\"\\nSelect a device to scan further:\")\n        for idx, (addr_type, mac, name) in enumerate(devices):\n            label = f\"{mac} ({name})\" if name else mac\n            print(f\"&#91;{idx}] {label} \")\n\n        choice = input(\"Enter device number (e.g. 0): \").strip()\n\n        try:\n            selected = devices&#91;int(choice)]\n            scan_target_device(selected&#91;1], selected&#91;0])  \n        except (IndexError, ValueError):\n            print(\"Invalid selection. Exiting.\")\n    else:\n        print(\"No devices found.\")\n\n<\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><strong>Note:<\/strong> Make sure to update the <code>SERIAL_PORT<\/code> variable in the script to match your system&#8217;s COM port \u2014 for example, <code>COM3<\/code> on Windows or <code>\/dev\/tty.usbmodemXXXX<\/code> on macOS\/Linux.<\/p>\n<\/blockquote>\n\n\n\n<h2 class=\"wp-block-heading\">How It Works<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Step 1:<\/strong> Sends the <code>AT+GAPSCAN<\/code> command to BleuIO, which returns a list of nearby BLE devices with MAC addresses and signal strength.<\/li>\n\n\n\n<li><strong>Step 2:<\/strong> Parses the output and allows the user to select one device.<\/li>\n\n\n\n<li><strong>Step 3:<\/strong> Sends the <code>AT+SCANTARGET=[address_type]MAC=3<\/code> command to scan the selected device and retrieve its advertisement payload.<\/li>\n\n\n\n<li><strong>Step 4:<\/strong> Displays the detailed advertising data broadcasted by the device \u2014 which can include device name, UUIDs, manufacturer data, and sensor readings.<\/li>\n\n\n\n<li><strong>Step 5:<\/strong> Attempts to decode all fields in the BLE advertisement payload, showing both known fields (like Flags, Manufacturer Data) and unknown ones with raw data formatting<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Decoding Advertisement Data<\/h2>\n\n\n\n<p>Every BLE advertisement is made up of TLV (Type-Length-Value) structures. This script extracts each one and attempts to decode:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Flags<\/strong> (Type 0x01): e.g., LE Only, Dual Mode<\/li>\n\n\n\n<li><strong>Manufacturer Specific Data<\/strong> (Type 0xFF): Extracts company ID and raw payload<\/li>\n\n\n\n<li><strong>Unknown types<\/strong>: Clearly marked and printed as raw hex for future analysis<\/li>\n<\/ul>\n\n\n\n<p>Even if the script can\u2019t interpret a block, you\u2019ll still see it listed with length, type, and raw content \u2014 helping with reverse engineering or debugging unknown BLE devices.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Sample Output<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>Starting BLE scan for 3 seconds...\n\nDiscovered Devices:\n>> AT+DUAL\n>> AT+GAPSCAN=3\n>> SCANNING...\n>> &#91;01] Device: &#91;1]D1:53:C9:A9:8C:D2  RSSI: -56 (HibouAIR)\n>> &#91;02] Device: &#91;1]C4:AD:CB:84:A5:73  RSSI: -83\n>> &#91;03] Device: &#91;1]D1:79:29:DB:CB:CC  RSSI: -52 (HibouAIR)\n>> &#91;04] Device: &#91;1]C0:8C:23:2E:1A:E5  RSSI: -59\n>> SCAN COMPLETE\n\nSelect a device to scan further:\n&#91;0] D1:53:C9:A9:8C:D2 (HibouAIR) \n&#91;02] C4:AD:CB:84:A5:73 \n&#91;03] D1:79:29:DB:CB:CC (HibouAIR) \n&#91;104] C0:8C:23:2E:1A:E5 \nEnter device number (e.g. 0): 03      \n\nScanning target device D1:79:29:DB:CB:CC (Type: 1) for 3 seconds...\n\nAdvertisement Data:\n--------------------------------------------------\n>> AT+SCANTARGET=&#91;1]D1:79:29:DB:CB:CC=3\n>> SCANNING TARGET DEVICE...\n>> &#91;D1:79:29:DB:CB:CC] Device Data &#91;ADV]: 0201061BFF5B0705042200696D009F26B60082023D00000000000000024C02\n>> &#91;D1:79:29:DB:CB:CC] Device Data &#91;RESP]: 110750EADA308883B89F604F15F30100C98E09094869626F75414952\n>> SCAN COMPLETE\n\nDecoding Advertisement Payload...\n\nDecoding ADV Data: 0201061BFF5B0705042200696D009F26B60082023D00000000000000024C02\n--------------------------------------------------\n\nData Object 1:\nLength: 2\nType: 0x01 (Flags)\nFlags:\n   - LE General Discoverable Mode\n   - BR\/EDR Not Supported\nDevice Type Inferred: LE Only\n\nData Object 2:\nLength: 27\nType: 0xFF (Manufacturer Specific Data)\nCompany Identifier: 0x075B (Smart Sensor Devices AB)\nManufacturer Data: 05042200696d009f26b60082023d00000000000000024c02<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Source Code on GitHub<\/h2>\n\n\n\n<p>You can find the full, open-source implementation of this BLE sniffer \u2014 including the Python script and all improvements \u2014 on GitHub:<\/p>\n\n\n\n<p> <strong><a href=\"https:\/\/github.com\/smart-sensor-devices-ab\/ble_sniffer_bleuio\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/github.com\/smart-sensor-devices-ab\/ble_sniffer_bleuio<\/a><\/strong><\/p>\n\n\n\n<p>Now we have a working BLE sniffer that not only scans for nearby devices but also lets you interactively select a target and read its detailed advertisement data.<\/p>\n\n\n\n<p>Here are some cool extensions we can build from here:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Display air quality sensor data from BLE beacons like HibouAir<\/li>\n\n\n\n<li>Export scan logs to CSV for analysis<\/li>\n\n\n\n<li>Build a desktop or web UI using Electron or Flask<\/li>\n\n\n\n<li>Trigger alerts based on proximity or signal strength<\/li>\n\n\n\n<li>Improve decoding support for more AD types (TX Power, Local Name, Services)<\/li>\n\n\n\n<li>Show scan response (RESP) data alongside advertisement (ADV)<\/li>\n\n\n\n<li>Display or log RSSI values for signal analysis<\/li>\n<\/ul>\n\n\n\n<p>Bluetooth sniffers don\u2019t have to be complicated or expensive. With <strong>BleuIO<\/strong>, a bit of Python, and a USB port, you can begin exploring the hidden world of BLE devices all around you \u2014 right from your own machine.<\/p>\n\n\n\n<p>This setup is perfect for developers working on BLE apps, IoT product engineers, or tech enthusiasts who want to learn how devices communicate wirelessly.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Bluetooth is commonly used in many products \u2014 from smartwatches and fitness trackers to wireless speakers, beacons, air quality sensors, and beyond. As developers, engineers, or even curious tech enthusiasts, we often would like to analyze what is being transmitted in the air interface between devices. That\u2019s where a Bluetooth sniffer comes into play. What [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":1246,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1,2],"tags":[],"class_list":["post-1245","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-bleuio","category-bleuio-tutorial"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>How to Build Your Own Bluetooth Scriptable Sniffer for Under $30 - BleuIO - Create Bluetooth Low Energy application<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.bleuio.com\/blog\/how-to-build-your-own-bluetooth-scriptable-sniffer-for-under-30\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"How to Build Your Own Bluetooth Scriptable Sniffer for Under $30 - BleuIO - Create Bluetooth Low Energy application\" \/>\n<meta property=\"og:description\" content=\"Bluetooth is commonly used in many products \u2014 from smartwatches and fitness trackers to wireless speakers, beacons, air quality sensors, and beyond. As developers, engineers, or even curious tech enthusiasts, we often would like to analyze what is being transmitted in the air interface between devices. That\u2019s where a Bluetooth sniffer comes into play. What [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.bleuio.com\/blog\/how-to-build-your-own-bluetooth-scriptable-sniffer-for-under-30\/\" \/>\n<meta property=\"og:site_name\" content=\"BleuIO - Create Bluetooth Low Energy application\" \/>\n<meta property=\"article:published_time\" content=\"2025-04-02T21:45:55+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-04-03T14:41:44+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.bleuio.com\/blog\/wp-content\/uploads\/2025\/04\/ble-sniffer.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"750\" \/>\n\t<meta property=\"og:image:height\" content=\"450\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"BleuIO\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.bleuio.com\\\/blog\\\/how-to-build-your-own-bluetooth-scriptable-sniffer-for-under-30\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.bleuio.com\\\/blog\\\/how-to-build-your-own-bluetooth-scriptable-sniffer-for-under-30\\\/\"},\"author\":{\"name\":\"BleuIO\",\"@id\":\"https:\\\/\\\/www.bleuio.com\\\/blog\\\/#\\\/schema\\\/person\\\/89bc581382d5964043f96efc54b75b80\"},\"headline\":\"How to Build Your Own Bluetooth Scriptable Sniffer for Under $30\",\"datePublished\":\"2025-04-02T21:45:55+00:00\",\"dateModified\":\"2025-04-03T14:41:44+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.bleuio.com\\\/blog\\\/how-to-build-your-own-bluetooth-scriptable-sniffer-for-under-30\\\/\"},\"wordCount\":754,\"commentCount\":0,\"image\":{\"@id\":\"https:\\\/\\\/www.bleuio.com\\\/blog\\\/how-to-build-your-own-bluetooth-scriptable-sniffer-for-under-30\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.bleuio.com\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/04\\\/ble-sniffer.jpg\",\"articleSection\":[\"BleuIO\",\"BleuIO tutorial\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.bleuio.com\\\/blog\\\/how-to-build-your-own-bluetooth-scriptable-sniffer-for-under-30\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.bleuio.com\\\/blog\\\/how-to-build-your-own-bluetooth-scriptable-sniffer-for-under-30\\\/\",\"url\":\"https:\\\/\\\/www.bleuio.com\\\/blog\\\/how-to-build-your-own-bluetooth-scriptable-sniffer-for-under-30\\\/\",\"name\":\"How to Build Your Own Bluetooth Scriptable Sniffer for Under $30 - BleuIO - Create Bluetooth Low Energy application\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.bleuio.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.bleuio.com\\\/blog\\\/how-to-build-your-own-bluetooth-scriptable-sniffer-for-under-30\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.bleuio.com\\\/blog\\\/how-to-build-your-own-bluetooth-scriptable-sniffer-for-under-30\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.bleuio.com\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/04\\\/ble-sniffer.jpg\",\"datePublished\":\"2025-04-02T21:45:55+00:00\",\"dateModified\":\"2025-04-03T14:41:44+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.bleuio.com\\\/blog\\\/#\\\/schema\\\/person\\\/89bc581382d5964043f96efc54b75b80\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.bleuio.com\\\/blog\\\/how-to-build-your-own-bluetooth-scriptable-sniffer-for-under-30\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.bleuio.com\\\/blog\\\/how-to-build-your-own-bluetooth-scriptable-sniffer-for-under-30\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.bleuio.com\\\/blog\\\/how-to-build-your-own-bluetooth-scriptable-sniffer-for-under-30\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.bleuio.com\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/04\\\/ble-sniffer.jpg\",\"contentUrl\":\"https:\\\/\\\/www.bleuio.com\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/04\\\/ble-sniffer.jpg\",\"width\":750,\"height\":450,\"caption\":\"ble sniffer\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.bleuio.com\\\/blog\\\/how-to-build-your-own-bluetooth-scriptable-sniffer-for-under-30\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.bleuio.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"How to Build Your Own Bluetooth Scriptable Sniffer for Under $30\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.bleuio.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.bleuio.com\\\/blog\\\/\",\"name\":\"BleuIO - Create Bluetooth Low Energy application\",\"description\":\"Learn Bluetooth Low Energy programming and build Bluetooth Low Energy Application\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.bleuio.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.bleuio.com\\\/blog\\\/#\\\/schema\\\/person\\\/89bc581382d5964043f96efc54b75b80\",\"name\":\"BleuIO\",\"sameAs\":[\"https:\\\/\\\/www.bleuio.com\\\/blog\"],\"url\":\"https:\\\/\\\/www.bleuio.com\\\/blog\\\/author\\\/biadmin\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"How to Build Your Own Bluetooth Scriptable Sniffer for Under $30 - BleuIO - Create Bluetooth Low Energy application","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.bleuio.com\/blog\/how-to-build-your-own-bluetooth-scriptable-sniffer-for-under-30\/","og_locale":"en_US","og_type":"article","og_title":"How to Build Your Own Bluetooth Scriptable Sniffer for Under $30 - BleuIO - Create Bluetooth Low Energy application","og_description":"Bluetooth is commonly used in many products \u2014 from smartwatches and fitness trackers to wireless speakers, beacons, air quality sensors, and beyond. As developers, engineers, or even curious tech enthusiasts, we often would like to analyze what is being transmitted in the air interface between devices. That\u2019s where a Bluetooth sniffer comes into play. What [&hellip;]","og_url":"https:\/\/www.bleuio.com\/blog\/how-to-build-your-own-bluetooth-scriptable-sniffer-for-under-30\/","og_site_name":"BleuIO - Create Bluetooth Low Energy application","article_published_time":"2025-04-02T21:45:55+00:00","article_modified_time":"2025-04-03T14:41:44+00:00","og_image":[{"width":750,"height":450,"url":"https:\/\/www.bleuio.com\/blog\/wp-content\/uploads\/2025\/04\/ble-sniffer.jpg","type":"image\/jpeg"}],"author":"BleuIO","twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.bleuio.com\/blog\/how-to-build-your-own-bluetooth-scriptable-sniffer-for-under-30\/#article","isPartOf":{"@id":"https:\/\/www.bleuio.com\/blog\/how-to-build-your-own-bluetooth-scriptable-sniffer-for-under-30\/"},"author":{"name":"BleuIO","@id":"https:\/\/www.bleuio.com\/blog\/#\/schema\/person\/89bc581382d5964043f96efc54b75b80"},"headline":"How to Build Your Own Bluetooth Scriptable Sniffer for Under $30","datePublished":"2025-04-02T21:45:55+00:00","dateModified":"2025-04-03T14:41:44+00:00","mainEntityOfPage":{"@id":"https:\/\/www.bleuio.com\/blog\/how-to-build-your-own-bluetooth-scriptable-sniffer-for-under-30\/"},"wordCount":754,"commentCount":0,"image":{"@id":"https:\/\/www.bleuio.com\/blog\/how-to-build-your-own-bluetooth-scriptable-sniffer-for-under-30\/#primaryimage"},"thumbnailUrl":"https:\/\/www.bleuio.com\/blog\/wp-content\/uploads\/2025\/04\/ble-sniffer.jpg","articleSection":["BleuIO","BleuIO tutorial"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.bleuio.com\/blog\/how-to-build-your-own-bluetooth-scriptable-sniffer-for-under-30\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.bleuio.com\/blog\/how-to-build-your-own-bluetooth-scriptable-sniffer-for-under-30\/","url":"https:\/\/www.bleuio.com\/blog\/how-to-build-your-own-bluetooth-scriptable-sniffer-for-under-30\/","name":"How to Build Your Own Bluetooth Scriptable Sniffer for Under $30 - BleuIO - Create Bluetooth Low Energy application","isPartOf":{"@id":"https:\/\/www.bleuio.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.bleuio.com\/blog\/how-to-build-your-own-bluetooth-scriptable-sniffer-for-under-30\/#primaryimage"},"image":{"@id":"https:\/\/www.bleuio.com\/blog\/how-to-build-your-own-bluetooth-scriptable-sniffer-for-under-30\/#primaryimage"},"thumbnailUrl":"https:\/\/www.bleuio.com\/blog\/wp-content\/uploads\/2025\/04\/ble-sniffer.jpg","datePublished":"2025-04-02T21:45:55+00:00","dateModified":"2025-04-03T14:41:44+00:00","author":{"@id":"https:\/\/www.bleuio.com\/blog\/#\/schema\/person\/89bc581382d5964043f96efc54b75b80"},"breadcrumb":{"@id":"https:\/\/www.bleuio.com\/blog\/how-to-build-your-own-bluetooth-scriptable-sniffer-for-under-30\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.bleuio.com\/blog\/how-to-build-your-own-bluetooth-scriptable-sniffer-for-under-30\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.bleuio.com\/blog\/how-to-build-your-own-bluetooth-scriptable-sniffer-for-under-30\/#primaryimage","url":"https:\/\/www.bleuio.com\/blog\/wp-content\/uploads\/2025\/04\/ble-sniffer.jpg","contentUrl":"https:\/\/www.bleuio.com\/blog\/wp-content\/uploads\/2025\/04\/ble-sniffer.jpg","width":750,"height":450,"caption":"ble sniffer"},{"@type":"BreadcrumbList","@id":"https:\/\/www.bleuio.com\/blog\/how-to-build-your-own-bluetooth-scriptable-sniffer-for-under-30\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.bleuio.com\/blog\/"},{"@type":"ListItem","position":2,"name":"How to Build Your Own Bluetooth Scriptable Sniffer for Under $30"}]},{"@type":"WebSite","@id":"https:\/\/www.bleuio.com\/blog\/#website","url":"https:\/\/www.bleuio.com\/blog\/","name":"BleuIO - Create Bluetooth Low Energy application","description":"Learn Bluetooth Low Energy programming and build Bluetooth Low Energy Application","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.bleuio.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.bleuio.com\/blog\/#\/schema\/person\/89bc581382d5964043f96efc54b75b80","name":"BleuIO","sameAs":["https:\/\/www.bleuio.com\/blog"],"url":"https:\/\/www.bleuio.com\/blog\/author\/biadmin\/"}]}},"_links":{"self":[{"href":"https:\/\/www.bleuio.com\/blog\/wp-json\/wp\/v2\/posts\/1245","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.bleuio.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.bleuio.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.bleuio.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.bleuio.com\/blog\/wp-json\/wp\/v2\/comments?post=1245"}],"version-history":[{"count":14,"href":"https:\/\/www.bleuio.com\/blog\/wp-json\/wp\/v2\/posts\/1245\/revisions"}],"predecessor-version":[{"id":1268,"href":"https:\/\/www.bleuio.com\/blog\/wp-json\/wp\/v2\/posts\/1245\/revisions\/1268"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.bleuio.com\/blog\/wp-json\/wp\/v2\/media\/1246"}],"wp:attachment":[{"href":"https:\/\/www.bleuio.com\/blog\/wp-json\/wp\/v2\/media?parent=1245"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.bleuio.com\/blog\/wp-json\/wp\/v2\/categories?post=1245"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.bleuio.com\/blog\/wp-json\/wp\/v2\/tags?post=1245"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}