zoukankan      html  css  js  c++  java
  • angular项目实现mqtt的订阅与发布 ngx-mqtt

    angular项目实现mqtt的订阅与发布

    如果要写一个exe可执行文件,可以使用angular编写,然后使用electron打包成一个exe文件。

    https://github.com/maximegris/angular-electron

     我们可以使用现成的angular链接mqtt的插件实现订阅和发布——ngx-mqtt

    https://github.com/sclausen/ngx-mqtt

    安装 ngx-mqtt

    首先在angular项目中安装 ngx-mqtt

    npm install ngx-mqtt --save

    配置mqtt服务器

    然后需要在app.module.ts或者使用mqtt的组件中配置mqtt服务器信息。

    import {
      IMqttMessage,
      MqttModule,
      IMqttServiceOptions
    } from 'ngx-mqtt';
    
    export const MQTT_SERVICE_OPTIONS: IMqttServiceOptions = {
      hostname: '192.168.1.123',  // mqtt 服务器ip
      port: 8083,  // mqtt 服务器端口
      path: '/mqtt'
    };
    
    @NgModule({
      declarations: [HomeComponent],
      imports: [CommonModule, FormsModule, SharedModule, HomeRoutingModule, MqttModule.forRoot(MQTT_SERVICE_OPTIONS)]
    })

     在需要的组件中使用ngx-mqtt订阅和发布消息。

    首先引入

    import {Subscription} from 'rxjs';
    import {IMqttMessage, MqttService} from 'ngx-mqtt';

     构造函数中注入依赖

     constructor(private _mqttService: MqttService) {
        // ...
      }

    订阅mqtt消息

    this.subscription = this._mqttService.observe('my/topic').subscribe((message: IMqttMessage) => {
          console.log(message.payload.toString()); 
    });

      其中  this._mqttService.observe(“ 这里面是要订阅的主题——topic ”),回调函数 message 为订阅后,发布者发布相关主题数据时收到的数据。

     发布消息

    this._mqttService.unsafePublish(topicText, messageText, {qos: 1, retain: true});

       topicText:是发布的主题(topic)    

      messageText:是发布的内容(payload)     

      {qos: 1, retain: true}

      retain参数

      当我们使用MQTT客户端发布消息(PUBLISH)时,如果将RETAIN标志位设置为true,那么MQTT服务器会将最近收到的一条RETAIN标志位为true的消息保存在服务器端(内存或文件),例如开启系统,查看设备的开关状态,我们可以获取上一次设备的状态直接设置开关的开关状态,使开关和设备的真实状态对应起来。

      qos 参数:

    1. QOS0不可靠,因此适合大量数据的传输,因为很大量的数据,完全避免不丢包是很难的,网络环境、现实环境什么的。想要保证的话,大量的数据,一般是要做断点续传。而且小编的经验,像类似 “轮询” 这样不断地得到一些检测数据,这种数据,中间丢几包是基本不会影响业务的。
    2. QOS1可靠,一般的场景够用,因为总能接到数据嘛。缺点就是 “可能造成” 1条数据,接了多次。
    3. QOS2严格可靠,保证相同的消息只接收一条,(请稍微构思一下内部的实现…虽然不复杂,但要一定的流程来保证的,对吧),在每一次通讯都这样执行的话,势必会造成性能的考验,因此小编对QOS2的意见是 “如非必要,慎用,特别是个人/小团队,没有那么多资金租用特别好的服务器”。

     然后根据自己的具体逻辑,就可以实现angular mqtt消息的订阅和转发了!

    连接mqtt服务器

    配置好 mqtt 服务器后,运行会自动连接设置好的mqtt服务器,直接进行订阅或者发布消息就可以。

    export const MQTT_SERVICE_OPTIONS: IMqttServiceOptions = {
      hostname: '192.168.1.123',  // mqtt 服务器ip
      port: 8083,  // mqtt 服务器端口
      path: '/mqtt'
    };

    但是!BUT!

    如果运行过程中需要切换mqtt服务器,因此需要重新配置mqtt服务器,然后重新连接。

    首先在界面引进配置mqtt的参数

    import {MQTT_SERVICE_OPTIONS} from './home.module';

    然后重新配置一下连接mqtt服务器的参数

    MQTT_SERVICE_OPTIONS.hostname = "这个地方填修改的mqtt服务器ip";
    MQTT_SERVICE_OPTIONS.port = Number("这个地方填写修改的mqtt服务器的端口");
    // 如果需要其他的配置自己添加修改

    配置信息修改完成,重新连接

    this._mqttService.connect(MQTT_SERVICE_OPTIONS);
  • 相关阅读:
    使用Jenkins自动编译 .net 项目
    Windows平台下Git服务器搭建
    在MAC上搭建cordova3.4.0的IOS和android开发环境
    检索 COM 类工厂中 CLSID 为 {820280E0-8ADA-4582-A1D9-960A83CE8BB5} 的组件失败,原因是出现以下错误: 80040154 没有注册类 (异常来自 HRESULT:0x80040154 (REGDB_E_CLASSNOTREG))。
    IIS7 404 模块 IIS Web Core 通知 MapRequestHandler 处理程序 StaticFile 错误代码 0x80070002
    mac 端口被占用及kill端口
    查询数据库表大小sql
    开启关闭keditor 过滤
    sql修改字段名称
    Android客户端性能优化
  • 原文地址:https://www.cnblogs.com/wjw1014/p/11529344.html
Copyright © 2011-2022 走看看