UpdateFrameMetaTask.java 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461
  1. package com.fdkk.fdkkmeta.task;
  2. import cn.hutool.core.util.ArrayUtil;
  3. import com.alibaba.fastjson.JSONArray;
  4. import com.alibaba.fastjson.JSONObject;
  5. import com.fdkk.fdkkmeta.domain.entity.mysql.BreakpointsEntity;
  6. import com.fdkk.fdkkmeta.domain.entity.mysql.MoveFrameEntity;
  7. import com.fdkk.fdkkmeta.domain.entity.mysql.RotateFrameEntity;
  8. import com.fdkk.fdkkmeta.domain.entity.mysql.UserEntity;
  9. import com.fdkk.fdkkmeta.domain.po.*;
  10. import com.fdkk.fdkkmeta.grpc.*;
  11. import com.fdkk.fdkkmeta.grpcService.SceneGrpcService;
  12. import com.fdkk.fdkkmeta.redis.RedisCache;
  13. import com.fdkk.fdkkmeta.service.BreakpointsService;
  14. import com.fdkk.fdkkmeta.service.MoveFrameService;
  15. import com.fdkk.fdkkmeta.service.UserService;
  16. import com.fdkk.fdkkmeta.service.RotateFrameService;
  17. import com.fdkk.fdkkmeta.util.kesar.GetRoute;
  18. import lombok.extern.slf4j.Slf4j;
  19. import org.springframework.beans.factory.annotation.Autowired;
  20. import org.springframework.scheduling.annotation.Scheduled;
  21. import org.springframework.stereotype.Component;
  22. import java.io.File;
  23. import java.util.ArrayList;
  24. import java.util.Arrays;
  25. import java.util.List;
  26. /**
  27. * @author Xiewj
  28. * @date 2022/3/30
  29. */
  30. @Component
  31. @Slf4j
  32. public class UpdateFrameMetaTask {
  33. @Autowired
  34. RedisCache redisCache;
  35. @Autowired
  36. UserService userService;
  37. @Autowired
  38. RotateFrameService rotateFrameService;
  39. @Autowired
  40. MoveFrameService moveFrameService;
  41. @Autowired
  42. SceneGrpcService sceneGrpcService;
  43. @Autowired
  44. BreakpointsService breakpointsService;
  45. @Scheduled(initialDelay=1000, fixedDelay=1000/30)
  46. public void updateFrameMetadata(){
  47. List<UserEntity> userOnline = userService.findUserOnline(true);
  48. log.info("进入定时任务{}", ArrayUtil.isNotEmpty(userOnline)?userOnline.size():0);
  49. // JSONObject a=new JSONObject();
  50. // a.put("123123",123123);
  51. //使用并行流处理数据
  52. userOnline.parallelStream().forEach(
  53. userEntity -> {
  54. //UserEntity user = redisCache.getCacheObject("setCacheRequest:" + userEntity.getUserId());
  55. // redisCache.set("updateFrameMetadata:"+userEntity.getUserId(),a.toJSONString());
  56. List<ActionPO> list = redisCache.getCacheList("setCacheRequest"+userEntity.getUserId());
  57. handle( userEntity,list);
  58. }
  59. );
  60. }
  61. private void handle(UserEntity user,List<ActionPO> list){
  62. try {
  63. if(list.size() == 0){
  64. //写入一个默认数据到redis里
  65. createDefaultFrameMetadata( user);
  66. return;
  67. }
  68. List<ActionPO> rotateJoystickList = new ArrayList<ActionPO>();
  69. JSONObject myState = redisCache.getCacheObject("UserState"+user.getUserId());
  70. ActionPO _actionPO = list.get(0);
  71. int firstActionType = _actionPO.getAction_type();
  72. JSONArray path = _actionPO.getPath();
  73. if(firstActionType == 1014||firstActionType == 15){
  74. rotateJoystickList.add(_actionPO);
  75. }
  76. else if(firstActionType == 1){
  77. long startBreakPointId = path.getLongValue(0);
  78. long endBreakPointId = path.getLongValue(1);
  79. BreakpointsEntity startBreakpointsEntity = breakpointsService.findById(startBreakPointId);
  80. BreakpointsEntity endBreakpointsEntity = breakpointsService.findById(endBreakPointId);
  81. //过渡
  82. if(myState.getIntValue("isMoving") == 1){
  83. MoveFrameEntity moveFrameEntity = moveFrameService.findByAppIAndStartBreakPointIdAndEndBreakPointIdAndAngleAndFrameIndex(user.getAppId(), startBreakPointId, endBreakPointId,_actionPO.getCameraAngle().getYaw(),_actionPO.getFrameIndex()+1);
  84. //准备过渡下一段
  85. if(moveFrameEntity==null){
  86. RotateFrameEntity rotateFrameEntity = rotateFrameService.findByAppIdAndBreakPointIdAndFrameIndex(user.getAppId(),endBreakPointId,_actionPO.getCameraAngle().getYaw());
  87. path.remove(0);
  88. if(path.size()>1){
  89. startBreakPointId = endBreakPointId;
  90. endBreakPointId = path.getLongValue(1);
  91. _actionPO.setPath(path);
  92. _actionPO.setFrameIndex(0);
  93. _actionPO.setStartPostion(null);
  94. _actionPO.setEndPosition(null);
  95. int subFrameIndex = moveFrameService.getCountByAppIAndStartBreakPointIdAndEndBreakPointIdAndAngle( user.getAppId(),startBreakPointId,endBreakPointId, _actionPO.getCameraAngle().getYaw()%45);
  96. _actionPO.setSubFrameIndex(subFrameIndex);
  97. _actionPO.setPlayerPosition(endBreakpointsEntity.getPosition());
  98. startBreakpointsEntity = breakpointsService.findById(startBreakPointId);
  99. endBreakpointsEntity = breakpointsService.findById(endBreakPointId);
  100. int _angle = sceneGrpcService.calAngleForBreakPointId(startBreakpointsEntity,endBreakpointsEntity);
  101. AnglePO playerAngle = user.getPlayerAngle();
  102. playerAngle.setYaw(_angle);
  103. _actionPO.setPlayerAngle(playerAngle);
  104. //更新redis记录
  105. redisCache.setCacheListByIndex("setCacheRequest"+user.getUserId(),0,_actionPO);
  106. myState.put("isMoving",0);
  107. redisCache.setCacheObject("UserState"+user.getUserId(),myState);
  108. //moveFrameEntity = moveFrameService.findByAppIAndStartBreakPointIdAndEndBreakPointIdAndAngleAndFrameIndex(user.getAppId(), startBreakPointId, endBreakPointId,_actionPO.getCameraAngle().getYaw(),0);
  109. user.setFrameId(rotateFrameEntity.getId());
  110. user.setPlayerAngle(playerAngle);
  111. user.setBreakPointId(startBreakPointId);
  112. user.setPlayerPosition(startBreakpointsEntity.getPosition());
  113. userService.updateById(user);
  114. }
  115. //过渡全部结束
  116. else{
  117. //删除redis里的数据
  118. redisCache.lTrim("setCacheRequest"+user.getUserId(),1,-1);
  119. //更新user表
  120. //moveFrameEntity = moveFrameService.findByAppIAndStartBreakPointIdAndEndBreakPointIdAndAngleAndFrameIndex(user.getAppId(), startBreakPointId, endBreakPointId,_actionPO.getCameraAngle().getYaw(),_actionPO.getFrameIndex());
  121. user.setPlayerPosition(endBreakpointsEntity.getPosition());
  122. user.setFrameId(rotateFrameEntity.getId());
  123. user.setPlayerAngle(_actionPO.getPlayerAngle());
  124. user.setBreakPointId(endBreakPointId);
  125. userService.updateById(user);
  126. myState.put("isMoving",0);
  127. redisCache.setCacheObject("UserState"+user.getUserId(),myState);
  128. //执行下一条记录
  129. list.remove(0);
  130. }
  131. handle( user,list);
  132. return ;
  133. }
  134. //更新
  135. if(_actionPO.getStartPostion() == null){
  136. _actionPO.setStartPostion(startBreakpointsEntity.getPosition());
  137. _actionPO.setEndPosition(endBreakpointsEntity.getPosition());
  138. }
  139. _actionPO.setFrameIndex(_actionPO.getFrameIndex()+1);
  140. PointPO playerPosition = new PointPO();
  141. playerPosition.setX((_actionPO.getEndPosition().getX() - _actionPO.getStartPostion().getX())/_actionPO.getSubFrameIndex()*_actionPO.getFrameIndex());
  142. playerPosition.setY((_actionPO.getEndPosition().getY() - _actionPO.getStartPostion().getY())/_actionPO.getSubFrameIndex()*_actionPO.getFrameIndex());
  143. playerPosition.setZ((_actionPO.getEndPosition().getZ() - _actionPO.getStartPostion().getZ())/_actionPO.getSubFrameIndex()*_actionPO.getFrameIndex());
  144. createMoveFrameMetadata(user.getUserId(),_actionPO.getPlayerAngle(), playerPosition, moveFrameEntity,_actionPO.getTrace_id());
  145. //更新redis里的数据
  146. redisCache.setCacheListByIndex("setCacheRequest"+user.getUserId(),0,_actionPO);
  147. }
  148. else if(myState.getIntValue("isMoving") == 0){
  149. if(list.size()>0){
  150. //中断,执行下一条记录
  151. list.remove(0);
  152. redisCache.lTrim("setCacheRequest"+user.getUserId(),1,-1);
  153. handle( user,list);
  154. return ;
  155. }
  156. else{
  157. //过渡
  158. myState.put("isMoving",1);
  159. redisCache.setCacheObject("UserState"+user.getUserId(),myState);
  160. MoveFrameEntity moveFrameEntity = moveFrameService.findByAppIAndStartBreakPointIdAndEndBreakPointIdAndAngleAndFrameIndex(user.getAppId(), startBreakPointId, endBreakPointId,_actionPO.getCameraAngle().getYaw(),_actionPO.getFrameIndex()+1);
  161. //更新
  162. int _angle = sceneGrpcService.calAngleForBreakPointId(startBreakpointsEntity,endBreakpointsEntity);
  163. AnglePO playerAngle = user.getPlayerAngle();
  164. playerAngle.setYaw(_angle);
  165. createMoveFrameMetadata( user.getUserId(),playerAngle,startBreakpointsEntity.getPosition(), moveFrameEntity,_actionPO.getTrace_id());
  166. _actionPO.setFrameIndex(_actionPO.getFrameIndex()+1);
  167. _actionPO.setStartPostion(startBreakpointsEntity.getPosition());
  168. _actionPO.setEndPosition(endBreakpointsEntity.getPosition());
  169. //更新redis里的数据
  170. redisCache.setCacheListByIndex("setCacheRequest"+user.getUserId(),0,_actionPO);
  171. }
  172. }
  173. /****************************************************************************************/
  174. return;
  175. }
  176. long lastFrameId = _actionPO.getFrameId();
  177. for(int i=1;i<list.size();++i){
  178. ActionPO actionPO = list.get(i);
  179. // if(firstActionType != actionPO.getAction_type()){
  180. // break;
  181. // }
  182. //旋转
  183. if(actionPO.getAction_type() == 1014||actionPO.getAction_type() == 15){
  184. rotateJoystickList.add(actionPO);
  185. lastFrameId = actionPO.getFrameId();
  186. continue;
  187. }
  188. else{
  189. break;
  190. }
  191. }
  192. createRotateFrameMetadata( user, rotateJoystickList, firstActionType);
  193. //删除redis里的数据
  194. redisCache.lTrim("setCacheRequest"+user.getUserId(),rotateJoystickList.size(),-1);
  195. //更新user表
  196. user.setFrameId(lastFrameId);
  197. userService.updateById(user);
  198. }catch (Exception e){
  199. e.printStackTrace();
  200. log.info("handleException{}",e.getMessage());
  201. }
  202. }
  203. private void createDefaultFrameMetadata(UserEntity user){
  204. String[] traceIds = new String[1];
  205. traceIds[0] = "";
  206. JSONArray actionResponses = new JSONArray();
  207. RotateFrameEntity rotateFrameEntity = rotateFrameService.findById(user.getFrameId());
  208. PointPO playerPosition = user.getPlayerPosition();
  209. Point playerPt = Point.newBuilder().setX(String.valueOf(playerPosition.getX())).setY(String.valueOf(playerPosition.getY())).setZ(String.valueOf(playerPosition.getZ())).build();
  210. AnglePO playerAngle = user.getPlayerAngle();
  211. AngleUe4 playerAg =AngleUe4.newBuilder().setPitch(playerAngle.getPitch()).setYaw(playerAngle.getYaw()).setRoll(playerAngle.getRoll()).build();
  212. Space player = sceneGrpcService.createSpace(playerPt,playerAg);
  213. PointPO cameraPoint = rotateFrameEntity.getCameraPosition();
  214. Point cameraPosition = sceneGrpcService.createPoint(String.valueOf(cameraPoint.getX()),String.valueOf(cameraPoint.getY()),String.valueOf(cameraPoint.getZ()));
  215. AnglePO cameraAnglePO = rotateFrameEntity.getCameraAngle();
  216. AngleUe4 cameraAngle = sceneGrpcService.createAngle(cameraAnglePO.getPitch(),cameraAnglePO.getYaw(),cameraAnglePO.getRoll());
  217. Space camera = sceneGrpcService.createSpace(cameraPosition,cameraAngle);
  218. MetaDataFramePO metaDataFramePO = new MetaDataFramePO();
  219. metaDataFramePO.setTraceIds(traceIds);
  220. metaDataFramePO.setVehicle(null);
  221. State playerState = sceneGrpcService.createPlayerState2(player,camera,playerPt);
  222. RenderInfo renderInfo = sceneGrpcService.createRenderInfo();
  223. UserState userState = sceneGrpcService.createUserState( user.getUserId(), playerState, renderInfo, null);
  224. //newUserStates
  225. UserState[] newUserStates = new UserState[1];
  226. newUserStates[0] = userState;
  227. metaDataFramePO.setNewUserStates(newUserStates);
  228. metaDataFramePO.setActionResponses(actionResponses);
  229. metaDataFramePO.setGetStateType(0);
  230. metaDataFramePO.setCode(0);
  231. metaDataFramePO.setMsg("");
  232. redisCache.delete("updateFrameMetadata:"+user.getUserId());
  233. redisCache.setCacheObject("updateFrameMetadata:"+user.getUserId(),metaDataFramePO);
  234. }
  235. private void createMoveFrameMetadata(String user_id,AnglePO playerAngle,PointPO playerPosition,MoveFrameEntity moveFrameEntity,String traceId){
  236. String[] traceIds = new String[1];
  237. traceIds[0] = traceId;
  238. JSONArray actionResponses = new JSONArray();
  239. //RotateFrameEntity rotateFrameEntity = rotateFrameService.findById(user.getFrameId());
  240. //PointPO playerPosition = user.getPlayerPosition();
  241. Point playerPt = Point.newBuilder().setX(String.valueOf(playerPosition.getX())).setY(String.valueOf(playerPosition.getY())).setZ(String.valueOf(playerPosition.getZ())).build();
  242. //AnglePO playerAngle = user.getPlayerAngle();
  243. AngleUe4 playerAg =AngleUe4.newBuilder().setPitch(playerAngle.getPitch()).setYaw(playerAngle.getYaw()).setRoll(playerAngle.getRoll()).build();
  244. Space player = sceneGrpcService.createSpace(playerPt,playerAg);
  245. PointPO cameraPoint = moveFrameEntity.getCameraPosition();
  246. Point cameraPosition = sceneGrpcService.createPoint(String.valueOf(cameraPoint.getX()),String.valueOf(cameraPoint.getY()),String.valueOf(cameraPoint.getZ()));
  247. AnglePO cameraAnglePO = moveFrameEntity.getCameraAngle();
  248. AngleUe4 cameraAngle = sceneGrpcService.createAngle(cameraAnglePO.getPitch(),cameraAnglePO.getYaw(),cameraAnglePO.getRoll());
  249. Space camera = sceneGrpcService.createSpace(cameraPosition,cameraAngle);
  250. MetaDataFramePO metaDataFramePO = new MetaDataFramePO();
  251. metaDataFramePO.setTraceIds(traceIds);
  252. metaDataFramePO.setVehicle(null);
  253. State playerState = sceneGrpcService.createPlayerState2(player,camera,playerPt);
  254. RenderInfo renderInfo = sceneGrpcService.createRenderInfo();
  255. UserState userState = sceneGrpcService.createUserState( user_id, playerState, renderInfo, null);
  256. //newUserStates
  257. // JSONArray newUserStates = new JSONArray();
  258. // newUserStates.add(userState);
  259. UserState[] newUserStates = new UserState[1];
  260. newUserStates[0] = userState;
  261. metaDataFramePO.setNewUserStates(newUserStates);
  262. metaDataFramePO.setActionResponses(actionResponses);
  263. metaDataFramePO.setGetStateType(0);
  264. metaDataFramePO.setCode(0);
  265. metaDataFramePO.setMsg("");
  266. redisCache.delete("updateFrameMetadata:"+user_id);
  267. redisCache.setCacheObject("updateFrameMetadata:"+user_id,metaDataFramePO);
  268. }
  269. private void createRotateFrameMetadata(UserEntity user,List<ActionPO> rotateJoystickList,int firstActionType){
  270. JSONArray actionResponses = new JSONArray();
  271. String[] traceIds = new String[rotateJoystickList.size()];
  272. if(rotateJoystickList.size()>0){
  273. for(int j=0;j<rotateJoystickList.size();++j){
  274. ActionPO actionPO = rotateJoystickList.get(j);
  275. JSONObject actionResponse = sceneGrpcService.createActionResponse(actionPO.getAction_type(),actionPO.getTrace_id());
  276. actionResponses.add(actionResponse);
  277. traceIds[j] = actionPO.getTrace_id();
  278. }
  279. }
  280. ActionPO lastActionPO = rotateJoystickList.get(rotateJoystickList.size()-1);
  281. RotateFrameEntity rotateFrameEntity = rotateFrameService.findById(lastActionPO.getFrameId());
  282. PointPO playerPosition = user.getPlayerPosition();
  283. Point playerPt = Point.newBuilder().setX(String.valueOf(playerPosition.getX())).setY(String.valueOf(playerPosition.getY())).setZ(String.valueOf(playerPosition.getZ())).build();
  284. AnglePO playerAngle = user.getPlayerAngle();
  285. AngleUe4 playerAg = null;
  286. if(firstActionType == 15){
  287. playerAngle.setYaw(lastActionPO.getPlayerAngle().getYaw());
  288. }
  289. playerAg = AngleUe4.newBuilder().setPitch(playerAngle.getPitch()).setYaw(playerAngle.getYaw()).setRoll(playerAngle.getRoll()).build();
  290. Space player = sceneGrpcService.createSpace(playerPt,playerAg);
  291. PointPO cameraPoint = rotateFrameEntity.getCameraPosition();
  292. Point cameraPosition = sceneGrpcService.createPoint(String.valueOf(cameraPoint.getX()),String.valueOf(cameraPoint.getY()),String.valueOf(cameraPoint.getZ()));
  293. AnglePO cameraAnglePO = rotateFrameEntity.getCameraAngle();
  294. AngleUe4 cameraAngle = sceneGrpcService.createAngle(cameraAnglePO.getPitch(),cameraAnglePO.getYaw(),cameraAnglePO.getRoll());
  295. Space camera = sceneGrpcService.createSpace(cameraPosition,cameraAngle);
  296. MetaDataFramePO metaDataFramePO = new MetaDataFramePO();
  297. metaDataFramePO.setTraceIds(traceIds);
  298. metaDataFramePO.setVehicle(null);
  299. State playerState = sceneGrpcService.createPlayerState2(player,camera,playerPt);
  300. RenderInfo renderInfo = sceneGrpcService.createRenderInfo();
  301. UserState userState = sceneGrpcService.createUserState( user.getUserId(), playerState, renderInfo, null);
  302. //newUserStates
  303. // JSONArray newUserStates = new JSONArray();
  304. //// newUserStates.add(userState);
  305. UserState[] newUserStates = new UserState[1];
  306. newUserStates[0] = userState;
  307. metaDataFramePO.setNewUserStates(newUserStates);
  308. metaDataFramePO.setActionResponses(actionResponses);
  309. metaDataFramePO.setGetStateType(0);
  310. metaDataFramePO.setCode(0);
  311. metaDataFramePO.setMsg("");
  312. redisCache.delete("updateFrameMetadata:"+user.getUserId());
  313. redisCache.setCacheObject("updateFrameMetadata:"+user.getUserId(),metaDataFramePO);
  314. //更新user表
  315. user.setFrameId(lastActionPO.getFrameId());
  316. user.setPlayerAngle(playerAngle);
  317. }
  318. /*
  319. * {
  320. "traceIds": ["d0864cd0-378d-4d49-b7b0-3e8e1b9494c3", "d0864cd0-378d-4d49-b7b0-3e8e1b9494c3", "939087ff-4999-4551-92e4-26ecb67f8aa2"],
  321. "vehicle": null,
  322. "newUserStates": [{
  323. "userId": "dcff36ae4fc1d",
  324. "playerState": {
  325. "roomTypeId": "",
  326. "person": 0,
  327. "avatarId": "",
  328. "skinId": "",
  329. "roomId": ""
  330. "isHost": false,
  331. "isFollowHost": false,
  332. "skinDataVersion": "",
  333. "avatarComponents": "",
  334. "nickName": "",
  335. "movingMode": 0,
  336. "attitude": "",
  337. "areaName": "",
  338. "pathName": "",
  339. "pathId": "",
  340. "avatarSize": 1,
  341. "extra": "",
  342. "prioritySync": false,
  343. "player": {
  344. "position": {
  345. "x": -421.30057,
  346. "y": -1434.4198,
  347. "z": -34
  348. },
  349. "angle": {
  350. "pitch": 0,
  351. "yaw": 47,
  352. "roll": 0
  353. }
  354. },
  355. "camera": {
  356. "position": {
  357. "x": -436.2,
  358. "y": -1408.8,
  359. "z": 130.7
  360. },
  361. "angle": {
  362. "pitch": 0,
  363. "yaw": 315,
  364. "roll": 0
  365. }
  366. },
  367. "cameraCenter": {
  368. "x": -400,
  369. "y": -1450,
  370. "z": 10.610336
  371. }
  372. },
  373. "renderInfo": {
  374. "renderType": 0,
  375. "videoFrame": null,
  376. "cameraStateType": 3,
  377. "isMoving": 1,
  378. "needIfr": 0,
  379. "isVideo": 0,
  380. "stillFrame": 0,
  381. "isRotating": 0,
  382. "isFollowing": 0,
  383. "clientPanoTitlesBitmap": [],
  384. "clientPanoTreceId": "",
  385. "prefetchVideoId": "",
  386. "noMedia": false
  387. },
  388. "event": null,
  389. "relation": 1
  390. }],
  391. "actionResponses": [{
  392. "actionType": 15,
  393. "pointType": 100,
  394. "extra": "",
  395. "traceId": "d0864cd0-378d-4d49-b7b0-3e8e1b9494c3",
  396. "packetId": "d44bd2f5-f877-4dd7-868b-803c64f99082",
  397. "nps": [],
  398. "peopleNum": 0,
  399. "zoneId": "",
  400. "echoMsg": "",
  401. "reserveDetail": null,
  402. "userWithAvatarList": [],
  403. "newUserStates": [],
  404. "code": 0,
  405. "msg": ""
  406. }, {
  407. "actionType": 1,
  408. "pointType": 0,
  409. "extra": "",
  410. "traceId": "939087ff-4999-4551-92e4-26ecb67f8aa2",
  411. "packetId": "",
  412. "nps": [],
  413. "peopleNum": 0,
  414. "zoneId": "",
  415. "echoMsg": "",
  416. "reserveDetail": null,
  417. "userWithAvatarList": [],
  418. "newUserStates": [],
  419. "code": 0,
  420. "msg": ""
  421. }],
  422. "getStateType": 0,
  423. "code": 0,
  424. "msg": "OK"
  425. }
  426. * */
  427. }