//----------------------------------------------------------------------------- // server life cycle //----------------------------------------------------------------------------- public bool StartServer(int clientNum) { // can only start server when it is inactive if (IsServerActive()) { ViveShare_Log.LogWarning(logLevel, "[ViveShare_Server] Server has started already!"); return(false); } // try to start server on given port number if (!NetworkServer.Listen(portNumber)) { ViveShare_Log.LogError(logLevel, "[ViveShare_Server] Failed to start server on port " + portNumber); ViveShare_Event.server_initFailedEvent.Invoke(); return(false); } ViveShare_Log.LogInfo(logLevel, "[ViveShare_Server] Server started on port " + portNumber + " , anticipated client = " + clientNum); // initialize connection data anticipatedClientNum = clientNum; connectionDataList = new List <ConnectionData>(); connectionDataMap = new Dictionary <int, ConnectionData>(); RegisterMessageHandlers(); // registor event callback types ViveShare_Event.RegistorEventEntry(); ViveShare_Event.server_initSuccessEvent.Invoke(); state = ViveNetworkState.Wait_Ready; return(true); }
private void DisconnectInternal() { // detect connection time out if (state == ViveNetworkState.Wait_Connect || state == ViveNetworkState.Wait_TrackerRegistry) { ViveShare_Log.LogError(logLevel, "[ViveShare_Client] Disconnect due to connection timeout"); ViveShare_Event.client_connectFailedEvent.Invoke(); } ViveShare_Log.LogInfo(logLevel, "[ViveShare_Client] Disconnect"); // reset and remove resources if (needTrackerPose) { ViveShare_SyncPose syncPose = Camera.main.gameObject.GetComponent <ViveShare_SyncPose>(); if (syncPose != null) { Destroy(syncPose); } ViveShare_SyncIdentity syncId = Camera.main.gameObject.GetComponent <ViveShare_SyncIdentity>(); if (syncId != null) { Destroy(syncId); } } clientId = -1; ViveShare_Event.client_disconnectEvent.Invoke(); state = ViveNetworkState.Init; }
//----------------------------------------------------------------------------- // networked operation //----------------------------------------------------------------------------- private void FixedUpdate() { // timeout detection if (state == ViveNetworkState.Wait_TrackerRegistry && IsTimeout(Time.time)) { ViveShare_Log.LogError(logLevel, "[ViveShare_Client] Timeout when waiting tracker registry"); networkClient.Disconnect(); DisconnectInternal(); } // messaging if (state == ViveNetworkState.Gaming || state == ViveNetworkState.Wait_Shutdown) { List <ViveShareMessage> msgList = ViveShare_MessageHandler.Instance.GenerateMessagesList(); for (int i = 0; i < msgList.Count; i++) { networkClient.Send(msgList[i].type, msgList[i].body); } } }
//----------------------------------------------------------------------------- // tracker assignment //----------------------------------------------------------------------------- internal void OnTrakcerResitryRequest(NetworkMessage netMsg) { // parse message ViveTrackerRegistryRequestMsg msg = netMsg.ReadMessage <ViveTrackerRegistryRequestMsg>(); // check connectivity int connId = netMsg.conn.connectionId; ConnectionData connData = GetConnectionData(connId); if (connData == null) { return; } // if need to assign a tracker to client string trackerPoseObjName = ""; if (msg.needTrackerPose) { TrackerRole trackerRole = TryToBindTracker(msg.serialNumber, msg.trackerNumber); // if failed, tell client to disconnect if (trackerRole == TrackerRole.Invalid) { ViveShare_Log.LogError(logLevel, "[ViveShare_Server] Failed to assign tracker for client (" + netMsg.conn.connectionId + ")"); netMsg.conn.Disconnect(); return; } // if succeeded, save assigned role and initialize sync pose object else { ViveShare_Log.LogInfo(logLevel, "[ViveShare_Server] Assign tracker (" + trackerRole.ToString() + ") to client (" + netMsg.conn.connectionId + ")"); connData.trackerRole = trackerRole; trackerPoseObjName = trackerRole.ToString(); // create pose tracker and attach sync param object to it GameObject trackerObj = new GameObject(trackerPoseObjName); VivePoseTracker poseTracker = trackerObj.AddComponent <VivePoseTracker>(); poseTracker.viveRole.SetEx <TrackerRole>(trackerRole); ViveShare_SyncIdentity syncId = trackerObj.AddComponent <ViveShare_SyncIdentity>(); syncId.id = trackerPoseObjName; syncId.hasAuthority = true; syncId.Register(); trackerObj.AddComponent <ViveShare_SyncPose>(); if (cameraRig != null) { trackerObj.transform.parent = cameraRig.transform; } connData.trackerObject = trackerObj; } } // return "finished" message ViveTrackerRegistryReturnMsg returnMsg = new ViveTrackerRegistryReturnMsg(); returnMsg.syncObjName = trackerPoseObjName; returnMsg.clientId = connId; NetworkServer.SendToClient(netMsg.conn.connectionId, ViveShareMsgType.TrackerRegistryFinished, returnMsg); // invoke callbacks -- we only think the connection is established at this moment ViveShare_Event.server_clientConnectedEvent.Invoke(netMsg.conn.connectionId); }