193 lines
6.9 KiB
JavaScript
193 lines
6.9 KiB
JavaScript
//===================================================================
|
|
/*
|
|
* My Web mqtt client
|
|
*
|
|
* Copyright (c) 2018 deunix@e-educ.fr
|
|
*
|
|
* MIT License
|
|
*
|
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
* of this software and associated documentation files (the "Software"), to deal
|
|
* in the Software without restriction, including without limitation the rights
|
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
* copies of the Software, and to permit persons to whom the Software is
|
|
* furnished to do so, subject to the following conditions:
|
|
*
|
|
* The above copyright notice and this permission notice shall be included in all
|
|
* copies or substantial portions of the Software.
|
|
*
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
* SOFTWARE.
|
|
*/
|
|
//======================================================
|
|
// some useful functions
|
|
function toFloat(value, n) {
|
|
return parseFloat(value).toFixed(n);
|
|
}
|
|
|
|
function toDecimal(value, n) {
|
|
return parseInt(value).toFixed(n);
|
|
}
|
|
|
|
function b64_to_utf8( str ) {
|
|
return decodeURIComponent(escape(window.atob( str )));
|
|
}
|
|
|
|
function format_date(unixtimestamp) {
|
|
var date = new Date(1000*parseInt(unixtimestamp));
|
|
var dateString =
|
|
date.getUTCFullYear() + "/" +
|
|
("0" +(date.getUTCMonth()+1)).slice(-2)+ "/" +
|
|
("0" + date.getUTCDate()).slice(-2) + " " +
|
|
("0" + date.getUTCHours()).slice(-2) + ":" +
|
|
("0" + date.getUTCMinutes()).slice(-2) + ":" +
|
|
("0" + date.getUTCSeconds()).slice(-2);
|
|
return dateString;
|
|
}
|
|
function locale_date(unixtimestamp) {
|
|
var date = new Date(1000*parseInt(unixtimestamp));
|
|
var dateString =
|
|
date.getFullYear() + "/" +
|
|
("0" +(date.getMonth()+1)).slice(-2)+ "/" +
|
|
("0" + date.getDate()).slice(-2) + " " +
|
|
("0" + date.getHours()).slice(-2) + ":" +
|
|
("0" + date.getMinutes()).slice(-2) + ":" +
|
|
("0" + date.getSeconds()).slice(-2);
|
|
return dateString;
|
|
}
|
|
|
|
function getUrlParameter(sParam) {
|
|
var sPageURL = window.location.search.substring(1),
|
|
sURLVariables = sPageURL.split('&'),
|
|
sParameterName,
|
|
i;
|
|
for (i = 0; i < sURLVariables.length; i++) {
|
|
sParameterName = sURLVariables[i].split('=');
|
|
if (sParameterName[0] === sParam) {
|
|
return sParameterName[1] === undefined ? true : decodeURIComponent(sParameterName[1]);
|
|
}
|
|
}
|
|
}
|
|
|
|
var MQTT_RETAIN = true;
|
|
var MQTT_NO_RETAIN = false;
|
|
var QOS_AT_MOST_ONCE = 0;
|
|
var QOS_AT_LEAST_ONCE = 1;
|
|
var QOS_EXACTLY_ONCE = 2;
|
|
|
|
var MqttClientClass = function MqttClient(options, callbacks) {
|
|
var self = this;
|
|
var defaults = {
|
|
host: "127.0.0.1",
|
|
port: 1884,
|
|
reconnectTimeout: 5, // seconds
|
|
subs: [],
|
|
datas: [],
|
|
//
|
|
userName: null,
|
|
password: null,
|
|
onSuccess: onConnect,
|
|
onFailure: onFailure,
|
|
useSSL: false,
|
|
cleanSession: true,
|
|
timeout: 30,
|
|
keepAliveInterval: 60,
|
|
};
|
|
|
|
var defaultCallbacks = {
|
|
onMessageCallback: onMessageArrived,
|
|
onConnectionLostCallback: onConnectionLost,
|
|
onConnectionCallback: null,
|
|
onDisconnectionCallback: null,
|
|
onSubscribeCallback: null,
|
|
onPublishCallback: null,
|
|
onSynMessageCallback: null,
|
|
onAckMessageCallback: null,
|
|
onPongMessageCallback: null,
|
|
};
|
|
var mqtt = null;
|
|
var opt = $.extend(defaults, options);
|
|
var cbk = $.extend(defaultCallbacks, callbacks);
|
|
var reconnectTimeout = opt.reconnectTimeout * 1000; delete opt.reconnectTimeout;
|
|
|
|
this.callbacks = cbk;
|
|
this.datas = opt.datas; delete opt.datas;
|
|
this.clid = "pahoJsCli_" + $.now();
|
|
this.host = opt.host; delete opt.host;
|
|
this.port = opt.port; delete opt.port;
|
|
this.subs = opt.subs; delete opt.subs;
|
|
|
|
// private methods
|
|
//
|
|
function MQTTconnect() {
|
|
mqtt = new Paho.MQTT.Client(self.host, self.port, self.clid);
|
|
mqtt.onConnectionLost = cbk.onConnectionLostCallback;
|
|
mqtt.onMessageArrived = cbk.onMessageCallback;
|
|
mqtt.connect(opt);
|
|
}
|
|
|
|
function MQTTsubscribe() {
|
|
$.each(self.subs, function(i, sub) {
|
|
mqtt.subscribe(sub[0], {qos: sub[1]});
|
|
if (cbk.onSubscribeCallback)
|
|
(cbk.onSubscribeCallback(sub[0], sub[1]));
|
|
});
|
|
}
|
|
|
|
function onFailure(message) {
|
|
//console.log("Connection failed: " + message.errorMessage + ". Retrying...");
|
|
setTimeout(MQTTconnect, reconnectTimeout);
|
|
}
|
|
|
|
function onConnect() {
|
|
//console.log('Connected to ' + self.host + ':' + self.port + "\nId: "+ self.clid);
|
|
if (cbk.onConnectionCallback)
|
|
cbk.onConnectionCallback();
|
|
MQTTsubscribe();
|
|
}
|
|
|
|
function onConnectionLost(response) {
|
|
if (cbk.onDisconnectionCallback)
|
|
cbk.onDisconnectionCallback(response);
|
|
console.log("Connection lost: " + response.errorMessage + ". Reconnecting...");
|
|
setTimeout(MQTTconnect, reconnectTimeout);
|
|
}
|
|
|
|
function onMessageArrived(message) {
|
|
var topic = message.destinationName;
|
|
var payload = message.payloadString;
|
|
console.log(topic +"\n"+ payload);
|
|
}
|
|
|
|
function MQTTpublish(topic, payload, qos, retained) {
|
|
if (cbk.onPublishCallback)
|
|
cbk.onPublishCallback(payload);
|
|
mqtt.send(topic, payload, qos, retained);
|
|
}
|
|
|
|
function MQTTdeleteRetainedMessage(topic) {
|
|
mqtt.send(topic, "", 0, true);
|
|
}
|
|
|
|
function MQTTpublishMessage(topic, payload) {
|
|
var msg = (typeof payload == 'undefined' || payload == null) ? {evt: topic}: payload;
|
|
MQTTpublish(topic, JSON.stringify(msg), QOS_AT_LEAST_ONCE, MQTT_NO_RETAIN);
|
|
}
|
|
|
|
// public methods
|
|
//
|
|
this.connect = function() { MQTTconnect(); };
|
|
this.disconnect = function() { mqtt.disconnect(); };
|
|
this.isConnected = function() { return mqtt.connected; };
|
|
this.suscribe = function(filter, subscribeOptions) { mqtt.suscribe(filter, subscribeOptions); };
|
|
this.unsubscribe = function(filter, unsubscribeOptions) { mqtt.unsuscribe(filter, unsubscribeOptions); };
|
|
this.publish = function(topic, payload, qos, retained) { MQTTpublish(topic, payload, qos, retained); };
|
|
this.publishMessage = function(topic, payload) { MQTTpublishMessage(topic, payload); };
|
|
this.deleteRetainedMessage = function(topic) { MQTTdeleteRetainedMessage(topic); };
|
|
};
|