{"_id":"@ernan2/midway-mqtt","_rev":"27-2d0a70ecb4eb40bb80f3de8b307763be","time":{"0.1.0":"2021-11-19T03:08:35.264Z","created":"2021-11-19T03:09:00.270Z","0.1.1":"2021-11-19T03:09:00.459Z","modified":"2022-04-05T08:09:36.764Z","0.1.2":"2021-12-23T05:13:11.278Z","0.1.3":"2021-12-23T06:00:31.294Z","2.0.0":"2022-03-02T03:24:04.242Z","2.0.1":"2022-03-02T03:29:31.543Z","3.0.0-0":"2022-03-24T06:29:54.788Z"},"name":"@ernan2/midway-mqtt","dist-tags":{"latest":"3.0.0-0"},"versions":{"0.1.1":{"name":"@ernan2/midway-mqtt","version":"0.1.1","main":"dist/index.js","license":"MIT","scripts":{"build":"tsc","test":"node --require=ts-node/register node_modules/.bin/jest","cov":"node --require=ts-node/register node_modules/.bin/jest --coverage --forceExit","prepublish":"npm run build","lint:fix":"mwts fix"},"devDependencies":{"@midwayjs/decorator":"^2.11.1","jest":"^27.0.6","mwts":"^1.2.2","ts-node":"^10.1.0","typescript":"^4.3.5"},"dependencies":{"@midwayjs/core":"^2.11.4","@midwayjs/logger":"^2.11.3","mqtt":"^4.2.8"},"gitHead":"65fd029a23c1bc836b533d05158f4c944a3b979c","description":"this is a sub package for midway.","_id":"@ernan2/midway-mqtt@0.1.1","_nodeVersion":"14.17.6","_npmVersion":"6.14.15","dist":{"integrity":"sha512-SfQYwsyxvfDKCb4Pqf3L5xIuV16+d17SM1N4uOujvv4SVEn1+TWHGRivKW3UDAaxZ8xUM/G+fLtiCWvTJYfHtg==","shasum":"645d7fe6569d458606762d69c51176c355286b99","tarball":"https://registry.npmjs.org/@ernan2/midway-mqtt/-/midway-mqtt-0.1.1.tgz","fileCount":23,"unpackedSize":20237,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhlxVMCRA9TVsSAnZWagAAT/AP/3nlGAJVQOwEgv7oiJuk\nrbJUam27W3krV9y5wWkj7ZNbnraXhVYx1fPoSjr49IyXOL1KjJKxxqXm8n+i\nMrd6wS56N62JkIXR5hsq59rnkOctMx0mMIZyCwnnC82NUz7LulNEvnBMgW+q\nCFt5917PgmC6QxDsyZOOGviG5xM5PpzVdcKp/TnyvlFthB5Xl/CZvcaDtKsz\np/JlsyBC7blNQ2Qpe/O4jU2aUb7VlqZU2uL8NHfqKEGze/whpeh7XoHAovbH\nSDbFoYXhRCYYxnW75wf1MXVOU1bqY0SJyT1lU063YPl/nk4dyd44ZaVN5jL2\nKrWui7eJR6VyMxZYtHC4t1VSSM9aI5S5JPVnxdbBE9el+/aELuKNO9YlBib7\n5LgCQ73ff1jN3TuHlTtf+UPfg5gGLaXritEnlLO4cLX/WOSdxpGcWifRynFz\nkktR8OsJIehILRuP3JQT/VxeVNS6Vn0HKW1LcrGpiuB0SxOxQ55GOdcpLDHT\nHwRNuV648SUbsNFGjRMHqDAfexzWHqfqz/kl6m/xy9HkCKhFIVzecURIoD6x\nCjohJb5cpozs3ZpsCYQovPQn0eQgptj0HVN6gprEhqLcRNzh7DOgj0L9nJCN\nOYDMk3CRMzxrvaOHiZ8uKUA9qhtnA8H2wNSpQKHXwMwOBZm8v64hfg/sJnlJ\nh+VY\r\n=xjOo\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEN3WLrbe2/gWQ4aSD0gx3bTCQjXsucC1dGdbBdOJ2geAiB+OMj9RXXGNRkbhIpFRgnAy3/48uyD1G1fQtjlaEsAuA=="}]},"_npmUser":{"name":"ernan2","email":"liaoernan@163.com"},"directories":{},"maintainers":[{"name":"ernan2","email":"liaoernan@163.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/midway-mqtt_0.1.1_1637291340308_0.1945571596500486"},"_hasShrinkwrap":false},"0.1.3":{"name":"@ernan2/midway-mqtt","version":"0.1.3","main":"dist/index.js","license":"MIT","scripts":{"build":"tsc","test":"node --require=ts-node/register node_modules/.bin/jest","cov":"node --require=ts-node/register node_modules/.bin/jest --coverage --forceExit","prepublish":"npm run build","lint:fix":"mwts fix"},"devDependencies":{"@midwayjs/decorator":"^2.11.1","jest":"^27.0.6","mwts":"^1.2.2","ts-node":"^10.1.0","typescript":"^4.3.5"},"dependencies":{"@midwayjs/core":"^2.11.4","@midwayjs/logger":"^2.11.3","mqtt":"^4.2.8"},"gitHead":"65fd029a23c1bc836b533d05158f4c944a3b979c","description":"this is a sub package for midway.","_id":"@ernan2/midway-mqtt@0.1.3","_nodeVersion":"14.17.6","_npmVersion":"6.14.15","dist":{"integrity":"sha512-FUSLlZwPk8qmV3Mwt4hk1Kcv1eUCh57hMRy33fHuj6iP1EhLj49ESfjrQurZ1a75a4Nnrpad/Pq8A8JkjiPfoQ==","shasum":"558f4c2c0b5573d33533cfe2fe27c317f3cd5364","tarball":"https://registry.npmjs.org/@ernan2/midway-mqtt/-/midway-mqtt-0.1.3.tgz","fileCount":29,"unpackedSize":23601,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhxBB/CRA9TVsSAnZWagAAMN0P/1V6nAXhAY8RI2hVn7yQ\nCTw3yFyIIKjfbggE4/5wl00NvQ8iVw0BoOLhhAFpi/asAy33zuBbyrciFX7o\nTGTzv5XMmL5LX6xF6D+aFNyjrBmtXmjQrrO05wIMiU0XA46yABtvWYCnyh7W\nOoy6DmmJafMnuQ65OtSm3FRWnUE19JTcuu6WD3AEvXoEWhrUw9li5X8OBV0H\nvHixwz8uBB6/cKTjnl4jbVh5uBXfELrd3J4MKPzpQSZo0q+iaj2IrJCorQv6\nVnkZiB5FCU6bWc48oHq16srfIOBAFj5GVgb5Si+p1ZkbLpR8Wq/JlH+xZUe4\nNZJ7bWjWblfHM2awBNhuW1zk7oNDlsk8mM6m1+rgediglBCgqjcFnMvOVzp3\ng5jlxSfEem8Fk8GZtB5B0NFDcaXHn3th+ldz4HjmAtl3c0VcfddpQiskdFFS\nI//H/veX7hILpCULn4YgaRFKpE/2GnatCQTOa6vOYltuH0N7z/rUVPYSS+hz\n5RrmsLpDUJQ2WjHC479/PM137o14r4WMxARsHWD317RRcD8ZLyoUgzpvJb9H\njxtkIOy8FQyXHXPzYAk0vMW7VTV4OyzjHUVcXPKOH97+pRRrgv+3sGEU0laj\nZ3ZuAarLUa5pofDVbCkj2q+jgjqhJHaUVjFsL8PtnlDiHi/iQjZ3oTILf9aD\n/Me2\r\n=JneQ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC/BqZGEeD3nbA9wRh8k0MDhylYJI9/i/FidfLX+zFEQQIhAJkkFr3n8tkBB0McwcVQufKC1uqE7UWPDFpvCMdYzrxJ"}]},"_npmUser":{"name":"ernan2","email":"liaoernan@163.com"},"directories":{},"maintainers":[{"name":"ernan2","email":"liaoernan@163.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/midway-mqtt_0.1.3_1640239231163_0.29787048248652637"},"_hasShrinkwrap":false},"2.0.1":{"name":"@ernan2/midway-mqtt","version":"2.0.1","main":"dist/index.js","license":"MIT","scripts":{"build":"tsc","test":"node --require=ts-node/register node_modules/.bin/jest","cov":"node --require=ts-node/register node_modules/.bin/jest --coverage --forceExit","prepublish":"npm run build","lint:fix":"mwts fix"},"devDependencies":{"@midwayjs/decorator":"^2.11.1","@types/jest":"^27.4.1","jest":"^27.0.6","mwts":"^1.2.2","ts-jest":"^27.1.3","ts-node":"^10.1.0","typescript":"^4.3.5"},"dependencies":{"@midwayjs/core":"^2.11.4","@midwayjs/logger":"^2.11.3","memoizee":"^0.4.15","mqtt":"^4.2.8"},"gitHead":"5c7245304b83552586e232e05ba9cefc3a199a9d","description":"this is a sub package for midway.","_id":"@ernan2/midway-mqtt@2.0.1","_nodeVersion":"14.17.6","_npmVersion":"6.14.15","dist":{"integrity":"sha512-i5QVb0iau3UknNicWhGWm+ZaISzhlUFjHWCb37L2hlCjvLwbyZjysc5xvSPzWWqjy5ud+dekSmMGYLzfBXYbwg==","shasum":"d401b0b62a2279c9381901b8e658c45f54bab3a3","tarball":"https://registry.npmjs.org/@ernan2/midway-mqtt/-/midway-mqtt-2.0.1.tgz","fileCount":48,"unpackedSize":94177,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiHuSbACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmq9Ww//aQSwQy+8rk3qw+EdiqtzR1xMbGYCDOjwOiwHkhqCNN1rT81Q\r\niUyWrGvBEwzLkYsKO83cGko419HFNWBsOLUQXzr/hC6twZ0gMnpFHpacj7T0\r\ncey+ahGSkj1mwJL3uDqOPBCzrH4cdW6xHZOvlOX/BCptM+2AtRD8m9IBcHOK\r\nT/kl7U1xL3MhKu8XP+2jXRBXABneybx0pbxA9z0Q4ZvwN3xjoESnm4b7oAIS\r\ny+mtcNIZLoU6KpTMO7xNKIs3BiCcEuw76VMcy9OwxC+vZAGF2tlG6a0/EMtk\r\ntsZF9KrYQKcjxIUQu/m6kkPh9bm1ZO5xp4f6ZkZLhvETXObtTYFTjRjhJN9v\r\nxqWrdVdSgWJVDPoy/jsWVQ+tTc3+Nene6Ja7jHE14HQV/dRCDIXS+UCXTeHW\r\nwHzvO0oA0qzga80AYFKhyiw66O3hliHS+COP7OcQdVMP77w1VRs9PRUAGFKj\r\ntE/Wix2V7eD/jZaagSZKnfUCfTIcQQVd/Vk+rAKsTN2x0Uagka7QjBSHbasQ\r\nqFEFOprkulDA54Zp5LIKXPAqOvjNSyHwWDLYbNJ8qU1Wa8F2NbUqe7BHBf0h\r\nqR5ib3XNzcC99C1NIZwOmY//CMT7cHg5KFTSwMeYv5LdI5uuVRfVmiVgd0Lm\r\nqyMqhsiFtjiijlsYpz41eDI24Qq6JguF/no=\r\n=rkfy\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIENgAFLqgBtBsqf3QhJYgD07uUQnFiRVcAiBHWh32fGSAiB1NEibTameSmkCFjfbsslVrxeSLC/B5m5yPykoHoXKmQ=="}]},"_npmUser":{"name":"ernan2","email":"liaoernan@163.com"},"directories":{},"maintainers":[{"name":"ernan2","email":"liaoernan@163.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/midway-mqtt_2.0.1_1646191771328_0.5938754020325316"},"_hasShrinkwrap":false},"3.0.0-0":{"name":"@ernan2/midway-mqtt","version":"3.0.0-0","main":"dist/index.js","license":"MIT","scripts":{"build":"tsc","test":"node --require=ts-node/register node_modules/.bin/jest","cov":"node --require=ts-node/register node_modules/.bin/jest --coverage --forceExit","dev":"cross-env NODE_ENV=local midway-bin dev --ts","prepublish":"npm run build","lint:fix":"mwts fix"},"devDependencies":{"@midwayjs/decorator":"^3.1.6","@types/jest":"^27.4.1","jest":"^27.0.6","mwts":"^1.2.2","ts-jest":"^27.1.3","ts-node":"^10.1.0","typescript":"^4.3.5"},"dependencies":{"@midwayjs/bootstrap":"^3.1.6","@midwayjs/core":"^3.1.6","@midwayjs/logger":"^2.11.3","memoizee":"^0.4.15","mqtt":"^4.2.8"},"gitHead":"27440cdfc0c3ee8bff1015f20bdcb2994415fcca","description":"this is a sub package for midway.","_id":"@ernan2/midway-mqtt@3.0.0-0","_nodeVersion":"14.17.6","_npmVersion":"6.14.15","dist":{"integrity":"sha512-wuTxH+vQFkeYM97VZcZDzbin0qPEAr/t11CvSQHmUHKNkf3xkOqjVP7HJvLSrC/5Jzbefuc4y9BceC5Zj5AfeQ==","shasum":"19103e8a5c5ee01edb218d75f68c007091933c03","tarball":"https://registry.npmjs.org/@ernan2/midway-mqtt/-/midway-mqtt-3.0.0-0.tgz","fileCount":42,"unpackedSize":398736,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiPA/iACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmqa8A//QVDa6e1QMgRWiJasOfuol8XEUl5LxTeZDfWXq9dsV33TcRkj\r\n6EJXNVVPa9bhqxGAYs/qW/QIpNDSzOrc4B1nbBIRnKCTBRuz/OB+4dz93uhN\r\nD3grc8Kn6TpeJFy3Z1ktNDL+/P2FCZ7KFnwC8s3a0V0VrNjr99drPFqSgJx+\r\n9uHSCWLrZSgp4SuDo+F1bTQw6OQCd4j9phe3tYx+S1GT1JINyjGsIqc0RNph\r\nzY6zwzL1xVHEsLGlA/Rm9lC83+v3mVicWc+8bJ+O9RyBjwRMS+aJHzCNPcw6\r\n30Hw6X4PduJ5UUBHZq3IgKrXk1gkKBL9DqpGxLiTjoHOhMXLeFhIz/DDo1Vr\r\nhMjluO/UOScLbyFr2621s1iyn0y1Sf5Xj6tqrxgZ5GP17uNgPnft267kB1de\r\nm3hlZ5PKPS4z1eQfNc7PQylKaEpC2vvvq/LBxU3Jm+v0d7rKh5+jILpKKm0Q\r\neXO7UfT9YVCryoReFJxRFhqEaq3IfXeAjSxtcJn1TTEqxynA/FWNlyM7g/K0\r\nNfgRmyy5EUKYMz01RWYwTQcvZC7I3cuBwbOPRbm5Uf6XSYoLchv7eOw9u5bD\r\nTbSYj2mg2OmhEHqx1NgPUfZ0PYGcKbZm90ZkzhBgK36k0bKDM3FeSi8fjr1W\r\n+kD2VHdWkbBZCIgJgq21TMhUPTibjGro5No=\r\n=g+29\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCzB72cMkkGpgToyaqd2m5dUO8SItFYzqm/99ZMCwXu1wIgaYlywtO3m0SkvvrlgDKkF0BYkw7DFsuWGsU2bfD7KR4="}]},"_npmUser":{"name":"ernan2","email":"liaoernan@163.com"},"directories":{},"maintainers":[{"name":"ernan2","email":"liaoernan@163.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/midway-mqtt_3.0.0-0_1648103394376_0.2464275707269068"},"_hasShrinkwrap":false}},"maintainers":[{"name":"ernan2","email":"liaoernan@163.com"}],"description":"this is a sub package for midway.","license":"MIT","readme":"# midway framework for mqtt\n\nthis is a sub package for midway.\n\nthis module use [mqtt](https://github.com/mqttjs/MQTT.js)\n\n## 消费者（Consumer）使用方法\n\n提供了订阅 mqtt 的能力，并能够独立部署和使用。安装 @ernan2/midway-mqtt 模块及其定义。\n\n``` bash\n npm i @ernan2/midway-mqtt@3 --save\n npm i mqtt --save\n```\n\n### 入口函数\n\n和 Web 一样，创建一个入口文件，指定 Framework 即可。\n\n``` js\n// server.js\nconst { Bootstrap } = require('@midwayjs/bootstrap');\nconst Framework = require('@ernan2/midway-mqtt').Framework;\n\nconst Framework = new Framework().configure({\n  url: 'mqtt://localhost',\n  options: {\n    username: '',\n    password: '',\n    clientId: '',\n    // clean: true,\n    // will: { retain: false },\n  },\n});\nBootstrap.load(Framework).run();\n```\n\n整个启动的配置为：\n\n``` ts\nexport type IMidwayMqttConfigurationOptions = {\n  url: string;\n  options?: mqtt.IClientOptions\n}\n```\n\n### 订阅 mqtt\n\n我们一般把能力分为生产者和消费者，而订阅正是消费者的能力。\n\n我们一般把消费者放在 consumer 目录。比如 src/consumer/userConsumer.ts\n\n``` text\n➜  my_midway_app tree\n.\n├── src\n│   ├── consumer\n│   │   └── userConsumer.ts\n│   └── interface.ts\n├── test\n├── package.json\n└── tsconfig.json\n```\n\n代码示例如下。\n\n``` ts\nimport {\n  Provide,\n  Consumer,\n  MSListenerType,\n  Inject,\n  Logger,\n} from '@midwayjs/decorator';\n\nimport { MqttListener, Context } from '@ernan2/midway-mqtt';\n\n@Provide()\n@Consumer(MSListenerType.MQTT)\nexport class MqttConsumer {\n  @Inject() logger: ILogger;\n  @Inject() ctx: Context;\n\n  @MqttListener('reply-to/queue', { qos: 0 })\n  async reply(topic: string, payload: Buffer) {\n    // producer\n    this.ctx.mqttClient.publish('receive/queue', JSON.stringify({msg: 'hello receive'}))\n  }\n\n  @MqttListener('receive/queue', { qos: 0 })\n  async receive(topic: string, payload: Buffer) {\n    // payload.toString() === '{\"msg\":\"hello receive\"}'\n  }\n\n  @MqttListener('hello/#', { qos: 0 })\n  async gotData(topic: string, payload: Buffer) {\n  }\n\n  @MqttListener('hello/+/post', { qos: 0 })\n  async gotWildcardData(topic: string, payload: Buffer) {\n  }\n\n  @MqttListener('$queue/hello/+/post')\n  async gotQueueData(topic: string, payload: Buffer) {\n  }\n\n  @MqttListener('$share/group/hello/+/post')\n  async gotShareData(topic: string, payload: Buffer) {\n  }\n}\n```\n\n@Consumer 装饰器，提供消费者标识，并且它的参数，指定了某种消费框架的类型，比如，我们这里指定了 MSListenerType.MQTT\n 这个类型，指的就是 mqtt 类型。\n\n标识了 @Consumer 的类，对方法使用 @MqttListener\n 装饰器后，可订阅一个 mqtt 的 Topic。\n\n方法的参数为订阅收到的 topic 和 payload\n\n### mqtt 订阅上下文\n\n订阅 mqtt topic的上下文，其中包含每次接收消息的数据。\n从 ctx 上可以取到 mqttClient ，整个 ctx 的定义为：\n\n```ts\nexport type Context = {\n  mqttClient: mqtt.MqttClient;\n};\n```\n\n可以从框架获取定义\n\n```ts\nimport { Context } from '@ernan2/midway-mqtt';\n```\n\n### MqttListener 装饰器参数\n\n@MqttListener 装饰器的第一个参数为 topic，代表需要订阅的 topic。​\n第二个参数是一个 mqtt.IClientSubscribeOptions 对象， 默认值\n\n```json\n  { qos: 0 }\n```\n\nmqtt.IClientSubscribeOptions 详细定义如下：\n\n```ts\nexport interface IClientSubscribeOptions {\n  /**\n   * the QoS\n   */\n  qos: QoS,\n  /*\n  * no local flag\n  * */\n  nl?: boolean,\n  /*\n  * Retain As Published flag\n  * */\n  rap?: boolean,\n  /*\n  * Retain Handling option\n  * */\n  rh?: number\n}\n```\n\n## 生产者（ Publish ）使用方法\n\n生产者（ Publish ）也就是第一节中的消息产生者，简单的来说就是会创建一个客户端，将消息发送到 mqtt 服务。​\n\n注意：当前 Midway 并没有使用组件来支持消息发送，这里展示的示例只是使用纯 SDK 在 Midway 中的写法。​\n\n### 安装依赖\n\n```bash\n npm i @ernan2/midway-mqtt@2 --save\n npm i mqtt --save\n\n // or\n yarn add @ernan2/midway-mqtt@2\n yarn add mqtt\n\n```\n\n### 调用服务发送消息\n\n比如，我们在 service 文件下，新增一个 mqtt.ts 文件。\n\n```ts\nimport {\n  Provide,\n  Scope,\n  ScopeEnum,\n  Init,\n  Config,\n  Autoload,\n  Destroy,\n  Logger,\n} from '@midwayjs/decorator';\nimport { MqttServer as Mqtt, IClientSubscribeOptions, } from '@ernan2/midway-mqtt';\nimport { ILogger } from '@midwayjs/logger';\nimport * as mqtt from 'mqtt';\n\n@Autoload()\n@Scope(ScopeEnum.Singleton)\n@Provide('mqttService')\nexport class MqttService {\n  @Logger() logger: ILogger;\n  private client: Mqtt;\n\n  @Init()\n  async connect() {\n    this.client = new Mqtt({logger: this.logger});\n    await this.client.connect({\n      url: 'mqtt://localhost',\n      options: {\n        username: '',\n        password: '',\n        clientId: '',\n        // clean: true,\n        // will: { retain: false },\n      },\n    });\n  }\n\n  // 发送消息\n  public async publish(\n    topic: string,\n    data: string | Buffer,\n    opts?: mqtt.IClientPublishOptions\n  ) {\n    return this.client.publish(topic, data, opts);\n  }\n\n  @Destroy()\n  async close() {\n    this.client.close();\n  }\n}\n```\n\n大概就是创建了一个用来封装消息通信的 service，同时他是全局唯一的 Singleton 单例。由于增加了 @AutoLoad 装饰器，可以自执行初始化。​\n\n这样基础的调用服务就抽象好了，我们只需要在用到的地方，调用 publish 方法即可。​\n\n比如：​\n\n```ts\n@Provide()\nexport class UserService {\n  @Inject()\n  mqttService: MqttService;\n\n  async invoke() {\n    // TODO\n\n    // 发送消息\n    await this.mqttService.publish('topic', JSON.stringify({ hello: 'world' }), { qos: 0 });\n  }\n}\n```\n\n## 参考文档\n\n[mqtt.js](https://www.npmjs.com/package/mqtt)\n\n[Midwayjs rabbitmq](http://www.midwayjs.org/docs/extensions/rabbitmq)\n\n## 联系我(欢迎交流)\n\n<img src=\"https://user-images.githubusercontent.com/18132383/156308667-458a7672-2e13-4002-b439-eb8978b8b53f.jpg\" width=\"150px\">\n","readmeFilename":"README.md"}