protected void DecodeMultiplePacketsByteArray(uint clientIndex, byte[] data, bool isWebSocketClient) { lock (oldDecodedFrame) { int numberOfBytesProcessed = 0; int numberOfBytesToProcess = 0; int numberOfBytesReceived = data.Length; byte[] packetByteArray; List <byte> packets = new List <byte>(); MqttMsgBase tmpPacket = new MqttMsgSubscribe(); try { while (numberOfBytesProcessed != numberOfBytesReceived) { int remainingLength = MqttMsgBase.decodeRemainingLength(data); int remainingLenghtIndex = tmpPacket.encodeRemainingLength(remainingLength, data, 1); numberOfBytesToProcess = remainingLength + remainingLenghtIndex; packetByteArray = new byte[numberOfBytesToProcess]; Array.Copy(data, 0, packetByteArray, 0, numberOfBytesToProcess); MqttMsgBase packet = PacketDecoder.DecodeControlPacket(packetByteArray); OnPacketReceived(clientIndex, packet, isWebSocketClient); { byte[] tmp = new byte[data.Length - numberOfBytesToProcess]; Array.Copy(data, numberOfBytesToProcess, tmp, 0, tmp.Length); data = tmp; } numberOfBytesProcessed += numberOfBytesToProcess; } } catch (Exception e) { oldDecodedFrame[clientIndex].AddRange(data); } } }
private void ConnectToServerCallback(SecureTCPClient myTCPClient) { try { if (myTCPClient.ClientStatus == SocketStatus.SOCKET_STATUS_CONNECTED) { MqttMsgConnect connect = MsgBuilder.BuildConnect(this.ClientId, MqttSettings.Instance.Username, MqttSettings.Instance.Password, this.WillRetain, this.WillQosLevel, this.WillFlag, this.WillTopic, this.WillMessage, this.CleanSession, this.KeepAlivePeriod, ProtocolVersion); Send(connect); //TODO: timer for connack tcpClient.ReceiveData(); MqttMsgBase packet = PacketDecoder.DecodeControlPacket(tcpClient.IncomingDataBuffer); if (packet.Type == MqttMsgBase.MQTT_MSG_CONNACK_TYPE) { RouteControlPacketToMethodHandler(packet); } else { throw new MqttConnectionException("MQTTCLIENT - ConnectToServerCallback - " + PayloadMapper.ClientType + " , Expected CONNACK , received " + packet, new ArgumentException()); } } } catch (MqttClientException e) { CrestronLogger.WriteToLog("MQTTCLIENT - ConnectToServerCallback - Error occured : " + e.ErrorCode, 7); CrestronLogger.WriteToLog("MQTTCLIENT - ConnectToServerCallback - Error occured : " + e.StackTrace, 7); } catch (Exception e) { CrestronLogger.WriteToLog("MQTTCLIENT - ConnectToServerCallback - Error occured : " + e.Message, 7); CrestronLogger.WriteToLog("MQTTCLIENT - ConnectToServerCallback - Error occured : " + e.StackTrace, 7); //Disconnect from server , signal error at module lvl; } }
public void DecodeMultiplePacketsByteArray(byte[] data) { List <MqttMsgBase> packetsInTheByteArray = new List <MqttMsgBase>(); int numberOfBytesProcessed = 0; int numberOfBytesToProcess = 0; int numberOfBytesReceived = data.Length; byte[] packetByteArray; MqttMsgBase tmpPacket = new MqttMsgSubscribe(); while (numberOfBytesProcessed != numberOfBytesReceived) { int remainingLength = MqttMsgBase.decodeRemainingLength(data); int remainingLenghtIndex = tmpPacket.encodeRemainingLength(remainingLength, data, 1); numberOfBytesToProcess = remainingLength + remainingLenghtIndex; packetByteArray = new byte[numberOfBytesToProcess]; Array.Copy(data, 0, packetByteArray, 0, numberOfBytesToProcess); { byte[] tmp = new byte[data.Length - numberOfBytesToProcess]; Array.Copy(data, numberOfBytesToProcess, tmp, 0, tmp.Length); data = tmp; } numberOfBytesProcessed += numberOfBytesToProcess; MqttMsgBase packet = PacketDecoder.DecodeControlPacket(packetByteArray); //RouteControlPacketDelegate r = new RouteControlPacketDelegate(RouteControlPacketToMethodHandler); //r.Invoke(packet); CrestronInvoke.BeginInvoke(RouteControlPacketToMethodHandler, packet); } }
override protected void ConnectionCallback(SecureTCPServer server, uint clientIndex) { try { Server.WaitForConnectionAsync(IPAddress.Parse("0.0.0.0"), this.ConnectionCallback); if (Server.ClientConnected(clientIndex)) { oldDecodedFrame.Add(clientIndex, new List <byte>()); int lenghtOfData = Server.ReceiveData(clientIndex); byte[] data = Server.GetIncomingDataBufferForSpecificClient(clientIndex); MqttMsgBase packet = PacketDecoder.DecodeControlPacket(data); if (packet.Type == MqttMsgBase.MQTT_MSG_CONNECT_TYPE) { OnPacketReceived(clientIndex, packet, false); } else { throw new ArgumentException("Attempted connection with a non CONNECT packet"); } } } catch (Exception e) { DisconnectClient(clientIndex, false); } }