sun-pc 6 months ago
parent
commit
d6a2935084
4 changed files with 86 additions and 23 deletions
  1. 3 1
      src/client/const.go
  2. 56 22
      src/client/router.go
  3. BIN
      src/native-render.exe
  4. 27 0
      src/readme.md

+ 3 - 1
src/client/const.go

@@ -3,5 +3,7 @@ package client
 const (
 	WORK_DEVICE_REGISTER uint32 = 30
 
-	OPEN_NATIVE_RENDER uint32 = 40
+	OPEN_NATIVE_RENDER       uint32 = 40
+	OPEN_NATIVE_RENDER_START uint32 = 42
+	OPEN_NATIVE_RENDER_FAIL  uint32 = 43
 )

+ 56 - 22
src/client/router.go

@@ -24,29 +24,57 @@ func (*OpenNativeRenderRouter) Handle(request ziface.IRequest) {
 	// 获取roomId
 	data := request.GetData()
 	params := strings.Split(string(data), ":")
-	if len(params) != 3 {
+	if len(params) != 2 {
 		zlog.Error("参数不正确")
 		return
 	}
-	deviceId := params[0]
-	roomId := params[1]
-	url := params[2]
+	roomId := params[0]
+	url := params[1]
+
+	// !这里没有deviceId native render如何知道自己属于哪个设备?因为此时room中并没有nr.device
+	go openNativeRender(roomId, url, request.GetConnection())
+
+}
+
+type OpenNativeRenderState struct {
+	DeviceId string
+	RoomId   int
+	Error    string
+}
+
+func openNativeRender(roomId, url string, conn ziface.IConnection) {
+
+	conn.SendMsg(OPEN_NATIVE_RENDER_START, []byte("open native render start"))
 	// 下载url文件
+	time.Sleep(5 * time.Second)
 
-	// TODO 将roomID 以参数形式传递给blender应用
-	// blender中的客户端接收到房间和deviceId后发送创建nativeRender 消息
-	// 打开后更新workdevice数据
-	pid, err := openRenderFile("blender", []string{
-		"-b",
-		url,
-		"--deviceId",
-		deviceId,
-		"--roomId",
-		roomId,
-	})
-	fmt.Println(err)
-	fmt.Println(pid)
+	restartTiem := 0
 
+	for {
+		// 打开应用
+		code, err := openRenderFile("./native-render.exe", []string{
+			"--file",
+			url,
+			"--roomId",
+			roomId,
+		})
+		if err != nil {
+			// 非正常退出
+			if code != 0 {
+				// 发送消息给服务端提示启动失败
+				conn.SendMsg(OPEN_NATIVE_RENDER_FAIL, []byte(err.Error()))
+				fmt.Println(err)
+				// 重试
+				restartTiem += 1
+				if restartTiem > 3 {
+					break
+				}
+			}
+
+		}
+
+		//判断是正常退出还是异常退出 0- 正常退出 != 0异常退出
+	}
 }
 
 func openRenderFile(cmdPath string, args []string) (int, error) {
@@ -55,12 +83,18 @@ func openRenderFile(cmdPath string, args []string) (int, error) {
 	// 运行命令并捕获输出
 	err := cmd.Run()
 	if err != nil {
-		fmt.Printf("Blender 启动失败: %v\n", err)
 		return -1, err
 	}
 
-	// 获取进程ID
-	time.Sleep(3 * time.Second)
-	pid := cmd.Process.Pid
-	return pid, nil
+	err = cmd.Wait()
+	if err != nil {
+		if exitError, ok := err.(*exec.ExitError); ok {
+			// 获取退出码
+			exitCode := exitError.ExitCode()
+			return exitCode, err
+		}
+		return -1, err
+	}
+
+	return 0, nil
 }

BIN
src/native-render.exe


+ 27 - 0
src/readme.md

@@ -1 +1,28 @@
 # work device
+
+## 职责
+
+1. 注册work device
+2. 启动native render
+3. 关闭时删除work device 并通知其中的native device
+4. 每个过程room state状态的变化
+
+## work device 注册逻辑
+
+- [x] work device 启动时初始化数据,msgId,data传入服务端,此时没有房间信息不作房间相关逻辑
+- [x] 将work device数据存入workmgr devices中
+- [x] 设置属性和deviceId用于关闭连接时逻辑的处理
+
+## work device 启动native render
+
+- 其他客户端给服务端发送启动nr的信息
+- 服务端给对应wd转发启动nr的信息
+- wd端(当前)接收服务端转发的消息
+- 根据接收的数据下载文件启动nr
+- nr端启动,注册自己到work device mgr中
+
+## work device 关闭逻辑
+
+- [x] 关闭时根据Property("type")删除work device
+- [x] 给对应native render连接发送device 关闭消息
+- [x] 更新native render绑定的房间状态未等到关闭