1- using Confluent . Kafka ;
2- using Ai . Hgb . Dat . Configuration ;
1+ using Ai . Hgb . Dat . Configuration ;
32using Ai . Hgb . Dat . Utils ;
43using MQTTnet ;
54using MQTTnet . Client ;
65using MQTTnet . Extensions . ManagedClient ;
7- using MQTTnet . Internal ;
86using MQTTnet . Protocol ;
9- using System ;
10- using System . Net . Mime ;
117
128namespace Ai . Hgb . Dat . Communication {
139 public class MqttSocket : ISocket {
@@ -55,7 +51,8 @@ public bool BlockingActionExecution {
5551
5652 private Dictionary < SubscriptionOptions , List < ActionItem > > actions ;
5753 private Dictionary < RequestOptions , TaskCompletionSource < IMessage > > promises ;
58-
54+
55+ #region setup
5956
6057 public MqttSocket ( SocketConfiguration configuration ) {
6158 this . configuration = configuration ;
@@ -130,7 +127,6 @@ public MqttSocket(string id, string name, HostAddress address, IPayloadConverter
130127 if ( connect ) Connect ( ) ;
131128 }
132129
133-
134130 public object Clone ( ) {
135131 return new MqttSocket ( Configuration . Id , Configuration . Name , Configuration . Broker , Converter ,
136132 ( SubscriptionOptions ) Configuration . DefaultSubscriptionOptions ? . Clone ( ) ,
@@ -139,6 +135,63 @@ public object Clone() {
139135 BlockingActionExecution ) ;
140136 }
141137
138+ public ISocket Connect ( ) {
139+ if ( IsConnected ( ) ) return this ;
140+
141+ var options = new MqttClientOptionsBuilder ( )
142+ . WithClientId ( Configuration . Name )
143+ . WithWebSocketServer ( "ws://127.0.0.1:5000/mqtt" )
144+ . WithTcpServer ( configuration . Broker . Name , configuration . Broker . Port )
145+ . WithCleanSession ( true ) ;
146+ var mgOptions = new ManagedMqttClientOptionsBuilder ( )
147+ . WithAutoReconnectDelay ( TimeSpan . FromSeconds ( 10 ) )
148+ . WithClientOptions ( options . Build ( ) )
149+ . Build ( ) ;
150+
151+ client . StartAsync ( mgOptions ) . Wait ( cts . Token ) ;
152+ client . ConnectingFailedAsync += OnClient_ConnectingFailedAsync ;
153+ connected . WaitOne ( ) ;
154+
155+ if ( configuration . DefaultSubscriptionOptions != null && configuration . DefaultSubscriptionOptions . Topic != null )
156+ client . SubscribeAsync ( configuration . DefaultSubscriptionOptions . Topic , GetQosLevel ( configuration . DefaultSubscriptionOptions . QosLevel ) ) . Wait ( cts . Token ) ;
157+
158+ foreach ( var subscription in pendingSubscriptions ) {
159+ client . SubscribeAsync ( subscription . Topic , GetQosLevel ( subscription . QosLevel ) ) . Wait ( cts . Token ) ;
160+ }
161+ pendingSubscriptions . Clear ( ) ;
162+
163+ return this ;
164+ }
165+
166+ public ISocket Disconnect ( ) {
167+ client . StopAsync ( ) . Wait ( cts . Token ) ;
168+ cts . Cancel ( ) ;
169+ disconnected . WaitOne ( ) ;
170+ client . Dispose ( ) ;
171+ client = null ;
172+
173+ return this ;
174+ }
175+
176+ public void Abort ( ) {
177+ cts . Cancel ( ) ;
178+ client . StopAsync ( ) ;
179+ client . Dispose ( ) ;
180+ client = null ;
181+ }
182+
183+ public void Dispose ( ) {
184+ Disconnect ( ) ;
185+ }
186+
187+ public bool IsConnected ( ) {
188+ return client != null && client . IsConnected ;
189+ }
190+
191+ #endregion setup
192+
193+ #region event handling
194+
142195 private void Configuration_ConfigurationChanged ( object sender , EventArgs < Ai . Hgb . Dat . Configuration . IConfiguration > e ) {
143196 Console . WriteLine ( "Udating socket now..." ) ;
144197 var newConfiguration = e . Value as SocketConfiguration ;
@@ -297,63 +350,14 @@ private void OnMessageReceived_AfterRegisteredHandlers(IMessage message) {
297350 if ( handler != null ) handler ( this , new EventArgs < IMessage > ( message ) ) ;
298351 }
299352
300- public ISocket Connect ( ) {
301- if ( IsConnected ( ) ) return this ;
302-
303- var options = new MqttClientOptionsBuilder ( )
304- . WithClientId ( Configuration . Name )
305- . WithWebSocketServer ( "ws://127.0.0.1:5000/mqtt" )
306- . WithTcpServer ( configuration . Broker . Name , configuration . Broker . Port )
307- . WithCleanSession ( true ) ;
308- var mgOptions = new ManagedMqttClientOptionsBuilder ( )
309- . WithAutoReconnectDelay ( TimeSpan . FromSeconds ( 10 ) )
310- . WithClientOptions ( options . Build ( ) )
311- . Build ( ) ;
312-
313- client . StartAsync ( mgOptions ) . Wait ( cts . Token ) ;
314- client . ConnectingFailedAsync += OnClient_ConnectingFailedAsync ;
315- connected . WaitOne ( ) ;
316-
317- if ( configuration . DefaultSubscriptionOptions != null && configuration . DefaultSubscriptionOptions . Topic != null )
318- client . SubscribeAsync ( configuration . DefaultSubscriptionOptions . Topic , GetQosLevel ( configuration . DefaultSubscriptionOptions . QosLevel ) ) . Wait ( cts . Token ) ;
319-
320- foreach ( var subscription in pendingSubscriptions ) {
321- client . SubscribeAsync ( subscription . Topic , GetQosLevel ( subscription . QosLevel ) ) . Wait ( cts . Token ) ;
322- }
323- pendingSubscriptions . Clear ( ) ;
324-
325- return this ;
326- }
327-
328353 private Task OnClient_ConnectingFailedAsync ( ConnectingFailedEventArgs arg ) {
329354 Console . WriteLine ( arg . Exception . InnerException . ToString ( ) ) ;
330355 return Task . CompletedTask ;
331356 }
332357
333- public ISocket Disconnect ( ) {
334- client . StopAsync ( ) . Wait ( cts . Token ) ;
335- cts . Cancel ( ) ;
336- disconnected . WaitOne ( ) ;
337- client . Dispose ( ) ;
338- client = null ;
358+ #endregion event handling
339359
340- return this ;
341- }
342-
343- public void Abort ( ) {
344- cts . Cancel ( ) ;
345- client . StopAsync ( ) ;
346- client . Dispose ( ) ;
347- client = null ;
348- }
349-
350- public void Dispose ( ) {
351- Disconnect ( ) ;
352- }
353-
354- public bool IsConnected ( ) {
355- return client != null && client . IsConnected ;
356- }
360+ #region subscribe
357361
358362 private void Subscribe ( SubscriptionOptions options ) {
359363 var o = options != null ? options : configuration . DefaultSubscriptionOptions ;
@@ -439,6 +443,9 @@ public void Unsubscribe(string topic = null) {
439443 }
440444 }
441445
446+ #endregion subscribe
447+
448+ #region publish
442449 public void Publish < T > ( T payload ) {
443450 var o = ( PublicationOptions ) configuration . DefaultPublicationOptions . Clone ( ) ;
444451 Publish ( o , payload ) ;
@@ -466,6 +473,12 @@ public async Task PublishAsync<T>(string topic, T payload) {
466473 await PublishAsync ( o , payload ) ;
467474 }
468475
476+ public async Task PublishAsync < T > ( string topic , IMessage msg ) {
477+ var o = ( PublicationOptions ) configuration . DefaultPublicationOptions . Clone ( ) ;
478+ o . Topic = topic ;
479+ await PublishAsync ( o , msg ) ;
480+ }
481+
469482 public async Task PublishAsync < T > ( PublicationOptions options , T payload ) {
470483 var o = options != null ? options : configuration . DefaultPublicationOptions ;
471484
@@ -487,6 +500,28 @@ public async Task PublishAsync<T>(PublicationOptions options, T payload) {
487500 await client . EnqueueAsync ( mappMessage ) ;
488501 }
489502
503+ public async Task PublishAsync ( PublicationOptions options , IMessage msg ) {
504+ var o = options != null ? options : configuration . DefaultPublicationOptions ;
505+
506+ msg . Topic = o . Topic ; // use old msg, update topic only
507+
508+ var appMessage = new MqttApplicationMessageBuilder ( )
509+ . WithTopic ( msg . Topic )
510+ . WithPayload ( converter . Serialize ( msg ) )
511+ . WithQualityOfServiceLevel ( GetQosLevel ( o . QosLevel ) )
512+ . Build ( ) ;
513+
514+ var mappMessage = new ManagedMqttApplicationMessageBuilder ( )
515+ . WithApplicationMessage ( appMessage )
516+ . Build ( ) ;
517+
518+ await client . EnqueueAsync ( mappMessage ) ;
519+ }
520+
521+ #endregion publish
522+
523+ #region request
524+
490525 public T Request < T > ( ) {
491526 var o = ( RequestOptions ) configuration . DefaultRequestOptions . Clone ( ) ;
492527
@@ -582,6 +617,8 @@ public async Task<T1> RequestAsync<T1, T2>(RequestOptions options, T2 payload) {
582617 string contentType = payload != null ? typeof ( T2 ) . FullName : "" ;
583618 //IMessage msg = new Message<T2>(Configuration.Id, Configuration.Name, o.Topic, o.ResponseTopic, contentType, payload);
584619 var msg = new Message < T2 > ( Configuration . Id , Configuration . Name , o . Topic , o . ResponseTopic , contentType , converter . Serialize < T2 > ( payload ) , payload ) ;
620+ msg . ResponseCount = o . ResponseCount ;
621+ msg . BulkResponse = o . BulkResponse ;
585622 var serMsg = converter . Serialize ( msg ) ;
586623
587624 appMessageBuilder = msg != null
@@ -606,6 +643,8 @@ public async Task<T1> RequestAsync<T1, T2>(RequestOptions options, T2 payload) {
606643 return converter . Deserialize < T1 > ( response . Payload ) ;
607644 }
608645
646+ #endregion request
647+
609648 #region helper
610649
611650 private MqttQualityOfServiceLevel GetQosLevel ( QualityOfServiceLevel qosl ) {
0 commit comments