让客户端一直听,而不是只听一次

时间:2015-12-05 02:05:03

标签: javascript angularjs node.js mqtt

我有一个在angularjs和node.js mqtt模块上运行的mqtt客户端。有一个简单的开关,只要交换机状态发生变化,它就会在mqtt代理上发布主题。

相关的html代码如下所示;

<div ng-controller="SwitchCtrl">
    <md-switch ng-model="switch_status.sw1" aria-label="SwitchCtrl" ng-change="onChange(switch_status.sw1)">
        Wireless Light Switch: {{ switch_status.sw1 }}
    </md-switch>
</div> 

这是angularjs控制器;

angular.module('myApp.controllers', [])
    .controller('SwitchCtrl', ['$scope', 
        function ($scope) {
            $scope.switch_status = {
                sw1: true,
            };

            var mqtt_client = mqtt.connect('ws://127.0.0.1:3000');
            mqtt_client.subscribe('hello/world');
            mqtt_client.on('connect', function () {
                console.log("MQTT connected");
            });

            mqtt_client.on("message", function(topic, payload) {
                console.log([topic, payload].join(": "));
                mqtt_client.end();
            });

            $scope.onChange = function (sw_state) {
                if (sw_state === true) {
                    mqtt_client.publish('hello/world', 'switch on');
                }
                else if (sw_state === false) {
                    mqtt_client.publish('hello/world', 'switch off');
                }
            }
        }])
;

我的问题是控制器代码只运行一次。我希望控制器中的这段代码能够永久运行,以便客户端知道在订阅主题上发布的新消息。

        mqtt_client.on("message", function(topic, payload) {
            console.log([topic, payload].join(": "));
            mqtt_client.end();
        });

如何让mqtt客户端一直监听而不是只听一次?

1 个答案:

答案 0 :(得分:-1)

注释掉结束mqtt_client连接的行。那可行!感谢floribon的一位评论员,他首先在评论中提供了答案。

mqtt_client.on("message", function(topic, payload) {
            console.log([topic, payload].join(": "));
            //mqtt_client.end();
        });