private async void ProcessBuffer(byte[] buffer) { await ThreadPool.RunAsync(state => { var args = new MqttNetEventArgs { ClientUid = _clientUid }; try { // Process incomming messages args.Message = MqttMessageDeserializer.Deserialize(buffer); if (args.Message is IMqttIdMessage) { var msgWithId = args.Message as IMqttIdMessage; _logger.LogMessage("Socket", LogLevel.Verbose, string.Format("Received message type '{0}', ID={1} from server.", msgWithId.MessageType, msgWithId.MessageId)); } else { _logger.LogMessage("Socket", LogLevel.Verbose, string.Format("SOCKET: Received message type '{0}' from server.", args.Message.MessageType)); } } catch (Exception ex) { args.Exception = ex; } _messageReceivedHandler(args); }); }
private void ProcessBuffer(byte[] buffer) { var t = new Thread(() => { var args = new MqttNetEventArgs { ClientUid = _clientUid }; try { // Process incomming messages args.Message = MqttMessageDeserializer.Deserialize(buffer); string id = "N/A"; if (args.Message is IMqttIdMessage) { id = ((IMqttIdMessage)args.Message).MessageId.ToString(); } _logger.LogMessage("Socket", LogLevel.Verbose, "Received message type " + args.Message.MessageType + ", QOS=" + args.Message.QualityOfService + ", ID=" + id); } catch (Exception ex) { args.Exception = ex; } MessageReceived(args); }); t.Start(); }
protected override void OnPublishReceived(MqttNetEventArgs args) { bool handled = false; lock (_subscriptionClients) { // Send to subscriber clients first #if !(MF_FRAMEWORK_VERSION_V4_3 || MF_FRAMEWORK_VERSION_V4_2 || WINDOWS_PHONE) Parallel.For(0, _subscriptionClients.Count, i => #else for (int i = 0; i < _subscriptionClients.Count; i++) #endif { var client = (SubscriptionClient)_subscriptionClients.GetAt(i); try { bool clientHandled = client.NotifyPublishReceived(args.Message as MqttPublishMessage); handled = handled | clientHandled; } catch (Exception ex) { Logger.LogException("Protocol", LogLevel.Error, "Exception occured while sending publish event to subscriber.", ex); } } #if !(MF_FRAMEWORK_VERSION_V4_3 || MF_FRAMEWORK_VERSION_V4_2 || WINDOWS_PHONE) ); #endif } if (!handled) { base.OnPublishReceived(args); } }
private void DoClientPublishWorkflow(MqttNetEventArgs args) { var publishMsg = (MqttPublishMessage)args.Message; switch (publishMsg.QualityOfService) { // Just fire event and we're done case QualityOfService.AtMostOnce: OnPublishReceived(args); break; // Must send a PubAck message case QualityOfService.AtLeastOnce: var pubAck = new MqttPublishAckMessageBuilder { MessageId = publishMsg.MessageId, }; SendMessageAsync(pubAck, null, args.ClientUid); OnPublishReceived(args); break; // Must send a PubRec message case QualityOfService.ExactlyOnce: var pubRec = new MqttPublishReceivedMessageBuilder { MessageId = publishMsg.MessageId, }; SendMessageAsync(pubRec, publishMsg, args.ClientUid); break; } }
private void ProcessException(Exception ex) { var t = new Thread(() => { var args = new MqttNetEventArgs { ClientUid = _clientUid }; var ece = ex as ErrorContextException; if (ece != null) { _logger.LogMessage("Socket", LogLevel.Verbose, "Processing exception " + ece.Message + ". Inner exception=" + ece.InnerException); args.AdditionalErrorInfo = ece.Message; args.Exception = ece.InnerException; } else { _logger.LogMessage("Socket", LogLevel.Verbose, "Processing exception " + ex); args.Exception = ex; } MessageReceived(args); }); t.Start(); }
protected void FireMessageReceived(MqttNetEventArgs args) { if (PublishReceived != null) { PublishReceived(this, args); } }
protected void FireSubscribeMessageComplete(MqttNetEventArgs args) { OnMqttMessageCompleted(args.ClientUid, args.Message, args.EventData, args.Exception); if (SubscribeComplete != null) { SubscribeComplete(this, args); } }
private void SocketMessageReceived(MqttNetEventArgs args) { if (args.Message != null) { Logger.LogMessage("Protocol", LogLevel.Verbose, "Protocol notified of message received " + args.Message.MessageType + " Client Identifier=" + args.ClientUid); OnMessageReceived(args); switch (args.Message.MessageType) { case MessageType.ConnAck: args.EventData = _messageStore.Remove(args.Message, args.ClientUid); var conAck = args.Message as MqttConnectAckMessage; if (conAck != null && conAck.ConnectReturnCode != ConnectReturnCode.Accepted) { Socket.Disconnect(args.ClientUid); } FireConnectComplete(args); break; case MessageType.SubAck: args.EventData = _messageStore.Remove(args.Message, args.ClientUid); FireSubscribeMessageComplete(args); break; case MessageType.PubAck: case MessageType.PubComp: case MessageType.UnsubAck: args.EventData = _messageStore.Remove(args.Message, args.ClientUid); FireSendMessageComplete(args); break; case MessageType.Publish: DoClientPublishWorkflow(args); break; case MessageType.PubRec: DoClientPublishRecWorkflow(args); break; case MessageType.PubRel: DoClientPubRelWorkflow(args); break; case MessageType.PingResp: args.EventData = _messageStore.Remove(args.Message, args.ClientUid); FireSendMessageComplete(args); break; } } else if (args.Exception != null) { Logger.LogException("Protocol", LogLevel.Verbose, "Exception occured while receiving message from server.", args.Exception); } }
private void DoClientPublishRecWorkflow(MqttNetEventArgs args) { var publishMsg = (IMqttIdMessage)args.Message; object eventData = _messageStore.Remove(args.Message, args.ClientUid); var pubRel = new MqttPublishReleaseMessageBuilder { MessageId = publishMsg.MessageId, }; SendMessageAsync(pubRel, eventData, args.ClientUid); }
protected void FireSendMessageComplete(MqttNetEventArgs args) { //string dataStr = args.EventData == null ? "(null)" : args.EventData.GetType().ToString(); //string exceptionStr = args.Exception == null ? "(null)" : args.Exception.ToString(); //string messageType = args.Message == null ? "(null)" : args.Message.MessageType.ToString(); //Logger.LogMessage("Protocol", LogLevel.Verbose, "Firing SendMessageCompete event. ClientID=" + args.ClientUid + " Message=" + messageType + " EventData=" + dataStr + ", Exception=" + exceptionStr); OnMqttMessageCompleted(args.ClientUid, args.Message, args.EventData, args.Exception); if (SendMessageComplete != null) { SendMessageComplete(this, args); } }
private void ProcessBuffer(byte[] buffer, ConnectedClientInfo info) { ThreadPool.QueueUserWorkItem(state => { // When receiving the ConnAck message, we are still using the ConnectionKey param // All other cases we've connected the client and use the ClientUid param var args = new MqttNetEventArgs { ClientUid = info.ClientUid }; try { // Process incomming messages args.Message = MqttMessageDeserializer.Deserialize(buffer); if (args.Message is IMqttIdMessage) { var msgWithId = args.Message as IMqttIdMessage; _logger.LogMessage("Socket", LogLevel.Verbose, string.Format("Received message type '{0}', ID={1}, from client {2}.", msgWithId.MessageType, msgWithId.MessageId, info.ClientUid)); } else { _logger.LogMessage("Socket", LogLevel.Verbose, string.Format("Received message type '{0}' from client {1}.", args.Message.MessageType, info.ClientUid)); } } catch (Exception ex) { var outer = new Exception(string.Format("Error deserializing message from network buffer. Buffer may be corrupt. Details: {0}", ex.Message), ex); args.Exception = outer; _logger.LogMessage("Socket", LogLevel.Error, outer.Message); } if (_messageReceivedHandler != null) { _messageReceivedHandler(args); } }); }
private void DoClientPubRelWorkflow(MqttNetEventArgs args) { var publishRelMsg = (IMqttIdMessage)args.Message; // Pop the original publish message to pass to the client object data = _messageStore.Remove(args.Message, args.ClientUid); args.Message = data as MqttPublishMessage; if (args.Message != null) { var pubComp = new MqttPublishCompleteMessageBuilder { MessageId = publishRelMsg.MessageId, }; SendMessageAsync(pubComp, null, args.ClientUid); OnPublishReceived(args); } else { Logger.LogMessage("Protocol", LogLevel.Warning, "Received PubRel message but no pending publishes were found. Client Identifier=" + args.ClientUid); } }
protected override void OnPublishReceived(MqttNetEventArgs args) { bool handled = false; lock (_subscriptionClients) { // Send to subscriber clients first #if !(MF_FRAMEWORK_VERSION_V4_3 || MF_FRAMEWORK_VERSION_V4_2 || WINDOWS_PHONE) Parallel.For(0, _subscriptionClients.Count, i => #else for (int i = 0; i < _subscriptionClients.Count; i++) #endif { var client = (SubscriptionClient)_subscriptionClients.GetAt(i); try { bool clientHandled = client.NotifyPublishReceived(args.Message as MqttPublishMessage); handled = handled | clientHandled; } catch (Exception ex) { Logger.LogException("Protocol", LogLevel.Error, "Exception occured while sending publish event to subscriber.", ex); } }
private void MqttOnConnectComplete(object sender, MqttNetEventArgs args) { var t = args.EventData as TaskCompletionSource<MqttConnectAckMessage>; if (t == null) { return; } if (args.Exception == null) { _clientUid = args.ClientUid; t.TrySetResult(args.Message as MqttConnectAckMessage); } else { t.TrySetException(args.Exception); } }
private void MqttOnPublishReceived(object sender, MqttNetEventArgs args) { // For this platform, only publishes not handled by a subscription client will end up here if (args.Message.MessageType == MessageType.Publish) { if (UnhandledPublishReceived != null) { UnhandledPublishReceived(this, new MqttPublishMessageEventArgs { Exception = args.Exception, Message = args.Message as MqttPublishMessage }); } } }
private async void ProcessBuffer(byte[] buffer) { await Windows.System.Threading.ThreadPool.RunAsync(state => { var args = new MqttNetEventArgs {ClientUid = _clientUid}; try { // Process incomming messages args.Message = MqttMessageDeserializer.Deserialize(buffer); if (args.Message is IMqttIdMessage) { var msgWithId = args.Message as IMqttIdMessage; _logger.LogMessage("Socket", LogLevel.Verbose, string.Format("Received message type '{0}', ID={1} from server.", msgWithId.MessageType, msgWithId.MessageId)); } else { _logger.LogMessage("Socket", LogLevel.Verbose, string.Format("SOCKET: Received message type '{0}' from server.", args.Message.MessageType)); } } catch (Exception ex) { args.Exception = ex; } _messageReceivedHandler(args); }); }
protected virtual void OnMessageReceived(MqttNetEventArgs args) { }
private void FireConnectionComplete(object sender, MqttNetEventArgs args) { if (ConnectionComplete != null) { ConnectionComplete(this, new MqttConnectMessageEventArgs() { Exception = args.Exception, AdditionalErrorInfo = args.AdditionalErrorInfo, Message = args.Message as MqttConnectAckMessage }); } }
private void MqttOnSubscribeComplete(object sender, MqttNetEventArgs args) { FireSubscribeComplete(this, args); }
private void MqttOnPublishReceived(object sender, MqttNetEventArgs args) { if (args.Message.MessageType == MessageType.Publish) { if (PublishReceived != null) { PublishReceived(this, new MqttPublishMessageEventArgs { Exception = args.Exception, Message = args.Message as MqttPublishMessage }); } } }
private void MqttOnOperationComplete(object sender, MqttNetEventArgs args) { var t = args.EventData as TaskCompletionSource<object>; if (t == null) { return; } if (args.Exception == null) { t.TrySetResult(null); } else { t.TrySetException(args.Exception); } }
private void MqttOnConnectComplete(object sender, MqttNetEventArgs args) { if (!_subscribed && _callback != null && args.Exception != null) { _clientUid = args.ClientUid; SubscribeToTopic(); } }
private void FireSubscribeComplete(object sender, MqttNetEventArgs args) { if (SubscribeComplete != null) { SubscribeComplete(this, new MqttSubscribeMessageEventArgs() { Exception = args.Exception, AdditionalErrorInfo = args.AdditionalErrorInfo, Message = args.Message as MqttSubscribeAckMessage }); } }
private void MqttOnSubscribeComplete(object sender, MqttNetEventArgs args) { var t = args.EventData as TaskCompletionSource<MqttSubscribeAckMessage>; if (t == null) { return; } if (args.Exception == null) { t.TrySetResult(args.Message as MqttSubscribeAckMessage); } else { t.TrySetException(args.Exception); } }
protected virtual void OnPublishReceived(MqttNetEventArgs args) { FireMessageReceived(args); }
private void MessageReceived(MqttNetEventArgs args) { _messageReceivedHandler(args); }
private void MqttOnConnectComplete(object sender, MqttNetEventArgs args) { _clientUid = args.ClientUid; FireConnectionComplete(this, args); }
private void MqttOnSendMessageComplete(object sender, MqttNetEventArgs args) { if (args.EventData == null) { return; } var type = (MessageType)args.EventData; switch (type) { case MessageType.Unsubscribe: FireUnsubscribeComplete(this, args); break; case MessageType.Publish: FirePublishMessageComplete(this, args); break; case MessageType.Disconnect: FireDisconnectCompleted(this, args); break; case MessageType.PingReq: FirePingComplete(this, args); break; } }
private void FireDisconnectCompleted(object sender, MqttNetEventArgs args) { if (DisconnectComplete != null) { DisconnectComplete(this, new MqttMessageEventArgs() { Exception = args.Exception, AdditionalErrorInfo = args.AdditionalErrorInfo, Message = args.Message }); } }
private void FirePublishMessageComplete(object sender, MqttNetEventArgs args) { if (PublishMessageComplete != null) { PublishMessageComplete(this, new MqttMessageEventArgs() { Exception = args.Exception, AdditionalErrorInfo = args.AdditionalErrorInfo, Message = args.Message }); } }