sceneGrpcServer.java 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426
  1. package com.fdkk.fdkkmeta.grpcService;
  2. import cn.hutool.core.bean.BeanUtil;
  3. import cn.hutool.core.util.ArrayUtil;
  4. import com.alibaba.fastjson.JSON;
  5. import com.alibaba.fastjson.JSONArray;
  6. import com.fdkk.fdkkmeta.config.MetaConfig;
  7. import com.fdkk.fdkkmeta.domain.dto.RouteDto;
  8. import com.fdkk.fdkkmeta.domain.entity.mysql.BreakpointsEntity;
  9. import com.fdkk.fdkkmeta.domain.entity.mysql.RotateFrameEntity;
  10. import com.fdkk.fdkkmeta.domain.entity.mysql.UserEntity;
  11. import com.fdkk.fdkkmeta.domain.po.PointPO;
  12. import com.fdkk.fdkkmeta.grpc.*;
  13. import com.fdkk.fdkkmeta.redis.RedisCache;
  14. import com.fdkk.fdkkmeta.service.BreakpointsService;
  15. import com.fdkk.fdkkmeta.service.MoveFrameService;
  16. import com.fdkk.fdkkmeta.service.RotateFrameService;
  17. import com.fdkk.fdkkmeta.service.UserService;
  18. import com.fdkk.fdkkmeta.util.ProtoJsonUtils;
  19. import com.fdkk.fdkkmeta.util.kesar.GetRoute;
  20. import com.google.protobuf.Message;
  21. import com.googlecode.protobuf.format.JsonFormat;
  22. import io.grpc.stub.StreamObserver;
  23. import lombok.extern.slf4j.Slf4j;
  24. import net.devh.boot.grpc.server.service.GrpcService;
  25. import org.json.JSONObject;
  26. import org.springframework.beans.factory.annotation.Autowired;
  27. import java.io.File;
  28. import java.io.IOException;
  29. import java.util.List;
  30. /**
  31. * @author Xiewj
  32. * @date 2022/5/9
  33. */
  34. @GrpcService
  35. @Slf4j
  36. public class sceneGrpcServer extends SceneGrpcServiceGrpc.SceneGrpcServiceImplBase {
  37. @Autowired
  38. MetaConfig metaConfig;
  39. @Autowired
  40. UserService userService;
  41. @Autowired
  42. BreakpointsService breakpointsService;
  43. @Autowired
  44. RotateFrameService rotateFrameService;
  45. @Autowired
  46. MoveFrameService moveFrameService;
  47. @Autowired
  48. RedisCache redisCache;
  49. /***
  50. * 回复 案例
  51. * SceneReply res = SceneReply.newBuilder().setRes(id+","+name).build();
  52. * responseObserver.onNext(res);
  53. */
  54. /*
  55. @Override
  56. public void testMethod(SceneRequest request, StreamObserver<SceneReply> responseObserver) {
  57. // grpc服务端获取调用端请求参数
  58. String id = request.getId();
  59. String name = request.getName();
  60. // 这里可以有自己的业务代码,只需要按照porto中的返回类型返回参数即可
  61. SceneReply res = SceneReply.newBuilder().setRes(id+","+name).build();
  62. responseObserver.onNext(res);
  63. responseObserver.onCompleted();
  64. log.info("回复{}",res);
  65. }
  66. */
  67. @Override
  68. public void getRoute(RouteRequest request, StreamObserver<RouteReply> responseObserver) {
  69. // grpc服务端获取调用端请求参数
  70. String sceneCode = request.getSceneCode();
  71. Point sLocation = request.getSLocation();
  72. Point eLocation = request.getELocation();
  73. RouteDto po=new RouteDto();
  74. PointPO s=new PointPO();
  75. s.setX(Double.parseDouble(sLocation.getX()));
  76. s.setY(Double.parseDouble(sLocation.getY()));
  77. s.setZ(Double.parseDouble(sLocation.getY()));
  78. PointPO e=new PointPO();
  79. e.setX(Double.parseDouble(eLocation.getX()));
  80. e.setY(Double.parseDouble(eLocation.getY()));
  81. e.setZ(Double.parseDouble(eLocation.getY()));
  82. po.setE_location(e);
  83. po.setS_location(s);
  84. po.setSceneCode(sceneCode);
  85. JSONArray maps = GetRoute.getRoute(metaConfig.getFreespacePath()+ File.separator +"target_freespace.json", po);
  86. // 这里可以有自己的业务代码,只需要按照porto中的返回类型返回参数即可
  87. RouteReply.Builder builder = RouteReply.newBuilder();
  88. if (ArrayUtil.isNotEmpty(maps)) {
  89. for (int i = 0; i < maps.size(); i++) {
  90. RouteArray.Builder addInBuilder = builder.addInBuilder();
  91. ProtoJsonUtils.toProtoBean(addInBuilder, maps.get(i).toString());
  92. }
  93. }
  94. responseObserver.onNext(builder.build());
  95. responseObserver.onCompleted();
  96. }
  97. @Override
  98. public void init(InitRequest request, StreamObserver<NormalReply> responseObserver) {
  99. try {
  100. String user_id = request.getUserId();
  101. String nick_name = request.getNickName();
  102. String skin_id = request.getSkinId();
  103. String avatar_id = request.getAvatarId();
  104. String room_id = request.getRoomId();
  105. String app_id = request.getAppId();
  106. //保存user
  107. UserEntity userEntity=new UserEntity();
  108. userService.save(userEntity);
  109. //初始化的时候可以写死
  110. //frame_id
  111. //break_point_id
  112. //player_angle
  113. //再写入user表
  114. }
  115. catch(Exception e) {
  116. e.printStackTrace();
  117. }
  118. }
  119. @Override
  120. public void rotate(RotateRequest request, StreamObserver<NormalReply> responseObserver) {
  121. try {
  122. /*
  123. {
  124. "action_type":1014,
  125. "rotation_action":
  126. {
  127. "vertical_move":0,
  128. "horizontal_move":-0.020630372492836675
  129. },
  130. "trace_id":"b40a894e-cd59-4db5-8d75-a8466a0c9f15",
  131. "user_id":"0a3987974feb4"
  132. }
  133. */
  134. int action_type = request.getActionType();
  135. //request.getRotationAction()
  136. String trace_id = request.getTraceId();
  137. String user_id = request.getUserId();
  138. //这三个变量从user表和rotateframe表里取
  139. UserEntity user = userService.findById(user_id);
  140. BreakpointsEntity breakpointsEntity = breakpointsService.findById(user.getBreakPointId());
  141. RotateFrameEntity rotateFrameEntity = rotateFrameService.findById(user.getFrameId());
  142. Space player = null;
  143. Space camera = null;
  144. Point cameraCenter = null;
  145. State playerState = createPlayerState( player, camera, cameraCenter);
  146. RenderInfo renderInfo = createRenderInfo();
  147. Event event = createEvent();
  148. UserState userState = createUserState( user_id, playerState, renderInfo, event);
  149. /// metaConfig.getVideoFramePath()
  150. log.info("VideoFramePath{}", metaConfig.getVideoFramePath());
  151. NormalReply res = NormalReply.newBuilder()
  152. .setTraceIds(0, trace_id)
  153. .setVehicle(null)
  154. .setNewUserStates(0, userState)
  155. .setActionResponses(0, 0) //这个要查查
  156. .setGetStateType(0)
  157. .setCode(0)
  158. .setMsg("OK")
  159. .setFrameSrc(null) //从数据库中获取对应的路径
  160. .build();
  161. responseObserver.onNext(res);
  162. responseObserver.onCompleted();
  163. }
  164. catch(Exception e) {
  165. e.printStackTrace();
  166. }
  167. }
  168. //返回的是角度矫正数据
  169. @Override
  170. public void moveStart(StartMoveRequest request, StreamObserver<MoveReply> responseObserver) {
  171. try {
  172. /*
  173. * 1.从user表里获得当前人物所在的breakPoint_id
  174. * 2.根据breakPoint_id,从breakpoints表里获得对应的起始坐标
  175. * 3.根据request中的clicking_action里的clicking_point(目的地)以及当前起始坐标计算出路径
  176. * 4.返回整个路径的一段
  177. *
  178. * */
  179. int action_type= request.getActionType();
  180. ClickingAction clicking_action = request.getClickingAction();
  181. Point end = clicking_action.getClickingPoint();
  182. State clicking_state = request.getClickingState();
  183. String trace_id = request.getTraceId();
  184. String user_id = request.getUserId();
  185. UserEntity userEntity = userService.findById(user_id);
  186. BreakpointsEntity breakpointsEntity = breakpointsService.findById(userEntity.getBreakPointId());
  187. Point start = null; //从user表里取
  188. //计算路径
  189. String appId = userEntity.getAppId();
  190. RouteDto po=new RouteDto();
  191. PointPO s=new PointPO();
  192. s.setX(Double.parseDouble(start.getX()));
  193. s.setY(Double.parseDouble(start.getY()));
  194. s.setZ(Double.parseDouble(start.getY()));
  195. PointPO e=new PointPO();
  196. e.setX(Double.parseDouble(end.getX()));
  197. e.setY(Double.parseDouble(end.getY()));
  198. e.setZ(Double.parseDouble(end.getY()));
  199. po.setE_location(e);
  200. po.setS_location(s);
  201. po.setSceneCode(appId);
  202. JSONArray maps = GetRoute.getRoute(metaConfig.getFreespacePath()+ File.separator +appId+"_target_freespace.json", po);
  203. //处理路径数组,处理完成后放入缓存
  204. redisCache.setCacheObject(trace_id,maps);
  205. //开始返回结果,一段一段的返回(每段是两个邻居点的过渡),第一段之前还要有角度的矫正
  206. //矫正的结果:
  207. //moveFrameService.findById()
  208. //这三个变量从user表和rotateframe表里取。自己对应的都是空
  209. Space player = null;
  210. Space camera = null;
  211. Point cameraCenter = null;
  212. State playerState = createPlayerState( player, camera, cameraCenter);
  213. RenderInfo renderInfo = createRenderInfo();
  214. Event event = createEvent();
  215. UserState userState = createUserState( user_id, playerState, renderInfo, event);
  216. MoveReply res = MoveReply.newBuilder()
  217. .setTraceIds(0, trace_id)
  218. .setVehicle(null)
  219. .setNewUserStates(0, userState)
  220. .setActionResponses(0, 0) //这个要查查
  221. .setGetStateType(0)
  222. .setCode(0)
  223. .setMsg("OK")
  224. //.setPlayer(index, value)
  225. //.setCamera(index, value)
  226. //.setCameraCenter(index, value)
  227. //.setFrameSrc(index, value)
  228. .setIsEnd(false)
  229. .build();
  230. }
  231. catch(Exception e) {
  232. e.printStackTrace();
  233. }
  234. }
  235. @Override
  236. public void moveProcess(MoveNextNeighborRequest request, StreamObserver<MoveReply> responseObserver) {
  237. try {
  238. /*
  239. * 1.从user表里获得当前人物所在的breakPoint_id
  240. * 2.根据breakPoint_id,从breakpoints表里获得对应的起始坐标
  241. * 3.根据request中的clicking_action里的clicking_point(目的地)以及当前起始坐标计算出路径
  242. * 4.返回整个路径的一段
  243. *
  244. * */
  245. String user_id = request.getUserId();
  246. String trace_id = request.getTraceId();
  247. boolean needNext = request.getNext();
  248. //moveStart的结果参考moveStart
  249. }
  250. catch(Exception e) {
  251. e.printStackTrace();
  252. }
  253. }
  254. @Override
  255. public void getBreakPoint(BreakPointRequest request, StreamObserver<BreakPointReply> responseObserver) {
  256. try {
  257. log.info("进入{}",request);
  258. int action_type = request.getActionType();
  259. NeighborPointsAction get_neighbor_points_action = request.getGetNeighborPointsAction();
  260. String trace_id = request.getTraceId();
  261. String user_id = request.getUserId();
  262. //从表breakpoints里获取所有的呼吸点,并且是数组
  263. //TODO 根据查询所有
  264. UserEntity userEntity = userService.findById(user_id);
  265. List<BreakpointsEntity> allList = breakpointsService.findByAppId(userEntity.getAppId());
  266. Point[] nps=null;
  267. BreakPointReply res = BreakPointReply.newBuilder()
  268. .setActionType(action_type)
  269. .setPointType(100)
  270. .setExtra("")
  271. .setTraceId(trace_id)
  272. .setPacketId("")
  273. //.setNps(nps)
  274. .setPeopleNum(0)
  275. .setZoneId("")
  276. .setEchoMsg("")
  277. .setReserveDetail(null)
  278. //.setUserWithAvatarList()
  279. //.setNewUserStates()
  280. .setCode(0)
  281. .setMsg("")
  282. .build();
  283. responseObserver.onNext(res);
  284. responseObserver.onCompleted();
  285. log.info("回复{}",res);
  286. }
  287. catch(Exception e) {
  288. e.printStackTrace();
  289. }
  290. }
  291. //操作杆
  292. @Override
  293. public void joystick(JoystickRequest request, StreamObserver<NormalReply> responseObserver) {
  294. try {
  295. log.info("进入{}",request);
  296. // responseObserver.onNext(res);
  297. // responseObserver.onCompleted();
  298. // log.info("回复{}",res);
  299. }
  300. catch(Exception e) {
  301. e.printStackTrace();
  302. }
  303. }
  304. private UserState createUserState(String user_id,State state,RenderInfo renderInfo,Event event) {
  305. UserState userState = UserState.newBuilder()
  306. .setUserId(user_id)
  307. .setPlayerState(state)
  308. .setRenderInfo(renderInfo)
  309. .setEvent(event)
  310. .setRelation(1)
  311. .build();
  312. return userState;
  313. }
  314. private State createPlayerState(Space player,Space camera,Point cameraCenter) {
  315. State playerState = State.newBuilder()
  316. .setRoomTypeId("")
  317. .setPerson(0)
  318. .setAvatarId("")
  319. .setSkinId("")
  320. .setRoomId("")
  321. .setIsHost(false)
  322. .setIsFollowHost(false)
  323. .setSkinDataVersion("")
  324. .setAvatarComponents("")
  325. .setNickName("")
  326. .setMovingMode(0)
  327. .setAttitude("")
  328. .setAreaName("")
  329. .setPathName("")
  330. .setPathId("")
  331. .setAvatarSize(1)
  332. .setExtra("")
  333. .setPrioritySync(false)
  334. .setPlayer(player)
  335. .setCamera(camera)
  336. .setCameraCenter(cameraCenter).build();
  337. return playerState;
  338. }
  339. private RenderInfo createRenderInfo() {
  340. RenderInfo renderInfo = RenderInfo.newBuilder()
  341. .setRenderType(0)
  342. .setVideoFrame(null)
  343. .setCameraStateType(0)
  344. .setIsMoving(0)
  345. .setNeedIfr(0)
  346. .setIsVideo(0)
  347. .setStillFrame(0)
  348. .setIsRotating(0)
  349. .setIsFollowing(0)
  350. .setClientPanoTreceId("")
  351. .setPrefetchVideoId("")
  352. .setNoMedia(false).build();
  353. return renderInfo;
  354. }
  355. private Event createEvent() {
  356. Event event = Event.newBuilder().setId("").setType(0).setRotateEvent(null).setRemoveVisitorEvent(null).build();
  357. return event;
  358. }
  359. private Space createSpace(Point position,AngleUe4 angle) {
  360. Space space = Space.newBuilder().setPosition(position).setAngle(angle).build();
  361. return space;
  362. }
  363. private Point createPoint(String x,String y,String z) {
  364. Point point = Point.newBuilder().setX(x).setY(y).setZ(z).build();
  365. return point;
  366. }
  367. private AngleUe4 createAngle(int pitch,int yaw,int roll) {
  368. AngleUe4 angle = AngleUe4.newBuilder().setPitch(pitch).setYaw(yaw).setRoll(roll).build();
  369. return angle;
  370. }
  371. }