private void ProcessMessage(XBeeResponse msg) { try { if (msg.getApiId() == XBee.ZB_RX_RESPONSE) { ZBRxResponse response = new ZBRxResponse(); msg.getZBRxResponse(response); byte[] body = response.getData(); string topic = ""; string payload = ""; SReceivePacket pkt = null; switch ((EMessageType)body[0]) { case EMessageType.TankWatererStats: pkt = new STankWatererStats(body); topic = $"/tele/TankWaterer/{response.getRemoteAddress64().get().ToString("X16")}/info"; break; case EMessageType.TankWatererManual: pkt = new STankWatererValve(body); topic = $"/tele/TankWaterer/{response.getRemoteAddress64().get().ToString("X16")}/manual"; break; case EMessageType.TankWatererParameters: pkt = new STankWatererParameters(body); topic = $"/tele/TankWaterer/{response.getRemoteAddress64().get().ToString("X16")}/parameters"; break; case EMessageType.PotPlantStats: pkt = new SPotPlantStats(body); topic = $"/tele/PotPlant/{response.getRemoteAddress64().get().ToString("X16")}/info"; break; case EMessageType.RainGaugeStats: pkt = new SRainGaugeStats(body); topic = $"/tele/RainGauge/{response.getRemoteAddress64().get().ToString("X16")}/info"; break; } payload = JsonConvert.SerializeObject(pkt); Log(topic + " " + payload); mqttClient.Publish(topic, Encoding.ASCII.GetBytes(payload)); } else if (msg.getApiId() == XBee.ZB_TX_STATUS_RESPONSE) { ZBTxStatusResponse response = new ZBTxStatusResponse(); msg.getZBTxStatusResponse(response); Log("TxResponse " + (response.isSuccess() ? "OK" : $"Error: {response.getErrorCode()}")); } else { Log($"Got Packet ApiId={msg.getApiId()}"); } } catch (Exception ex) { Log("Unhandled exception while processing message: " + ex.ToString()); } }