taoqf / MQTT.js

The MQTT client for Node.js and the browser
Other
12 stars 8 forks source link

mqtt.js

Build Status codecov

NPM NPM

Sauce Test Status

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

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

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.

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.

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.

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

Installation

npm install mqtt --save

Example

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

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

client.on('connect', function () {
  client.subscribe('presence', function (err) {
    if (!err) {
      client.publish('presence', 'Hello mqtt')
    }
  })
})

client.on('message', function (topic, message) {
  // message is Buffer
  console.log(message.toString())
  client.end()
})

output:

Hello mqtt

If you want to run your own MQTT broker, you can use Mosquitto or Mosca, and launch it. You can also use a test instance: test.mosquitto.org and test.mosca.io are both public.

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

to use MQTT.js in the browser see the browserify section

Promise support

If you want to use the new async-await functionality in JavaScript, or just prefer using Promises instead of callbacks, async-mqtt is a wrapper over MQTT.js which uses promises instead of callbacks when possible.

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.

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'. 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.


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 automatically handles the following:

The arguments are:

In case mqtts (mqtt over tls) is required, the options object is passed through to tls.connect(). If you are using a self-signed certificate, pass the rejectUnauthorized: false option. Beware that you are exposing yourself to man in the middle attacks, so it is a configuration that is not recommended for production environments.

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).

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.

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

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#publish(topic, message, [options], [callback])

Publish a message to a topic


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

Subscribe to a topic or topics


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

Unsubscribe from a topic or topics


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

Close the client, accepts the following options:


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.


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.

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

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.

WeChat Mini Program

Support WeChat Mini Program. See Doc.

Example(js)

var mqtt = require('mqtt')
var client = mqtt.connect('wxs://test.mosquitto.org')

Example(ts)

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

Ali Mini Program

Surport Ali Mini Program. See Doc.

Example(js)

var mqtt = require('mqtt')
var client = mqtt.connect('alis://test.mosquitto.org')

Example(ts)

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

Browserify

In order to use MQTT.js as a browserify module you can either require it in your browserify bundles or build it as a stand alone module. The exported module is AMD/CommonJs compatible and it will add an object in the global space.

npm install -g browserify // install browserify
cd node_modules/mqtt
npm install . // install dev dependencies
browserify mqtt.js -s mqtt > browserMqtt.js // require mqtt in your client-side app

Webpack

Just like browserify, export MQTT.js as library. The exported module would be var mqtt = xxx and it will add an object in the global space. You could also export module in other formats (AMD/CommonJS/others) by setting output.libraryTarget in webpack configuration.

npm install -g webpack // install webpack

cd node_modules/mqtt
npm install . // install dev dependencies
webpack mqtt.js ./browserMqtt.js --output-library mqtt

you can then use mqtt.js in the browser with the same api than node's one.

<html>
<head>
  <title>test Ws mqtt.js</title>
</head>
<body>
<script src="https://github.com/taoqf/MQTT.js/raw/master/browserMqtt.js"></script>
<script>
  var client = mqtt.connect() // you add a ws:// url here
  client.subscribe("mqtt/demo")

  client.on("message", function (topic, payload) {
    alert([topic, payload].join(": "))
    client.end()
  })

  client.publish("mqtt/demo", "hello world!")
</script>
</body>
</html>

Your broker should accept websocket connection (see MQTT over Websockets to setup Mosca).

Signed WebSocket Urls

If you need to sign an url, for example for AWS IoT, then you can pass in a transformWsUrl function to the mqtt.connect() options This is needed because signed urls have an expiry and eventually upon reconnects, a new signed url needs to be created:

// This module doesn't actually exist, just an example
var awsIotUrlSigner = require('awsIotUrlSigner')
mqtt.connect('wss://a2ukbzaqo9vbpb.iot.ap-southeast-1.amazonaws.com/mqtt', {
  transformWsUrl: function (url, options, client) {
    // It's possible to inspect some state on options(pre parsed url components)
    // and the client (reconnect state etc)
    return awsIotUrlSigner(url)
  }
})

// Now every time a new WebSocket connection is opened (hopefully not that
// often) we get a freshly signed url

About QoS

Here is how QoS works:

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

Usage with TypeScript

This repo bundles TypeScript definition files for use in TypeScript projects and to support tools that can read .d.ts files.

Pre-requisites

Before you can begin using these TypeScript definitions with your project, you need to make sure your project meets a few of these requirements:

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:

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

License

MIT