MQTT-Nodejs

概要:使用Aedes包实现MQTT服务器,在前端使用mqtt.js订阅发布消息

1 服务端的实现

Simple plain MQTT server

const aedes = require('aedes')()
const server = require('net').createServer(aedes.handle)
const port = 1883

server.listen(port, function () {
  console.log('server started and listening on port ', port)
})

  

Simple plain MQTT server using server-factory

const aedes = require('aedes')()
const { createServer } = require('aedes-server-factory')
const port = 1883

const server = createServer(aedes)

server.listen(port, function () {
  console.log('server started and listening on port ', port)
})

  

MQTT over TLS / MQTTS

const fs = require('fs')
const aedes = require('aedes')()
const port = 8883

const options = {
  key: fs.readFileSync('YOUR_PRIVATE_KEY_FILE.pem'),
  cert: fs.readFileSync('YOUR_PUBLIC_CERT_FILE.pem')
}

const server = require('tls').createServer(options, aedes.handle)

server.listen(port, function () {
  console.log('server started and listening on port ', port)
})

  

MQTT server over WebSocket

const aedes = require('aedes')()
const httpServer = require('http').createServer()
const ws = require('websocket-stream')
const port = 8888

ws.createServer({ server: httpServer }, aedes.handle)

httpServer.listen(port, function () {
  console.log('websocket server listening on port ', port)
})

 

MQTT server over WebSocket using server-factory

const aedes = require('aedes')()
const { createServer } = require('aedes-server-factory')
const port = 8888

const httpServer = createServer(aedes, { ws: true })

httpServer.listen(port, function () {
  console.log('websocket server listening on port ', port)
})

 2 客户端实现(js)

安装mqtt.js

npm install mqtt -s

由于 JavaScript 单线程特性,MQTT.js 是全异步 MQTT 客户端,MQTT.js 支持 MQTT/TCP、MQTT/TLS、MQTT/WebSocket,在不同运行环境支持的度如下:

  • 浏览器环境:MQTT over WebSocket(包括微信小程序、支付宝小程序等定制浏览器环境)
  • Node.js 环境:MQTT、MQTT over WebSocket

node 使用

const mqtt = require('mqtt')
const client = mqtt.connect('mqtt://broker.emqx.io:1883')
client.on('connect', function () { console.log('Connected')
  client.subscribe('test', function (err) { if (!err) {
    client.publish('test', 'Hello mqtt') }
  })
})
client.on('message', function (topic, message) { // message is Buffer
  console.log(message.toString())
  client.end() // 关闭连接
})

前端使用

// CDN
// CDN 会引入全局变量mqt
const client
= mqtt.connect('ws://broker.emqx.io:8083')
  this.client.on('connect',  ()=> {
    // 订阅主题presence
      this.client.subscribe('server',  (err)=> {
          if (!err) {
        // 发布主题presence
            this.client.publish('client', 'Hello mqtt')
          }
      })
  })
  this.client.on('close',  () =>{
        console.log('Disconnected')
  })

  this.client.on('message',  (topic, message) =>{
      // message is Buffer
      console.log(message.toString())
    // 发布主题server
      this.client.publish('server','come from browser.')
  })

// ES6 Module
import * as mqtt from 'mqtt'
const client = mqtt.connect('ws://broker.emqx.io:8083')

 

posted @ 2022-03-04 16:19  Eswing  阅读(691)  评论(0编辑  收藏  举报