Convert Figma logo to code with AI

mqttjs logoMQTT.js

The MQTT client for Node.js and the browser

8,821
1,429
8,821
42

Top Related Projects

paho.mqtt.javascript

5,105

MQTT协议3.1.1中文翻译版,IoT,物联网

A client library for the Arduino Ethernet Shield that provides support for MQTT.

MQTT library for Arduino

Quick Overview

MQTT.js is a client library for the MQTT protocol, written in JavaScript for Node.js and the browser. It provides a robust and feature-rich implementation of MQTT, allowing developers to easily integrate MQTT messaging into their applications for real-time communication and IoT scenarios.

Pros

  • Cross-platform compatibility (Node.js and browser)
  • Supports MQTT 3.1, 3.1.1, and 5.0 protocols
  • Extensive documentation and active community support
  • Lightweight and efficient implementation

Cons

  • Limited built-in security features (relies on external libraries for TLS)
  • May require additional setup for browser usage (WebSocket support)
  • Performance can be affected in high-throughput scenarios
  • Lack of built-in clustering support for scalability

Code Examples

  1. Connecting to an MQTT broker:
const mqtt = require('mqtt');
const client = mqtt.connect('mqtt://broker.example.com');

client.on('connect', () => {
  console.log('Connected to MQTT broker');
});
  1. Publishing a message:
client.publish('topic/example', 'Hello, MQTT!', { qos: 1 }, (error) => {
  if (error) {
    console.error('Publish error:', error);
  } else {
    console.log('Message published successfully');
  }
});
  1. Subscribing to a topic:
client.subscribe('topic/example', { qos: 1 }, (error) => {
  if (error) {
    console.error('Subscribe error:', error);
  } else {
    console.log('Subscribed to topic');
  }
});

client.on('message', (topic, message) => {
  console.log(`Received message on ${topic}: ${message.toString()}`);
});

Getting Started

  1. Install MQTT.js using npm:

    npm install mqtt
    
  2. Create a new JavaScript file (e.g., mqtt-example.js) and add the following code:

const mqtt = require('mqtt');
const client = mqtt.connect('mqtt://test.mosquitto.org');

client.on('connect', () => {
  console.log('Connected to MQTT broker');
  
  client.subscribe('test/topic', (err) => {
    if (!err) {
      client.publish('test/topic', 'Hello MQTT');
    }
  });
});

client.on('message', (topic, message) => {
  console.log(`Received message on ${topic}: ${message.toString()}`);
  client.end();
});
  1. Run the example:
    node mqtt-example.js
    

This example connects to a public MQTT broker, subscribes to a topic, publishes a message, and then receives and displays the message before disconnecting.

Competitor Comparisons

paho.mqtt.javascript

Pros of paho.mqtt.javascript

  • Better support for WebSocket connections, making it more suitable for browser-based applications
  • Part of the Eclipse Foundation, potentially offering more stability and long-term support
  • Implements the MQTT 3.1 and 3.1.1 specifications fully

Cons of paho.mqtt.javascript

  • Less active development and fewer recent updates compared to MQTT.js
  • More limited platform support, primarily focused on web browsers
  • Smaller community and fewer resources available online

Code Comparison

MQTT.js:

const mqtt = require('mqtt');
const client = mqtt.connect('mqtt://broker.example.com');

client.on('connect', () => {
  client.subscribe('topic');
  client.publish('topic', 'Hello MQTT');
});

paho.mqtt.javascript:

const client = new Paho.MQTT.Client('broker.example.com', 8080, 'clientId');

client.connect({
  onSuccess: () => {
    client.subscribe('topic');
    client.send('topic', 'Hello MQTT');
  }
});

Both libraries provide similar functionality for connecting to an MQTT broker, subscribing to topics, and publishing messages. However, MQTT.js uses a more Node.js-style API with event listeners, while paho.mqtt.javascript uses callback functions for handling connection and message events.

5,105

MQTT协议3.1.1中文翻译版,IoT,物联网

Pros of mqtt

  • Written in Java, suitable for Android development
  • Lightweight implementation with minimal dependencies
  • Focuses on simplicity and ease of use for mobile applications

Cons of mqtt

  • Less actively maintained compared to MQTT.js
  • Limited platform support (primarily Android)
  • Fewer features and extensions compared to MQTT.js

Code Comparison

MQTT.js:

const mqtt = require('mqtt')
const client = mqtt.connect('mqtt://broker.example.com')

client.on('connect', () => {
  client.subscribe('topic')
  client.publish('topic', 'Hello MQTT')
})

mqtt:

MqttClient client = new MqttClient("tcp://broker.example.com:1883", "ClientId");
client.connect();
client.subscribe("topic");
client.publish("topic", "Hello MQTT".getBytes(), 0, false);

Summary

MQTT.js is a more widely used and actively maintained JavaScript implementation of MQTT, suitable for both Node.js and browser environments. It offers extensive features and broad platform support.

mqtt is a Java-based MQTT client library, primarily designed for Android development. It's lightweight and easy to use but has limited platform support and fewer features compared to MQTT.js.

Choose MQTT.js for JavaScript/Node.js projects or when broad platform support is needed. Opt for mqtt when developing Android applications or when a simple Java-based MQTT client is required.

A client library for the Arduino Ethernet Shield that provides support for MQTT.

Pros of PubSubClient

  • Lightweight and optimized for embedded systems, particularly Arduino
  • Simple API with easy-to-understand examples
  • Supports QoS 0 and 1 for MQTT messaging

Cons of PubSubClient

  • Limited to Arduino and similar microcontroller platforms
  • Lacks support for some advanced MQTT features (e.g., QoS 2, retained messages)
  • Less active development compared to MQTT.js

Code Comparison

PubSubClient:

#include <PubSubClient.h>

PubSubClient client(espClient);
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
client.publish("topic", "message");

MQTT.js:

const mqtt = require('mqtt');

const client = mqtt.connect('mqtt://localhost:1883');
client.on('connect', () => {
  client.subscribe('topic');
  client.publish('topic', 'message');
});

Key Differences

  • PubSubClient is designed for C++ and Arduino, while MQTT.js is a JavaScript library
  • MQTT.js offers more features and flexibility, suitable for various environments (Node.js, browsers)
  • PubSubClient has a simpler API, making it easier for beginners in embedded development
  • MQTT.js has better support for modern MQTT features and is more actively maintained

Both libraries serve their purposes well, with PubSubClient excelling in resource-constrained environments and MQTT.js offering more comprehensive features for diverse applications.

MQTT library for Arduino

Pros of arduino-mqtt

  • Specifically designed for Arduino and embedded systems
  • Lightweight and optimized for resource-constrained environments
  • Supports both Ethernet and WiFi connections out of the box

Cons of arduino-mqtt

  • Limited to Arduino and similar platforms
  • Fewer features compared to MQTT.js (e.g., no WebSocket support)
  • Smaller community and less frequent updates

Code Comparison

MQTT.js:

const mqtt = require('mqtt');
const client = mqtt.connect('mqtt://broker.example.com');

client.on('connect', () => {
  client.subscribe('topic');
  client.publish('topic', 'Hello MQTT');
});

arduino-mqtt:

#include <MQTT.h>
WiFiClient net;
MQTTClient client;

void setup() {
  client.begin("broker.example.com", net);
  client.onMessage(messageReceived);
  client.connect("arduino");
  client.subscribe("topic");
}

Both libraries provide similar basic functionality for connecting to an MQTT broker, subscribing to topics, and publishing messages. However, MQTT.js offers a more JavaScript-friendly API with event-based programming, while arduino-mqtt uses a more C-style approach suitable for embedded systems.

MQTT.js is more versatile and feature-rich, making it ideal for Node.js environments and web applications. Arduino-mqtt, on the other hand, is tailored for Arduino and other microcontroller platforms, offering a compact solution for IoT devices with limited resources.

Convert Figma logo designs to code with AI

Visual Copilot

Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.

Try Visual Copilot

README

mqtt.js

Github Test Status codecov

Maintenance PRs Welcome

node npm NPM Downloads

MQTT.js is a client library for the MQTT protocol, written in JavaScript for node.js and the browser.

Table of Contents

MQTT.js is an OPEN Open Source Project, see the Contributing section to find out what this means.

JavaScript Style
Guide

Important notes for existing users

v5.0.0 (07/2023)

  • Removes support for all end of life node versions (v12 and v14), and now supports node v18 and v20.
  • Completely rewritten in Typescript 🚀.
  • When creating MqttClient instance new is now required.

v4.0.0 (Released 04/2020) removes support for all end of life node versions, and now supports node v12 and v14. It also adds improvements to debug logging, along with some feature additions.

As a breaking change, by default a error handler is built into the MQTT.js client, so if any errors are emitted and the user has not created an event handler on the client for errors, the client will not break as a result of unhandled errors. Additionally, typical TLS errors like ECONNREFUSED, ECONNRESET have been added to a list of TLS errors that will be emitted from the MQTT.js client, and so can be handled as connection errors.

v3.0.0 adds support for MQTT 5, support for node v10.x, and many fixes to improve reliability.

Note: MQTT v5 support is experimental as it has not been implemented by brokers yet.

v2.0.0 removes support for node v0.8, v0.10 and v0.12, and it is 3x faster in sending packets. It also removes all the deprecated functionality in v1.0.0, mainly mqtt.createConnection and mqtt.Server. From v2.0.0, subscriptions are restored upon reconnection if clean: true. v1.x.x is now in LTS, and it will keep being supported as long as there are v0.8, v0.10 and v0.12 users.

As a breaking change, the encoding option in the old client is removed, and now everything is UTF-8 with the exception of the password in the CONNECT message and payload in the PUBLISH message, which are Buffer.

Another breaking change is that MQTT.js now defaults to MQTT v3.1.1, so to support old brokers, please read the client options doc.

v1.0.0 improves the overall architecture of the project, which is now split into three components: MQTT.js keeps the Client, mqtt-connection includes the barebone Connection code for server-side usage, and mqtt-packet includes the protocol parser and generator. The new Client improves performance by a 30% factor, embeds Websocket support (MOWS is now deprecated), and it has a better support for QoS 1 and 2. The previous API is still supported but deprecated, as such, it is not documented in this README.

Installation

npm install mqtt --save

Example

For the sake of simplicity, let's put the subscriber and the publisher in the same file:

const mqtt = require("mqtt");
const client = mqtt.connect("mqtt://test.mosquitto.org");

client.on("connect", () => {
  client.subscribe("presence", (err) => {
    if (!err) {
      client.publish("presence", "Hello mqtt");
    }
  });
});

client.on("message", (topic, message) => {
  // message is Buffer
  console.log(message.toString());
  client.end();
});

output:

Hello mqtt

React Native

MQTT.js can be used in React Native applications. To use it, see the React Native example

If you want to run your own MQTT broker, you can use Mosquitto or Aedes-cli, and launch it.

You can also use a test instance: test.mosquitto.org.

If you do not want to install a separate broker, you can try using the Aedes.

Import styles

CommonJS (Require)

const mqtt = require("mqtt")  // require mqtt
const client = mqtt.connect("mqtt://test.mosquitto.org")  // create a client

ES6 Modules (Import)

Default import

import mqtt from "mqtt"; // import namespace "mqtt"
let client = mqtt.connect("mqtt://test.mosquitto.org"); // create a client

Importing individual components

import { connect } from "mqtt"; // import connect from mqtt
let client = connect("mqtt://test.mosquitto.org"); // create a client

Command Line Tools

MQTT.js bundles a command to interact with a broker. In order to have it available on your path, you should install MQTT.js globally:

npm install mqtt -g

Then, on one terminal

mqtt sub -t 'hello' -h 'test.mosquitto.org' -v

On another

mqtt pub -t 'hello' -h 'test.mosquitto.org' -m 'from MQTT.js'

See mqtt help <command> for the command help.

Debug Logs

MQTT.js uses the debug package for debugging purposes. To enable debug logs, add the following environment variable on runtime :

# (example using PowerShell, the VS Code default)
$env:DEBUG='mqttjs*'

About Reconnection

An important part of any websocket connection is what to do when a connection drops off and the client needs to reconnect. MQTT has built-in reconnection support that can be configured to behave in ways that suit the application.

Refresh Authentication Options / Signed Urls with transformWsUrl (Websocket Only)

When an mqtt connection drops and needs to reconnect, it's common to require that any authentication associated with the connection is kept current with the underlying auth mechanism. For instance some applications may pass an auth token with connection options on the initial connection, while other cloud services may require a url be signed with each connection.

By the time the reconnect happens in the application lifecycle, the original auth data may have expired.

To address this we can use a hook called transformWsUrl to manipulate either of the connection url or the client options at the time of a reconnect.

Example (update clientId & username on each reconnect):

    const transformWsUrl = (url, options, client) => {
      client.options.username = `token=${this.get_current_auth_token()}`;
      client.options.clientId = `${this.get_updated_clientId()}`;

      return `${this.get_signed_cloud_url(url)}`;
    }

    const connection = await mqtt.connectAsync(<wss url>, {
      ...,
      transformWsUrl: transformUrl,
    });

Now every time a new WebSocket connection is opened (hopefully not too often), we will get a fresh signed url or fresh auth token data.

Note: Currently this hook does not support promises, meaning that in order to use the latest auth token, you must have some outside mechanism running that handles application-level authentication refreshing so that the websocket connection can simply grab the latest valid token or signed url.

Customize Websockets with createWebsocket (Websocket Only)

When you need to add a custom websocket subprotocol or header to open a connection through a proxy with custom authentication this callback allows you to create your own instance of a websocket which will be used in the mqtt client.

  const createWebsocket = (url, websocketSubProtocols, options) => {
    const subProtocols = [
      websocketSubProtocols[0],
      'myCustomSubprotocolOrOAuthToken',
    ]
    return new WebSocket(url, subProtocols)
  }

  const client = await mqtt.connectAsync(<wss url>, {
    ...,
    createWebsocket: createWebsocket,
  });

Enabling Reconnection with reconnectPeriod option

To ensure that the mqtt client automatically tries to reconnect when the connection is dropped, you must set the client option reconnectPeriod to a value greater than 0. A value of 0 will disable reconnection and then terminate the final connection when it drops.

The default value is 1000 ms which means it will try to reconnect 1 second after losing the connection.

About Topic Alias Management

Enabling automatic Topic Alias using

If the client sets the option autoUseTopicAlias:true then MQTT.js uses existing topic alias automatically.

example scenario:

1. PUBLISH topic:'t1', ta:1                   (register)
2. PUBLISH topic:'t1'       -> topic:'', ta:1 (auto use existing map entry)
3. PUBLISH topic:'t2', ta:1                   (register overwrite)
4. PUBLISH topic:'t2'       -> topic:'', ta:1 (auto use existing map entry based on the receent map)
5. PUBLISH topic:'t1'                         (t1 is no longer mapped to ta:1)

User doesn't need to manage which topic is mapped to which topic alias. If the user want to register topic alias, then publish topic with topic alias. If the user want to use topic alias, then publish topic without topic alias. If there is a mapped topic alias then added it as a property and update the topic to empty string.

Enabling automatic Topic Alias assign

If the client sets the option autoAssignTopicAlias:true then MQTT.js uses existing topic alias automatically. If no topic alias exists, then assign a new vacant topic alias automatically. If topic alias is fully used, then LRU(Least Recently Used) topic-alias entry is overwritten.

example scenario:

The broker returns CONNACK (TopicAliasMaximum:3)
1. PUBLISH topic:'t1' -> 't1', ta:1 (auto assign t1:1 and register)
2. PUBLISH topic:'t1' -> ''  , ta:1 (auto use existing map entry)
3. PUBLISH topic:'t2' -> 't2', ta:2 (auto assign t1:2 and register. 2 was vacant)
4. PUBLISH topic:'t3' -> 't3', ta:3 (auto assign t1:3 and register. 3 was vacant)
5. PUBLISH topic:'t4' -> 't4', ta:1 (LRU entry is overwritten)

Also user can manually register topic-alias pair using PUBLISH topic:'some', ta:X. It works well with automatic topic alias assign.

API


mqtt.connect([url], options)

Connects to the broker specified by the given url and options and returns a Client.

The URL can be on the following protocols: 'mqtt', 'mqtts', 'tcp', 'tls', 'ws', 'wss', 'wxs', 'alis'. If you are trying to connect to a unix socket just append the +unix suffix to the protocol (ex: mqtt+unix). This will set the unixSocket property automatically.

The URL can also be an object as returned by URL.parse(), in that case the two objects are merged, i.e. you can pass a single object with both the URL and the connect options.

You can also specify a servers options with content: [{ host: 'localhost', port: 1883 }, ... ], in that case that array is iterated at every connect.

For all MQTT-related options, see the Client constructor.

connectAsync([url], options)

Asynchronous wrapper around the connect function.

Returns a Promise that resolves to a mqtt.Client instance when the client fires a 'connect' or 'end' event, or rejects with an error if the 'error' is fired.

Note that the manualConnect option will cause the promise returned by this function to never resolve or reject as the underlying client never fires any events.


mqtt.Client(streamBuilder, options)

The Client class wraps a client connection to an MQTT broker over an arbitrary transport method (TCP, TLS, WebSocket, ecc). Client is an EventEmitter that has it's own events

Client automatically handles the following:

  • Regular server pings
  • QoS flow
  • Automatic reconnections
  • Start publishing before being connected

The arguments are:

  • streamBuilder is a function that returns a subclass of the Stream class that supports the connect event. Typically a net.Socket.
  • options is the client connection options (see: the connect packet). Defaults:
    • wsOptions: is the WebSocket connection options. Default is {}. It's specific for WebSockets. For possible options have a look at: https://github.com/websockets/ws/blob/master/doc/ws.md.

    • keepalive: 60 seconds, set to 0 to disable

    • reschedulePings: reschedule ping messages after sending packets (default true)

    • clientId: 'mqttjs_' + Math.random().toString(16).substr(2, 8)

    • protocolId: 'MQTT'

    • protocolVersion: 4

    • clean: true, set to false to receive QoS 1 and 2 messages while offline

    • reconnectPeriod: 1000 milliseconds, interval between two reconnections. Disable auto reconnect by setting to 0.

    • connectTimeout: 30 * 1000 milliseconds, time to wait before a CONNACK is received

    • username: the username required by your broker, if any

    • password: the password required by your broker, if any

    • incomingStore: a Store for the incoming packets

    • outgoingStore: a Store for the outgoing packets

    • queueQoSZero: if connection is broken, queue outgoing QoS zero messages (default true)

    • customHandleAcks: MQTT 5 feature of custom handling puback and pubrec packets. Its callback:

        customHandleAcks: function(topic, message, packet, done) {/*some logic with calling done(error, reasonCode)*/}
      
    • autoUseTopicAlias: enabling automatic Topic Alias using functionality

    • autoAssignTopicAlias: enabling automatic Topic Alias assign functionality

    • properties: properties MQTT 5.0. object that supports the following properties:

      • sessionExpiryInterval: representing the Session Expiry Interval in seconds number,
      • receiveMaximum: representing the Receive Maximum value number,
      • maximumPacketSize: representing the Maximum Packet Size the Client is willing to accept number,
      • topicAliasMaximum: representing the Topic Alias Maximum value indicates the highest value that the Client will accept as a Topic Alias sent by the Server number,
      • requestResponseInformation: The Client uses this value to request the Server to return Response Information in the CONNACK boolean,
      • requestProblemInformation: The Client uses this value to indicate whether the Reason String or User Properties are sent in the case of failures boolean,
      • userProperties: The User Property is allowed to appear multiple times to represent multiple name, value pairs object,
      • authenticationMethod: the name of the authentication method used for extended authentication string,
      • authenticationData: Binary Data containing authentication data binary
    • authPacket: settings for auth packet object

    • will: a message that will sent by the broker automatically when the client disconnect badly. The format is:

      • topic: the topic to publish
      • payload: the message to publish
      • qos: the QoS
      • retain: the retain flag
      • properties: properties of will by MQTT 5.0:
        • willDelayInterval: representing the Will Delay Interval in seconds number,
        • payloadFormatIndicator: Will Message is UTF-8 Encoded Character Data or not boolean,
        • messageExpiryInterval: value is the lifetime of the Will Message in seconds and is sent as the Publication Expiry Interval when the Server publishes the Will Message number,
        • contentType: describing the content of the Will Message string,
        • responseTopic: String which is used as the Topic Name for a response message string,
        • correlationData: The Correlation Data is used by the sender of the Request Message to identify which request the Response Message is for when it is received binary,
        • userProperties: The User Property is allowed to appear multiple times to represent multiple name, value pairs object
    • transformWsUrl : optional (url, options, client) => url function For ws/wss protocols only. Can be used to implement signing urls which upon reconnect can have become expired.

    • createWebsocket : optional url, websocketSubProtocols, options) => Websocket function For ws/wss protocols only. Can be used to implement a custom websocket subprotocol or implementation.

    • resubscribe : if connection is broken and reconnects, subscribed topics are automatically subscribed again (default true)

    • messageIdProvider: custom messageId provider. when new UniqueMessageIdProvider() is set, then non conflict messageId is provided.

    • log: custom log function. Default uses debug package.

    • manualConnect: prevents the constructor to call connect. In this case after the mqtt.connect is called you should call client.connect manually.

    • timerVariant: defaults to auto, which tries to determine which timer is most appropriate for you environment, if you're having detection issues, you can set it to worker or native. If none suits you, you can pass a timer object with set and clear properties:

      timerVariant: {
        set: (func, timer) => setInterval(func, timer),
        clear: (id) => clearInterval(id)
      }
      
    • forceNativeWebSocket: set to true if you're having detection issues (i.e. the ws does not work in the browser exception) to force the use of native WebSocket. It is important to note that if set to true for the first client created, then all the clients will use native WebSocket. And conversely, if not set or set to false, all will use the detection result.

    • unixSocket: if you want to connect to a unix socket, set this to true

In case mqtts (mqtt over tls) is required, the options object is passed through to tls.connect(). If using a self-signed certificate, set rejectUnauthorized: false. However, be cautious as this exposes you to potential man in the middle attacks and isn't recommended for production.

For those supporting multiple TLS protocols on a single port, like MQTTS and MQTT over WSS, utilize the ALPNProtocols option. This lets you define the Application Layer Protocol Negotiation (ALPN) protocol. You can set ALPNProtocols as a string array, Buffer, or Uint8Array based on your setup.

If you are connecting to a broker that supports only MQTT 3.1 (not 3.1.1 compliant), you should pass these additional options:

{
  protocolId: 'MQIsdp',
  protocolVersion: 3
}

This is confirmed on RabbitMQ 3.2.4, and on Mosquitto < 1.3. Mosquitto version 1.3 and 1.4 works fine without those.

Event 'connect'

function (connack) {}

Emitted on successful (re)connection (i.e. connack rc=0).

  • connack received connack packet. When clean connection option is false and server has a previous session for clientId connection option, then connack.sessionPresent flag is true. When that is the case, you may rely on stored session and prefer not to send subscribe commands for the client.

Event 'reconnect'

function () {}

Emitted when a reconnect starts.

Event 'close'

function () {}

Emitted after a disconnection.

Event 'disconnect'

function (packet) {}

Emitted after receiving disconnect packet from broker. MQTT 5.0 feature.

Event 'offline'

function () {}

Emitted when the client goes offline.

Event 'error'

function (error) {}

Emitted when the client cannot connect (i.e. connack rc != 0) or when a parsing error occurs.

The following TLS errors will be emitted as an error event:

  • ECONNREFUSED
  • ECONNRESET
  • EADDRINUSE
  • ENOTFOUND

Event 'end'

function () {}

Emitted when mqtt.Client#end() is called. If a callback was passed to mqtt.Client#end(), this event is emitted once the callback returns.

Event 'message'

function (topic, message, packet) {}

Emitted when the client receives a publish packet

  • topic topic of the received packet
  • message payload of the received packet
  • packet received packet, as defined in mqtt-packet

Event 'packetsend'

function (packet) {}

Emitted when the client sends any packet. This includes .published() packets as well as packets used by MQTT for managing subscriptions and connections

Event 'packetreceive'

function (packet) {}

Emitted when the client receives any packet. This includes packets from subscribed topics as well as packets used by MQTT for managing subscriptions and connections


mqtt.Client#connect()

By default client connects when constructor is called. To prevent this you can set manualConnect option to true and call client.connect() manually.

mqtt.Client#publish(topic, message, [options], [callback])

Publish a message to a topic

  • topic is the topic to publish to, String
  • message is the message to publish, Buffer or String
  • options is the options to publish with, including:
    • qos QoS level, Number, default 0
    • retain retain flag, Boolean, default false
    • dup mark as duplicate flag, Boolean, default false
    • properties: MQTT 5.0 properties object
      • payloadFormatIndicator: Payload is UTF-8 Encoded Character Data or not boolean,
      • messageExpiryInterval: the lifetime of the Application Message in seconds number,
      • topicAlias: value that is used to identify the Topic instead of using the Topic Name number,
      • responseTopic: String which is used as the Topic Name for a response message string,
      • correlationData: used by the sender of the Request Message to identify which request the Response Message is for when it is received binary,
      • userProperties: The User Property is allowed to appear multiple times to represent multiple name, value pairs object,
      • subscriptionIdentifier: representing the identifier of the subscription number,
      • contentType: String describing the content of the Application Message string
    • cbStorePut - function (), fired when message is put into outgoingStore if QoS is 1 or 2.
  • callback - function (err, packet), fired when the QoS handling completes, or at the next tick if QoS 0. An error occurs if client is disconnecting.

mqtt.Client#publishAsync(topic, message, [options])

Async publish. Returns a Promise<Packet | undefined>.

A packet is anything that has a messageId property.

mqtt.Client#subscribe(topic/topic array/topic object, [options], [callback])

Subscribe to a topic or topics

  • topic is a String topic to subscribe to or an Array of topics to subscribe to. It can also be an object, it has as object keys the topic name and as value the QoS, like {'test1': {qos: 0}, 'test2': {qos: 1}}. MQTT topic wildcard characters are supported (+ - for single level and # - for multi level)
  • options is the options to subscribe with, including:
    • qos QoS subscription level, default 0
    • nl No Local MQTT 5.0 flag (If the value is true, Application Messages MUST NOT be forwarded to a connection with a ClientID equal to the ClientID of the publishing connection)
    • rap Retain as Published MQTT 5.0 flag (If true, Application Messages forwarded using this subscription keep the RETAIN flag they were published with. If false, Application Messages forwarded using this subscription have the RETAIN flag set to 0.)
    • rh Retain Handling MQTT 5.0 (This option specifies whether retained messages are sent when the subscription is established.)
    • properties: object
      • subscriptionIdentifier: representing the identifier of the subscription number,
      • userProperties: The User Property is allowed to appear multiple times to represent multiple name, value pairs object
  • callback - function (err, granted) callback fired on suback where:
    • err a subscription error or an error that occurs when client is disconnecting
    • granted is an array of {topic, qos} where:
      • topic is a subscribed to topic
      • qos is the granted QoS level on it

mqtt.Client#subscribeAsync(topic/topic array/topic object, [options])

Async subscribe. Returns a Promise<ISubscriptionGrant[]>.


mqtt.Client#unsubscribe(topic/topic array, [options], [callback])

Unsubscribe from a topic or topics

  • topic is a String topic or an array of topics to unsubscribe from
  • options: options of unsubscribe.
    • properties: object
      • userProperties: The User Property is allowed to appear multiple times to represent multiple name, value pairs object
  • callback - function (err), fired on unsuback. An error occurs if client is disconnecting.

mqtt.Client#unsubscribeAsync(topic/topic array, [options])

Async unsubscribe. Returns a Promise<void>.


mqtt.Client#end([force], [options], [callback])

Close the client, accepts the following options:

  • force: passing it to true will close the client right away, without waiting for the in-flight messages to be acked. This parameter is optional.
  • options: options of disconnect.
    • reasonCode: Disconnect Reason Code number
    • properties: object
      • sessionExpiryInterval: representing the Session Expiry Interval in seconds number,
      • reasonString: representing the reason for the disconnect string,
      • userProperties: The User Property is allowed to appear multiple times to represent multiple name, value pairs object,
      • serverReference: String which can be used by the Client to identify another Server to use string
  • callback: will be called when the client is closed. This parameter is optional.

mqtt.Client#endAsync([force], [options])

Async end. Returns a Promise<void>.


mqtt.Client#removeOutgoingMessage(mId)

Remove a message from the outgoingStore. The outgoing callback will be called with Error('Message removed') if the message is removed.

After this function is called, the messageId is released and becomes reusable.

  • mId: The messageId of the message in the outgoingStore.

mqtt.Client#reconnect()

Connect again using the same options as connect()


mqtt.Client#handleMessage(packet, callback)

Handle messages with backpressure support, one at a time. Override at will, but always call callback, or the client will hang.


mqtt.Client#connected

Boolean : set to true if the client is connected. false otherwise.


mqtt.Client#getLastMessageId()

Number : get last message id. This is for sent messages only.


mqtt.Client#reconnecting

Boolean : set to true if the client is trying to reconnect to the server. false otherwise.


mqtt.Store(options)

In-memory implementation of the message store.

  • options is the store options:
    • clean: true, clean inflight messages when close is called (default true)

Other implementations of mqtt.Store:


mqtt.Store#put(packet, callback)

Adds a packet to the store, a packet is anything that has a messageId property. The callback is called when the packet has been stored.


mqtt.Store#createStream()

Creates a stream with all the packets in the store.


mqtt.Store#del(packet, cb)

Removes a packet from the store, a packet is anything that has a messageId property. The callback is called when the packet has been removed.


mqtt.Store#close(cb)

Closes the Store.

Browser

[!IMPORTANT] The only protocol supported in browsers is MQTT over WebSockets, so you must use ws:// or wss:// protocols.

While the ws module is used in NodeJS, WebSocket is used in browsers. This is totally transparent to users except for the following:

  • The wsOption is not supported in browsers.

  • Browsers doesn't allow to catch many WebSocket errors for security reasons as:

    Access to this information could allow a malicious Web page to gain information about your network, so they require browsers report all connection-time errors in an indistinguishable way.

    So listening for client.on('error') may not catch all the errors you would get in NodeJS env.

Bundle

MQTT.js is bundled using esbuild. It is tested working with all bundlers like Webpack, Vite and React.

You can find all mqtt bundles versions in dist folder:

  • mqtt.js - iife format, not minified
  • mqtt.min.js - iife format, minified
  • mqtt.esm.js - esm format minified

Starting from MQTT.js > 5.2.0 you can import mqtt in your code like this:

import mqtt from 'mqtt'

This will be automatically handled by your bundler.

Otherwise you can choose to use a specific bundle like:

import * as mqtt from 'mqtt/dist/mqtt'
import * as mqtt from 'mqtt/dist/mqtt.min'
import mqtt from 'mqtt/dist/mqtt.esm'

Via CDN

The MQTT.js bundle is available through http://unpkg.com, specifically at https://unpkg.com/mqtt/dist/mqtt.min.js. See http://unpkg.com for the full documentation on version ranges.

About QoS

Here is how QoS works:

  • QoS 0 : received at most once : The packet is sent, and that's it. There is no validation about whether it has been received.
  • QoS 1 : received at least once : The packet is sent and stored as long as the client has not received a confirmation from the server. MQTT ensures that it will be received, but there can be duplicates.
  • QoS 2 : received exactly once : Same as QoS 1 but there is no duplicates.

About data consumption, obviously, QoS 2 > QoS 1 > QoS 0, if that's a concern to you.

Usage with TypeScript

Starting from v5 this project is written in TypeScript and the type definitions are included in the package.

Example:

import { connect } from "mqtt"
const client = connect('mqtt://test.mosquitto.org')

WeChat and Ali Mini Program support

WeChat Mini Program

Supports WeChat Mini Program. Use the wxs protocol. See the WeChat docs.

import 'abortcontroller-polyfill/dist/abortcontroller-polyfill-only' // import before mqtt.
import 'esbuild-plugin-polyfill-node/polyfills/navigator'
const mqtt = require("mqtt");
const client = mqtt.connect("wxs://test.mosquitto.org", {
  timerVariant: 'native' // more info ref issue: #1797
});

Ali Mini Program

Supports Ali Mini Program. Use the alis protocol. See the Alipay docs.

const mqtt = require("mqtt");
const client = mqtt.connect("alis://test.mosquitto.org");

Contributing

MQTT.js is an OPEN Open Source Project. This means that:

Individuals making significant and valuable contributions are given commit-access to the project to contribute as they see fit. This project is more like an open wiki than a standard guarded open source project.

See the CONTRIBUTING.md file for more details.

Contributors

MQTT.js is only possible due to the excellent work of the following contributors:

NameGitHubTwitter
Adam RuddGitHub/adamvrTwitter/@adam_vr
Matteo CollinaGitHub/mcollinaTwitter/@matteocollina
Maxime AgorGitHub/4rzaelTwitter/@4rzael
Siarhei BuntsevichGitHub/scarry1992
Daniel LandoGitHub/robertsLando

Sponsor

If you would like to support MQTT.js, please consider sponsoring the author and active maintainers:

License

MIT

NPM DownloadsLast 30 Days