|
@@ -0,0 +1,444 @@
|
|
|
+#include "grpcclient.h"
|
|
|
+
|
|
|
+grpcclient * ggrpcclient;
|
|
|
+
|
|
|
+void ListenData(const char * strdata,const unsigned int nSize,const unsigned int index,const QDateTime * dt,const char * strmemname)
|
|
|
+{
|
|
|
+ ggrpcclient->UpdateData(strdata,nSize,strmemname);
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+grpcclient::grpcclient(std::string stryamlpath)
|
|
|
+{
|
|
|
+ ggrpcclient = this;
|
|
|
+ dec_yaml(stryamlpath.data());
|
|
|
+
|
|
|
+ int i;
|
|
|
+ for(i=0;i<mvectormsgunit.size();i++)
|
|
|
+ {
|
|
|
+ mvectormsgunit[i].mpa = iv::modulecomm::RegisterRecv(mvectormsgunit[i].mstrmsgname,ListenData);
|
|
|
+ }
|
|
|
+
|
|
|
+ for(i=0;i<mvectorctrlmsgunit.size();i++)
|
|
|
+ {
|
|
|
+ mvectorctrlmsgunit[i].mpa = iv::modulecomm::RegisterSend(mvectorctrlmsgunit[i].mstrmsgname,mvectorctrlmsgunit[i].mnBufferSize,
|
|
|
+ mvectorctrlmsgunit[i].mnBufferCount);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+void grpcclient::threadsend(std::shared_ptr<::grpc::ClientReaderWriter<iv::UploadRequestStream, iv::UploadReplyStream> > writer,bool * pbrun)
|
|
|
+{
|
|
|
+ int nsize = mvectormsgunit.size();
|
|
|
+ int i;
|
|
|
+
|
|
|
+ int ninterval = atoi(gstruploadinterval.data());
|
|
|
+ if(ninterval<=0)ninterval = 100;
|
|
|
+
|
|
|
+ QTime xTime;
|
|
|
+ xTime.start();
|
|
|
+ int nlastsend = xTime.elapsed();
|
|
|
+
|
|
|
+ int nid= 0;
|
|
|
+
|
|
|
+ while(*pbrun)
|
|
|
+ {
|
|
|
+ std::this_thread::sleep_for(std::chrono::milliseconds(1));
|
|
|
+ if((xTime.elapsed()-nlastsend)<ninterval)
|
|
|
+ {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ bool bImportant = false;
|
|
|
+ int nkeeptime = 0;
|
|
|
+ iv::cloud::cloudmsg xmsg;
|
|
|
+ xmsg.set_xtime(QDateTime::currentMSecsSinceEpoch());
|
|
|
+ gMutexMsg.lock();
|
|
|
+ for(i=0;i<nsize;i++)
|
|
|
+ {
|
|
|
+ if(mvectormsgunit[i].mbRefresh)
|
|
|
+ {
|
|
|
+ mvectormsgunit[i].mbRefresh = false;
|
|
|
+ if(mvectormsgunit[i].mbImportant)
|
|
|
+ {
|
|
|
+ bImportant = true;
|
|
|
+ }
|
|
|
+ if(mvectormsgunit[i].mnkeeptime > nkeeptime)
|
|
|
+ {
|
|
|
+ nkeeptime = mvectormsgunit[i].mnkeeptime;
|
|
|
+ }
|
|
|
+ iv::cloud::cloudunit xcloudunit;
|
|
|
+ xcloudunit.set_msgname(mvectormsgunit[i].mstrmsgname);
|
|
|
+ xcloudunit.set_data(mvectormsgunit[i].mpstrmsgdata.get(),mvectormsgunit[i].mndatasize);
|
|
|
+ iv::cloud::cloudunit * pcu = xmsg.add_xclouddata();
|
|
|
+ pcu->CopyFrom(xcloudunit);
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ gMutexMsg.unlock();
|
|
|
+
|
|
|
+ int nbytesize = xmsg.ByteSize();
|
|
|
+ char * strbuf = new char[nbytesize];
|
|
|
+ std::shared_ptr<char> pstrbuf;
|
|
|
+ pstrbuf.reset(strbuf);
|
|
|
+ if(xmsg.SerializeToArray(strbuf,nbytesize))
|
|
|
+ {
|
|
|
+ iv::UploadRequestStream request;
|
|
|
+ qint64 time1 = QDateTime::currentMSecsSinceEpoch();
|
|
|
+
|
|
|
+ request.set_id(nid);
|
|
|
+ request.set_ntime(time1);
|
|
|
+ request.set_strquerymd5(gstrqueryMD5);
|
|
|
+ request.set_strctrlmd5(gstrctrlMD5);
|
|
|
+ request.set_strvin(gstrVIN);
|
|
|
+ request.set_xdata(strbuf,nbytesize);
|
|
|
+ request.set_kepptime(nkeeptime);
|
|
|
+ request.set_bimportant(bImportant);
|
|
|
+ nid++;
|
|
|
+
|
|
|
+ nlastsend = xTime.elapsed();
|
|
|
+
|
|
|
+ bool bsend = writer->Write(request);
|
|
|
+ std::cout<<"send msg. rtn is "<<bsend<<std::endl;
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+void grpcclient::run()
|
|
|
+{
|
|
|
+ int nsize = mvectormsgunit.size();
|
|
|
+ int i;
|
|
|
+
|
|
|
+ int ninterval = atoi(gstruploadinterval.data());
|
|
|
+ if(ninterval<=0)ninterval = 100;
|
|
|
+
|
|
|
+ QTime xTime;
|
|
|
+ xTime.start();
|
|
|
+ int nlastsend = xTime.elapsed();
|
|
|
+
|
|
|
+ std::string target_str = gstrserverip+":";
|
|
|
+ target_str = target_str + gstrserverport ;//std::to_string()
|
|
|
+ auto cargs = grpc::ChannelArguments();
|
|
|
+ cargs.SetMaxReceiveMessageSize(1024 * 1024 * 1024); // 1 GB
|
|
|
+ cargs.SetMaxSendMessageSize(1024 * 1024 * 1024);
|
|
|
+
|
|
|
+ std::shared_ptr<Channel> channel = grpc::CreateCustomChannel(
|
|
|
+ target_str, grpc::InsecureChannelCredentials(),cargs);
|
|
|
+
|
|
|
+ std::unique_ptr<iv::UploadStream::Stub> stub_ = iv::UploadStream::NewStub(channel);
|
|
|
+
|
|
|
+
|
|
|
+ iv::UploadRequestStream request;
|
|
|
+
|
|
|
+ int nfail = 0;
|
|
|
+
|
|
|
+ while(!QThread::isInterruptionRequested())
|
|
|
+ {
|
|
|
+ ClientContext context ;
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ std::shared_ptr<::grpc::ClientReaderWriter<iv::UploadRequestStream, iv::UploadReplyStream> > writerRead(stub_->upload(&context));
|
|
|
+
|
|
|
+ bool bRun = true;
|
|
|
+ std::thread * pthread = new std::thread(&grpcclient::threadsend,this,writerRead,&bRun);
|
|
|
+ (void )pthread;
|
|
|
+ iv::UploadReplyStream reply;
|
|
|
+ while (writerRead->Read(&reply)) {
|
|
|
+ nfail = 0;
|
|
|
+ // std::cout << "接收到回复:" << reply.remsg()<<"--\n" << std::endl;
|
|
|
+ if(reply.nres() == 1)
|
|
|
+ {
|
|
|
+ iv::cloud::cloudmsg xmsg;
|
|
|
+ if(xmsg.ParseFromArray(reply.xdata().data(),reply.xdata().size()))
|
|
|
+ {
|
|
|
+ sharectrlmsg(&xmsg);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ std::cout<<"read data from server."<<std::endl;
|
|
|
+ }
|
|
|
+ bRun = false;
|
|
|
+ pthread->join();
|
|
|
+ nfail++;
|
|
|
+ if(nfail > 100)std::this_thread::sleep_for(std::chrono::milliseconds(3000));
|
|
|
+ else std::this_thread::sleep_for(std::chrono::milliseconds(100));
|
|
|
+ std::cout<<"reconnnect to server. nfail is "<<nfail<<std::endl;
|
|
|
+ }
|
|
|
+
|
|
|
+ int nid = 0;
|
|
|
+
|
|
|
+ // Container for the data we expect from the server.
|
|
|
+// iv::UploadReply reply;
|
|
|
+
|
|
|
+ gpr_timespec timespec;
|
|
|
+ timespec.tv_sec = 30;//设置阻塞时间为2秒
|
|
|
+ timespec.tv_nsec = 0;
|
|
|
+ timespec.clock_type = GPR_TIMESPAN;
|
|
|
+
|
|
|
+ // ClientContext context;
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+// while(!QThread::isInterruptionRequested())
|
|
|
+// {
|
|
|
+// std::this_thread::sleep_for(std::chrono::milliseconds(1));
|
|
|
+// if((xTime.elapsed()-nlastsend)<ninterval)
|
|
|
+// {
|
|
|
+// continue;
|
|
|
+// }
|
|
|
+
|
|
|
+// bool bImportant = false;
|
|
|
+// int nkeeptime = 0;
|
|
|
+// iv::cloud::cloudmsg xmsg;
|
|
|
+// xmsg.set_xtime(QDateTime::currentMSecsSinceEpoch());
|
|
|
+// gMutexMsg.lock();
|
|
|
+// for(i=0;i<nsize;i++)
|
|
|
+// {
|
|
|
+// if(mvectormsgunit[i].mbRefresh)
|
|
|
+// {
|
|
|
+// mvectormsgunit[i].mbRefresh = false;
|
|
|
+// if(mvectormsgunit[i].mbImportant)
|
|
|
+// {
|
|
|
+// bImportant = true;
|
|
|
+// }
|
|
|
+// if(mvectormsgunit[i].mnkeeptime > nkeeptime)
|
|
|
+// {
|
|
|
+// nkeeptime = mvectormsgunit[i].mnkeeptime;
|
|
|
+// }
|
|
|
+// iv::cloud::cloudunit xcloudunit;
|
|
|
+// xcloudunit.set_msgname(mvectormsgunit[i].mstrmsgname);
|
|
|
+// xcloudunit.set_data(mvectormsgunit[i].mpstrmsgdata.get(),mvectormsgunit[i].mndatasize);
|
|
|
+// iv::cloud::cloudunit * pcu = xmsg.add_xclouddata();
|
|
|
+// pcu->CopyFrom(xcloudunit);
|
|
|
+// }
|
|
|
+
|
|
|
+// }
|
|
|
+// gMutexMsg.unlock();
|
|
|
+
|
|
|
+// int nbytesize = xmsg.ByteSize();
|
|
|
+// char * strbuf = new char[nbytesize];
|
|
|
+// std::shared_ptr<char> pstrbuf;
|
|
|
+// pstrbuf.reset(strbuf);
|
|
|
+// if(xmsg.SerializeToArray(strbuf,nbytesize))
|
|
|
+// {
|
|
|
+
|
|
|
+// ClientContext context ;
|
|
|
+// context.set_deadline(timespec);
|
|
|
+// qint64 time1 = QDateTime::currentMSecsSinceEpoch();
|
|
|
+
|
|
|
+// request.set_id(nid);
|
|
|
+// request.set_ntime(time1);
|
|
|
+// request.set_strquerymd5(gstrqueryMD5);
|
|
|
+// request.set_strctrlmd5(gstrctrlMD5);
|
|
|
+// request.set_strvin(gstrVIN);
|
|
|
+// request.set_xdata(strbuf,nbytesize);
|
|
|
+// request.set_kepptime(nkeeptime);
|
|
|
+// request.set_bimportant(bImportant);
|
|
|
+// nid++;
|
|
|
+
|
|
|
+// nlastsend = xTime.elapsed();
|
|
|
+// // The actual RPC.
|
|
|
+// Status status = stub_->upload(&context, request, &reply);
|
|
|
+// if (status.ok()) {
|
|
|
+// std::cout<<" data size is "<<nbytesize<<std::endl;
|
|
|
+// std::cout<<nid<<" upload successfully"<<std::endl;
|
|
|
+// if(reply.nres() == 1)
|
|
|
+// {
|
|
|
+// iv::cloud::cloudmsg xmsg;
|
|
|
+// if(xmsg.ParseFromArray(reply.xdata().data(),reply.xdata().size()))
|
|
|
+// {
|
|
|
+// sharectrlmsg(&xmsg);
|
|
|
+// }
|
|
|
+// }
|
|
|
+// } else {
|
|
|
+// std::cout << status.error_code() << ": " << status.error_message()
|
|
|
+// << std::endl;
|
|
|
+// std::cout<<"RPC failed"<<std::endl;
|
|
|
+// if(status.error_code() == 4)
|
|
|
+// {
|
|
|
+// std::cout<<" RPC Exceed Time, Create New stub_"<<std::endl;
|
|
|
+// channel = grpc::CreateCustomChannel(
|
|
|
+// target_str, grpc::InsecureChannelCredentials(),cargs);
|
|
|
+
|
|
|
+// stub_ = iv::Upload::NewStub(channel);
|
|
|
+// }
|
|
|
+// std::this_thread::sleep_for(std::chrono::milliseconds(900));
|
|
|
+
|
|
|
+// }
|
|
|
+
|
|
|
+// }
|
|
|
+
|
|
|
+
|
|
|
+// }
|
|
|
+
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+void grpcclient::dec_yaml(const char * stryamlpath)
|
|
|
+{
|
|
|
+
|
|
|
+ YAML::Node config;
|
|
|
+ try
|
|
|
+ {
|
|
|
+ config = YAML::LoadFile(stryamlpath);
|
|
|
+ }
|
|
|
+ catch(YAML::BadFile e)
|
|
|
+ {
|
|
|
+ qDebug("load error.");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ std::vector<std::string> vecmodulename;
|
|
|
+
|
|
|
+
|
|
|
+ if(config["server"])
|
|
|
+ {
|
|
|
+ gstrserverip = config["server"].as<std::string>();
|
|
|
+ }
|
|
|
+ if(config["port"])
|
|
|
+ {
|
|
|
+ gstrserverport = config["port"].as<std::string>();
|
|
|
+ }
|
|
|
+ if(config["uploadinterval"])
|
|
|
+ {
|
|
|
+ gstruploadinterval = config["uploadinterval"].as<std::string>();
|
|
|
+ }
|
|
|
+
|
|
|
+ if(config["VIN"])
|
|
|
+ {
|
|
|
+ gstrVIN = config["VIN"].as<std::string>();
|
|
|
+ }
|
|
|
+
|
|
|
+ if(config["queryMD5"])
|
|
|
+ {
|
|
|
+ gstrqueryMD5 = config["queryMD5"].as<std::string>();
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(config["ctrlMD5"])
|
|
|
+ {
|
|
|
+ gstrctrlMD5 = config["ctrlMD5"].as<std::string>();
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ std::string strmsgname;
|
|
|
+
|
|
|
+ if(config["uploadmessage"])
|
|
|
+ {
|
|
|
+
|
|
|
+ for(YAML::const_iterator it= config["uploadmessage"].begin(); it != config["uploadmessage"].end();++it)
|
|
|
+ {
|
|
|
+ std::string strtitle = it->first.as<std::string>();
|
|
|
+ std::cout<<strtitle<<std::endl;
|
|
|
+
|
|
|
+ if(config["uploadmessage"][strtitle]["msgname"]&&config["uploadmessage"][strtitle]["buffersize"]&&config["uploadmessage"][strtitle]["buffercount"])
|
|
|
+ {
|
|
|
+ iv::msgunit xmu;
|
|
|
+ strmsgname = config["uploadmessage"][strtitle]["msgname"].as<std::string>();
|
|
|
+ strncpy(xmu.mstrmsgname,strmsgname.data(),255);
|
|
|
+ xmu.mnBufferSize = config["uploadmessage"][strtitle]["buffersize"].as<int>();
|
|
|
+ xmu.mnBufferCount = config["uploadmessage"][strtitle]["buffercount"].as<int>();
|
|
|
+ if(config["uploadmessage"][strtitle]["bimportant"])
|
|
|
+ {
|
|
|
+ std::string strimportant = config["uploadmessage"][strtitle]["bimportant"].as<std::string>();
|
|
|
+ if(strimportant == "true")
|
|
|
+ {
|
|
|
+ xmu.mbImportant = true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(config["uploadmessage"][strtitle]["keeptime"])
|
|
|
+ {
|
|
|
+ std::string strkeep = config["uploadmessage"][strtitle]["keeptime"].as<std::string>();
|
|
|
+ xmu.mnkeeptime = atoi(strkeep.data());
|
|
|
+ }
|
|
|
+ mvectormsgunit.push_back(xmu);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if(!config["ctrlMD5"])
|
|
|
+ {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(config["ctrlmessage"])
|
|
|
+ {
|
|
|
+ std::string strnodename = "ctrlmessage";
|
|
|
+ for(YAML::const_iterator it= config[strnodename].begin(); it != config[strnodename].end();++it)
|
|
|
+ {
|
|
|
+ std::string strtitle = it->first.as<std::string>();
|
|
|
+ std::cout<<strtitle<<std::endl;
|
|
|
+
|
|
|
+ if(config[strnodename][strtitle]["msgname"]&&config[strnodename][strtitle]["buffersize"]&&config[strnodename][strtitle]["buffercount"])
|
|
|
+ {
|
|
|
+ iv::msgunit xmu;
|
|
|
+ strmsgname = config[strnodename][strtitle]["msgname"].as<std::string>();
|
|
|
+ strncpy(xmu.mstrmsgname,strmsgname.data(),255);
|
|
|
+ xmu.mnBufferSize = config[strnodename][strtitle]["buffersize"].as<int>();
|
|
|
+ xmu.mnBufferCount = config[strnodename][strtitle]["buffercount"].as<int>();
|
|
|
+ mvectorctrlmsgunit.push_back(xmu);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ return;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+void grpcclient::sharectrlmsg(iv::cloud::cloudmsg * pxmsg)
|
|
|
+{
|
|
|
+ int i;
|
|
|
+ int nsize = pxmsg->xclouddata_size();
|
|
|
+ for(i=0;i<nsize;i++)
|
|
|
+ {
|
|
|
+ int j;
|
|
|
+ int nquerysize = mvectorctrlmsgunit.size();
|
|
|
+ for(j=0;j<nquerysize;j++)
|
|
|
+ {
|
|
|
+ if(strncmp(pxmsg->xclouddata(i).msgname().data(), mvectorctrlmsgunit[j].mstrmsgname,255) == 0)
|
|
|
+ {
|
|
|
+ // qDebug("size is %d ",pxmsg->xclouddata(i).data().size());
|
|
|
+ iv::modulecomm::ModuleSendMsg(mvectorctrlmsgunit[j].mpa,pxmsg->xclouddata(i).data().data(),pxmsg->xclouddata(i).data().size());
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+void grpcclient::UpdateData(const char *strdata, const unsigned int nSize, const char *strmemname)
|
|
|
+{
|
|
|
+ int nsize = mvectormsgunit.size();
|
|
|
+ int i;
|
|
|
+ for(i=0;i<nsize;i++)
|
|
|
+ {
|
|
|
+ if(strncmp(strmemname,mvectormsgunit[i].mstrmsgname,255) == 0)
|
|
|
+ {
|
|
|
+ gMutexMsg.lock();
|
|
|
+ char * strtem = new char[nSize];
|
|
|
+ memcpy(strtem,strdata,nSize);
|
|
|
+ mvectormsgunit[i].mpstrmsgdata.reset(strtem);
|
|
|
+ mvectormsgunit[i].mndatasize = nSize;
|
|
|
+ mvectormsgunit[i].mbRefresh = true;
|
|
|
+ gMutexMsg.unlock();
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|