mqtt-mosq-chat-server
v1.0.0
Published
A Node.js chat server using MQTT, Mosquitto Broker and MongoDB
Downloads
3
Readme
Mqtt-mosq-chat-server.js is a server library that uses the mqtt.js library with the Mosquitto broker to implement a chat functionality. It communicates with its sister client side library mqtt-mosq-chat-client.js. It requires a mongoDB database.
Table of Contents
Setting up the Mosquitto broker & Plugin
On Ubuntu Linux, execute the following commands to install the Mosquitto broker:
sudo apt update
sudo apt install mosquitto
The Mosquitto broker should start automatically after installation. If it's not running, you can start it manually using the following command:
sudo systemctl start mosquitto
You can check the status of the Mosquitto broker using the following command:
sudo systemctl status mosquitto
If you want the Mosquitto broker to start automatically when your server boots up, you can enable it using the following command:
sudo systemctl enable mosquitto
To configure the Mosquitto broker, you can make changes to its configuration file, typically named mosquitto.conf. The location of this file may vary depending on your operating system and installation method, but usually it is located in /etc/mosquitto. Open with an editor of your choice and add the following lines, if they don't already exist:
pid_file /run/mosquitto/mosquitto.pid
persistence true
persistence_location /var/lib/mosquitto/
listener 8083
protocol websockets
log_dest file /var/log/mosquitto/mosquitto.log
include_dir /etc/mosquitto/conf.d
At this point we need to install the Dynamic Security Plugin for Mosquitto. On Linux you would expect the plugin library to be installed to /usr/lib/x86_64-linux-gnu/mosquitto_dynamic_security.so
or a similar path, but this will vary depending on the particular distribution and hardware in use.
We need to add some more lines to our mosquitto.conf file. Those lines are:
plugin path/to/mosquitto_dynamic_security.so
plugin_opt_config_file path/to/dynamic-security.json
allow_anonymous false
per_listener_settings false
Replace "path/to/"
with the actual path to the .so and .json files. Note that we still haven't created the dynamic-security.json
, we will do it very soon.
The "allow_anonymous false"
option will allow only registered users to connect to the broker, while the "per_listener_settings false"
option is so all listeners use the same authentication and access control.
The next step is to create the dynamic-security.json
file, which is where the plugin configuration will be stored. This file will be updated each time you make client/group/role changes, during normal operation the configuration stays in memory. To generate an initial file, we will use the mosquitto_ctrl
utility to create our first and also admin user. We do that by executing the following command (again replace path/to/
with the path you want, I recommend the same path as your mosquitto.conf):
mosquitto_ctrl dynsec init path/to/dynamic-security.json admin-user
Make sure the path to the .json file is correct in the .conf file as well.
You can choose your own admin-user username. You will be asked for a password for the client. This user will be assigned the admin role.
Now that the dynamic-security.json is created, we need to change the read/write permissions of the file. Go to the directory where you created the dynamic-security.json
file and execute this command:
sudo chmod a+rw dynamic-security.json
Everything should be set up now.
Installation
npm install mqtt-mosq-chat-server
Config file
The library requires a config file from which it will read some of the data it needs. You will have to create that file with the name config.json
. It also needs to be in the same directory as your project's entry file (usually the index.js file). The json structure should look something like this example:
{
"databaseUrl": "mongodb://localhost:27017/libtestDB",
"brokerUrl": "ws://localhost:8083",
"port": "3001",
"credentials": {
"username": "admin-user",
"password": "admin"
}
}
Replace the the example data with your own.
Import
const chatServer = require('mqtt-mosq-chat-server')
API
chatServer.connectDB()
chatServer.brokerConnect()
chatServer.receivingMessages()
chatServer.brokerError()
chatServer.startServer()
chatServer.connectDB()
Uses the URL in the config file to connect to the mongoDB database.
chatServer.brokerConnect()
Creates a listener that automatically subscribes to all the chat rooms that are saved in the database as soon as the connection to the broker is achieved.
chatServer.receivingMessages()
Creates a listener for all the messages that the server will receive. The server will be subscribed to all the existing rooms so it will receive every single messages sent. For each message, it will save it in the mongoDB database.
chatServer.brokerError()
Creates a listener for any errors that might occur with the broker connection.
chatServer.startServer()
The main function that starts the express server listener in the given port. It sets the endpoints for the various axios requests that the client library will send.
Example
An example of how you can initialize the library from your idnex.js file:
const chatServer = require('mqtt-mosq-chat-server');
chatServer.connectDB();
chatServer.brokerConnect();
chatServer.receivingMessages();
chatServer.brokerError();
chatServer.startServer();