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

Make client listen all the time instead of listen only once

本文关键字:监听 一次 一直 客户端      更新时间:2023-09-26

我有一个运行在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客户端始终侦听,而不是只侦听一次?

注释掉结束mqtt_client连接的行。这会奏效的!其中一位评论者floribon首先在评论中给出了答案。

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