无法通过angular8中的ngx-mqtt连接到MQTT代理

时间:2019-12-10 11:04:41

标签: mqtt angular8

无论我做什么,我都无法通过我的角度应用程序中的websocket连接到mqtt代理(在chrome和firefox中尝试)。 为简单起见,我使用HiveMQ broker,我已经在主题Array上发布了一些数据

我已经按照medium article进行了有关如何使用ngx-mqtt以角度连接到mqtt的操作,但是对我来说,它不起作用。

在我的应用中:

我已经安装了模块

@foreach ($city->features as $feature => $chosenfeature)
    @foreach ($features as $feature)
         @if ($feature->id == $chosenfeature)
               {{ $feature->title }}
         @endif
    @endforeach
@endforeach 

我已经添加了配置,并在我的/gat/38/openReservationRequests中设置了模块npm install ngx-mqtt --save

forRoot

我正在app.module.ts的{​​{1}}内执行此功能

...
export const MQTT_SERVICE_OPTIONS: IMqttServiceOptions = {
  connectOnCreate: true,
  hostname: 'broker.hivemq.com',
  port: 8000,
  path: '/gat/38/openReservationRequests',
  protocol: 'ws',
};

...
imports: [
    ...
    MqttModule.forRoot(MQTT_SERVICE_OPTIONS),
    ...
  ],
...

但我总是收到此错误:

ngOnInit

如果我在app.component.ts中指定了... import { IMqttMessage, MqttConnectionState, MqttService } from 'ngx-mqtt'; ... constructor(private mqttService: MqttService) { this.mqttService.state.subscribe((s: MqttConnectionState) => { const status = s === MqttConnectionState.CONNECTED ? 'CONNECTED' : 'DISCONNECTED'; this.status.push(`Mqtt client connection status: ${status}`); }); } ngOnInit() { this.subscription = this.mqttService .observe('/gat/38/openReservationRequests') .subscribe((message: IMqttMessage) => { this.msg = message; console.log('msg: ', message); console.log('Message: ' + message.payload.toString() + 'for topic: ' + message.topic); console.log('subscribed to topic: ' + /gat/38/openReservationRequests); }); } ,我仍然会遇到相同的错误。

如果我将core.js:6014 ERROR TypeError: Cannot read property 'resubscribe' of undefined at MqttClient.subscribe (mqtt.min.js:1) at mqtt.service.js:211 at Observable._subscribe (using.js:8) at Observable._trySubscribe (Observable.js:42) at Observable.subscribe (Observable.js:28) at FilterOperator.call (filter.js:13) at Observable.subscribe (Observable.js:23) at Observable.connect (ConnectableObservable.js:30) at RefCountOperator.call (refCount.js:17) at Observable.subscribe (Observable.js:23) mqtt.min.js:1 WebSocket connection to 'ws://broker.hivemq.com:8000/gat/38/openReservationRequests' failed: Connection closed before receiving a handshake response 更改为clientId,则会收到另一个错误:

MQTT_SERVICE_OPTIONS

如果我在观察主题之前尝试在protocol内部手动连接:

wss

我仍然收到上面的错误。 对我来说,连接某个内部组件(在用户经过身份验证后可以访问)是理想的,因为我将拥有我的私有mqtt代理,并且主题将取决于记录的用户信息。

我已经尝试了带有/不带有cliendId等的协议的任何组合,但是目前我还不知道出什么问题了。我已经多次完全重新编译我的应用程序,我尝试将其发布在具有ssl证书但没有任何更改的测试服务器上。

已解决,感谢@Anant Lalchandani我设置了正确的路径。

另一个问题是'/ mytopic'和'mytopic'确实是两个不同的主题,我也错误地使用了它。 这是我的代码,已更新: app.module.ts

core.js:6014 ERROR TypeError: Cannot read property 'resubscribe' of undefined
    at MqttClient.subscribe (mqtt.min.js:1)
    at mqtt.service.js:211
    at Observable._subscribe (using.js:8)
    at Observable._trySubscribe (Observable.js:42)
    at Observable.subscribe (Observable.js:28)
    at FilterOperator.call (filter.js:13)
    at Observable.subscribe (Observable.js:23)
    at Observable.connect (ConnectableObservable.js:30)
    at RefCountOperator.call (refCount.js:17)
    at Observable.subscribe (Observable.js:23)

mqtt.min.js:1 WebSocket connection to 'wss://broker.hivemq.com:8000/gat/38/openReservationRequests' failed: Error in connection establishment: net::ERR_CONNECTION_CLOSED

appcomponent.ts(目前在ngOnInit内部)

app.component.ts ngOnInit

1 个答案:

答案 0 :(得分:2)

我已经检查了您共享的代码段。

在您的app.module.ts中,路径值应为'/ mqtt'。您已在此处将主题设置为path的值。该主题只能被订阅/发布。当您在连接到Websocket时使用主题作为路径值时,您的应用程序将首先无法连接到websocket。

我们需要使用/ mqtt作为路径的原因是,它指定您正在通过WebSocket协议发送MQTT消息。

HiveMQ本身的文档在其示例中声明将路径用作“ / mqtt”。您可以查看文档here