2016-03-24 9 views
1

Ich lerne MQTT und möchte den Open Source mosca broker zu einer azure Web App mit mosca ohne Datenbank implementieren (brauche keine QoS die Persistenz beinhaltet).mosca mqtt broker auf azure

Ich habe den Code aus http://thejackalofjavascript.com/getting-started-mqtt/ verwendet, die für ein auf lokale Bereitstellung (siehe unten)

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); 
}); 

ich diesen Code bekommen auf Azure Website laufe ein großes Tutorial, aber nicht wissen, was zu Setup als die Adresse und die Ports für diesen Broker in einem Client mit MQTT - siehe unten

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(); 
}); 

Vielen Dank im Voraus,

Antwort

0

ich hatte das gleiche Problem.

Sie haben MQTT over Websockets zu verwenden, und die Server-Adresse wäre:

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

und Sie müssen Websockets in azur aktivieren -> Web-App -> Einstellungen -> Anwendungseinstellungen -> Web-Sockets.

Ich hoffe, das könnte helfen.

+0

Lakhdar, danke. Das hat sehr geholfen. Dank Ihrer Einsicht funktioniert es jetzt. Ich musste den Schritten folgen, um einen Node-HTTP-Server mit MQTT-über-Websocket-Funktionalität zu erweitern, indem ich die Server # attachHttpServer-Methode wie in dem von Ihnen vorgeschlagenen Link aufgerufen habe und wenn dies mit dem var-Client = mqtt.connect ('ws:// .azurewebsites.net '); Vorschlag Sie hatten es funktioniert!. Danke nochmal – bulho

+0

Sie sind willkommen :) –

+0

@bulho können Sie bitte Ihre Lösung teilen? Ich kann diese Arbeit machen –

0

hier ist der Broker auf Azure (Web app mit WebSockets aktiviert)

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); 
}); 

Hier ist ein Beispiel mit dem Broker Vorrichtung über interagiert. Zur Vereinfachung haben wir das Gerät veröffentlicht und abonniert zum Thema:

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(); 
}); 

ich hoffe, das hilft.

+0

muss ich noch etwas tun? Ich kann diese Arbeit nicht machen –

0

Ich denke, das klingt nach einem Problem, das auftritt, wenn Sie vergessen, sich abzumelden und dann ein Thema erneut zu abonnieren.

Dies kann zum Beispiel passieren, wenn Sie den Client und den Server ausführen, dann den Server herunterfahren (was zu einer Verbindung mit dem Client führt) und dann den Server neu starten, was zum erneuten Verbinden (und Abonnieren) des Clients führt. Vergleichen Sie dies mit:

  1. Server startet -> Client verbindet -> Client abonniert.
  2. Server wird heruntergefahren, ohne Client abzubestellen.
  3. Server startet -> Client verbindet -> Client abonniert (das zweite Mal)
  4. dies führt zu zwei/drei/... Nachrichten.

Ist das, was reproduziert Ihr Problem?