/// <summary> /// 解码缓存字节为协议包 /// </summary> private IProtocolPackage Decode() { var result = _protocolEncoder.Decode(_processBuffer.ToArray()); if (result.Finalized) { _protocolEncoder.Delive(result, this); } return(result); }
public static void OnDataReceived(IClientConnection connection, byte[] data) { try { ProtocolEncoder encoder = new ProtocolEncoder(); MediumDeserializedObject requestObject = null; try { requestObject = ProtocolSerializer.Deserialize(data); } catch (Exception e) { Console.WriteLine(e.Message); } string controlCommand = encoder.Decode(requestObject.ControlCommand); IList <ArraySegment <byte> > serializedResponse = null; Type requestType = _availableRequests.GetRequestType(controlCommand); if (requestType != null) { try { Type protocolRequestInterface = requestType.GetInterfaces().FirstOrDefault(x => typeof(IProtocolRequest <IProtocolResponse>).IsAssignableFrom(x)); Type responseType = protocolRequestInterface.GenericTypeArguments[0]; serializedResponse = (IList <ArraySegment <byte> >)_executeMethod.MakeGenericMethod(requestType, responseType).Invoke(null, new object[] { requestObject.Body }); } catch { serializedResponse = SerializeResponse(new ErrorResponse { Code = 500, Message = "Internal server error." }); } } else { serializedResponse = SerializeResponse(new ErrorResponse { Code = 400, Message = "Unsupported request." }); } connection.Send(serializedResponse); } catch (Exception e) { Console.WriteLine(e.Message); } }
/// <summary> /// 解码缓存字节为协议包 /// </summary> private void Decode() { var package = ProtocolEncoder.Decode(_processBuffer.ToArray()); AsyncCleanBuffer(package); if (!package.Finalized) { return; } package.ClientSource = ClientSource; package.SetupProtocolData(); OnClientDecoded(package.ProtocolData); EncodingManager.RunBuinessHandler(package); }
/// <summary> /// 设备认证 /// </summary> /// <param name="buffer"></param> /// <returns></returns> public static AuthResult DeviceAuthcation(byte[] buffer) { var package = ProtocolEncoder.Decode(buffer, ProtocolInfoManager.AllProtocols); if (!package.Finalized) { return(new AuthResult(AuthResultType.DecodedFailed, package)); } var device = GetAuthedDevice(package); return(device == null ? new AuthResult(AuthResultType.DeviceNotRegisted, package) : new AuthResult(AuthResultType.Success, package, device, package.NeedReply)); }
public TResponse Execute <TResponse>(IProtocolRequest <TResponse> request) where TResponse : class, IProtocolResponse, new() { if (_connection == null) { throw new ConnectionRequiredException(); } MessageHeadersDictionary headers = new MessageHeadersDictionary(); byte[] requestHeaders = ProtocolMessageHeaderSerializer.Serialize(headers); byte[] requestBody = ProtocolBodySerializer.Serialize(request); byte[] requestIdentifier = _encoder.Encode(request.GetIdentifier()); IList <ArraySegment <byte> > serializedRequest = ProtocolSerializer.Serialize(requestIdentifier, requestHeaders, requestBody); byte[] responseEncoded = _connection.Send(serializedRequest); var deserializedObject = ProtocolSerializer.Deserialize(responseEncoded); string expectedIdentifier = new TResponse().GetIdentifier(); string identifier = _encoder.Decode(deserializedObject.ControlCommand); if (identifier != expectedIdentifier) { if (identifier == ErrorResponse.Identifier) { ErrorResponse errorResponse = ProtocolBodySerializer.Deserialize <ErrorResponse>(deserializedObject.Body); throw new CustomException(errorResponse.Message); } throw new InvalidResponseException(); } TResponse response = ProtocolBodySerializer.Deserialize <TResponse>(deserializedObject.Body); return(response); }