otaserver.cpp 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. #include "otaserver.h"
  2. #include "mainwindow.h"
  3. extern MainWindow * gw;
  4. void OTAServiceImpl::log(char *str)
  5. {
  6. std::cout<<str<<std::endl;
  7. std::string strlog = str;
  8. gw->updatelog(strlog);
  9. }
  10. Status OTAServiceImpl::query(grpc::ServerContext *context, const iv::ota::queryreq *request, iv::ota::queryReply *response)
  11. {
  12. (void)context;
  13. char strlog[1000];
  14. snprintf(strlog,1000,"%s VehicleType:%s Version:%s VIN:%s query.",QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss:zzz").toLatin1().data(),
  15. request->strvehicletype().data(),request->strversion().data(),
  16. request->strvin().data());
  17. log(strlog);
  18. std::vector<iv::vehiclefile> xvectorvf;
  19. mMutexVF.lock();
  20. xvectorvf = mvectorvf;
  21. bool bupdate = false;
  22. unsigned int i;
  23. unsigned int index = 0;
  24. for(i=0;i<xvectorvf.size();i++)
  25. {
  26. if(xvectorvf[i].mstrVehicleType == request->strvehicletype())
  27. {
  28. if(request->strversion() == xvectorvf[i].mstrVersion)
  29. {
  30. snprintf(strlog,1000,"%s VehicleType:%s Version:%s VIN:%s Version is newest.",QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss:zzz").toLatin1().data(),
  31. request->strvehicletype().data(),request->strversion().data(),
  32. request->strvin().data());
  33. log(strlog);
  34. }
  35. else
  36. {
  37. bupdate = true;
  38. index = i;
  39. }
  40. break;
  41. }
  42. }
  43. response->set_bupdate(bupdate);
  44. if(bupdate)
  45. {
  46. response->set_strmd5(xvectorvf[index].mstrmd5);
  47. response->set_nfilesize(xvectorvf[index].mnFileSize);
  48. response->set_strversion(xvectorvf[index].mstrVersion);
  49. snprintf(strlog,1000,"%s VehicleType:%s Version:%s VIN:%s Set Need Update.",QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss:zzz").toLatin1().data(),
  50. request->strvehicletype().data(),request->strversion().data(),
  51. request->strvin().data());
  52. log(strlog);
  53. }
  54. mMutexVF.unlock();
  55. // std::cout<<"vehicle type:"<<request->strvehicletype()<<" version:"<<request->strversion()<<" VIN:"<<request->strvin()<<std::endl;
  56. return Status::OK;
  57. }
  58. Status OTAServiceImpl::downfile(grpc::ServerContext *context, const iv::ota::Filereq *request, iv::ota::FileReply *response)
  59. {
  60. (void)context;
  61. char strlog[1000];
  62. snprintf(strlog,1000,"%s VehicleType:%s Version:%s VIN:%s request download file.Pos:%ld PacSize:%ld",QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss:zzz").toLatin1().data(),
  63. request->strvehicletype().data(),request->strversion().data(),
  64. request->strvin().data(),request->npos(),request->nsize());
  65. log(strlog);
  66. std::vector<iv::vehiclefile> xvectorvf;
  67. mMutexVF.lock();
  68. xvectorvf = mvectorvf;
  69. bool bupdate = false;
  70. unsigned int i;
  71. unsigned int index = 0;
  72. for(i=0;i<xvectorvf.size();i++)
  73. {
  74. if(xvectorvf[i].mstrVehicleType == request->strvehicletype())
  75. {
  76. index = i;
  77. bupdate = true;
  78. break;
  79. }
  80. }
  81. if(request->npos()<0 ||(request->npos()>= mvectorbadata[index].size()))
  82. {
  83. std::cout<<"nPos error."<<std::endl;
  84. bupdate = false;
  85. }
  86. response->set_bupdate(bupdate);
  87. if(bupdate)
  88. {
  89. response->set_strmd5(xvectorvf[index].mstrmd5);
  90. response->set_nfilesize(xvectorvf[index].mnFileSize);
  91. int nsize = request->nsize();
  92. if(mvectorbadata[index].size()<(nsize+request->npos()))nsize = mvectorbadata[index].size() - request->npos();
  93. if(mvectorbadata[index].size()<=(nsize+request->npos()))
  94. {
  95. response->set_blastpac(true);
  96. }
  97. else
  98. {
  99. response->set_blastpac(false);
  100. }
  101. response->set_nsize(nsize);
  102. response->set_xdata(mvectorbadata[index].data() + request->npos(),nsize);
  103. snprintf(strlog,1000,"%s VehicleType:%s Version:%s VIN:%s Transfer File.New version is %s. pos:%ld nsize:%ld",QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss:zzz").toLatin1().data(),
  104. request->strvehicletype().data(),request->strversion().data(),
  105. request->strvin().data(),mvectorvf[index].mstrVersion.data(),
  106. request->npos(),response->nsize());
  107. log(strlog);
  108. }
  109. else
  110. {
  111. snprintf(strlog,1000,"%s VehicleType:%s Version:%s VIN:%s query file, but Not Found File.",QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss:zzz").toLatin1().data(),
  112. request->strvehicletype().data(),request->strversion().data(),
  113. request->strvin().data());
  114. log(strlog);
  115. }
  116. mMutexVF.unlock();
  117. return Status::OK;
  118. }
  119. void OTAServiceImpl::SetVehicleFile(std::vector<iv::vehiclefile> xvectorvf)
  120. {
  121. mMutexVF.lock();
  122. unsigned int i;
  123. mvectorbadata.clear();
  124. mvectorvf.clear();
  125. for(i=0;i<xvectorvf.size();i++)
  126. {
  127. QFile xFile;
  128. xFile.setFileName(xvectorvf.at(i).mstrFilePath.data());
  129. if(xFile.open(QIODevice::ReadOnly))
  130. {
  131. QByteArray ba = xFile.readAll();
  132. if(ba.size() > 0)
  133. {
  134. mvectorbadata.push_back(ba);
  135. xvectorvf[i].mnFileSize = xFile.size();
  136. xvectorvf[i].mstrmd5 = getFileMD5(xvectorvf.at(i).mstrFilePath);
  137. mvectorvf.push_back(xvectorvf[i]);
  138. }
  139. }
  140. else
  141. {
  142. std::cout<<" File "<<xvectorvf[i].mstrFilePath<<" Can't open"<<std::endl;
  143. }
  144. xFile.close();
  145. }
  146. mMutexVF.unlock();
  147. }
  148. otaserver::otaserver()
  149. {
  150. mpOTAService = new OTAServiceImpl();
  151. }
  152. void otaserver::run()
  153. {
  154. std::string server_address("0.0.0.0:60051");
  155. // OTAServiceImpl service;
  156. grpc::EnableDefaultHealthCheckService(true);
  157. // grpc::reflection::InitProtoReflectionServerBuilderPlugin();
  158. ServerBuilder builder;
  159. // Listen on the given address without any authentication mechanism.
  160. builder.AddListeningPort(server_address, grpc::InsecureServerCredentials());
  161. builder.SetMaxReceiveMessageSize(1000000000);
  162. builder.SetMaxSendMessageSize(1000000000);
  163. // builder.SetMaxSendMessageSize(100000000);
  164. // Register "service" as the instance through which we'll communicate with
  165. // clients. In this case it corresponds to an *synchronous* service.
  166. builder.RegisterService(mpOTAService);
  167. // Finally assemble the server.
  168. std::unique_ptr<Server> server(builder.BuildAndStart());
  169. std::cout << "Server listening on " << server_address << std::endl;
  170. // Wait for the server to shutdown. Note that some other thread must be
  171. // responsible for shutting down the server for this call to ever return.
  172. server->Wait();
  173. }
  174. void otaserver::SetVehicleFile(std::vector<iv::vehiclefile> xvectorvf)
  175. {
  176. mpOTAService->SetVehicleFile(xvectorvf);
  177. }