Skip to main content

修改mqtt.js项目

MQTT.js项目是目前实现的比较好的JavaScript mqtt客户端实现,支持nodejs、浏览器、微信小程序、支付宝小程序,而且还支持mqtt 5,但毕竟是老外在维护,对小程序没那么重视,下面我们来下载项目代码自己修改。

请先确保电脑上安装了nodejs、git。

下载项目源码

可以用

git clone https://github.com/mqttjs/MQTT.js.git

也可以去项目主页 https://github.com/mqttjs/MQTT.js 下载

下载好解压后进入项目目录 MQTT.js,执行 npm install 安装依赖

如果没有任何错误,就说明依赖安装好了。

1)用喜欢的编辑器打开目录,我用sublime text,打开 MQTT.js/lib/connect/index.js

找到

这里 if 语句判断 ((typeof process !== 'undefined' && process.title !== 'browser') || typeof __webpack_require__ !== 'function') 如果为假才引入wx、wxs、ali、alis协议,在小程序里这个else得不到执行。

但是 typeof process !== 'undefined' 是false,(typeof process !== 'undefined' && process.title !== 'browser')就是false,会判断后面的 typeof __webpack_require__ !== 'function',这个是true,因为__webpack_require__是undefined

所以这里要修改为

这样直接判断前缀就行了,wx这个前缀目前只有微信小程序有,my只有支付宝小程序有。

改完之后就支持wxs协议了。

2)还是在这个文件 MQTT.js/lib/connect/index.js

在第4行 var Store = require('../store') 下面添加

var Buffer = require('buffer/').Buffer

在文件末尾添加 module.exports.Buffer = Buffer

这么做的目的是让小程序支持Buffer

3)继续打开 MQTT.js/node_modules/mqtt-packet/writeToStream.js

在大概804行的 writeVarByteInt 方法里,修改:

return stream.write(buffer)

return stream.write(Buffer.from(buffer))

因为这里的buffer是个Uint8Array类型,写入stream有问题。

最后我们在项目目录执行

npm run browser-build

打包生成一个库文件供我们在小程序里使用。

执行完成后会在当前目录生成dist目录,里边包含了mqtt.js和mqtt.min.js,mqtt.min.js是压缩过的,在生产环境最好使用这个,毕竟小程序对大小有限制。

最后我们把mqtt.min.js复制到小程序的utils目录