private void PushData(object state) { var resData = new DataPushResponse { resType = ResponseType.push.ToString(), content = new DataPushContent { subType = "device_prop", body = new Dictionary <string, IEnumerable <TagDataPush> >() } }; foreach (var data in this._rTData.Values) { resData.content.body.Add($"{data.ObjectName}:{data.PropertyName}", new List <TagDataPush> { new TagDataPush { value = data.Value, status = data.Status, timestamp = data.TimeStamp } }); } this.SendMsg <DataPushResponse>(resData); }
public async Task WsHandler(WebSocket socket) { //认证消息验证 if (socket.State == WebSocketState.Open) { var buffer = new byte[1024 * 4]; var result = await socket.ReceiveAsync(new ArraySegment <byte>(buffer), CancellationToken.None); var reqAuth = GetReceiveObj <WsRequest <AuthRequestContent> >(buffer); bool isAuth = true; if (isAuth) {//验证成功 string sessionId = HttpContext.Session.Id; var resAuth = new WsResponse <AuthResponseContent> { resID = reqAuth.reqID, resType = RequestType.request.ToString(), content = new AuthResponseContent { auth = Convert.ToInt32(true).ToString(), sessionId = sessionId } }; var sendBuffer = GetSendBuffer <WsResponse <AuthResponseContent> >(resAuth); await socket.SendAsync(sendBuffer, WebSocketMessageType.Text, true, CancellationToken.None); //session相关操作,如缓存一些连接信息 } else {//验证失败 var resAuth = new WsResponse <object> { resID = reqAuth.reqID, resType = RequestType.request.ToString(), content = new { auth = Convert.ToInt32(false).ToString() } }; var sendBuffer = GetSendBuffer <WsResponse <object> >(resAuth); await socket.SendAsync(sendBuffer, WebSocketMessageType.Text, true, CancellationToken.None); await socket.CloseAsync(WebSocketCloseStatus.NormalClosure, "认证失败,断开socket通道", CancellationToken.None); } } //等待接收订阅消息 if (socket.State == WebSocketState.Open) {//1.接收心跳包,2.接收订阅消息,3.响应订阅请求 var buffer = new byte[1024 * 4]; var result = await socket.ReceiveAsync(new ArraySegment <byte>(buffer), CancellationToken.None); var req = GetReceiveObj <WsRequest <object> >(buffer); if (req.reqType == RequestType.heartbreak.ToString()) {//接收订阅消息 await socket.ReceiveAsync(new ArraySegment <byte>(buffer), CancellationToken.None); var reqSub = GetReceiveObj <WsRequest <SubscribeRequestContent> >(buffer); //去订阅位号数据 this.Subscribe(reqSub.content.body); //响应订阅请求 bool subFlag = true; var resSub = new WsResponse <object> { resID = reqSub.reqID, resType = ResponseType.subscribe.ToString(), content = new { result = Convert.ToInt32(subFlag).ToString() } }; var sendBuffer = GetSendBuffer <WsResponse <object> >(resSub); await socket.SendAsync(sendBuffer, WebSocketMessageType.Text, true, CancellationToken.None); } else {//继续接收心跳包 } } //推送实时数据() while (socket.State == WebSocketState.Open) {//1.推送实时数据,2. var resData = new DataPushResponse { resType = ResponseType.push.ToString(), content = new DataPushContent { subType = "device_prop", body = new Dictionary <string, IEnumerable <TagDataPush> >() } }; resData.content.body.Add("device - 1:prop1", new List <TagDataPush> { new TagDataPush { value = "0.85262805", status = TagDataStatus.normal, timestamp = 1524185355322 } }); resData.content.body.Add("device - 1:prop2", new List <TagDataPush> { new TagDataPush { value = "0.6905742", status = TagDataStatus.normal, timestamp = 1524185355322 } }); var sendBuffer = GetSendBuffer <DataPushResponse>(resData); await socket.SendAsync(sendBuffer, WebSocketMessageType.Text, true, CancellationToken.None); } }