如何解决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 举报,一经查实,本站将立刻删除。