GrpcClient.py 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. import time
  2. from PyQt5.QtWidgets import QMessageBox
  3. import grpc
  4. import def_pb2 as pb
  5. import def_pb2_grpc as mrpc
  6. import threading
  7. from concurrent.futures import ThreadPoolExecutor
  8. def singleton(cls):
  9. _instance = {}
  10. def inner():
  11. if cls not in _instance:
  12. _instance[cls] = cls()
  13. return _instance[cls]
  14. return inner
  15. @singleton
  16. class GrpcStream(threading.Thread):
  17. def __init__(self):
  18. threading.Thread.__init__(self)
  19. self.threadpool=ThreadPoolExecutor(5)
  20. self.exit_=False
  21. self.features_=None
  22. self.measures_=None
  23. self.imagesCallBack=None
  24. self.cloudCallBack=None
  25. self.MeasureDataCallBack=None
  26. def SetDataCallBack(self,ImagesCallback,CloudsCallBack,MeasureDataCallback):
  27. self.imagesCallBack=ImagesCallback
  28. self.cloudCallBack=CloudsCallBack
  29. self.MeasureDataCallBack=MeasureDataCallback
  30. def GrabImage(self,ip,port,id): # id:1-4,其他表示所有
  31. connectstr='%s:%d'%(ip,port)
  32. self.channel=grpc.insecure_channel(connectstr)
  33. self.stub = mrpc.StreamServerStub(self.channel)
  34. cmd=pb.RequestCmd()
  35. cmd.Id=id
  36. resImage=self.stub.GetImage(cmd)
  37. if self.imagesCallBack is not None:
  38. self.imagesCallBack(resImage)
  39. def GrabCloud(self,ip,port,id): # id:1-4,其他表示所有
  40. connectstr='%s:%d'%(ip,port)
  41. self.channel=grpc.insecure_channel(connectstr)
  42. self.stub = mrpc.StreamServerStub(self.channel)
  43. cmd=pb.RequestCmd()
  44. cmd.Id=id
  45. resCloud=self.stub.GetCloud(cmd)
  46. if self.cloudCallBack is not None:
  47. self.cloudCallBack(resCloud)
  48. def OpenDataStream(self,ip,port):
  49. connectstr='%s:%d'%(ip,port)
  50. channel=grpc.insecure_channel(connectstr)
  51. stub = mrpc.StreamServerStub(channel)
  52. cmd=pb.RequestCmd()
  53. self.measures_ = stub.OpenMeasureDataStream(cmd)
  54. def CloseDataStream(self,ip,port):
  55. connectstr='%s:%d'%(ip,port)
  56. channel=grpc.insecure_channel(connectstr)
  57. stub = mrpc.StreamServerStub(channel)
  58. cmd=pb.RequestCmd()
  59. stub.CloseMeasureDataStream(cmd)
  60. def OpenImageStream(self,ip,port):
  61. connectstr='%s:%d'%(ip,port)
  62. channel=grpc.insecure_channel(connectstr)
  63. stub = mrpc.StreamServerStub(channel)
  64. cmd=pb.RequestCmd()
  65. self.features_ = stub.OpenImageStream(cmd)
  66. def CloseImageStream(self,ip,port):
  67. connectstr='%s:%d'%(ip,port)
  68. channel=grpc.insecure_channel(connectstr)
  69. stub = mrpc.StreamServerStub(channel)
  70. cmd=pb.RequestCmd()
  71. stub.CloseImageStream(cmd)
  72. def loopImageStream(self):
  73. while self.exit_ == False:
  74. time.sleep(0.001)
  75. if self.features_ is not None:
  76. try:
  77. for feature in self.features_: #流式返回的结果
  78. if self.imagesCallBack is not None:
  79. self.imagesCallBack(feature)
  80. except Exception as e:
  81. self.features_=None
  82. def loopDataStream(self):
  83. while self.exit_ == False:
  84. time.sleep(0.001)
  85. if self.measures_ is not None:
  86. try:
  87. for measure in self.measures_:
  88. if self.MeasureDataCallBack is not None:
  89. self.MeasureDataCallBack(measure)
  90. except Exception as e:
  91. if self.MeasureDataCallBack is not None:
  92. info=pb.MeasureInfo()
  93. info.error=str(e)
  94. self.MeasureDataCallBack(info)
  95. self.measures_=None
  96. def run(self):
  97. self.threadpool.submit(self.loopImageStream)
  98. self.threadpool.submit(self.loopDataStream)
  99. print(" close ")
  100. def close(self):
  101. self.exit_=True
  102. self.threadpool.shutdown()
  103. self.join()