npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

ble-scan

v0.2.0

Published

Command-line tool that scans for BLE advertisements and publishes them to a MQTT topic

Downloads

3

Readme

ble-scan

Command-line tool that scans for BLE (Bluetooth Low Energy) peripheral advertisements and publishes them (JSON-encoded) to a MQTT topic, where the data can be processed by other software.

Installation

Prerequisites

Install

To install ble-scan globally (so that you have it on your path), run

$ npm install -g ble-scan

Install on Linux systems

On Linux systems, you will probably need to run this command with sudo and use the --unsafe-perm flag:

$ sudo npm install -g --unsafe-perm ble-scan

If you want to run ble-scan without without sudo/root permissions, you will probably also need to run (see here for more information):

$ sudo setcap cap_net_raw+eip $(eval readlink -f `which node`)

Usage

Command-line arguments

$ ble-scan --help
usage: ble-scan [-h] [--interval INTERVAL] [--time TIME] [--host HOST]
                [--port PORT] [--client_id CLIENT_ID] [--username USERNAME]
                [--password PASSWORD] [--base_topic BASE_TOPIC]
                [--advertisements_topic ADVERTISEMENTS_TOPIC]
                [--status_topic STATUS_TOPIC] [--online_message ONLINE_MESSAGE]
                [--offline_message OFFLINE_MESSAGE]
                [--status_retain | --no-status_retain | -sr] [--qos {0,1,2}]
                [--keepalive KEEPALIVE]

Scan for BLE (Bluetooth Low Energy) advertisements

optional arguments:
  -h, --help            show this help message and exit
  --interval INTERVAL, -i INTERVAL
                        The minimum interval between publishing two
                        advertisements from the same peripheral, in seconds
                        (0=publish all advertisements) (default: 60)
  --time TIME, -t TIME  The time to scan for BLE advertisements, in seconds.
                        After the specified time has passed, the program will
                        terminate (0=scan forever) (default: 12)
  --host HOST, -H HOST  The hostname/IP address of the the broker (default:
                        127.0.0.1)
  --port PORT, -p PORT  The port number of the the broker (default: 1883)
  --client_id CLIENT_ID, -c CLIENT_ID
                        The client ID to use for connecting to the broker
                        (default: ble-scan)
  --username USERNAME, -u USERNAME
                        The username required by your broker, if any (default:
                        null)
  --password PASSWORD, -P PASSWORD
                        The password required by your broker, if any (default:
                        null)
  --base_topic BASE_TOPIC, -bt BASE_TOPIC
                        The "base" topic. When passing topic names, the
                        substring "#{base_topic}" will be replaced with this
                        value (default: ble-scan)
  --advertisements_topic ADVERTISEMENTS_TOPIC, -at ADVERTISEMENTS_TOPIC
                        The topic where scanned BLE advertisement messages
                        will be published to (default:
                        #{base_topic}/advertisements)
  --status_topic STATUS_TOPIC, -st STATUS_TOPIC
                        The topic where status messages will be published to
                        (default: #{base_topic}/status)
  --online_message ONLINE_MESSAGE
                        The message that will be published to the status topic
                        when going online (default: online)
  --offline_message OFFLINE_MESSAGE
                        The message that will be published to the status topic
                        when going offline (default: offline)
  --status_retain, --no-status_retain, -sr
                        The retain flag for status (online/offline) messages
                        (default: true) (default: true)
  --qos {0,1,2}, -q {0,1,2}
                        The QOS (Quality of service) level to use (default: 2)
  --keepalive KEEPALIVE, -k KEEPALIVE
                        The keepalive time, in seconds (default: 60)

The most important argument is the --host argument for setting the hostname/IP address of the MQTT broker.

If you need to authenticate to the MQTT broker, you will also need to --username, --password and maybe the --client_id arguments.

By default, ble-scan will scan for 12 seconds (the maximum advertising interval is 11.24 seconds) and then terminate. With these default settings, ble-scan is intended to be periodically run, for example via a cronjob.

Data format

Here's a sample JSON message (representing one advertisement) with comments:

{
  "address": { // The Bluetooth address, in multiple formats
    "long": "12:34:56:78:9A:BC", // The Bluetooth address, in "long" format
    "short": "123456789ABC" // The Bluetooth address, in "short" format
  },
  "address_type": "random", // The address type, "public" or "random"
  "connectable": true, // Boolean flag that indicates if the device is connectable
  "service_uuids": [ // Array with advertised service UUIDs
    { // Service UUID, in multiple formats
      "full": "00000AF0-0000-1000-8000-00805F9B34FB", // Service UUID, in "long" (string) format
      "short": 2800 // Service UUID, in "short" (integer) format. Only available for services with 16-/32-Bit-UUID, null otherwise
    }
  ],
  "solicitation_service_uuids": [ // Array with solicitation service UUIDs (rarely used)
    { // Service UUID, in multiple formats
      "full": "00000AF1-0000-1000-8000-00805F9B34FB", // Service UUID, in "long" (string) format
      "short": 2801 // Service UUID, in "short" (integer) format. Only available for services with 16-/32-Bit-UUID, null otherwise
    }
  ],
  "manufacturer_data": { // The manufacturer data, in multiple formats
    "hex": "FE034EA5", // Manufacturer data, as a hexadecimal string
    "array": [254,3,78,165] // Manufacturer data, as an array of uint8 numbers
  },
  "service_datas": [ // Array with service data object
    { // A service data object, contains the UUID and data of the service
      "uuid": { // The service UUID, in multiple formats
        "long": "0000FE95-0000-1000-8000-00805F9B34FB", // Service UUID, in "long" (string) format
        "short": 65173 // Service UUID, in "short" (integer) format. Only available for services with 16-/32-Bit-UUID, null otherwise
      },
      "data": { // The service data, in multiple formats
        "hex": "EF3E7DA74813", // Service data, as a hexadecimal string
        "array": [239,62,125,167,72,19] // Service data, as an array of uint8 numbers
      }
    }
  ],
  "rssi": -86, // The RSSI value (signal quality)
  "timestamp": 1612336387228 // Timestamp when the advertisement was received, in milliseconds since the epoch
}