Skip to content

Abstraction layer for Protocol to MQTT/REST bridge implementations

Notifications You must be signed in to change notification settings

74Labs/nestjs-protocol-mqtt-rest-bridge

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

NestJS Protocol MQTT/REST Bridge

NestJS abstraction layer for buliding any protocol to MQTT and/or REST bridges.

Configuration

Bridge module expects configuration provided via ConfigModule with following configuration keys (with default values):

CONFIG_MQTT_CLIENT_ID: string = 'mqtt.clientId'
CONFIG_MQTT_HOST: string = 'mqtt.host'
CONFIG_MQTT_PORT: string = 'mqtt.port'

DEFAULT_MQTT_CLIENT_ID: string = 'protocol-gateway'
DEFAULT_MQTT_HOST: string = 'localhost'
DEFAULT_MQTT_PORT: number = 1883

Example:

{
  mqtt: {
    clientId: 'protocol-gateway',
    host: 'localhost',
    port: 1883
  }
}

Bridge performs MQTT publisher only connection initialization with options like this:

{
  clientId: cfg.get<string>(CONFIG_MQTT_CLIENT_ID, DEFAULT_MQTT_CLIENT_ID) + '-pub',
  host: cfg.get<string>(CONFIG_MQTT_HOST, DEFAULT_MQTT_HOST),
  port: cfg.get<number>(CONFIG_MQTT_PORT, DEFAULT_MQTT_PORT),
  protocolVersion: 5,
  connectTimeout: 5000,
  reconnectPeriod: 1000,
}

MQTT client for subscription should be provide in your main.ts like this:

const app = await NestFactory.create(AppModule)

const cfg = app.get(ConfigService)

app.connectMicroservice<MicroserviceOptions>({
  transport: Transport.MQTT,
  options: {
    host: cfg.get<string>(CONFIG_MQTT_HOST, DEFAULT_MQTT_HOST),
    port: cfg.get<number>(CONFIG_MQTT_PORT, DEFAULT_MQTT_PORT),
    clientId: cfg.get<string>(CONFIG_MQTT_CLIENT_ID, DEFAULT_MQTT_CLIENT_ID) + '-sub',
    protocolVersion: 5,
    connectTimeout: 5000,
    reconnectPeriod: 1000,
  },
});

Implementation

Create your own protocol module

@Module({
  imports: [
    ProtocolMqttBridgeModule,
  ],
  providers: [
    YourProtocolService
  ],
  controllers: [
    YourProtocolController
  ],
  exports: [
    YourProtocolService
  ]
})
export class YourProtocolModule { }

Create your own protocol service

import { ProtocolReadVariableConfig, ProtocolService, ProtocolWriteVariableConfig } from '@74labs/nestjs-protocol-mqtt-bridge'

export type YourProtocolConnection = any
export type YourProtocolVariableId = string

@Injectable()
export class YourProtocolService extends ProtocolService<YourProtocolConnection, YourProtocolVariableId> implements OnModuleDestroy {

  constructor(private config: ConfigService) {
    super('MY-PROTO')
    // Create connection for all devices that you want to bridge
    this.config.get<any[]>('devices', []).forEach(device => this.connect(device.name, device.params))
  }

  // You should override these methods:

  override protocolConnect(params: any): Observable<YourProtocolConnection> {
    // return Observable with your protocol connection
  }

  override protocolConnectionCheck(connection: YourProtocolConnection): boolean {
    // return true if your connection is still healthy
  }

  override protocolRead(connection: YourProtocolConnection, vars: ProtocolReadVariableConfig<YourProtocolVariableId>[]): Observable<any[]> {
    // return Observable with array of values of variables identified via vars param
  }

  override protocolWrite(connection: YourProtocolConnection, vars: ProtocolWriteVariableConfig<YourProtocolVariableId>[]): Observable<void> {
    // write variables identified by vars param with provided values
  }

  override protocolDisconnect(connection: YourProtocolConnection): Observable<void> {
    // disconnect provided connection
  }

}

About

Abstraction layer for Protocol to MQTT/REST bridge implementations

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published