/// <summary> /// Subscribe for message topics /// </summary> /// <param name="topics">List of topics to subscribe</param> /// <param name="qosLevels">QOS levels related to topics</param> /// <returns>Granted QoS Levels in SUBACK message from broker</returns> public byte[] Subscribe(string[] topics, byte[] qosLevels) { int attempts = 0; bool acknowledged = false; MqttMsgSubscribe subscribe = new MqttMsgSubscribe(topics, qosLevels); MqttMsgSuback suback = null; do { try { // try subscribe suback = (MqttMsgSuback)this.SendReceive(subscribe.GetBytes()); acknowledged = true; } catch (MqttTimeoutException) { // no SUBACK message received in time, retry with duplicate flag attempts++; subscribe.DupFlag = true; // delay before retry if (attempts < MQTT_ATTEMPTS_RETRY) { Thread.Sleep(MQTT_DELAY_RETRY); } } } while ((attempts < MQTT_ATTEMPTS_RETRY) && !acknowledged); // return granted QoS Levels or null return(acknowledged ? suback.GrantedQoSLevels : null); }