2016-03-24 5 views
1

J'apprends MQTT et j'aimerais déployer le courtier mosca open source dans une application web azure exécutant mosca sans base de données (pas besoin de QoS qui implique la persistance).mosca mqtt broker sur azure

J'ai utilisé le code de http://thejackalofjavascript.com/getting-started-mqtt/ qui est un excellent tutoriel pour un sur le déploiement des locaux (voir ci-dessous)

var mosca = require('mosca') 

var settings = { 
    port: 1883 
}; 

//here we start mosca 

var server = new mosca.Server(settings); 
server.on('ready', setup); 

// fired when the mqtt server is ready 

function setup() { 
    console.log('Mosca server is up and running') 
} 

// fired when a client is connected 

server.on('clientConnected', function(client) { 
    console.log('client connected', client.id); 
}); 

// fired when a message is received 

server.on('published', function(packet, client) { 
    console.log('Published : ', packet.payload); 
}); 

// fired when a client subscribes to a topic 

server.on('subscribed', function(topic, client) { 
    console.log('subscribed : ', topic); 
}); 

// fired when a client subscribes to a topic 

server.on('unsubscribed', function(topic, client) { 
    console.log('unsubscribed : ', topic); 
}); 

// fired when a client is disconnecting 

server.on('clientDisconnecting', function(client) { 
    console.log('clientDisconnecting : ', client.id); 
}); 

// fired when a client is disconnected 

server.on('clientDisconnected', function(client) { 
    console.log('clientDisconnected : ', client.id); 
}); 

Je peux obtenir ce code en cours d'exécution sur le site Web Azure mais ne savent pas quoi configurer comme l'adresse et les ports de ce courtier dans un client à l'aide MQTT - s'il vous plaît voir ci-dessous

var mqtt = require('mqtt') 

client = mqtt.connect([{port:1883, host:'???'}]); //what do you use here as the port and server address here instead of localhost and 1883? I tried using the URL for the web app in azure but it does not work and i do not get any error messages. 

client.on('connect', function() { 
    console.log('client connected'); 
    client.subscribe('presence'); 
    client.publish('presence', 'Hello mqtt'); 
}); 

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

Merci à l'avance,

Répondre

0

j'eu le même problème.

Vous devez utiliser MQTT over Websockets, et l'adresse du serveur serait:

var client = mqtt.connect('ws://<app-id>.azurewebsites.net'); 

et vous avez besoin d'activer Websockets dans d'azur -> application Web -> Paramètres -> Paramètres de l'application -> prises Web.

J'espère que cela pourrait aider.

+0

Lakhdar, merci. Cela a beaucoup aidé. Je l'ai maintenant travailler grâce à votre perspicacité. J'ai dû suivre les étapes pour augmenter un serveur HTTP de noeud avec MQTT-over-Websocket Capability en appelant la méthode Server # attachHttpServer comme indiqué dans le lien que vous avez suggéré et en faisant cela avec le client var = mqtt.connect ('ws:// .azurewebsites.net '); suggestion que vous avez fait marcher! Merci encore – bulho

+0

Vous êtes les bienvenus :) –

+0

@bulho pouvez-vous s'il vous plaît partager votre solution? Je ne peux pas faire ce travail –

0

ici est le courtier sur Azure (application Web avec websockets activé)

var mosca = require('mosca') 
var http  = require('http') 
    , httpServ = http.createServer(); 

var server = new mosca.Server(); 
server.on('ready', setup); 

server.attachHttpServer(httpServ); 

var port = process.env.PORT || 3000; 
httpServ.listen(port); 

// fired when the mqtt server is ready 

function setup() { 
    console.log('Mosca server is up and running') 
} 

// fired when a client is connected 

server.on('clientConnected', function(client) { 
    console.log('client connected', client.id); 
}); 

// fired when a message is received 

server.on('published', function(packet, client) { 
    console.log('Published: ', packet.payload.toString()); 
    console.log('timestamp: ',new Date().getMilliseconds()); 
}); 

// fired when a client subscribes to a topic 

server.on('subscribed', function(topic, client) { 
    console.log('subscribed : ', topic); 
}); 

// fired when a client subscribes to a topic 

server.on('unsubscribed', function(topic, client) { 
    console.log('unsubscribed : ', topic); 
}); 

// fired when a client is disconnecting 

server.on('clientDisconnecting', function(client) { 
    console.log('clientDisconnecting : ', client.id); 
}); 

// fired when a client is disconnected 

server.on('clientDisconnected', function(client) { 
    console.log('clientDisconnected : ', client.id); 
}); 

Voici un exemple de dispositif en interaction avec le courtier ci-dessus. Pour plus de simplicité, nous avons l'appareil de publication et d'abonnement au sujet:

var mqtt = require('mqtt'); 
var client = mqtt.connect('ws://your_web_app_address_here.azurewebsites.net'); 

client.on('connect', function() { 
    client.subscribe('someTopic'); 
    client.publish('someTopic', 'hello from my device!); 
}); 

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

J'espère que cela aide.

+0

dois-je faire autre chose? je ne peux pas faire ce travail –

0

Je pense que cela ressemble à un problème qui se produit lorsque vous oubliez de vous désabonner puis de vous réabonner à un sujet. Ceci peut arriver (par exemple) lorsque le client et le serveur tournent, puis éteindre le serveur (ce qui entraîne la déconnexion du client) puis redémarrer le serveur, ce qui entraîne la reconnexion (et l'abonnement) par le client. Comparez avec ceci:

  1. le serveur démarre -> le client se connecte -> le client s'abonne.
  2. Le serveur s'arrête, sans désinscription du client.
  3. le serveur démarre -> le client se connecte -> le client s'abonne (la deuxième fois)
  4. cela conduira à deux fois/tripple/... messages.

Est-ce ce qui reproduit votre problème?