MQTT.jsを使用する MQTT クライアント(デスクトップ PC 上でも実際のボード上でも同じです) とmoscaを使用する MQTT ブローカー(これはデスクトップ PC 上で実行されます) をセットアップします。
client から brokerに特定のトピックを含むメッセージを正常に送信できますが、今度は反対の方法で行き詰っています。つまり、broker から clientにメッセージを送信します。
両方のプロジェクト ドキュメントで提供されているコード サンプルに従っていますが、うまくいきません。クライアントはトピックに正しく登録できますが、メッセージが送信されてもまったく反応しません。ブローカは、メッセージを正しく送信することができ、またすべてのメッセージをリッスンしているため、自身のメッセージをリッスンすることもできます。
MQTT ブローカーからの抜粋:
broker.on('published', function(packet, client) {
console.log('MQTT broker received message'); // it passes by here
console.log(' - packet:', packet);
console.log(' - packet payload:', packet.payload.toString());
});
// ...
var packet = {
topic: 'our_custom_topic',
payload: ourCustomPayload,
qos: 1,
retain: false,
};
console.log('MQTT broker sending message to client ...');
broker.publish(packet, function() {
console.log('Message sent'); // it passes by here
});
MQTT クライアントからの抜粋:
client.on('connect', function () {
console.log('MQTT client connected');
client.subscribe('our_custom_topic', { qos: 1 }, function onSubscribe(err, granted) {
if (err) {
console.log('subscribe errors:', err); // no error shown
}
if (granted) {
console.log('subscribe granted:', granted); // it passes by here
}
});
});
// ...
client.on('message', function (topic, message, packet) {
console.log('MQTT client received message'); // it DOESN'T pass by here
console.log(' - topic', topic);
console.log(' - message', JSON.stringify(message));
console.log(' - packet', JSON.stringify(packet));
});
アップデート
永続性がmongoDbに基づいている場合、問題が発生するようです。代わりに、持続性がメモリーベースの場合、メッセージはサブスクライバーに正しく送信されます。永続化を mongoDb に依存する場合の pub-sub 設定は次のとおりです。実際には、mongolab.com で実行されている開発インスタンスです。
var mongoDbSettings = {
// remote MongoLab mongodb instance
url: 'mongodb://mqtt-db-user:<OUR-USER-CODE>@<THEIR-INSTANCE-SUBDOMAIN>.mongolab.com:39291/sample-mqtt-datastore',
pubsubCollection: 'myCollections',
};
var mongoDbBrokerSettings = {
port: 1883, // mosca (mqtt) port
// using ascoltatore over MongoDB
backend: {
type: 'mongo',
url: mongoDbSettings.url,
pubsubCollection: mongoDbSettings.pubsubCollection,
mongo: {},
},
persistence: {
factory: mosca.persistence.Mongo,
url: mongoDbSettings.url,
}
};
var broker = new mosca.Server(mongoDbBrokerSettings, function onCreated(err, broker) {
// assume no errors
console.log('MQTT broker is up and running');
});
誰かがそれで何か問題を見つけますか?