公司是做loraWAN开发的,由于使用lora server project作为服务器,经常需要MQTT来测试设备,用nodejs的mqtt包简单实现命令行工具,但是鉴于开发人员太多只熟悉c语言什么的,装个nodejs还会很莫名其妙,就做了一个带有服务端和web客户端的项目。
项目地址:https://github.com/HobaiRiku/loraserver-mqtt-test-console
主要功能:
- 向一个loraserver的mqtt服务端发起连接
- 订阅指定的rx主题并实时接收设备的mqtt消息
- 设备fCnt计数以及丢包率统计
- mqtt下行消息
这个工具也是在使用中逐步变化来的,由原来的只用命令行变为有简单html+websoeckt的本地服务+客户端,后来应需求(开发人员不方便也不熟悉部署和使用nodejs环境)就用vue和element写了界面,koa+websocket写了多用户能够同时创建mqtt实时连接的服务端。 基本就是:
import {Server} from 'http';
import * as Koa from 'koa';
import * as mqtt from 'mqtt';
import {server as WebSocketServer, request, IMessage,} from 'websocket';
const app = new Koa();
// 配置koa路由等等....
const server: Server = app.listen(4889);
// 加载websocket服务
let wsServer = new WebSocketServer({
httpServer: server,
autoAcceptConnections: false
});
// 处理一个ws的会话
wsServer.on('request', function (request: request) {
let mqttClient: mqtt.MqttClient;
// do something
}
这里比较简单粗暴,也没有做什么封装,就直接在一个ws的request中处理所有的数据包,web发过来的数据,是要带有协议的,用if一个一个判断协议,做不同处理,比如创建mqtt连接,一个会话就只初始化一个mqttClient,然后做连接、订阅、监听转发、发布等操作。之前考虑过用socketio,但是一下子还没想好如何处理客户端和mqttClient的绑定标识,就直接一个一个请求干完了。
后续可能会用http接口模式更改,使用全局存储mqttClient并对应客户端,websocket就只处理mqtt消息的转发。
对于vue的ui也是很简单,因为不太会css,就用element-ui写了一个页面+一大堆websocket的数据处理。 其实最好是写electron应用,就不用考虑什么服务端了,还在学习中。 截图: