private void WsClient_Subscribe <T>(string token, WsRequestMetaData.WsRequestMsgType requestType, T message) { WsRequestMetaData meta; byte[] msg; using (MemoryStream msgStream = new MemoryStream()) { ProtoBuf.Serializer.Serialize(msgStream, message); msg = msgStream.ToArray(); } meta = new WsRequestMetaData { RequestType = requestType, Token = token }; WsRequest request = new WsRequest { Meta = meta, Msg = msg }; SendRequest(request); }
private void WsClient_Login(String key, String secret, int ttl) { byte[] msg; LoginRequest message = new LoginRequest { ExpireControl = new RequestExpired { Now = (long)(DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalMilliseconds, Ttl = ttl }, ApiKey = key }; using (MemoryStream msgStream = new MemoryStream()) { ProtoBuf.Serializer.Serialize(msgStream, message); msg = msgStream.ToArray(); } byte[] sign = ComputeHash(secret, msg); var meta = new WsRequestMetaData { RequestType = WsRequestMetaData.WsRequestMsgType.Login, Token = "Login request", Sign = sign }; WsRequest request = new WsRequest { Meta = meta, Msg = msg }; SendRequest(request); }
private void SendAuthMessage <T>(string secret, string token, WsRequestMetaData.WsRequestMsgType requestType, T message) { WsRequestMetaData meta; byte[] msg; using (MemoryStream msgStream = new MemoryStream()) { ProtoBuf.Serializer.Serialize(msgStream, message); msg = msgStream.ToArray(); } byte[] sign = ComputeHash(secret, msg); meta = new WsRequestMetaData { RequestType = requestType, Token = token, Sign = sign }; WsRequest request = new WsRequest { Meta = meta, Msg = msg }; SendRequest(request); }
private void AuthHandler(object sender, WsRequest <AuthRequestContent> args) { if (CheckToken(args.content.token)) {//认证通过 this._isAuth = true; if (CheckSession(args.content.sessionId)) {//session存在 this._sessionId = args.content.sessionId; var res = new WsResponse <object> { resID = args.reqID, resType = ResponseType.subscribe.ToString(), content = new { result = 1 } }; this.SendMsg <WsResponse <object> >(res);//订阅成功消息 //立即推送位号数据 PushData(null); } else {//session不存在 this._sessionId = Guid.NewGuid().ToString(); var res = new WsResponse <AuthResponseContent> { resID = args.reqID, resType = ResponseType.request.ToString(), content = new AuthResponseContent { auth = "1", sessionId = this._sessionId } }; this.SendMsg <WsResponse <AuthResponseContent> >(res);//返回session } //心跳检测,30秒检测一次 this._lastHearBeat = DateTime.Now; this._hearBeatMonitor = new Timer(this.HearBeatCheck, null, 2000, 30000); } else { this._webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "authentication failed", CancellationToken.None); } }
internal async Task SendAsync(WsRequest request) { if (_connection == null) { throw new InvalidOperationException("Does not connect to WebSocket stream"); } await _connection.SendAsync(request).Stay(); }
public static bool CallWMSInterface(string batchNumber, string method, string requestData, ref string responseData, ref string responseoriginalDate) { bool restult = false; try { WIInput myInput = new WIInput(); myInput.P_BATCH_NUMBER = batchNumber; myInput.P_IFACE_CODE = method; myInput.P_REQUEST_DATA = requestData; WIHeader myHeader = new WIHeader(); myHeader.xmlns = "http://xmlns.oracle.com/apps/per/rest/comm_ws/header"; myHeader.Responsibility = "CUX_DEVE_RESP"; myHeader.RespApplication = "CUX"; myHeader.SecurityGroup = "STANDARD"; myHeader.NLSLanguage = "AMERICAN"; myHeader.Org_Id = "0"; WIRequst myRequst = new WIRequst(); myRequst.InputParameters = myInput; myRequst.RESTHeader = myHeader; myRequst.@xmlns = "http://xmlns.oracle.com/apps/per/rest/comm_ws/invokeebsws"; WsRequest wsRequest = new WsRequest(); wsRequest.comm_ws = myRequst; string request = JsonConvert.SerializeObject(wsRequest); request = request.Insert(request.IndexOf("xmlns"), "@"); HttpClient client = new HttpClient(); client.Timeout = TimeSpan.FromMilliseconds(10000000); //Uri uri = new Uri("http://192.168.2.139:8004/webservices/rest/comm_ws/invokeebsws/"); Uri uri = new Uri("http://192.168.2.120:8000/webservices/rest/comm_ws/invokeebsws/"); //Uri uri = new Uri("http://192.168.2.139:8010/webservices/rest/comm_ws/invokeebsws/"); client.BaseAddress = uri; client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(Encoding.UTF8.GetBytes("REST:Hytera1993"))); var content = new StringContent(request, Encoding.UTF8, "application/json"); HttpResponseMessage response = client.PostAsync(uri, content).Result; string responseJsonText = response.Content.ReadAsStringAsync().Result; responseoriginalDate = responseJsonText; int successIndex = responseJsonText.IndexOf("\"X_RETURN_CODE\" : \"S1001000\""); if (0 < successIndex) { restult = true; } int responseEnd = responseJsonText.LastIndexOf("\""); int responseStart = responseJsonText.IndexOf("X_RESPONSE_DATA"); //byte[] bytes = Convert.FromBase64String(responseJsonText.Substring(responseStart + 20, responseEnd - responseStart - 20)); responseData = Encoding.UTF8.GetString(Convert.FromBase64String(responseJsonText.Substring(responseStart + 20, responseEnd - responseStart - 20))); } catch (Exception e) { } finally { } return(restult); }
private void SendRequest(WsRequest request) { using (var requestStream = new MemoryStream()) { ProtoBuf.Serializer.Serialize(requestStream, request); //ws.Send(requestStream.ToArray()); ws.SendAsync(requestStream.ToArray(), b => { }); } }
private void UnSubscribeHandler(object sender, WsRequest <SubscribeRequestContent> args) { if (!this._isAuth) { this._webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "authentication failed", CancellationToken.None); return; } //订阅数据 this.UnSubscribe(args.content.body); }
public IObservable <IStreamMessage> GlobalTimelineAsObservable() { var id = Guid.NewGuid().ToString(); var body = new WsRequest { Body = new Connection { Channel = "globalTimeline", Id = id }, Type = "connect" }; SendAsync(body).Wait(); return(ApplyStreamFilter(_observable, id)); }
public async Task <object> Excute(WsRequest request) { if (_methods.TryGetValue(request.Method, out var method)) { var instance = _provider.GetService(method.DeclaringType); if (instance is Invoker invoker) { invoker.Client = _provider.GetService <WebSocketSession>().Connection; } return(await method.Invoke(instance, request)); } return($"method [{request.Method}] not found!"); }
private async Task BroadcastLocation(Envelope envelope, WsRequest request) { var locationEnvelope = new Envelope { Data = JsonConvert.SerializeObject(new Location(await GetCity(request.RequestContext.Identity))), FromId = envelope.FromId, RoomId = envelope.RoomId, ToId = envelope.RoomId, Type = "location" }; await Broadcast(locationEnvelope, request.RequestContext.ConnectionId); }
internal async Task <T> SendAsync <T>(WsRequest request) { if (_connection == null) { throw new InvalidOperationException("Does not connect to WebSocket stream"); } await _connection.SendAsync(request).Stay(); var response = await _observable.Cast <WsResponse>().FirstAsync(w => $"api:{request.Body.Id}" == w?.Type); if (response.Body is WsRestResponseObject obj) { return(obj.Res.ToObject <T>()); } return(default);
private async Task ReceiveMsg() { var buffer = new byte[1024 * 4]; var result = await _webSocket.ReceiveAsync(new ArraySegment <byte>(buffer), CancellationToken.None); //关闭socket请求 if (result.CloseStatus != null) { if (this.OnClose != null) { this.OnClose(this, null); return; } } var obj = GetReceiveObj <WsRequest <object> >(buffer); var strContent = obj.content?.ToString(); if (obj.reqType == RequestType.request.ToString() && this.OnAuth != null) {//认证请求 var context = strContent.ToObject <AuthRequestContent>(); var req = new WsRequest <AuthRequestContent> { reqID = obj.reqID, reqType = obj.reqType, content = context }; this.OnAuth(this, req); } else if (obj.reqType == RequestType.heartbreak.ToString() && this.OnHeartbeat != null) {//心跳包 this.OnHeartbeat(this, null); } else if (obj.reqType == RequestType.subscribe.ToString() && this.OnSubscribe != null) {//订阅请求 var context = strContent.ToObject <SubscribeRequestContent>(); var req = new WsRequest <SubscribeRequestContent> { reqID = obj.reqID, reqType = obj.reqType, content = context }; this.OnSubscribe(this, req); } else if (obj.reqType == RequestType.unsubscribe.ToString() && this.OnUnSubscribe != null) {//取消订阅请求 var context = strContent.ToObject <SubscribeRequestContent>(); var req = new WsRequest <SubscribeRequestContent> { reqID = obj.reqID, reqType = obj.reqType, content = context }; this.OnUnSubscribe(this, req); } }
private BinaryData BuildRequest <T>(T?request, string token, WsRequestMsgType requestType, bool signed) where T : class { var result = new BinaryData(); result._buildData = () => { byte[] msg = Array.Empty <byte>(); var meta = new WsRequestMetaData() { RequestType = requestType, Token = token }; if (request is IExpireControl expireControl) { expireControl.ExpireControl = new RequestExpired { Now = DateTime.UtcNow, Ttl = _timeToLive }; } if (request != null) { using (MemoryStream msgStream = new MemoryStream()) { ProtoBuf.Serializer.Serialize(msgStream, request); msg = msgStream.ToArray(); } } WsRequest wsRequest = new WsRequest() { Meta = meta, Msg = msg }; if (signed) { wsRequest.Meta.Sign = authProvider?.Sign(wsRequest.Msg); } using (var requestStream = new MemoryStream()) { ProtoBuf.Serializer.Serialize(requestStream, wsRequest); return(System.Convert.ToBase64String(requestStream.ToArray())); } }; result.Token = token; return(result); }
private async Task <WsRequest> GetRequestParameter(HttpRequest httpRequest) { if (httpRequest.Method == "GET") { var request = new WsRequest(); request.Id = httpRequest.Query["id"]; request.Method = httpRequest.Query["method"]; request.Params = httpRequest.Query["params"].ToString().DeserializeJson <JsonElement>(); return(request); } else { using var reader = new StreamReader(httpRequest.Body); var requestString = await reader.ReadToEndAsync(); var request = requestString.DeserializeJson <WsRequest>(); return(request); } }
public async Task <object> Excute(WsRequest request) { if (request.Method.IsNull()) { return(ErrorCode.MethodNotFound.ToError()); } if (_methods.TryGetValue(request.Method, out var method)) { var instance = _provider.GetService(method.DeclaringType); if (instance is ApiService invoker) { invoker.Client = _provider.GetService <WebSocketSession>().Connection; } return(await method.Invoke(instance, request)); } return(new WsError() { Code = (int)ErrorCode.MethodNotFound, Message = $"method [{request.Method}] not found!" }); }
private async Task ProcessMessage(Envelope envelope, WsRequest request) { if (!bIsInitialised) { var parameters = ssm.GetParametersAsync(new GetParametersRequest { Names = new List <string> { "MaxMindLicense" } }).GetAwaiter().GetResult(); var maxMindLicense = parameters.Parameters.Single(x => x.Name == "MaxMindLicense").Value.Split(","); geoIp = new WebServiceClient(int.Parse(maxMindLicense[0]), maxMindLicense[1]); bIsInitialised = true; } switch (envelope.Type) { case "discover": await AddConnection(envelope.RoomId, envelope.FromId, request.RequestContext.ConnectionId, Guid.Parse(JsonConvert.DeserializeObject <string>(envelope.Data))); await Broadcast(envelope, request.RequestContext.ConnectionId); await BroadcastLocation(envelope, request); break; case "acknowledge": envelope.Data = null; await SendTo(envelope); await BroadcastLocation(envelope, request); break; default: await SendTo(envelope); break; } }
public Task <WsResponse> HandleRequest(WsRequest request) { var response = new WsResponse(); var data = request.GetJson(); var message = data.message; dynamic value = null; switch ((string)message.InterfaceName) { case "setAttributeInfo": value = "hello world"; break; default: Log.W($"Unknwon interface name: {message.InterfaceName}"); break; } var result = new { protocolType = "general", message = new { message.InterfaceName, message.MessageUID, message.SessionID, InterfaceErrorCode = 0, InterfaceErrorMessage = "", ReturnValue = value, ReturnType = value is int? "number" : "string", }, }; response.SetJson(result); return(Task.FromResult(response)); }
private void SubscribeHandler(object sender, WsRequest <SubscribeRequestContent> args) { if (!this._isAuth) { this._webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "authentication failed", CancellationToken.None); return; } //订阅数据 this.Subscribe(args.content.body); //响应客户端订阅 var res = new WsResponse <object> { resID = args.reqID, resType = RequestType.subscribe.ToString(), content = new { result = "1" } }; this.SendMsg <WsResponse <object> >(res); if (this._dataPushTimer == null) { this._dataPushTimer = new Timer(this.PushData, null, 0, 2000); } }
public Task <WsResponse> HandleRequest(WsRequest request) { var response = new WsResponse(); var data = request.GetJson(); if (data == null) { return(Task.FromResult(response)); } dynamic result = null; dynamic callbackReply = null; if (data.init != null) { switch ((string)data.init) { case "get_versions": result = new { tabid = data.tabid, daemon = "9.9.9.9", ex = "9.9.9.9", m = new[] { new { name = data.m, version = "9.9.9.9" } } }; break; default: Log.W($"Unknwon init command: {data.init}"); break; } } else if (data.cmd != null) { var callback = data.callback; dynamic reply = null; switch ((string)data.cmd) { case "setcallback": reply = ""; break; case "native": var args = data.exfunc.args; switch ((string)data.exfunc.fname) { case "Request": dynamic requestParams = JsonConvert.DeserializeObject((string)args[0]); switch ((string)requestParams.key) { case "Clear": callbackReply = new { InputClear = requestParams.elename }; break; case "InvalidateSession": break; default: Log.W($"Unknown request type: {requestParams.key}"); break; } reply = ""; break; case "Key_Init": reply = new { result = "true", isvm = "false", }; callbackReply = new { SeedKey = "SeedKey", value = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", }; break; case "Key_Start": reply = "StartReadyComplete"; // callbackReply = new { addChar = $"a_#_{args[1]}" }; break; case "Key_Keydown": reply = ""; break; case "Key_Stop": reply = ""; callbackReply = new { GetActiveElement = args[2] }; break; case "Key_RealStop": reply = ""; break; default: Log.W($"Unknown native call: {data.exfunc.fname}"); break; } break; default: Log.W($"Unknwon command: {data.cmd}"); break; } result = new { response = new { id = data.id, tabid = data.tabid, status = "TRUE", reply = new { reply = new { status = "0", reply = reply } }, callback = callback ?? "", } }; } response.SetJson(result); if (callbackReply != null) { var callbackResult = new { response = new { id = "setcallback", callback = "update_callback", reply = callbackReply, } }; var callbackResponse = new WsResponse(); callbackResponse.SetJson(callbackResult); response.Additional = callbackResponse; } return(Task.FromResult(response)); }
public dynamic Invoke(object instance, WsRequest request) { var paras = PrepareParameters(request.Params); return(InvokeInternal(instance, paras.ToArray())); }
private IAsyncEnumerator <byte[]> HandleWsRequest(StreamReader reader) { return(new AsyncEnumerator <byte[]>(async yield => { var requestLine = await reader.ReadLineAsync(); if (string.IsNullOrWhiteSpace(requestLine)) { yield.Break(); } var httpRequest = new HttpRequest(requestLine); while (true) { var line = await reader.ReadLineAsync(); if (string.IsNullOrEmpty(line)) { break; } httpRequest.AddHeader(line); } Log.D($"[{Identifier}] WS Handshake {httpRequest.Path}"); var key = Encoding.ASCII.GetBytes(httpRequest.Headers["Sec-WebSocket-Key"] + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"); var httpResponse = new HttpResponse(); httpResponse.StatusCode = HttpStatusCode.SwitchingProtocols; httpResponse.Headers["Connection"] = "Upgrade"; httpResponse.Headers["Upgrade"] = "websocket"; httpResponse.Headers["Sec-WebSocket-Accept"] = Convert.ToBase64String(SHA1.Create().ComputeHash(key)); await yield.ReturnAsync(httpResponse.ToBytes()); while (true) { var request = new WsRequest(); while (true) { var buffer = new byte[1024]; var readCount = await reader.BaseStream.ReadAsync(buffer, 0, buffer.Length); if (request.AddBytes(buffer.Take(readCount))) { break; } } Log.D($"[{Identifier}] WS Message ({request.Opcode})"); switch (request.Opcode) { case WsOpcode.Text: case WsOpcode.Binary: var response = await((IWsHandler)Handler).HandleRequest(request); await yield.ReturnAsync(response.ToBytes()); break; case WsOpcode.Close: yield.Break(); break; case WsOpcode.Ping: case WsOpcode.Pong: break; default: Log.B(request.RawContent); break; } } })); }
public async Task SendAsync(WsRequest request) { await SendAsync(JsonConvert.SerializeObject(request)).Stay(); }
private void DisplayUsers() { // authenticates AuthenticationResponse authentication = new Authentication(new Credentials("admin", "password")) .PerformRequestAsync() .Result; if (authentication.IsSuccess) { Console.WriteLine("Authentication success.", Color.Cyan); Console.WriteLineFormatted( "{0}: {1}", Color.White, new Formatter[] { new Formatter("Context ID", Color.White), new Formatter(authentication.ContextID, Color.PaleGreen) } ); } else { Console.WriteLine("Authentication failed.", Color.Cyan); Console.WriteLine(authentication.Error.ErrorMessage, Color.Gray); } Console.WriteLine(); // get device list DevicesResponse devices = new Devices() .PerformRequestAsync() .Result; if (devices.IsSuccess) { Console.WriteLine("Device list:", Color.Cyan); foreach (Device device in devices.Devices.OrderBy(d => !d.IsConnected).ThenBy(d => d.DisplayName)) { Console.WriteLineFormatted( " - {0} ({1}{2}{3})", Color.White, new Formatter[] { new Formatter(device.DisplayName, Color.White), new Formatter( device.IsConnected ? device.HasAddress ? device.Addresses[0].IpAddress : "no address" : "disconnected", device.IsConnected ? device.HasAddress ? Color.PaleGreen : Color.LightGoldenrodYellow : Color.IndianRed ), new Formatter( device.IsConnected ? device.IsEthernet ? ", " : ", " : "", Color.White ), new Formatter( device.IsConnected ? device.IsEthernet ? "ethernet" : "wireless" : "", device.IsConnected ? device.IsEthernet ? Color.PaleGreen : Color.LightGoldenrodYellow : Color.White ) } ); } } else { Console.WriteLine("Failed.", Color.Cyan); Console.WriteLine(authentication.Error.ErrorMessage, Color.Gray); } Console.WriteLine(); // disables wifi WsResponse ws = new WsRequest( "NMC.Wifi", "set", new Dictionary <string, string>() { { "Enable", "False" }, { "Status", "False" } }) .PerformRequestAsync() .Result; Console.WriteLine("Disabling Wi-Fi.", Color.Cyan); if (ws.IsSuccess) { Console.WriteLineFormatted( "{0}.", Color.White, new Formatter[] { new Formatter("Succeed", Color.PaleGreen), } ); } else { Console.WriteLineFormatted( "{0}. {1} ({2}).", Color.White, new Formatter[] { new Formatter("Failed", Color.IndianRed), new Formatter(ws.Error.ErrorMessage, Color.Gray), new Formatter(ws.Error.ErrorCode, Color.Gray) } ); } Console.WriteLine(); // gets ws paths Console.WriteLine("Listing WS paths.", Color.Cyan); foreach (WsPath path in WsRequest.GetWsPaths().Result) { Console.WriteLineFormatted( " - {0} [ {1} ]", Color.White, new Formatter[] { new Formatter(path.Path, Color.PaleGreen), new Formatter(string.Join(", ", path.Methods.ToArray()), Color.Gray), } ); } Console.Read(); }