微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Nestjs ClientMqtt.emit 将模式和数据发布到代理,而不仅仅是数据

如何解决Nestjs ClientMqtt.emit 将模式和数据发布到代理,而不仅仅是数据

我使用 nestjs 将数据发布到 Mqtt broker,但它同时发送模式和数据,而不仅仅是这样的数据:

{
    "pattern": "test/test","data": "Data"
}

app.module.ts 中,我像这样导入 MQTT 客户端:

@Module({
    imports: [
        ClientsModule.register([
            {
                name: 'MQTT_CLIENT',transport: Transport.MQTT,options: {
                    url: 'tcp://abc.abc.com',username: 'name',password: 'psswrd',port: 1883,},]),],controllers: [AppController],providers: [AppService],})

并在app.controller.ts中:

@Controller()
export class AppController {
    constructor(@Inject('MQTT_CLIENT') private client: ClientMqtt) {}

    async onApplicationBootstrap() {
        await this.client.connect();
    }

    @Get()
    getHello(): string {
        this.client.emit('test/test','Data')
        return 'Done';
    }
}

我还发现在 ClientMqtt 代理 source code 中,方法 publish 是发布所有 partialPacket,即 JSON {pattern,data} 而不仅仅是 { {1}}

packet.data

所以如果我只是想使用protected publish( partialPacket: ReadPacket,callback: (packet: WritePacket) => any,): Function { try { const packet = this.assignPacketId(partialPacket); const pattern = this.normalizePattern(partialPacket.pattern); ... this.mqttClient.publish( this.getAckPatternName(pattern),JSON.stringify(packet),); }); ... } 代理而只是发布数据包的数据字段,我该怎么做?

解决方法

您可以使用序列化程序更改发送到 MQTT 代理的消息的结构。为此,您需要在 ClientsModule 注册中包含“serializer”属性:

this.init(savedInstanceState,new ArrayList<Class<? extends Plugin>>() {{
-            // Additional plugins you've installed go here
-            add(Plugin1.class);
-            add(Plugin2.class);
-        }});

通过此更改,您需要在其他实现“serialize”方法的文件中创建“OutboundResponseSerializer”类:

@Module({
    imports: [
        ClientsModule.register([
            {
                name: 'MQTT_CLIENT',transport: Transport.MQTT,options: {
                    url: 'tcp://abc.abc.com',username: 'name',password: 'psswrd',port: 1883,serializer: new OutboundResponseSerializer()
                },},]),],controllers: [AppController],providers: [AppService],})

通过此更改,您的消息仅包含数据信息。

您可以在以下链接中的“实现序列化程序和反序列化程序”部分中找到更多相关信息:https://dev.to/nestjs/integrate-nestjs-with-external-services-using-microservice-transporters-part-3-4m20

,

我遇到了和你一样的问题,我用的是nest-mqtt

,

app.module.ts

import { Module } from '@nestjs/common';
import { MqttModule } from 'nest-mqtt';
import { AppService } from './app.service';
import { AppController } from './app.controller';

@Module({
  imports: [
    MqttModule.forRoot({
      host: '192.168.0.73',clientId: 'clientId',username: 'your username',password: 'your password',clean: false,}),})
export class AppModule {}

app.service.ts

/**nest-mqtt */
import { MqttService,Payload,Subscribe } from 'nest-mqtt';


/**nestjs common */
import { HttpException,HttpStatus,Inject,Injectable } from '@nestjs/common';

@Injectable()
export class AppService {

  constructor(
    @Inject(MqttService) private readonly mqttService: MqttService,) {}


  /**Subscription information */
  @Subscribe('your subject')
  async handleGetDeviceData(@Payload() payload: ISubjectSendData) {
   // Processing received messages
  }

  /**publish payload */
  async handelSendMsgToDevice(device: string,payload: any) {
    this.mqttService.publish(device,payload);
  }

}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。