@@ -69,27 +69,19 @@ namespace mtconnect {
69
69
{configuration::MqttClientId, string ()},
70
70
{configuration::MqttUserName, string ()},
71
71
{configuration::MqttPassword, string ()}});
72
- AddDefaultedOptions (config, m_options,
73
- {{configuration::MqttHost, " 127.0.0.1" s},
74
- {configuration::DeviceTopic, " MTConnect/Probe/[device]" s},
75
- {configuration::AssetTopic, " MTConnect/Asset/[device]" s},
76
- {configuration::CurrentTopic, " MTConnect/Current/[device]" s},
77
- {configuration::SampleTopic, " MTConnect/Sample/[device]" s},
78
- {configuration::MqttCurrentInterval, 10000ms},
79
- {configuration::MqttSampleInterval, 500ms},
80
- {configuration::MqttSampleCount, 1000 },
81
- {configuration::MqttPort, 1883 },
82
- {configuration::MqttTls, false }});
83
-
84
- auto clientHandler = make_unique<ClientHandler>();
85
- clientHandler->m_connected = [this ](shared_ptr<MqttClient> client) {
86
- // Publish latest devices, assets, and observations
87
- auto &circ = m_sinkContract->getCircularBuffer ();
88
- std::lock_guard<buffer::CircularBuffer> lock (circ);
89
- client->connectComplete ();
90
-
91
- pubishInitialContent ();
92
- };
72
+ AddDefaultedOptions (
73
+ config, m_options,
74
+ {{configuration::MqttHost, " 127.0.0.1" s},
75
+ {configuration::DeviceTopic, " MTConnect/Probe/[device]" s},
76
+ {configuration::AssetTopic, " MTConnect/Asset/[device]" s},
77
+ {configuration::MqttLastWillTopic, " MTConnect/Probe/[device]/Availability" s},
78
+ {configuration::CurrentTopic, " MTConnect/Current/[device]" s},
79
+ {configuration::SampleTopic, " MTConnect/Sample/[device]" s},
80
+ {configuration::MqttCurrentInterval, 10000ms},
81
+ {configuration::MqttSampleInterval, 500ms},
82
+ {configuration::MqttSampleCount, 1000 },
83
+ {configuration::MqttPort, 1883 },
84
+ {configuration::MqttTls, false }});
93
85
94
86
int maxTopicDepth {GetOption<int >(options, configuration::MqttMaxTopicDepth).value_or (7 )};
95
87
@@ -103,23 +95,38 @@ namespace mtconnect {
103
95
m_sampleInterval = *GetOption<Milliseconds>(m_options, configuration::MqttSampleInterval);
104
96
105
97
m_sampleCount = *GetOption<int >(m_options, configuration::MqttSampleCount);
106
-
107
- if (IsOptionSet (m_options, configuration::MqttTls))
108
- {
109
- m_client = make_shared<MqttTlsClient>(m_context, m_options, std::move (clientHandler));
110
- }
111
- else
112
- {
113
- m_client = make_shared<MqttTcpClient>(m_context, m_options, std::move (clientHandler));
114
- }
115
98
}
116
99
117
100
void Mqtt2Service::start ()
118
101
{
119
- // mqtt client side not a server side...
120
102
if (!m_client)
121
- return ;
122
-
103
+ {
104
+ auto clientHandler = make_unique<ClientHandler>();
105
+ clientHandler->m_connected = [this ](shared_ptr<MqttClient> client) {
106
+ // Publish latest devices, assets, and observations
107
+ auto &circ = m_sinkContract->getCircularBuffer ();
108
+ std::lock_guard<buffer::CircularBuffer> lock (circ);
109
+ client->connectComplete ();
110
+
111
+ client->publish (m_lastWillTopic, " AVAILABLE" );
112
+ pubishInitialContent ();
113
+ };
114
+
115
+ auto agentDevice = m_sinkContract->getDeviceByName (" Agent" );
116
+ auto lwtTopic = get<string>(m_options[configuration::MqttLastWillTopic]);
117
+ m_lastWillTopic = formatTopic (lwtTopic, agentDevice, " Agent" );
118
+
119
+ if (IsOptionSet (m_options, configuration::MqttTls))
120
+ {
121
+ m_client = make_shared<MqttTlsClient>(m_context, m_options, std::move (clientHandler),
122
+ m_lastWillTopic, " UNAVAILABLE" s);
123
+ }
124
+ else
125
+ {
126
+ m_client = make_shared<MqttTcpClient>(m_context, m_options, std::move (clientHandler),
127
+ m_lastWillTopic, " UNAVAILABLE" s);
128
+ }
129
+ }
123
130
m_client->start ();
124
131
}
125
132
0 commit comments