Skip to content

Commit 7d81ed3

Browse files
MQTT Bugfixes
1 parent 0b03786 commit 7d81ed3

File tree

6 files changed

+76
-13
lines changed

6 files changed

+76
-13
lines changed

ConsoleApplicationMqqt/Program.cs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,14 @@ class Program
1111
static void Main(string[] args)
1212
{
1313
EasyModbus.EasyModbus2Mqtt easyModbus2Mqtt= new EasyModbus.EasyModbus2Mqtt();
14-
easyModbus2Mqtt.AutomaticReconnect = false;
15-
easyModbus2Mqtt.MqttBrokerAddress = "broker.hivemq.com";
16-
easyModbus2Mqtt.IPAddress = "127.0.0.1";
14+
// easyModbus2Mqtt.AutomaticReconnect = false;
15+
easyModbus2Mqtt.MqttUserName = "sr555";
16+
easyModbus2Mqtt.MqttPassword = "Ironsink51";
17+
easyModbus2Mqtt.MqttBrokerPort = 18972;
18+
//easyModbus2Mqtt.MqttBrokerAddress = "broker.hivemq.com";
19+
// easyModbus2Mqtt.MqttBrokerAddress = "192.168.178.101";
20+
easyModbus2Mqtt.MqttBrokerAddress = "m21.cloudmqtt.com";
21+
easyModbus2Mqtt.ModbusIPAddress = "127.0.0.1";
1722
easyModbus2Mqtt.AddReadOrder(EasyModbus.FunctionCode.ReadCoils, 2, 0, 200, new string[] { "easymodbusclient/customtopic1", "easymodbusclient/customtopic2" });
1823
// easyModbus2Mqtt.AddReadOrder(EasyModbus.FunctionCode.ReadHoldingRegisters, 10, 0, 200);
1924
easyModbus2Mqtt.AddReadOrder(EasyModbus.FunctionCode.ReadInputRegisters, 10, 0, 200);

EasyModbus/EasyModbus2Mqtt.cs

Lines changed: 41 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,9 @@ public class EasyModbus2Mqtt
1919
string mqttRootTopic = "easymodbusclient";
2020
uPLibrary.Networking.M2Mqtt.MqttClient mqttClient;
2121
public bool AutomaticReconnect { get; set; } = true;
22-
22+
public string MqttUserName { get; set; }
23+
public string MqttPassword { get; set; }
24+
2325

2426
public EasyModbus2Mqtt()
2527
{
@@ -123,9 +125,20 @@ public void start()
123125
mqttClient = new uPLibrary.Networking.M2Mqtt.MqttClient(mqttBrokerAddress,mqttBrokerPort,false,null,null, uPLibrary.Networking.M2Mqtt.MqttSslProtocols.None);
124126

125127
string clientID = new Guid().ToString();
126-
mqttClient.Connect(clientID);
127-
if (!modbusClient.Connected)
128-
modbusClient.Connect();
128+
try
129+
{
130+
if (MqttUserName == null || MqttPassword == null)
131+
mqttClient.Connect(clientID);
132+
else
133+
mqttClient.Connect(clientID, MqttUserName, MqttPassword);
134+
if (!modbusClient.Connected)
135+
modbusClient.Connect();
136+
}
137+
catch (Exception exc)
138+
{
139+
if (!this.AutomaticReconnect)
140+
throw exc;
141+
}
129142
for (int i = 0; i < readOrders.Count; i++)
130143
{
131144
readOrders[i].thread = new System.Threading.Thread(new ParameterizedThreadStart(ProcessData));
@@ -144,7 +157,13 @@ public void publish(string[] topic, string[] payload, string mqttBrokerAddress)
144157
mqttClient = new uPLibrary.Networking.M2Mqtt.MqttClient(mqttBrokerAddress, mqttBrokerPort, false, null, null, uPLibrary.Networking.M2Mqtt.MqttSslProtocols.None);
145158
string clientID = Guid.NewGuid().ToString();
146159
if (!mqttClient.IsConnected)
147-
mqttClient.Connect(clientID);
160+
{
161+
if (MqttUserName == null || MqttPassword == null)
162+
mqttClient.Connect(clientID);
163+
else
164+
mqttClient.Connect(clientID, MqttUserName, MqttPassword);
165+
}
166+
148167
for (int i = 0; i < payload.Length; i++)
149168
mqttClient.Publish(topic[i], Encoding.UTF8.GetBytes(payload[i]), MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE, false);
150169

@@ -163,7 +182,23 @@ private void ProcessData(object param)
163182
{
164183
while (!shouldStop)
165184
{
166-
185+
try
186+
{
187+
if (!mqttClient.IsConnected)
188+
{
189+
mqttClient = new uPLibrary.Networking.M2Mqtt.MqttClient(mqttBrokerAddress, mqttBrokerPort, false, null, null, uPLibrary.Networking.M2Mqtt.MqttSslProtocols.None);
190+
string clientID = Guid.NewGuid().ToString();
191+
if (MqttUserName == null || MqttPassword == null)
192+
mqttClient.Connect(clientID);
193+
else
194+
mqttClient.Connect(clientID, MqttUserName, MqttPassword);
195+
}
196+
}
197+
catch (Exception exc)
198+
{
199+
if (!this.AutomaticReconnect)
200+
throw exc;
201+
}
167202
ReadOrder readOrder = (ReadOrder)param;
168203
lock (lockProcessData)
169204
{

EasyModbus/ModbusClient.cs

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,9 @@ public enum RegisterOrder { LowHigh = 0, HighLow = 1 };
4343
private StopBits stopBits = StopBits.One;
4444
private bool connected = false;
4545
string mqttRootTopic = "easymodbusclient";
46+
public string MqttUserName { get; set; }
47+
public string MqttPassword { get; set; }
48+
public int MqttBrokerPort = 1883;
4649

4750
public delegate void ReceiveDataChanged(object sender);
4851
public event ReceiveDataChanged receiveDataChanged;
@@ -771,11 +774,13 @@ public static bool DetectValidModbusFrame(byte[] readBuffer, int length)
771774
/// Read Discrete Inputs from Server device (FC2) and publishes the values to a MQTT-Broker.
772775
/// The Topic will be easymodbusclient/discreteinputs/'address' e.g. easymodbusclient/discreteinputs/0 for address "0".
773776
/// Note that the Address that will be publishes is "0"-Based. The Root topic can be changed using the Parameter
777+
/// By default we are using the Standard-Port 1883. This Port can be changed using the Property "MqttBrokerPort"
778+
/// A Username and Passowrd can be provided using the Properties "MqttUserName" and "MqttPassword"
774779
/// 'MqttRootTopic' Default is 'easymodbusclient'
775780
/// </summary>
776781
/// <param name="startingAddress">First discrete input to read</param>
777782
/// <param name="quantity">Number of discrete Inputs to read</param>
778-
/// <param name="mqttBrokerAddress">Broker address 8the values will be published to</param>
783+
/// <param name="mqttBrokerAddress">Broker address the values will be published to</param>
779784
/// <returns>Boolean Array which contains the discrete Inputs</returns>
780785
public bool[] ReadDiscreteInputs(int startingAddress, int quantity, string mqttBrokerAddress)
781786
{
@@ -788,6 +793,9 @@ public bool[] ReadDiscreteInputs(int startingAddress, int quantity, string mqttB
788793
payload[i] = returnValue[i].ToString();
789794
}
790795
EasyModbus2Mqtt easyModbus2Mqtt = new EasyModbus2Mqtt();
796+
easyModbus2Mqtt.MqttBrokerPort = this.MqttBrokerPort;
797+
easyModbus2Mqtt.MqttUserName = this.MqttUserName;
798+
easyModbus2Mqtt.MqttPassword = this.MqttPassword;
791799
easyModbus2Mqtt.publish(topic, payload, mqttBrokerAddress);
792800

793801
return returnValue;
@@ -968,6 +976,8 @@ public bool[] ReadDiscreteInputs(int startingAddress, int quantity)
968976
/// The Topic will be easymodbusclient/coils/'address' e.g. easymodbusclient/coils/0 for address "0".
969977
/// Note that the Address that will be publishes is "0"-Based. The Root topic can be changed using the Parameter
970978
/// 'MqttRootTopic' Default is 'easymodbusclient'
979+
/// By default we are using the Standard-Port 1883. This Port can be changed using the Property "MqttBrokerPort"
980+
/// A Username and Passowrd can be provided using the Properties "MqttUserName" and "MqttPassword"
971981
/// </summary>
972982
/// <param name="startingAddress">First coil to read</param>
973983
/// <param name="quantity">Number of coils to read</param>
@@ -984,6 +994,9 @@ public bool[] ReadCoils(int startingAddress, int quantity, string mqttBrokerAddr
984994
payload[i] = returnValue[i].ToString();
985995
}
986996
EasyModbus2Mqtt easyModbus2Mqtt = new EasyModbus2Mqtt();
997+
easyModbus2Mqtt.MqttBrokerPort = this.MqttBrokerPort;
998+
easyModbus2Mqtt.MqttUserName = this.MqttUserName;
999+
easyModbus2Mqtt.MqttPassword = this.MqttPassword;
9871000
easyModbus2Mqtt.publish(topic, payload, mqttBrokerAddress);
9881001

9891002

@@ -1164,6 +1177,8 @@ public bool[] ReadCoils(int startingAddress, int quantity)
11641177
/// The Topic will be easymodbusclient/holdingregisters/'address' e.g. easymodbusclient/holdingregisters/0 for address "0".
11651178
/// Note that the Address that will be publishes is "0"-Based. The Root topic can be changed using the Parameter
11661179
/// 'MqttRootTopic' Default is 'easymodbusclient'
1180+
/// By default we are using the Standard-Port 1883. This Port can be changed using the Property "MqttBrokerPort"
1181+
/// A Username and Passowrd can be provided using the Properties "MqttUserName" and "MqttPassword"
11671182
/// </summary>
11681183
/// <param name="startingAddress">First Holding Register to read</param>
11691184
/// <param name="quantity">Number of Holding Registers to read</param>
@@ -1180,6 +1195,9 @@ public int[] ReadHoldingRegisters(int startingAddress, int quantity, string mqtt
11801195
payload[i] = returnValue[i].ToString();
11811196
}
11821197
EasyModbus2Mqtt easyModbus2Mqtt = new EasyModbus2Mqtt();
1198+
easyModbus2Mqtt.MqttBrokerPort = this.MqttBrokerPort;
1199+
easyModbus2Mqtt.MqttUserName = this.MqttUserName;
1200+
easyModbus2Mqtt.MqttPassword = this.MqttPassword;
11831201
easyModbus2Mqtt.publish(topic, payload, mqttBrokerAddress);
11841202
return returnValue;
11851203
}
@@ -1359,6 +1377,8 @@ public int[] ReadHoldingRegisters(int startingAddress, int quantity)
13591377
/// The Topic will be easymodbusclient/inputregisters/'address' e.g. easymodbusclient/inputregisters/0 for address "0".
13601378
/// Note that the Address that will be publishes is "0"-Based. The Root topic can be changed using the Parameter
13611379
/// 'MqttRootTopic' Default is 'easymodbusclient'
1380+
/// By default we are using the Standard-Port 1883. This Port can be changed using the Property "MqttBrokerPort"
1381+
/// A Username and Passowrd can be provided using the Properties "MqttUserName" and "MqttPassword"
13621382
/// </summary>
13631383
/// <param name="startingAddress">First Input Register to read</param>
13641384
/// <param name="quantity">Number of Input Registers to read</param>
@@ -1375,6 +1395,9 @@ public int[] ReadInputRegisters(int startingAddress, int quantity, string mqttBr
13751395
payload[i] = returnValue[i].ToString();
13761396
}
13771397
EasyModbus2Mqtt easyModbus2Mqtt = new EasyModbus2Mqtt();
1398+
easyModbus2Mqtt.MqttBrokerPort = this.MqttBrokerPort;
1399+
easyModbus2Mqtt.MqttUserName = this.MqttUserName;
1400+
easyModbus2Mqtt.MqttPassword = this.MqttPassword;
13781401
easyModbus2Mqtt.publish(topic, payload, mqttBrokerAddress);
13791402

13801403

EasyModbus/Properties/AssemblyInfo.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,4 +28,4 @@
2828
//
2929
// You can specify all the values or you can use the default the Revision and
3030
// Build Numbers by using the '*' as shown below:
31-
[assembly: AssemblyVersion("4.0")]
31+
[assembly: AssemblyVersion("4.1")]

EasyModbusClientExample/Properties/AssemblyInfo.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,4 +28,4 @@
2828
//
2929
// You can specify all the values or you can use the default the Revision and
3030
// Build Numbers by using the '*' as shown below:
31-
[assembly: AssemblyVersion("4.0")]
31+
[assembly: AssemblyVersion("4.1")]

EasyModbusServerSimulator/Properties/AssemblyInfo.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,4 +24,4 @@
2424
//
2525
// You can specify all the values or you can use the default the Revision and
2626
// Build Numbers by using the '*' as shown below:
27-
[assembly: AssemblyVersion ("4.0")]
27+
[assembly: AssemblyVersion ("4.1")]

0 commit comments

Comments
 (0)