TS MQTT封装
TS MQTT封装
导入相关包
npm i mqtt
npm i lodash
- guid 随机生成就行,具体可以参考百度或者随便生成一个随机数*
代码封装
import mqtt from 'mqtt'
import type { MqttClient, OnMessageCallback, IClientOptions, IClientPublishOptions, IPublishPacket } from 'mqtt'
import { getGuid } from '@/common/basic'
import { without, uniq } from 'lodash'
export type TPublishFormat = {
topic: string
payload: string | Buffer
opts?: IClientPublishOptions
}
export type TMessageCallback<T> = (topic: string, payload: T) => void
export interface IMqClientOptions extends IClientOptions {
connectCb?: () => void
errorCb?: (e: Event) => void
reconnectCb?: () => void
}
export default class MQTT {
private _type: string
private _url: string
private _opt: IMqClientOptions // mqtt地址
public client!: MqttClient
public topicArr: Array<string> = []
constructor(url: string, opt?: IMqClientOptions, type: string = 'Web') {
this._type = type
this._url = url
this._opt = {
clean: true,
clientId: this._type + '_' + getGuid(), // 客户端分类唯一
connectTimeout: 3000, // 超时时间
reconnectPeriod: 1000, //重连超时
...(opt && opt),
}
this._init()
}
private _init() {
this.destroy()
this.client = mqtt.connect(this._url, this._opt)
this.client.on('connect', () => {
this._opt.connectCb && this._opt.connectCb()
console.log(this._url + '连接成功...')
})
this.client.on('error', (error: any) => {
this._opt.errorCb && this._opt.errorCb(error)
console.log(this._url + '异常中断...')
})
this.client.on('reconnect', () => {
this._opt.reconnectCb && this._opt.reconnectCb()
console.log(this._url + '重新连接...')
})
}
/**
* 函数“unSubscribe”是一个 TypeScript 函数,用于取消订阅一个或多个主题,并返回一个 Promise,该 Promise 解析为一个布尔值,指示取消订阅是否成功。
* @param {string | string[]} topic - topic 参数可以是字符串或字符串数组。它代表客户端想要取消订阅的主题。
* @returns 正在返回 Promise。
*/
public unSubscribe(topic: string | string[]) {
return new Promise((resolve: (isOk: boolean) => void) => {
this.client &&
!this.client.disconnected &&
this.client
.unsubscribeAsync(topic)
.then((result) => {
if (typeof topic === 'string') {
topic = [topic]
}
//去重
this.topicArr = without(this.topicArr, ...topic)
console.log(topic, this.topicArr, '取消订阅成功...')
resolve(true)
})
.catch((err) => {
console.log(topic, '取消订阅失败...')
resolve(false)
})
})
}
/**
* 函数“onSubscribe”是一个 TypeScript 函数,它订阅一个或多个主题并返回一个 Promise,该 Promise 解析为一个布尔值,指示订阅是否成功。
* @param {string | string[]} topic - topic 参数可以是字符串或字符串数组。它代表您要订阅的主题。
* @returns 一个 Promise,解析为布尔值,指示订阅是否成功。
*/
public onSubscribe(topic: string | string[]) {
if (typeof topic === 'string') {
topic = [topic]
}
const topicOk: Array<string> = without(topic, ...this.topicArr)
return new Promise((resolve: (isOk: boolean) => void) => {
this.client &&
!this.client.disconnected &&
topicOk.length > 0 &&
this.client
.subscribeAsync(topic)
.then((result) => {
this.topicArr.push(...topicOk)
this.topicArr = uniq(this.topicArr)
console.log(topicOk, this.topicArr, '订阅成功...')
resolve(true)
})
.catch((err) => {
console.log(topicOk, '订阅失败...')
resolve(false)
})
})
}
/**
* 函数“onPublish”使用客户端向主题发布消息,并返回一个解析为布尔值的 Promise,指示发布是否成功。
* @param {TPublishFormat} format - format参数的类型为TPublishFormat,它是一个包含两个属性的对象:topic和message。 topic
* 属性表示消息将发布到的主题,message 属性表示将发布的实际消息。
* @returns 正在返回 Promise。
*/
public onPublish(format: TPublishFormat) {
return new Promise((resolve: (isOk: boolean) => void) => {
this.client &&
!this.client.disconnected &&
this.client
.publishAsync(format.topic, format.payload, format.opts)
.then((result) => {
console.log('发布消息成功...')
resolve(true)
})
.catch((err) => {
console.log('发布消息失败...')
resolve(false)
})
})
}
//收到的消息
public onMessage<T = any>(callback: TMessageCallback<T>) {
this.client &&
!this.client.disconnected &&
this.client.on('message', (topic: string, payload: Buffer) => {
try {
callback && callback(topic, JSON.parse(payload.toString()))
} catch (err) {
console.log('无法执行JSON.parse...')
callback && callback(topic, payload.toString() as T)
}
})
}
//销毁
public destroy() {
console.log('销毁...')
this.client && this.client.end()
this.topicArr = []
}
}
使用
//通过开源公共服务器测试,切换成自家服务器就行了
const mqtt = new MQTT('mqtt://broker.emqx.io:8083/mqtt', { username: 'emqx_test', password: 'emqx_test' })
mqtt.onSubscribe('/test/ss')
mqtt.onMessage((topic, message) => {
console.log(topic, message)
})
setTimeout(() => {
mqtt.onPublish({ topic: '/sss/ss', payload: '测试1111' })
}, 3000);
TS MQTT封装的更多相关文章
- 关于对H264码流的TS的封装的相关代码实现
1 写在开始之前 在前段时间有分享一个H264封装ps流到相关文章的,这次和大家分享下将H264封装成TS流到相关实现,其实也是工作工作需要.依照上篇一样,分段说明每个数据头的封装情况,当然,一样也会 ...
- ESA2GJK1DH1K基础篇: Android实现MQTT封装源码使用说明
说明 这一节说明一下基础篇APP源码里面MyMqttCilent.java这个文件的使用 新建工程 安装MQTT的jar包 implementation 'org.eclipse.paho:org.e ...
- 自己动手写RTP服务器——用RTP协议传输TS流
上一篇文章我们介绍了关于RTP协议的知识,那么我们现在就自己写一个简单的传输TS流媒体的RTP服务器吧. 预备知识 关于TS流的格式:TS流封装的具体格式请参考文档ISO/IEC 13818-1.这里 ...
- 关于TCP和MQTT之间的转换(转载)
现在物联网流行的就是MQTT 其实MQTT就是在TCP的基础上建立了一套协议 可以看这个,本来我自己想用Wireshark监听一下,不过百度一搜索一大把,我就不测试了 https://blog.csd ...
- 关于TCP和MQTT之间的转换
现在物联网流行的就是MQTT 其实MQTT就是在TCP的基础上建立了一套协议 可以看这个,本来我自己想用Wireshark监听一下,不过百度一搜索一大把,我就不测试了 https://blog.csd ...
- FFMPEG中关于ts流的时长估计的实现(转)
最近在做H.265 编码,原本只是做编码器的实现,但客户项目涉及到ts的封装,搞得我不得不配合了解点ts方面的东西.下面技术文档不错,转一下. ts流中的时间估计 我们知道ts流中是没有时间信息的,我 ...
- 基于ElementUI封装Excel数据导入组件
由于前端项目使用的是Vue-cli3.0 + TypeScript的架构,所以该组件也是基于ts语法封装的,组件的完整代码如下: <template> <div id="m ...
- ts流中的pcr与pts计算与逆运算
mpeg2ts文件格式中有pcr和pts的概念,其代码含义如下: PCR(Program Clock Reference)--指示系统时钟本身的瞬时值的时间标签称为节目参考时钟标签(PCR). PTS ...
- Angular:使用service进行http请求的简单封装
①使用ng g service services/storage创建一个服务组件 ②在app.module.ts 中引入HttpClientModule模块 ③在app.module.ts 中引入创建 ...
- 一些好用的javascript/typescript方法封装分享
1.数字格式化 JS版-直接写到原型链上 /** * @author: silencetea * @name: * @description: 数字格式化,默认每三位用英文逗号分隔 * @param ...
随机推荐
- linux下查找文件中某字符串出现的行以及该行前后n行
linux下查找文件中某字符串出现的行以及该行前后n行 查找指定字符串的前后n行 grep -A 100 -B 100 "要查找的字符串" 被查找的文件 -A after 后面 - ...
- 探秘公有IP地址与私有IP地址的区别及其在路由控制中的作用
引言 IP地址是互联网通信中至关重要的组成部分.虽然在前一章节我们讲解了IP一些基础知识,但在我们日常生活中,我们经常听到公有IP地址和私有IP地址这两个术语.那么,公有IP地址和私有IP地址有何区别 ...
- WebKit Inside: CSS 样式表解码字符集
CSS 样式表引入有3种方式: 外部样式表.内部样式表.行内样式,不同的引入方式,解码样式表的字符集原理不一样. 外部样式表 外部样式表由 link 标签引入,当 WebKit 解析到 link 标签 ...
- 使用playwright爬取魔笔小说网站并下载轻小说资源
一.安装python 官网 下载python3.9及以上版本 二.安装playwright playwright是微软公司2020年初发布的新一代自动化测试工具,相较于目前最常用的Selenium,它 ...
- 每个后端都应该了解的OpenResty入门以及网关安全实战
简介 在官网上对 OpenResty 是这样介绍的(http://openresty.org): "OpenResty 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成 ...
- RL 基础 | Value Iteration 的收敛性证明
(其实是专业课作业 感觉算法岗面试可能会问,来存一下档) 目录 问题:证明 Value Iteration 收敛性 0 Definitions - 定义 1 Bellman operator is a ...
- Kubernetes 中使用consul-template渲染配置
Kubernetes 中使用consul-template渲染配置 当前公司使用consul来实现服务发现,如Prometheue配置中的target和alertmanager注册都采用了consul ...
- 【2023年更新】git 常用口令
1.已关联远程 fatal: remote origin already exists. 先输入$ git remote rm origin(删除关联的origin的远程库) 2.关联新远程 ...
- 测试技术:开源测试工具 jenkins、Sonar
http://www.cnblogs.com/itech/archive/2011/11/23/2260009.html Jenkins入门总结 基于 Jenkins 快速搭建持续集成环境 https ...
- CSS z-index属性层重叠顺序
作者:WangMin 格言:努力做好自己喜欢的每一件事 对于所有定位,最后都不免遇到两个元素试图放在同一位置上的情况.显然,其中一个必须遮住另一个.但是如何控制哪个元素放在上层,这就出现了z-inde ...