This project aims at creating a simple connector and scheduler for automation devices, like industrial PLCs, publishing data to the cloud and more.
SmartIOT.Connector enables you to connect to a variety of IOT sensors and industrial PLCs and distribute their data to an external system in form of an event describing the changed data.
The external system can then process the data being read and can send back to SmartIOT.Connector data to be written to the devices.
SmartIOT.Connector is a good fit for industrial and automation needs, where developers are being asked to abstract away from device communication protocols and must concentrate solely on the business logic to implement.
The following quick start creates an SmartIOT.Connector instance that connects to a device (namely a Siemens PLC) and reads 100 bytes from Tag 20.
Whenever a change is detected in the tag, a message is published to the Mqtt Server specified in the connection string below.
It also listens for incoming messages in topic tagWrite
and tries to write data to tag 22.
For message formats, read the docs here for project SmartIOT.Connector.Messages. JSON serializer is used by default, but Protobuf can also be used, or even your own serializer.
- Create a configuration json file (see this file for configuration reference):
{
"ConnectorConnectionStrings": [
"mqttClient://Server=<IpAddress or hostname>;ClientId=MyClient;Port=1883"
],
"DeviceConfigurations": [
{
"ConnectionString": "snap7://Ip=<IpAddress>;Rack=0;Slot=0;Type=PG",
"DeviceId": "1",
"Enabled": true,
"Name": "Test Device",
"IsPartialReadsEnabled": false,
"IsWriteOptimizationEnabled": true,
"Tags": [
{
"TagId": "DB20",
"TagType": "READ",
"ByteOffset": 0,
"Size": 100,
"Weight": 1
},
{
"TagId": "DB22",
"TagType": "WRITE",
"ByteOffset": 0,
"Size": 100,
"Weight": 1
}
]
}
],
"SchedulerConfiguration": {
"MaxErrorsBeforeReconnection": 10,
"RestartDeviceInErrorTimeoutMillis": 30000,
"WaitTimeAfterErrorMillis": 1000,
"WaitTimeBetweenEveryScheduleMillis": 0,
"WaitTimeBetweenReadSchedulesMillis": 0,
"TerminateAfterNoWriteRequestsDelayMillis": 3000,
"TerminateMinimumDelayMillis": 0
}
}
- Use SmartIotConnectorBuilder to create the connector and run it:
// Build SmartIOT.Connector and bind it to your DI container or wherever you can do this:
var smartiot = new SmartIOT.Connector.Core.SmartIotConnectorBuilder()
.WithAutoDiscoverDeviceDriverFactories()
.WithAutoDiscoverConnectorFactories()
.WithConfigurationJsonFilePath("smartiot-config.json")
.Build();
// Start SmartIOT.Connector whenever you need it to run
smartiot.Start();
// Stop SmartIOT.Connector before shutting down everything
smartiot.Stop();
otherwise, you can add SmartIOT.Connector to DI container with these extension methods:
// this method will start an IHostedService running SmartIOT.Connector
builder.Services.AddSmartIOTConnector(cfg =>
{
// configure here.
cfg.WithAutoDiscoverDeviceDriverFactories()
.WithAutoDiscoverConnectorFactories()
.WithConfigurationJsonFilePath("smartiot-config.json");
});
var app = builder.Build();
// you can configure further..
app.UseSmartIOTConnector(smartIotConnector =>
{
smartIotConnector.AddPrometheus(conf); // for example, adding Prometheus here..
});
- Configuration guide
- Supported devices/protocols
- Connectors guide
- REST API guide
- Customization guide
If you want to run SmartIOT.Connector as a standalone application or as a Docker container, see project SmartIOT.Connector.App for further details.
Here is a quick link to the Docker image repository: https://hub.docker.com/repository/docker/lucadomenichini/smartiot-connector-app
The application SmartIOT.Connector.App supports being run as a WinService. All you need to do is install it and run. Follow this guide for further informations
You can find SmartIOT.Connector packages on nuget.org site and on Visual Studio Package Manager: https://www.nuget.org/packages?q=SmartIOT.Connector
These libraries provide connectivity with underlying devices:
- Snap7 for Siemens S7 plc family, S7300, S71200, S71500 http://snap7.sourceforge.net/
- SnapModbus for devices on ModBus network https://snapmodbus.sourceforge.io/
- S7NetPlus for Siemens S7 plc family, S7300, S71200, S71500 https://github.com/S7NetPlus/s7netplus