专栏首页ccf19881030的博客MQTT简单封装类-TypeScript实现

MQTT简单封装类-TypeScript实现

使用过C++和Nodejs的Mqtt封装类,之前使用过mosquitto的C语言库以及mosquittopp的C++库;另外nodejs中也有一个mqtt的模块。

TypeScript中封装MQTT客户端模块

安装mqtt模块

在TypeScript中使用mqtt模块十分简单,首先得用npm或者cnpm安装mqtt模块

npm install mqtt

mq.ts 源代码 MQTT类

下面是使用TypeScript封装的mqtt的简单客户端,代码如下:

import mqtt = require('mqtt')

export interface MqttConnOpt extends mqtt.IClientOptions{}

export declare type OnMessageFunc = (topic: string, payload: Buffer) => void

declare class Topic {
public topic: string;
public qos: 0|1|2;
}

export class MQTT {
mqclient: mqtt.MqttClient;
brokerHost: string;
brokerPort: number;
subscribeTopics: Array<Topic>;
subscribeCallbacks: Map<string, OnMessageFunc>;

constructor(host?: string | any, port?: number) {
 this.brokerHost = host;
 this.brokerPort = port;
 this.subscribeTopics = new Array<Topic>();
 this.subscribeCallbacks = new Map<string, OnMessageFunc>();
}

/**
* 订阅主题
*/
public subscribe(topic: string, qos: 0|1|2) {
 this.subscribeTopics.push({topic: topic, qos: qos});
 if (this.is_connected()){
   this.mqclient.subscribe(topic, {qos: qos});
 }
}

/**
* 设置消息数据回调函数
*/
public set_message_callback(topicPatten: string, cb: OnMessageFunc) {
 this.subscribeCallbacks.set(topicPatten, cb);
}

/**
* 是否已连接到服务器
*/
public is_connected() {
 return this.mqclient.connected == true;
}

/**
* 连接到服务器
*/
public connect(opts?: MqttConnOpt){
 this.mqclient = mqtt.connect(`mqtt://${this.brokerHost}:${this.brokerPort}`, opts);

 this.mqclient.on('connect', ()=>{
   console.log(`成功连接到服务器[${this.brokerHost}:${this.brokerPort}]`);
   for (let index = 0; index < this.subscribeTopics.length; index++) {
     const element = this.subscribeTopics[index];
     this.mqclient.subscribe(element.topic, {qos: element.qos});
   }
 });

 this.mqclient.on('message', (topic: string, payload: Buffer)=>{
   this.mqclient;
   this.subscribeCallbacks.forEach((val, key)=>{
     if (topic.indexOf(key) != -1){
       val(topic, payload);
     }
   });
 });

 this.mqclient.on('error', (err: Error)=>{

 });
}

/**
* 推送数据
*/
public publish(topic: string, message: string, qos: 0|1|2) {
 this.mqclient.publish(topic, message, {qos: qos, retain: false})
}

}

测试

import { MQTT } from './mq'

// mqtt客户端列表
var mqttList: Array<MQTT> = new Array<MQTT>();

/**
   * 实时数据处理函数
   */
function handleReal(topic: string, payload: Buffer) {
  // console.log(`data: ${topic}=>${payload.toString()}`);
  const topics = topic.split('/');
}

/**
  * 数据包处理函数
  */
function handlePacked(topic: string, payload: Buffer) {
  // console.log(`rx: ${topic}=>${payload.toString()}`);
}

/**
   * 连接MQTT服务器
   */
function connectMqtt(host: string, port: number, user: string, pwd: string, id: string, clean: boolean) {
  let it = new MQTT(host, port);
  it.connect({
    username:user,
    password: pwd,
    clientId: id,
    clean: clean,
  });
  // 订阅主题 /gb212/#
  it.subscribe('/gb212/#', 0);
  // 设置主题 /gb212/data 的消息回调
  it.set_message_callback('/gb212/data', handleReal.bind(this));
  // 设置主题 /gb212/rx 的消息回调
  it.set_message_callback('/gb212/rx', handlePacked.bind(this));
  // 将MQTT变量it放到MQTT客户端列表中
  mqttList.push(it);
}
  
// 连接MQTT服务器
connectMqtt('127.0.0.1', 1883, 'test', '123456', 'this_is_test_200507_nodejs_oilfume_2', true);

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 使用Express+TypeScript编写后台服务

    最近接到一个比较简单的任务,需求如下: 1、从MQTT服务器订阅断电报警信息然后入库到SQLServer或者MySQL数据库中 2、从MQTT服务器订阅到站...

    ccf19881030
  • DES ECB加解密的Java实现

    [2020-08-12 16:04:15.037]# RECV HEX FROM 117.136.81.93 :51423> C4 FC 35 4A 83 E...

    ccf19881030
  • Windows10中VS2017环境下使用libmodbus库Modbus TCP读取设备的数据

    TCP(IPv4)环境 TCP后端实现了用于通过TCP / IPv4网络进行通信的Modbus变体。它不需要校验和计算,因为底层TCP会处理相同的功能。

    ccf19881030
  • 七夕最污代码,单身慎入

    2.找不到对象说爱(Fatal error: Call to a member function on a non-object), 他怎么才能说出爱?

    后端技术探索
  • 面向对象版tab 栏切换案例

    梨涡浅笑
  • (四十九)c#Winform自定义控件-下拉框(表格)

    GitHub:https://github.com/kwwwvagaa/NetWinformControl

    冰封一夏
  • Vuejs --04 计算属性

    一、使用原因      1、模板中表达式很便利,但实际上只适用于简单的运算,不适宜放入太多逻辑运算,例如: <div id="example"> {{ mess...

    用户1148399
  • React 深入系列5:事件处理

    iKcamp
  • java队列

    队列为特殊的线性表,队列的特点先进先出(FIFO),队列插入为入队,队列删除为出对。

    mySoul
  • PHP设计模式之装饰器(装饰者)模式(Decorator)入门与应用详解

    本文实例讲述了PHP设计模式之装饰器(装饰者)模式(Decorator)入门与应用。分享给大家供大家参考,具体如下:

    砸漏

扫码关注云+社区

领取腾讯云代金券