MQTT系列實踐二 在EGG中使用mqtt

神奇的包子發表於2018-12-11

egg.js配置

一.首先安裝egg-mqtt外掛

npm install egg-emqtt --save複製程式碼

二.開啟外掛

//config/plugin.ts    
emqtt:{      enable:true,      package:'egg-emqtt',    },
複製程式碼

三.外掛配置

//config/config.default.ts
 config.emqtt={
    client:{
      host:'mqtt://你的mqtt伺服器地址',
      username:'server',
      password:'admin',
      clientId:'egg',
      options: {
        keepalive: 60,
        protocolId: 'MQTT',
        protocolVersion: 4,
        clean: true,
        reconnectPeriod: 1000,
        connectTimeout: 30 * 1000,
        rejectUnauthorized: false,
      },
      msgMiddleware: [ 'msg2json' ],
    }
  };
複製程式碼

四.外掛操作目錄

//app/mqtt/controller
//app/mqtt/middleware複製程式碼

五.路由設定

//app/router.ts
//第一個引數為topic,第二個引數為controller設定,外掛文件中有部分錯誤,此處程式碼,應為如下程式碼,請以本程式碼為準
app.emqtt.route('test',app.mqtt.controller.dzbp.index);
複製程式碼

六.示例程式碼

//app/mqtt/middleware/msg2json.ts
//JSON格式化中介軟體,格式化請求內容,並log到bash中
module.exports = () => {

    return async (ctx, next) => {module.exports = () => {

    return async (ctx, next) => {      try {         ctx.req.message = JSON.parse(ctx.req.msg);      } catch (err) {          ctx.logger.error(err);      }      await next();      ctx.logger.info(`Response_Time: ${ctx.starttime ? Date.now() - ctx.starttime : 0}ms Topic:${ctx.req.topic} Msg: ${ctx.req.msg}`);    };  };
複製程式碼

//app/mqtt/controller/dzbp.ts
//mqtt控制器,處理mqtt請求
module.exports = (app) => {    return class ServerController extends app.Controller {      async index(){
//emqtt.publish方法 向指定topic推送訊息,第一個引數為topic,第二個引數為訊息內容,第三個引數為QOS        
await this.app.emqtt.publish(this.ctx.req.message.name, '收到訊息內容為:'+this.ctx.req.message.msg, { qos: 0 });      
}   
 };  
};
複製程式碼

7.一些說明

1.如果配置了多個客戶端,則可以使用app.emqtt.get(instanceName)獲取特定的mqtt例項,並像上面那樣使用它。

2.由於外掛作者沒有提供d.ts檔案,所以TS開發下,會報錯,vscode中可以右鍵新增定義,或者使用TSLINT的提示功能新增定義,或者在egg的index.d.ts檔案中新增定義,其他編輯器自行尋找解決辦法。

3.為什麼不使用mqtt.js?

 一方面專案基於egg.js構建 使用外掛更加方便,mqtt.js示例在第一篇教程中已經給出,其他問題可以參考文件

感謝您的閱讀


相關文章