3

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

誰かがそれで何か問題を見つけますか?

4

2 に答える 2

0

Mosca パブリック API の一部であるため、ブローカーから直接公開できます。

/**
 * Publishes a packet on the MQTT broker.
 *
 * @api public
 * @param {Object} packet The MQTT packet, it should include the
 *                        topic, payload, qos, and retain keys.
 * @param {Object} client The client object (internal)
 * @param {Function} callback The callback
 */
Server.prototype.publish = function publish(packet, client, callback)...

クライアントがサブスクライブしている限り、送信しbroker.publish({topic:"/foo/bar", payload:'foo'}, client)たいモデル インスタンスのクライアントを介して (つまり、コールバックから) 送信できます。

于 2015-08-15T22:01:10.083 に答える