Explorar o código

fix(controller_midcar,grpc_BS,gitignore):add gear control in remote control mode of midcar. add some file rules to gitignore

孙嘉城 %!s(int64=3) %!d(string=hai) anos
pai
achega
adaeb7a294

+ 10 - 2
.gitignore

@@ -217,14 +217,22 @@ CATKIN_IGNORE
 *.pb.cc
 *.pb.h
 *.swp
+!src/driver/driver_cloud_grpc_client_BS/*.grpc.pb.cc
+!src/driver/driver_cloud_grpc_client_BS/*.grpc.pb.h
 
 # thirdpartylib
-/thirdpartylib/*
+thirdpartylib/*
 
 # ivversion_def
-/include/ivversion_def.h
+include/ivversion_def.h
+
+# system_def
+include/systemdef.pri
+src/common/modulecomm/systemdef.pri
 
 # Qt-Creator build
 build-*-Debug
 build-*-Release
 
+#vscode
+*.vscode

+ 26 - 1
src/controller/controller_midcar/main.cpp

@@ -88,6 +88,26 @@ void ListenRemotectrl(const char * strdata,const unsigned int nSize,const unsign
     {
         gbAutoDriving = true;
     }
+    else if(xrc.ntype() == iv::remotectrl_CtrlType_STOP)
+    {
+        gbAutoDriving = false;
+        xdecition.set_torque(0.0);
+        xdecition.set_brake(100.0);
+        xdecition.set_wheelangle(0.0);
+        xdecition.set_speed(5);
+        xdecition.set_gear(3); //0P 1D 2R 3N
+        xdecition.set_handbrake(0);
+        xdecition.set_grade(1);
+        xdecition.set_mode(1);
+        xdecition.set_speak(0);
+        xdecition.set_headlight(false);
+        xdecition.set_engine(0);
+        xdecition.set_taillight(false);
+        gMutex.lock();
+        gdecition_remote.CopyFrom(xdecition);
+        gMutex.unlock();
+        gLastRemoteTime = QDateTime::currentMSecsSinceEpoch();
+    }
     else
     {
         gbAutoDriving = false;
@@ -95,7 +115,12 @@ void ListenRemotectrl(const char * strdata,const unsigned int nSize,const unsign
         xdecition.set_brake(xrc.brake());
         xdecition.set_wheelangle(xrc.wheel()*5.5f);
         xdecition.set_speed(5);
-        xdecition.set_gear(1);
+        if(xrc.shift() > 0) //D shift
+            xdecition.set_gear(1); //0P 1D 2R 3N
+        else if(xrc.shift() < 0)
+            xdecition.set_gear(2);
+        else
+            xdecition.set_gear(3);
         xdecition.set_handbrake(0);
         xdecition.set_grade(1);
         xdecition.set_mode(1);

+ 31 - 0
src/driver/driver_cloud_grpc_client_BS/VehicleControl.grpc.pb.cc

@@ -0,0 +1,31 @@
+// Generated by the gRPC C++ plugin.
+// If you make any local change, they will be lost.
+// source: VehicleControl.proto
+
+#include "VehicleControl.pb.h"
+#include "VehicleControl.grpc.pb.h"
+
+#include <functional>
+#include <grpcpp/impl/codegen/async_stream.h>
+#include <grpcpp/impl/codegen/async_unary_call.h>
+#include <grpcpp/impl/codegen/channel_interface.h>
+#include <grpcpp/impl/codegen/client_unary_call.h>
+#include <grpcpp/impl/codegen/client_callback.h>
+#include <grpcpp/impl/codegen/message_allocator.h>
+#include <grpcpp/impl/codegen/method_handler.h>
+#include <grpcpp/impl/codegen/rpc_service_method.h>
+#include <grpcpp/impl/codegen/server_callback.h>
+#include <grpcpp/impl/codegen/server_callback_handlers.h>
+#include <grpcpp/impl/codegen/server_context.h>
+#include <grpcpp/impl/codegen/service_type.h>
+#include <grpcpp/impl/codegen/sync_stream.h>
+namespace org {
+namespace jeecg {
+namespace defsControl {
+namespace grpc {
+
+}  // namespace org
+}  // namespace jeecg
+}  // namespace defsControl
+}  // namespace grpc
+

+ 40 - 0
src/driver/driver_cloud_grpc_client_BS/VehicleControl.grpc.pb.h

@@ -0,0 +1,40 @@
+// Generated by the gRPC C++ plugin.
+// If you make any local change, they will be lost.
+// source: VehicleControl.proto
+#ifndef GRPC_VehicleControl_2eproto__INCLUDED
+#define GRPC_VehicleControl_2eproto__INCLUDED
+
+#include "VehicleControl.pb.h"
+
+#include <functional>
+#include <grpc/impl/codegen/port_platform.h>
+#include <grpcpp/impl/codegen/async_generic_service.h>
+#include <grpcpp/impl/codegen/async_stream.h>
+#include <grpcpp/impl/codegen/async_unary_call.h>
+#include <grpcpp/impl/codegen/client_callback.h>
+#include <grpcpp/impl/codegen/client_context.h>
+#include <grpcpp/impl/codegen/completion_queue.h>
+#include <grpcpp/impl/codegen/message_allocator.h>
+#include <grpcpp/impl/codegen/method_handler.h>
+#include <grpcpp/impl/codegen/proto_utils.h>
+#include <grpcpp/impl/codegen/rpc_method.h>
+#include <grpcpp/impl/codegen/server_callback.h>
+#include <grpcpp/impl/codegen/server_callback_handlers.h>
+#include <grpcpp/impl/codegen/server_context.h>
+#include <grpcpp/impl/codegen/service_type.h>
+#include <grpcpp/impl/codegen/status.h>
+#include <grpcpp/impl/codegen/stub_options.h>
+#include <grpcpp/impl/codegen/sync_stream.h>
+
+namespace org {
+namespace jeecg {
+namespace defsControl {
+namespace grpc {
+
+}  // namespace grpc
+}  // namespace defsControl
+}  // namespace jeecg
+}  // namespace org
+
+
+#endif  // GRPC_VehicleControl_2eproto__INCLUDED

+ 176 - 0
src/driver/driver_cloud_grpc_client_BS/VehicleControl_service.grpc.pb.cc

@@ -0,0 +1,176 @@
+// Generated by the gRPC C++ plugin.
+// If you make any local change, they will be lost.
+// source: VehicleControl_service.proto
+
+#include "VehicleControl_service.pb.h"
+#include "VehicleControl_service.grpc.pb.h"
+
+#include <functional>
+#include <grpcpp/impl/codegen/async_stream.h>
+#include <grpcpp/impl/codegen/async_unary_call.h>
+#include <grpcpp/impl/codegen/channel_interface.h>
+#include <grpcpp/impl/codegen/client_unary_call.h>
+#include <grpcpp/impl/codegen/client_callback.h>
+#include <grpcpp/impl/codegen/message_allocator.h>
+#include <grpcpp/impl/codegen/method_handler.h>
+#include <grpcpp/impl/codegen/rpc_service_method.h>
+#include <grpcpp/impl/codegen/server_callback.h>
+#include <grpcpp/impl/codegen/server_callback_handlers.h>
+#include <grpcpp/impl/codegen/server_context.h>
+#include <grpcpp/impl/codegen/service_type.h>
+#include <grpcpp/impl/codegen/sync_stream.h>
+namespace org {
+namespace jeecg {
+namespace defsControl {
+namespace grpc {
+
+static const char* VehicleControl_method_names[] = {
+  "/org.jeecg.defsControl.grpc.VehicleControl/vehicleControl",
+  "/org.jeecg.defsControl.grpc.VehicleControl/UploadMap",
+  "/org.jeecg.defsControl.grpc.VehicleControl/changeCtrlMode",
+};
+
+std::unique_ptr< VehicleControl::Stub> VehicleControl::NewStub(const std::shared_ptr< ::grpc::ChannelInterface>& channel, const ::grpc::StubOptions& options) {
+  (void)options;
+  std::unique_ptr< VehicleControl::Stub> stub(new VehicleControl::Stub(channel));
+  return stub;
+}
+
+VehicleControl::Stub::Stub(const std::shared_ptr< ::grpc::ChannelInterface>& channel)
+  : channel_(channel), rpcmethod_vehicleControl_(VehicleControl_method_names[0], ::grpc::internal::RpcMethod::NORMAL_RPC, channel)
+  , rpcmethod_UploadMap_(VehicleControl_method_names[1], ::grpc::internal::RpcMethod::NORMAL_RPC, channel)
+  , rpcmethod_changeCtrlMode_(VehicleControl_method_names[2], ::grpc::internal::RpcMethod::NORMAL_RPC, channel)
+  {}
+
+::grpc::Status VehicleControl::Stub::vehicleControl(::grpc::ClientContext* context, const ::org::jeecg::defsControl::grpc::Empty& request, ::org::jeecg::defsControl::grpc::ControlReply* response) {
+  return ::grpc::internal::BlockingUnaryCall(channel_.get(), rpcmethod_vehicleControl_, context, request, response);
+}
+
+void VehicleControl::Stub::experimental_async::vehicleControl(::grpc::ClientContext* context, const ::org::jeecg::defsControl::grpc::Empty* request, ::org::jeecg::defsControl::grpc::ControlReply* response, std::function<void(::grpc::Status)> f) {
+  ::grpc::internal::CallbackUnaryCall(stub_->channel_.get(), stub_->rpcmethod_vehicleControl_, context, request, response, std::move(f));
+}
+
+void VehicleControl::Stub::experimental_async::vehicleControl(::grpc::ClientContext* context, const ::org::jeecg::defsControl::grpc::Empty* request, ::org::jeecg::defsControl::grpc::ControlReply* response, ::grpc::experimental::ClientUnaryReactor* reactor) {
+  ::grpc::internal::ClientCallbackUnaryFactory::Create(stub_->channel_.get(), stub_->rpcmethod_vehicleControl_, context, request, response, reactor);
+}
+
+::grpc::ClientAsyncResponseReader< ::org::jeecg::defsControl::grpc::ControlReply>* VehicleControl::Stub::PrepareAsyncvehicleControlRaw(::grpc::ClientContext* context, const ::org::jeecg::defsControl::grpc::Empty& request, ::grpc::CompletionQueue* cq) {
+  return ::grpc::internal::ClientAsyncResponseReaderFactory< ::org::jeecg::defsControl::grpc::ControlReply>::Create(channel_.get(), cq, rpcmethod_vehicleControl_, context, request, false);
+}
+
+::grpc::ClientAsyncResponseReader< ::org::jeecg::defsControl::grpc::ControlReply>* VehicleControl::Stub::AsyncvehicleControlRaw(::grpc::ClientContext* context, const ::org::jeecg::defsControl::grpc::Empty& request, ::grpc::CompletionQueue* cq) {
+  auto* result =
+    this->PrepareAsyncvehicleControlRaw(context, request, cq);
+  result->StartCall();
+  return result;
+}
+
+::grpc::Status VehicleControl::Stub::UploadMap(::grpc::ClientContext* context, const ::org::jeecg::defsControl::grpc::Empty& request, ::org::jeecg::defsControl::grpc::UploadMapReply* response) {
+  return ::grpc::internal::BlockingUnaryCall(channel_.get(), rpcmethod_UploadMap_, context, request, response);
+}
+
+void VehicleControl::Stub::experimental_async::UploadMap(::grpc::ClientContext* context, const ::org::jeecg::defsControl::grpc::Empty* request, ::org::jeecg::defsControl::grpc::UploadMapReply* response, std::function<void(::grpc::Status)> f) {
+  ::grpc::internal::CallbackUnaryCall(stub_->channel_.get(), stub_->rpcmethod_UploadMap_, context, request, response, std::move(f));
+}
+
+void VehicleControl::Stub::experimental_async::UploadMap(::grpc::ClientContext* context, const ::org::jeecg::defsControl::grpc::Empty* request, ::org::jeecg::defsControl::grpc::UploadMapReply* response, ::grpc::experimental::ClientUnaryReactor* reactor) {
+  ::grpc::internal::ClientCallbackUnaryFactory::Create(stub_->channel_.get(), stub_->rpcmethod_UploadMap_, context, request, response, reactor);
+}
+
+::grpc::ClientAsyncResponseReader< ::org::jeecg::defsControl::grpc::UploadMapReply>* VehicleControl::Stub::PrepareAsyncUploadMapRaw(::grpc::ClientContext* context, const ::org::jeecg::defsControl::grpc::Empty& request, ::grpc::CompletionQueue* cq) {
+  return ::grpc::internal::ClientAsyncResponseReaderFactory< ::org::jeecg::defsControl::grpc::UploadMapReply>::Create(channel_.get(), cq, rpcmethod_UploadMap_, context, request, false);
+}
+
+::grpc::ClientAsyncResponseReader< ::org::jeecg::defsControl::grpc::UploadMapReply>* VehicleControl::Stub::AsyncUploadMapRaw(::grpc::ClientContext* context, const ::org::jeecg::defsControl::grpc::Empty& request, ::grpc::CompletionQueue* cq) {
+  auto* result =
+    this->PrepareAsyncUploadMapRaw(context, request, cq);
+  result->StartCall();
+  return result;
+}
+
+::grpc::Status VehicleControl::Stub::changeCtrlMode(::grpc::ClientContext* context, const ::org::jeecg::defsControl::grpc::Empty& request, ::org::jeecg::defsControl::grpc::CtrlModeReply* response) {
+  return ::grpc::internal::BlockingUnaryCall(channel_.get(), rpcmethod_changeCtrlMode_, context, request, response);
+}
+
+void VehicleControl::Stub::experimental_async::changeCtrlMode(::grpc::ClientContext* context, const ::org::jeecg::defsControl::grpc::Empty* request, ::org::jeecg::defsControl::grpc::CtrlModeReply* response, std::function<void(::grpc::Status)> f) {
+  ::grpc::internal::CallbackUnaryCall(stub_->channel_.get(), stub_->rpcmethod_changeCtrlMode_, context, request, response, std::move(f));
+}
+
+void VehicleControl::Stub::experimental_async::changeCtrlMode(::grpc::ClientContext* context, const ::org::jeecg::defsControl::grpc::Empty* request, ::org::jeecg::defsControl::grpc::CtrlModeReply* response, ::grpc::experimental::ClientUnaryReactor* reactor) {
+  ::grpc::internal::ClientCallbackUnaryFactory::Create(stub_->channel_.get(), stub_->rpcmethod_changeCtrlMode_, context, request, response, reactor);
+}
+
+::grpc::ClientAsyncResponseReader< ::org::jeecg::defsControl::grpc::CtrlModeReply>* VehicleControl::Stub::PrepareAsyncchangeCtrlModeRaw(::grpc::ClientContext* context, const ::org::jeecg::defsControl::grpc::Empty& request, ::grpc::CompletionQueue* cq) {
+  return ::grpc::internal::ClientAsyncResponseReaderFactory< ::org::jeecg::defsControl::grpc::CtrlModeReply>::Create(channel_.get(), cq, rpcmethod_changeCtrlMode_, context, request, false);
+}
+
+::grpc::ClientAsyncResponseReader< ::org::jeecg::defsControl::grpc::CtrlModeReply>* VehicleControl::Stub::AsyncchangeCtrlModeRaw(::grpc::ClientContext* context, const ::org::jeecg::defsControl::grpc::Empty& request, ::grpc::CompletionQueue* cq) {
+  auto* result =
+    this->PrepareAsyncchangeCtrlModeRaw(context, request, cq);
+  result->StartCall();
+  return result;
+}
+
+VehicleControl::Service::Service() {
+  AddMethod(new ::grpc::internal::RpcServiceMethod(
+      VehicleControl_method_names[0],
+      ::grpc::internal::RpcMethod::NORMAL_RPC,
+      new ::grpc::internal::RpcMethodHandler< VehicleControl::Service, ::org::jeecg::defsControl::grpc::Empty, ::org::jeecg::defsControl::grpc::ControlReply>(
+          [](VehicleControl::Service* service,
+             ::grpc::ServerContext* ctx,
+             const ::org::jeecg::defsControl::grpc::Empty* req,
+             ::org::jeecg::defsControl::grpc::ControlReply* resp) {
+               return service->vehicleControl(ctx, req, resp);
+             }, this)));
+  AddMethod(new ::grpc::internal::RpcServiceMethod(
+      VehicleControl_method_names[1],
+      ::grpc::internal::RpcMethod::NORMAL_RPC,
+      new ::grpc::internal::RpcMethodHandler< VehicleControl::Service, ::org::jeecg::defsControl::grpc::Empty, ::org::jeecg::defsControl::grpc::UploadMapReply>(
+          [](VehicleControl::Service* service,
+             ::grpc::ServerContext* ctx,
+             const ::org::jeecg::defsControl::grpc::Empty* req,
+             ::org::jeecg::defsControl::grpc::UploadMapReply* resp) {
+               return service->UploadMap(ctx, req, resp);
+             }, this)));
+  AddMethod(new ::grpc::internal::RpcServiceMethod(
+      VehicleControl_method_names[2],
+      ::grpc::internal::RpcMethod::NORMAL_RPC,
+      new ::grpc::internal::RpcMethodHandler< VehicleControl::Service, ::org::jeecg::defsControl::grpc::Empty, ::org::jeecg::defsControl::grpc::CtrlModeReply>(
+          [](VehicleControl::Service* service,
+             ::grpc::ServerContext* ctx,
+             const ::org::jeecg::defsControl::grpc::Empty* req,
+             ::org::jeecg::defsControl::grpc::CtrlModeReply* resp) {
+               return service->changeCtrlMode(ctx, req, resp);
+             }, this)));
+}
+
+VehicleControl::Service::~Service() {
+}
+
+::grpc::Status VehicleControl::Service::vehicleControl(::grpc::ServerContext* context, const ::org::jeecg::defsControl::grpc::Empty* request, ::org::jeecg::defsControl::grpc::ControlReply* response) {
+  (void) context;
+  (void) request;
+  (void) response;
+  return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+}
+
+::grpc::Status VehicleControl::Service::UploadMap(::grpc::ServerContext* context, const ::org::jeecg::defsControl::grpc::Empty* request, ::org::jeecg::defsControl::grpc::UploadMapReply* response) {
+  (void) context;
+  (void) request;
+  (void) response;
+  return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+}
+
+::grpc::Status VehicleControl::Service::changeCtrlMode(::grpc::ServerContext* context, const ::org::jeecg::defsControl::grpc::Empty* request, ::org::jeecg::defsControl::grpc::CtrlModeReply* response) {
+  (void) context;
+  (void) request;
+  (void) response;
+  return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+}
+
+
+}  // namespace org
+}  // namespace jeecg
+}  // namespace defsControl
+}  // namespace grpc
+

+ 709 - 0
src/driver/driver_cloud_grpc_client_BS/VehicleControl_service.grpc.pb.h

@@ -0,0 +1,709 @@
+// Generated by the gRPC C++ plugin.
+// If you make any local change, they will be lost.
+// source: VehicleControl_service.proto
+#ifndef GRPC_VehicleControl_5fservice_2eproto__INCLUDED
+#define GRPC_VehicleControl_5fservice_2eproto__INCLUDED
+
+#include "VehicleControl_service.pb.h"
+
+#include <functional>
+#include <grpc/impl/codegen/port_platform.h>
+#include <grpcpp/impl/codegen/async_generic_service.h>
+#include <grpcpp/impl/codegen/async_stream.h>
+#include <grpcpp/impl/codegen/async_unary_call.h>
+#include <grpcpp/impl/codegen/client_callback.h>
+#include <grpcpp/impl/codegen/client_context.h>
+#include <grpcpp/impl/codegen/completion_queue.h>
+#include <grpcpp/impl/codegen/message_allocator.h>
+#include <grpcpp/impl/codegen/method_handler.h>
+#include <grpcpp/impl/codegen/proto_utils.h>
+#include <grpcpp/impl/codegen/rpc_method.h>
+#include <grpcpp/impl/codegen/server_callback.h>
+#include <grpcpp/impl/codegen/server_callback_handlers.h>
+#include <grpcpp/impl/codegen/server_context.h>
+#include <grpcpp/impl/codegen/service_type.h>
+#include <grpcpp/impl/codegen/status.h>
+#include <grpcpp/impl/codegen/stub_options.h>
+#include <grpcpp/impl/codegen/sync_stream.h>
+
+namespace org {
+namespace jeecg {
+namespace defsControl {
+namespace grpc {
+
+class VehicleControl final {
+ public:
+  static constexpr char const* service_full_name() {
+    return "org.jeecg.defsControl.grpc.VehicleControl";
+  }
+  class StubInterface {
+   public:
+    virtual ~StubInterface() {}
+    // 车辆远程控制
+    virtual ::grpc::Status vehicleControl(::grpc::ClientContext* context, const ::org::jeecg::defsControl::grpc::Empty& request, ::org::jeecg::defsControl::grpc::ControlReply* response) = 0;
+    std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::org::jeecg::defsControl::grpc::ControlReply>> AsyncvehicleControl(::grpc::ClientContext* context, const ::org::jeecg::defsControl::grpc::Empty& request, ::grpc::CompletionQueue* cq) {
+      return std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::org::jeecg::defsControl::grpc::ControlReply>>(AsyncvehicleControlRaw(context, request, cq));
+    }
+    std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::org::jeecg::defsControl::grpc::ControlReply>> PrepareAsyncvehicleControl(::grpc::ClientContext* context, const ::org::jeecg::defsControl::grpc::Empty& request, ::grpc::CompletionQueue* cq) {
+      return std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::org::jeecg::defsControl::grpc::ControlReply>>(PrepareAsyncvehicleControlRaw(context, request, cq));
+    }
+    // 路径生成
+    virtual ::grpc::Status UploadMap(::grpc::ClientContext* context, const ::org::jeecg::defsControl::grpc::Empty& request, ::org::jeecg::defsControl::grpc::UploadMapReply* response) = 0;
+    std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::org::jeecg::defsControl::grpc::UploadMapReply>> AsyncUploadMap(::grpc::ClientContext* context, const ::org::jeecg::defsControl::grpc::Empty& request, ::grpc::CompletionQueue* cq) {
+      return std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::org::jeecg::defsControl::grpc::UploadMapReply>>(AsyncUploadMapRaw(context, request, cq));
+    }
+    std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::org::jeecg::defsControl::grpc::UploadMapReply>> PrepareAsyncUploadMap(::grpc::ClientContext* context, const ::org::jeecg::defsControl::grpc::Empty& request, ::grpc::CompletionQueue* cq) {
+      return std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::org::jeecg::defsControl::grpc::UploadMapReply>>(PrepareAsyncUploadMapRaw(context, request, cq));
+    }
+    // 控制模式改变
+    virtual ::grpc::Status changeCtrlMode(::grpc::ClientContext* context, const ::org::jeecg::defsControl::grpc::Empty& request, ::org::jeecg::defsControl::grpc::CtrlModeReply* response) = 0;
+    std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::org::jeecg::defsControl::grpc::CtrlModeReply>> AsyncchangeCtrlMode(::grpc::ClientContext* context, const ::org::jeecg::defsControl::grpc::Empty& request, ::grpc::CompletionQueue* cq) {
+      return std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::org::jeecg::defsControl::grpc::CtrlModeReply>>(AsyncchangeCtrlModeRaw(context, request, cq));
+    }
+    std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::org::jeecg::defsControl::grpc::CtrlModeReply>> PrepareAsyncchangeCtrlMode(::grpc::ClientContext* context, const ::org::jeecg::defsControl::grpc::Empty& request, ::grpc::CompletionQueue* cq) {
+      return std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::org::jeecg::defsControl::grpc::CtrlModeReply>>(PrepareAsyncchangeCtrlModeRaw(context, request, cq));
+    }
+    class experimental_async_interface {
+     public:
+      virtual ~experimental_async_interface() {}
+      // 车辆远程控制
+      virtual void vehicleControl(::grpc::ClientContext* context, const ::org::jeecg::defsControl::grpc::Empty* request, ::org::jeecg::defsControl::grpc::ControlReply* response, std::function<void(::grpc::Status)>) = 0;
+      #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+      virtual void vehicleControl(::grpc::ClientContext* context, const ::org::jeecg::defsControl::grpc::Empty* request, ::org::jeecg::defsControl::grpc::ControlReply* response, ::grpc::ClientUnaryReactor* reactor) = 0;
+      #else
+      virtual void vehicleControl(::grpc::ClientContext* context, const ::org::jeecg::defsControl::grpc::Empty* request, ::org::jeecg::defsControl::grpc::ControlReply* response, ::grpc::experimental::ClientUnaryReactor* reactor) = 0;
+      #endif
+      // 路径生成
+      virtual void UploadMap(::grpc::ClientContext* context, const ::org::jeecg::defsControl::grpc::Empty* request, ::org::jeecg::defsControl::grpc::UploadMapReply* response, std::function<void(::grpc::Status)>) = 0;
+      #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+      virtual void UploadMap(::grpc::ClientContext* context, const ::org::jeecg::defsControl::grpc::Empty* request, ::org::jeecg::defsControl::grpc::UploadMapReply* response, ::grpc::ClientUnaryReactor* reactor) = 0;
+      #else
+      virtual void UploadMap(::grpc::ClientContext* context, const ::org::jeecg::defsControl::grpc::Empty* request, ::org::jeecg::defsControl::grpc::UploadMapReply* response, ::grpc::experimental::ClientUnaryReactor* reactor) = 0;
+      #endif
+      // 控制模式改变
+      virtual void changeCtrlMode(::grpc::ClientContext* context, const ::org::jeecg::defsControl::grpc::Empty* request, ::org::jeecg::defsControl::grpc::CtrlModeReply* response, std::function<void(::grpc::Status)>) = 0;
+      #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+      virtual void changeCtrlMode(::grpc::ClientContext* context, const ::org::jeecg::defsControl::grpc::Empty* request, ::org::jeecg::defsControl::grpc::CtrlModeReply* response, ::grpc::ClientUnaryReactor* reactor) = 0;
+      #else
+      virtual void changeCtrlMode(::grpc::ClientContext* context, const ::org::jeecg::defsControl::grpc::Empty* request, ::org::jeecg::defsControl::grpc::CtrlModeReply* response, ::grpc::experimental::ClientUnaryReactor* reactor) = 0;
+      #endif
+    };
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+    typedef class experimental_async_interface async_interface;
+    #endif
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+    async_interface* async() { return experimental_async(); }
+    #endif
+    virtual class experimental_async_interface* experimental_async() { return nullptr; }
+  private:
+    virtual ::grpc::ClientAsyncResponseReaderInterface< ::org::jeecg::defsControl::grpc::ControlReply>* AsyncvehicleControlRaw(::grpc::ClientContext* context, const ::org::jeecg::defsControl::grpc::Empty& request, ::grpc::CompletionQueue* cq) = 0;
+    virtual ::grpc::ClientAsyncResponseReaderInterface< ::org::jeecg::defsControl::grpc::ControlReply>* PrepareAsyncvehicleControlRaw(::grpc::ClientContext* context, const ::org::jeecg::defsControl::grpc::Empty& request, ::grpc::CompletionQueue* cq) = 0;
+    virtual ::grpc::ClientAsyncResponseReaderInterface< ::org::jeecg::defsControl::grpc::UploadMapReply>* AsyncUploadMapRaw(::grpc::ClientContext* context, const ::org::jeecg::defsControl::grpc::Empty& request, ::grpc::CompletionQueue* cq) = 0;
+    virtual ::grpc::ClientAsyncResponseReaderInterface< ::org::jeecg::defsControl::grpc::UploadMapReply>* PrepareAsyncUploadMapRaw(::grpc::ClientContext* context, const ::org::jeecg::defsControl::grpc::Empty& request, ::grpc::CompletionQueue* cq) = 0;
+    virtual ::grpc::ClientAsyncResponseReaderInterface< ::org::jeecg::defsControl::grpc::CtrlModeReply>* AsyncchangeCtrlModeRaw(::grpc::ClientContext* context, const ::org::jeecg::defsControl::grpc::Empty& request, ::grpc::CompletionQueue* cq) = 0;
+    virtual ::grpc::ClientAsyncResponseReaderInterface< ::org::jeecg::defsControl::grpc::CtrlModeReply>* PrepareAsyncchangeCtrlModeRaw(::grpc::ClientContext* context, const ::org::jeecg::defsControl::grpc::Empty& request, ::grpc::CompletionQueue* cq) = 0;
+  };
+  class Stub final : public StubInterface {
+   public:
+    Stub(const std::shared_ptr< ::grpc::ChannelInterface>& channel);
+    ::grpc::Status vehicleControl(::grpc::ClientContext* context, const ::org::jeecg::defsControl::grpc::Empty& request, ::org::jeecg::defsControl::grpc::ControlReply* response) override;
+    std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::org::jeecg::defsControl::grpc::ControlReply>> AsyncvehicleControl(::grpc::ClientContext* context, const ::org::jeecg::defsControl::grpc::Empty& request, ::grpc::CompletionQueue* cq) {
+      return std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::org::jeecg::defsControl::grpc::ControlReply>>(AsyncvehicleControlRaw(context, request, cq));
+    }
+    std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::org::jeecg::defsControl::grpc::ControlReply>> PrepareAsyncvehicleControl(::grpc::ClientContext* context, const ::org::jeecg::defsControl::grpc::Empty& request, ::grpc::CompletionQueue* cq) {
+      return std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::org::jeecg::defsControl::grpc::ControlReply>>(PrepareAsyncvehicleControlRaw(context, request, cq));
+    }
+    ::grpc::Status UploadMap(::grpc::ClientContext* context, const ::org::jeecg::defsControl::grpc::Empty& request, ::org::jeecg::defsControl::grpc::UploadMapReply* response) override;
+    std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::org::jeecg::defsControl::grpc::UploadMapReply>> AsyncUploadMap(::grpc::ClientContext* context, const ::org::jeecg::defsControl::grpc::Empty& request, ::grpc::CompletionQueue* cq) {
+      return std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::org::jeecg::defsControl::grpc::UploadMapReply>>(AsyncUploadMapRaw(context, request, cq));
+    }
+    std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::org::jeecg::defsControl::grpc::UploadMapReply>> PrepareAsyncUploadMap(::grpc::ClientContext* context, const ::org::jeecg::defsControl::grpc::Empty& request, ::grpc::CompletionQueue* cq) {
+      return std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::org::jeecg::defsControl::grpc::UploadMapReply>>(PrepareAsyncUploadMapRaw(context, request, cq));
+    }
+    ::grpc::Status changeCtrlMode(::grpc::ClientContext* context, const ::org::jeecg::defsControl::grpc::Empty& request, ::org::jeecg::defsControl::grpc::CtrlModeReply* response) override;
+    std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::org::jeecg::defsControl::grpc::CtrlModeReply>> AsyncchangeCtrlMode(::grpc::ClientContext* context, const ::org::jeecg::defsControl::grpc::Empty& request, ::grpc::CompletionQueue* cq) {
+      return std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::org::jeecg::defsControl::grpc::CtrlModeReply>>(AsyncchangeCtrlModeRaw(context, request, cq));
+    }
+    std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::org::jeecg::defsControl::grpc::CtrlModeReply>> PrepareAsyncchangeCtrlMode(::grpc::ClientContext* context, const ::org::jeecg::defsControl::grpc::Empty& request, ::grpc::CompletionQueue* cq) {
+      return std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::org::jeecg::defsControl::grpc::CtrlModeReply>>(PrepareAsyncchangeCtrlModeRaw(context, request, cq));
+    }
+    class experimental_async final :
+      public StubInterface::experimental_async_interface {
+     public:
+      void vehicleControl(::grpc::ClientContext* context, const ::org::jeecg::defsControl::grpc::Empty* request, ::org::jeecg::defsControl::grpc::ControlReply* response, std::function<void(::grpc::Status)>) override;
+      #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+      void vehicleControl(::grpc::ClientContext* context, const ::org::jeecg::defsControl::grpc::Empty* request, ::org::jeecg::defsControl::grpc::ControlReply* response, ::grpc::ClientUnaryReactor* reactor) override;
+      #else
+      void vehicleControl(::grpc::ClientContext* context, const ::org::jeecg::defsControl::grpc::Empty* request, ::org::jeecg::defsControl::grpc::ControlReply* response, ::grpc::experimental::ClientUnaryReactor* reactor) override;
+      #endif
+      void UploadMap(::grpc::ClientContext* context, const ::org::jeecg::defsControl::grpc::Empty* request, ::org::jeecg::defsControl::grpc::UploadMapReply* response, std::function<void(::grpc::Status)>) override;
+      #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+      void UploadMap(::grpc::ClientContext* context, const ::org::jeecg::defsControl::grpc::Empty* request, ::org::jeecg::defsControl::grpc::UploadMapReply* response, ::grpc::ClientUnaryReactor* reactor) override;
+      #else
+      void UploadMap(::grpc::ClientContext* context, const ::org::jeecg::defsControl::grpc::Empty* request, ::org::jeecg::defsControl::grpc::UploadMapReply* response, ::grpc::experimental::ClientUnaryReactor* reactor) override;
+      #endif
+      void changeCtrlMode(::grpc::ClientContext* context, const ::org::jeecg::defsControl::grpc::Empty* request, ::org::jeecg::defsControl::grpc::CtrlModeReply* response, std::function<void(::grpc::Status)>) override;
+      #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+      void changeCtrlMode(::grpc::ClientContext* context, const ::org::jeecg::defsControl::grpc::Empty* request, ::org::jeecg::defsControl::grpc::CtrlModeReply* response, ::grpc::ClientUnaryReactor* reactor) override;
+      #else
+      void changeCtrlMode(::grpc::ClientContext* context, const ::org::jeecg::defsControl::grpc::Empty* request, ::org::jeecg::defsControl::grpc::CtrlModeReply* response, ::grpc::experimental::ClientUnaryReactor* reactor) override;
+      #endif
+     private:
+      friend class Stub;
+      explicit experimental_async(Stub* stub): stub_(stub) { }
+      Stub* stub() { return stub_; }
+      Stub* stub_;
+    };
+    class experimental_async_interface* experimental_async() override { return &async_stub_; }
+
+   private:
+    std::shared_ptr< ::grpc::ChannelInterface> channel_;
+    class experimental_async async_stub_{this};
+    ::grpc::ClientAsyncResponseReader< ::org::jeecg::defsControl::grpc::ControlReply>* AsyncvehicleControlRaw(::grpc::ClientContext* context, const ::org::jeecg::defsControl::grpc::Empty& request, ::grpc::CompletionQueue* cq) override;
+    ::grpc::ClientAsyncResponseReader< ::org::jeecg::defsControl::grpc::ControlReply>* PrepareAsyncvehicleControlRaw(::grpc::ClientContext* context, const ::org::jeecg::defsControl::grpc::Empty& request, ::grpc::CompletionQueue* cq) override;
+    ::grpc::ClientAsyncResponseReader< ::org::jeecg::defsControl::grpc::UploadMapReply>* AsyncUploadMapRaw(::grpc::ClientContext* context, const ::org::jeecg::defsControl::grpc::Empty& request, ::grpc::CompletionQueue* cq) override;
+    ::grpc::ClientAsyncResponseReader< ::org::jeecg::defsControl::grpc::UploadMapReply>* PrepareAsyncUploadMapRaw(::grpc::ClientContext* context, const ::org::jeecg::defsControl::grpc::Empty& request, ::grpc::CompletionQueue* cq) override;
+    ::grpc::ClientAsyncResponseReader< ::org::jeecg::defsControl::grpc::CtrlModeReply>* AsyncchangeCtrlModeRaw(::grpc::ClientContext* context, const ::org::jeecg::defsControl::grpc::Empty& request, ::grpc::CompletionQueue* cq) override;
+    ::grpc::ClientAsyncResponseReader< ::org::jeecg::defsControl::grpc::CtrlModeReply>* PrepareAsyncchangeCtrlModeRaw(::grpc::ClientContext* context, const ::org::jeecg::defsControl::grpc::Empty& request, ::grpc::CompletionQueue* cq) override;
+    const ::grpc::internal::RpcMethod rpcmethod_vehicleControl_;
+    const ::grpc::internal::RpcMethod rpcmethod_UploadMap_;
+    const ::grpc::internal::RpcMethod rpcmethod_changeCtrlMode_;
+  };
+  static std::unique_ptr<Stub> NewStub(const std::shared_ptr< ::grpc::ChannelInterface>& channel, const ::grpc::StubOptions& options = ::grpc::StubOptions());
+
+  class Service : public ::grpc::Service {
+   public:
+    Service();
+    virtual ~Service();
+    // 车辆远程控制
+    virtual ::grpc::Status vehicleControl(::grpc::ServerContext* context, const ::org::jeecg::defsControl::grpc::Empty* request, ::org::jeecg::defsControl::grpc::ControlReply* response);
+    // 路径生成
+    virtual ::grpc::Status UploadMap(::grpc::ServerContext* context, const ::org::jeecg::defsControl::grpc::Empty* request, ::org::jeecg::defsControl::grpc::UploadMapReply* response);
+    // 控制模式改变
+    virtual ::grpc::Status changeCtrlMode(::grpc::ServerContext* context, const ::org::jeecg::defsControl::grpc::Empty* request, ::org::jeecg::defsControl::grpc::CtrlModeReply* response);
+  };
+  template <class BaseClass>
+  class WithAsyncMethod_vehicleControl : public BaseClass {
+   private:
+    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
+   public:
+    WithAsyncMethod_vehicleControl() {
+      ::grpc::Service::MarkMethodAsync(0);
+    }
+    ~WithAsyncMethod_vehicleControl() override {
+      BaseClassMustBeDerivedFromService(this);
+    }
+    // disable synchronous version of this method
+    ::grpc::Status vehicleControl(::grpc::ServerContext* /*context*/, const ::org::jeecg::defsControl::grpc::Empty* /*request*/, ::org::jeecg::defsControl::grpc::ControlReply* /*response*/) override {
+      abort();
+      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+    }
+    void RequestvehicleControl(::grpc::ServerContext* context, ::org::jeecg::defsControl::grpc::Empty* request, ::grpc::ServerAsyncResponseWriter< ::org::jeecg::defsControl::grpc::ControlReply>* response, ::grpc::CompletionQueue* new_call_cq, ::grpc::ServerCompletionQueue* notification_cq, void *tag) {
+      ::grpc::Service::RequestAsyncUnary(0, context, request, response, new_call_cq, notification_cq, tag);
+    }
+  };
+  template <class BaseClass>
+  class WithAsyncMethod_UploadMap : public BaseClass {
+   private:
+    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
+   public:
+    WithAsyncMethod_UploadMap() {
+      ::grpc::Service::MarkMethodAsync(1);
+    }
+    ~WithAsyncMethod_UploadMap() override {
+      BaseClassMustBeDerivedFromService(this);
+    }
+    // disable synchronous version of this method
+    ::grpc::Status UploadMap(::grpc::ServerContext* /*context*/, const ::org::jeecg::defsControl::grpc::Empty* /*request*/, ::org::jeecg::defsControl::grpc::UploadMapReply* /*response*/) override {
+      abort();
+      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+    }
+    void RequestUploadMap(::grpc::ServerContext* context, ::org::jeecg::defsControl::grpc::Empty* request, ::grpc::ServerAsyncResponseWriter< ::org::jeecg::defsControl::grpc::UploadMapReply>* response, ::grpc::CompletionQueue* new_call_cq, ::grpc::ServerCompletionQueue* notification_cq, void *tag) {
+      ::grpc::Service::RequestAsyncUnary(1, context, request, response, new_call_cq, notification_cq, tag);
+    }
+  };
+  template <class BaseClass>
+  class WithAsyncMethod_changeCtrlMode : public BaseClass {
+   private:
+    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
+   public:
+    WithAsyncMethod_changeCtrlMode() {
+      ::grpc::Service::MarkMethodAsync(2);
+    }
+    ~WithAsyncMethod_changeCtrlMode() override {
+      BaseClassMustBeDerivedFromService(this);
+    }
+    // disable synchronous version of this method
+    ::grpc::Status changeCtrlMode(::grpc::ServerContext* /*context*/, const ::org::jeecg::defsControl::grpc::Empty* /*request*/, ::org::jeecg::defsControl::grpc::CtrlModeReply* /*response*/) override {
+      abort();
+      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+    }
+    void RequestchangeCtrlMode(::grpc::ServerContext* context, ::org::jeecg::defsControl::grpc::Empty* request, ::grpc::ServerAsyncResponseWriter< ::org::jeecg::defsControl::grpc::CtrlModeReply>* response, ::grpc::CompletionQueue* new_call_cq, ::grpc::ServerCompletionQueue* notification_cq, void *tag) {
+      ::grpc::Service::RequestAsyncUnary(2, context, request, response, new_call_cq, notification_cq, tag);
+    }
+  };
+  typedef WithAsyncMethod_vehicleControl<WithAsyncMethod_UploadMap<WithAsyncMethod_changeCtrlMode<Service > > > AsyncService;
+  template <class BaseClass>
+  class ExperimentalWithCallbackMethod_vehicleControl : public BaseClass {
+   private:
+    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
+   public:
+    ExperimentalWithCallbackMethod_vehicleControl() {
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+      ::grpc::Service::
+    #else
+      ::grpc::Service::experimental().
+    #endif
+        MarkMethodCallback(0,
+          new ::grpc::internal::CallbackUnaryHandler< ::org::jeecg::defsControl::grpc::Empty, ::org::jeecg::defsControl::grpc::ControlReply>(
+            [this](
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+                   ::grpc::CallbackServerContext*
+    #else
+                   ::grpc::experimental::CallbackServerContext*
+    #endif
+                     context, const ::org::jeecg::defsControl::grpc::Empty* request, ::org::jeecg::defsControl::grpc::ControlReply* response) { return this->vehicleControl(context, request, response); }));}
+    void SetMessageAllocatorFor_vehicleControl(
+        ::grpc::experimental::MessageAllocator< ::org::jeecg::defsControl::grpc::Empty, ::org::jeecg::defsControl::grpc::ControlReply>* allocator) {
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+      ::grpc::internal::MethodHandler* const handler = ::grpc::Service::GetHandler(0);
+    #else
+      ::grpc::internal::MethodHandler* const handler = ::grpc::Service::experimental().GetHandler(0);
+    #endif
+      static_cast<::grpc::internal::CallbackUnaryHandler< ::org::jeecg::defsControl::grpc::Empty, ::org::jeecg::defsControl::grpc::ControlReply>*>(handler)
+              ->SetMessageAllocator(allocator);
+    }
+    ~ExperimentalWithCallbackMethod_vehicleControl() override {
+      BaseClassMustBeDerivedFromService(this);
+    }
+    // disable synchronous version of this method
+    ::grpc::Status vehicleControl(::grpc::ServerContext* /*context*/, const ::org::jeecg::defsControl::grpc::Empty* /*request*/, ::org::jeecg::defsControl::grpc::ControlReply* /*response*/) override {
+      abort();
+      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+    }
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+    virtual ::grpc::ServerUnaryReactor* vehicleControl(
+      ::grpc::CallbackServerContext* /*context*/, const ::org::jeecg::defsControl::grpc::Empty* /*request*/, ::org::jeecg::defsControl::grpc::ControlReply* /*response*/)
+    #else
+    virtual ::grpc::experimental::ServerUnaryReactor* vehicleControl(
+      ::grpc::experimental::CallbackServerContext* /*context*/, const ::org::jeecg::defsControl::grpc::Empty* /*request*/, ::org::jeecg::defsControl::grpc::ControlReply* /*response*/)
+    #endif
+      { return nullptr; }
+  };
+  template <class BaseClass>
+  class ExperimentalWithCallbackMethod_UploadMap : public BaseClass {
+   private:
+    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
+   public:
+    ExperimentalWithCallbackMethod_UploadMap() {
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+      ::grpc::Service::
+    #else
+      ::grpc::Service::experimental().
+    #endif
+        MarkMethodCallback(1,
+          new ::grpc::internal::CallbackUnaryHandler< ::org::jeecg::defsControl::grpc::Empty, ::org::jeecg::defsControl::grpc::UploadMapReply>(
+            [this](
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+                   ::grpc::CallbackServerContext*
+    #else
+                   ::grpc::experimental::CallbackServerContext*
+    #endif
+                     context, const ::org::jeecg::defsControl::grpc::Empty* request, ::org::jeecg::defsControl::grpc::UploadMapReply* response) { return this->UploadMap(context, request, response); }));}
+    void SetMessageAllocatorFor_UploadMap(
+        ::grpc::experimental::MessageAllocator< ::org::jeecg::defsControl::grpc::Empty, ::org::jeecg::defsControl::grpc::UploadMapReply>* allocator) {
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+      ::grpc::internal::MethodHandler* const handler = ::grpc::Service::GetHandler(1);
+    #else
+      ::grpc::internal::MethodHandler* const handler = ::grpc::Service::experimental().GetHandler(1);
+    #endif
+      static_cast<::grpc::internal::CallbackUnaryHandler< ::org::jeecg::defsControl::grpc::Empty, ::org::jeecg::defsControl::grpc::UploadMapReply>*>(handler)
+              ->SetMessageAllocator(allocator);
+    }
+    ~ExperimentalWithCallbackMethod_UploadMap() override {
+      BaseClassMustBeDerivedFromService(this);
+    }
+    // disable synchronous version of this method
+    ::grpc::Status UploadMap(::grpc::ServerContext* /*context*/, const ::org::jeecg::defsControl::grpc::Empty* /*request*/, ::org::jeecg::defsControl::grpc::UploadMapReply* /*response*/) override {
+      abort();
+      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+    }
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+    virtual ::grpc::ServerUnaryReactor* UploadMap(
+      ::grpc::CallbackServerContext* /*context*/, const ::org::jeecg::defsControl::grpc::Empty* /*request*/, ::org::jeecg::defsControl::grpc::UploadMapReply* /*response*/)
+    #else
+    virtual ::grpc::experimental::ServerUnaryReactor* UploadMap(
+      ::grpc::experimental::CallbackServerContext* /*context*/, const ::org::jeecg::defsControl::grpc::Empty* /*request*/, ::org::jeecg::defsControl::grpc::UploadMapReply* /*response*/)
+    #endif
+      { return nullptr; }
+  };
+  template <class BaseClass>
+  class ExperimentalWithCallbackMethod_changeCtrlMode : public BaseClass {
+   private:
+    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
+   public:
+    ExperimentalWithCallbackMethod_changeCtrlMode() {
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+      ::grpc::Service::
+    #else
+      ::grpc::Service::experimental().
+    #endif
+        MarkMethodCallback(2,
+          new ::grpc::internal::CallbackUnaryHandler< ::org::jeecg::defsControl::grpc::Empty, ::org::jeecg::defsControl::grpc::CtrlModeReply>(
+            [this](
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+                   ::grpc::CallbackServerContext*
+    #else
+                   ::grpc::experimental::CallbackServerContext*
+    #endif
+                     context, const ::org::jeecg::defsControl::grpc::Empty* request, ::org::jeecg::defsControl::grpc::CtrlModeReply* response) { return this->changeCtrlMode(context, request, response); }));}
+    void SetMessageAllocatorFor_changeCtrlMode(
+        ::grpc::experimental::MessageAllocator< ::org::jeecg::defsControl::grpc::Empty, ::org::jeecg::defsControl::grpc::CtrlModeReply>* allocator) {
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+      ::grpc::internal::MethodHandler* const handler = ::grpc::Service::GetHandler(2);
+    #else
+      ::grpc::internal::MethodHandler* const handler = ::grpc::Service::experimental().GetHandler(2);
+    #endif
+      static_cast<::grpc::internal::CallbackUnaryHandler< ::org::jeecg::defsControl::grpc::Empty, ::org::jeecg::defsControl::grpc::CtrlModeReply>*>(handler)
+              ->SetMessageAllocator(allocator);
+    }
+    ~ExperimentalWithCallbackMethod_changeCtrlMode() override {
+      BaseClassMustBeDerivedFromService(this);
+    }
+    // disable synchronous version of this method
+    ::grpc::Status changeCtrlMode(::grpc::ServerContext* /*context*/, const ::org::jeecg::defsControl::grpc::Empty* /*request*/, ::org::jeecg::defsControl::grpc::CtrlModeReply* /*response*/) override {
+      abort();
+      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+    }
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+    virtual ::grpc::ServerUnaryReactor* changeCtrlMode(
+      ::grpc::CallbackServerContext* /*context*/, const ::org::jeecg::defsControl::grpc::Empty* /*request*/, ::org::jeecg::defsControl::grpc::CtrlModeReply* /*response*/)
+    #else
+    virtual ::grpc::experimental::ServerUnaryReactor* changeCtrlMode(
+      ::grpc::experimental::CallbackServerContext* /*context*/, const ::org::jeecg::defsControl::grpc::Empty* /*request*/, ::org::jeecg::defsControl::grpc::CtrlModeReply* /*response*/)
+    #endif
+      { return nullptr; }
+  };
+  #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+  typedef ExperimentalWithCallbackMethod_vehicleControl<ExperimentalWithCallbackMethod_UploadMap<ExperimentalWithCallbackMethod_changeCtrlMode<Service > > > CallbackService;
+  #endif
+
+  typedef ExperimentalWithCallbackMethod_vehicleControl<ExperimentalWithCallbackMethod_UploadMap<ExperimentalWithCallbackMethod_changeCtrlMode<Service > > > ExperimentalCallbackService;
+  template <class BaseClass>
+  class WithGenericMethod_vehicleControl : public BaseClass {
+   private:
+    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
+   public:
+    WithGenericMethod_vehicleControl() {
+      ::grpc::Service::MarkMethodGeneric(0);
+    }
+    ~WithGenericMethod_vehicleControl() override {
+      BaseClassMustBeDerivedFromService(this);
+    }
+    // disable synchronous version of this method
+    ::grpc::Status vehicleControl(::grpc::ServerContext* /*context*/, const ::org::jeecg::defsControl::grpc::Empty* /*request*/, ::org::jeecg::defsControl::grpc::ControlReply* /*response*/) override {
+      abort();
+      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+    }
+  };
+  template <class BaseClass>
+  class WithGenericMethod_UploadMap : public BaseClass {
+   private:
+    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
+   public:
+    WithGenericMethod_UploadMap() {
+      ::grpc::Service::MarkMethodGeneric(1);
+    }
+    ~WithGenericMethod_UploadMap() override {
+      BaseClassMustBeDerivedFromService(this);
+    }
+    // disable synchronous version of this method
+    ::grpc::Status UploadMap(::grpc::ServerContext* /*context*/, const ::org::jeecg::defsControl::grpc::Empty* /*request*/, ::org::jeecg::defsControl::grpc::UploadMapReply* /*response*/) override {
+      abort();
+      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+    }
+  };
+  template <class BaseClass>
+  class WithGenericMethod_changeCtrlMode : public BaseClass {
+   private:
+    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
+   public:
+    WithGenericMethod_changeCtrlMode() {
+      ::grpc::Service::MarkMethodGeneric(2);
+    }
+    ~WithGenericMethod_changeCtrlMode() override {
+      BaseClassMustBeDerivedFromService(this);
+    }
+    // disable synchronous version of this method
+    ::grpc::Status changeCtrlMode(::grpc::ServerContext* /*context*/, const ::org::jeecg::defsControl::grpc::Empty* /*request*/, ::org::jeecg::defsControl::grpc::CtrlModeReply* /*response*/) override {
+      abort();
+      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+    }
+  };
+  template <class BaseClass>
+  class WithRawMethod_vehicleControl : public BaseClass {
+   private:
+    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
+   public:
+    WithRawMethod_vehicleControl() {
+      ::grpc::Service::MarkMethodRaw(0);
+    }
+    ~WithRawMethod_vehicleControl() override {
+      BaseClassMustBeDerivedFromService(this);
+    }
+    // disable synchronous version of this method
+    ::grpc::Status vehicleControl(::grpc::ServerContext* /*context*/, const ::org::jeecg::defsControl::grpc::Empty* /*request*/, ::org::jeecg::defsControl::grpc::ControlReply* /*response*/) override {
+      abort();
+      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+    }
+    void RequestvehicleControl(::grpc::ServerContext* context, ::grpc::ByteBuffer* request, ::grpc::ServerAsyncResponseWriter< ::grpc::ByteBuffer>* response, ::grpc::CompletionQueue* new_call_cq, ::grpc::ServerCompletionQueue* notification_cq, void *tag) {
+      ::grpc::Service::RequestAsyncUnary(0, context, request, response, new_call_cq, notification_cq, tag);
+    }
+  };
+  template <class BaseClass>
+  class WithRawMethod_UploadMap : public BaseClass {
+   private:
+    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
+   public:
+    WithRawMethod_UploadMap() {
+      ::grpc::Service::MarkMethodRaw(1);
+    }
+    ~WithRawMethod_UploadMap() override {
+      BaseClassMustBeDerivedFromService(this);
+    }
+    // disable synchronous version of this method
+    ::grpc::Status UploadMap(::grpc::ServerContext* /*context*/, const ::org::jeecg::defsControl::grpc::Empty* /*request*/, ::org::jeecg::defsControl::grpc::UploadMapReply* /*response*/) override {
+      abort();
+      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+    }
+    void RequestUploadMap(::grpc::ServerContext* context, ::grpc::ByteBuffer* request, ::grpc::ServerAsyncResponseWriter< ::grpc::ByteBuffer>* response, ::grpc::CompletionQueue* new_call_cq, ::grpc::ServerCompletionQueue* notification_cq, void *tag) {
+      ::grpc::Service::RequestAsyncUnary(1, context, request, response, new_call_cq, notification_cq, tag);
+    }
+  };
+  template <class BaseClass>
+  class WithRawMethod_changeCtrlMode : public BaseClass {
+   private:
+    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
+   public:
+    WithRawMethod_changeCtrlMode() {
+      ::grpc::Service::MarkMethodRaw(2);
+    }
+    ~WithRawMethod_changeCtrlMode() override {
+      BaseClassMustBeDerivedFromService(this);
+    }
+    // disable synchronous version of this method
+    ::grpc::Status changeCtrlMode(::grpc::ServerContext* /*context*/, const ::org::jeecg::defsControl::grpc::Empty* /*request*/, ::org::jeecg::defsControl::grpc::CtrlModeReply* /*response*/) override {
+      abort();
+      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+    }
+    void RequestchangeCtrlMode(::grpc::ServerContext* context, ::grpc::ByteBuffer* request, ::grpc::ServerAsyncResponseWriter< ::grpc::ByteBuffer>* response, ::grpc::CompletionQueue* new_call_cq, ::grpc::ServerCompletionQueue* notification_cq, void *tag) {
+      ::grpc::Service::RequestAsyncUnary(2, context, request, response, new_call_cq, notification_cq, tag);
+    }
+  };
+  template <class BaseClass>
+  class ExperimentalWithRawCallbackMethod_vehicleControl : public BaseClass {
+   private:
+    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
+   public:
+    ExperimentalWithRawCallbackMethod_vehicleControl() {
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+      ::grpc::Service::
+    #else
+      ::grpc::Service::experimental().
+    #endif
+        MarkMethodRawCallback(0,
+          new ::grpc::internal::CallbackUnaryHandler< ::grpc::ByteBuffer, ::grpc::ByteBuffer>(
+            [this](
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+                   ::grpc::CallbackServerContext*
+    #else
+                   ::grpc::experimental::CallbackServerContext*
+    #endif
+                     context, const ::grpc::ByteBuffer* request, ::grpc::ByteBuffer* response) { return this->vehicleControl(context, request, response); }));
+    }
+    ~ExperimentalWithRawCallbackMethod_vehicleControl() override {
+      BaseClassMustBeDerivedFromService(this);
+    }
+    // disable synchronous version of this method
+    ::grpc::Status vehicleControl(::grpc::ServerContext* /*context*/, const ::org::jeecg::defsControl::grpc::Empty* /*request*/, ::org::jeecg::defsControl::grpc::ControlReply* /*response*/) override {
+      abort();
+      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+    }
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+    virtual ::grpc::ServerUnaryReactor* vehicleControl(
+      ::grpc::CallbackServerContext* /*context*/, const ::grpc::ByteBuffer* /*request*/, ::grpc::ByteBuffer* /*response*/)
+    #else
+    virtual ::grpc::experimental::ServerUnaryReactor* vehicleControl(
+      ::grpc::experimental::CallbackServerContext* /*context*/, const ::grpc::ByteBuffer* /*request*/, ::grpc::ByteBuffer* /*response*/)
+    #endif
+      { return nullptr; }
+  };
+  template <class BaseClass>
+  class ExperimentalWithRawCallbackMethod_UploadMap : public BaseClass {
+   private:
+    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
+   public:
+    ExperimentalWithRawCallbackMethod_UploadMap() {
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+      ::grpc::Service::
+    #else
+      ::grpc::Service::experimental().
+    #endif
+        MarkMethodRawCallback(1,
+          new ::grpc::internal::CallbackUnaryHandler< ::grpc::ByteBuffer, ::grpc::ByteBuffer>(
+            [this](
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+                   ::grpc::CallbackServerContext*
+    #else
+                   ::grpc::experimental::CallbackServerContext*
+    #endif
+                     context, const ::grpc::ByteBuffer* request, ::grpc::ByteBuffer* response) { return this->UploadMap(context, request, response); }));
+    }
+    ~ExperimentalWithRawCallbackMethod_UploadMap() override {
+      BaseClassMustBeDerivedFromService(this);
+    }
+    // disable synchronous version of this method
+    ::grpc::Status UploadMap(::grpc::ServerContext* /*context*/, const ::org::jeecg::defsControl::grpc::Empty* /*request*/, ::org::jeecg::defsControl::grpc::UploadMapReply* /*response*/) override {
+      abort();
+      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+    }
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+    virtual ::grpc::ServerUnaryReactor* UploadMap(
+      ::grpc::CallbackServerContext* /*context*/, const ::grpc::ByteBuffer* /*request*/, ::grpc::ByteBuffer* /*response*/)
+    #else
+    virtual ::grpc::experimental::ServerUnaryReactor* UploadMap(
+      ::grpc::experimental::CallbackServerContext* /*context*/, const ::grpc::ByteBuffer* /*request*/, ::grpc::ByteBuffer* /*response*/)
+    #endif
+      { return nullptr; }
+  };
+  template <class BaseClass>
+  class ExperimentalWithRawCallbackMethod_changeCtrlMode : public BaseClass {
+   private:
+    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
+   public:
+    ExperimentalWithRawCallbackMethod_changeCtrlMode() {
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+      ::grpc::Service::
+    #else
+      ::grpc::Service::experimental().
+    #endif
+        MarkMethodRawCallback(2,
+          new ::grpc::internal::CallbackUnaryHandler< ::grpc::ByteBuffer, ::grpc::ByteBuffer>(
+            [this](
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+                   ::grpc::CallbackServerContext*
+    #else
+                   ::grpc::experimental::CallbackServerContext*
+    #endif
+                     context, const ::grpc::ByteBuffer* request, ::grpc::ByteBuffer* response) { return this->changeCtrlMode(context, request, response); }));
+    }
+    ~ExperimentalWithRawCallbackMethod_changeCtrlMode() override {
+      BaseClassMustBeDerivedFromService(this);
+    }
+    // disable synchronous version of this method
+    ::grpc::Status changeCtrlMode(::grpc::ServerContext* /*context*/, const ::org::jeecg::defsControl::grpc::Empty* /*request*/, ::org::jeecg::defsControl::grpc::CtrlModeReply* /*response*/) override {
+      abort();
+      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+    }
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+    virtual ::grpc::ServerUnaryReactor* changeCtrlMode(
+      ::grpc::CallbackServerContext* /*context*/, const ::grpc::ByteBuffer* /*request*/, ::grpc::ByteBuffer* /*response*/)
+    #else
+    virtual ::grpc::experimental::ServerUnaryReactor* changeCtrlMode(
+      ::grpc::experimental::CallbackServerContext* /*context*/, const ::grpc::ByteBuffer* /*request*/, ::grpc::ByteBuffer* /*response*/)
+    #endif
+      { return nullptr; }
+  };
+  template <class BaseClass>
+  class WithStreamedUnaryMethod_vehicleControl : public BaseClass {
+   private:
+    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
+   public:
+    WithStreamedUnaryMethod_vehicleControl() {
+      ::grpc::Service::MarkMethodStreamed(0,
+        new ::grpc::internal::StreamedUnaryHandler<
+          ::org::jeecg::defsControl::grpc::Empty, ::org::jeecg::defsControl::grpc::ControlReply>(
+            [this](::grpc::ServerContext* context,
+                   ::grpc::ServerUnaryStreamer<
+                     ::org::jeecg::defsControl::grpc::Empty, ::org::jeecg::defsControl::grpc::ControlReply>* streamer) {
+                       return this->StreamedvehicleControl(context,
+                         streamer);
+                  }));
+    }
+    ~WithStreamedUnaryMethod_vehicleControl() override {
+      BaseClassMustBeDerivedFromService(this);
+    }
+    // disable regular version of this method
+    ::grpc::Status vehicleControl(::grpc::ServerContext* /*context*/, const ::org::jeecg::defsControl::grpc::Empty* /*request*/, ::org::jeecg::defsControl::grpc::ControlReply* /*response*/) override {
+      abort();
+      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+    }
+    // replace default version of method with streamed unary
+    virtual ::grpc::Status StreamedvehicleControl(::grpc::ServerContext* context, ::grpc::ServerUnaryStreamer< ::org::jeecg::defsControl::grpc::Empty,::org::jeecg::defsControl::grpc::ControlReply>* server_unary_streamer) = 0;
+  };
+  template <class BaseClass>
+  class WithStreamedUnaryMethod_UploadMap : public BaseClass {
+   private:
+    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
+   public:
+    WithStreamedUnaryMethod_UploadMap() {
+      ::grpc::Service::MarkMethodStreamed(1,
+        new ::grpc::internal::StreamedUnaryHandler<
+          ::org::jeecg::defsControl::grpc::Empty, ::org::jeecg::defsControl::grpc::UploadMapReply>(
+            [this](::grpc::ServerContext* context,
+                   ::grpc::ServerUnaryStreamer<
+                     ::org::jeecg::defsControl::grpc::Empty, ::org::jeecg::defsControl::grpc::UploadMapReply>* streamer) {
+                       return this->StreamedUploadMap(context,
+                         streamer);
+                  }));
+    }
+    ~WithStreamedUnaryMethod_UploadMap() override {
+      BaseClassMustBeDerivedFromService(this);
+    }
+    // disable regular version of this method
+    ::grpc::Status UploadMap(::grpc::ServerContext* /*context*/, const ::org::jeecg::defsControl::grpc::Empty* /*request*/, ::org::jeecg::defsControl::grpc::UploadMapReply* /*response*/) override {
+      abort();
+      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+    }
+    // replace default version of method with streamed unary
+    virtual ::grpc::Status StreamedUploadMap(::grpc::ServerContext* context, ::grpc::ServerUnaryStreamer< ::org::jeecg::defsControl::grpc::Empty,::org::jeecg::defsControl::grpc::UploadMapReply>* server_unary_streamer) = 0;
+  };
+  template <class BaseClass>
+  class WithStreamedUnaryMethod_changeCtrlMode : public BaseClass {
+   private:
+    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
+   public:
+    WithStreamedUnaryMethod_changeCtrlMode() {
+      ::grpc::Service::MarkMethodStreamed(2,
+        new ::grpc::internal::StreamedUnaryHandler<
+          ::org::jeecg::defsControl::grpc::Empty, ::org::jeecg::defsControl::grpc::CtrlModeReply>(
+            [this](::grpc::ServerContext* context,
+                   ::grpc::ServerUnaryStreamer<
+                     ::org::jeecg::defsControl::grpc::Empty, ::org::jeecg::defsControl::grpc::CtrlModeReply>* streamer) {
+                       return this->StreamedchangeCtrlMode(context,
+                         streamer);
+                  }));
+    }
+    ~WithStreamedUnaryMethod_changeCtrlMode() override {
+      BaseClassMustBeDerivedFromService(this);
+    }
+    // disable regular version of this method
+    ::grpc::Status changeCtrlMode(::grpc::ServerContext* /*context*/, const ::org::jeecg::defsControl::grpc::Empty* /*request*/, ::org::jeecg::defsControl::grpc::CtrlModeReply* /*response*/) override {
+      abort();
+      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+    }
+    // replace default version of method with streamed unary
+    virtual ::grpc::Status StreamedchangeCtrlMode(::grpc::ServerContext* context, ::grpc::ServerUnaryStreamer< ::org::jeecg::defsControl::grpc::Empty,::org::jeecg::defsControl::grpc::CtrlModeReply>* server_unary_streamer) = 0;
+  };
+  typedef WithStreamedUnaryMethod_vehicleControl<WithStreamedUnaryMethod_UploadMap<WithStreamedUnaryMethod_changeCtrlMode<Service > > > StreamedUnaryService;
+  typedef Service SplitStreamedService;
+  typedef WithStreamedUnaryMethod_vehicleControl<WithStreamedUnaryMethod_UploadMap<WithStreamedUnaryMethod_changeCtrlMode<Service > > > StreamedService;
+};
+
+}  // namespace grpc
+}  // namespace defsControl
+}  // namespace jeecg
+}  // namespace org
+
+
+#endif  // GRPC_VehicleControl_5fservice_2eproto__INCLUDED

+ 31 - 0
src/driver/driver_cloud_grpc_client_BS/VehiclePatrol.grpc.pb.cc

@@ -0,0 +1,31 @@
+// Generated by the gRPC C++ plugin.
+// If you make any local change, they will be lost.
+// source: VehiclePatrol.proto
+
+#include "VehiclePatrol.pb.h"
+#include "VehiclePatrol.grpc.pb.h"
+
+#include <functional>
+#include <grpcpp/impl/codegen/async_stream.h>
+#include <grpcpp/impl/codegen/async_unary_call.h>
+#include <grpcpp/impl/codegen/channel_interface.h>
+#include <grpcpp/impl/codegen/client_unary_call.h>
+#include <grpcpp/impl/codegen/client_callback.h>
+#include <grpcpp/impl/codegen/message_allocator.h>
+#include <grpcpp/impl/codegen/method_handler.h>
+#include <grpcpp/impl/codegen/rpc_service_method.h>
+#include <grpcpp/impl/codegen/server_callback.h>
+#include <grpcpp/impl/codegen/server_callback_handlers.h>
+#include <grpcpp/impl/codegen/server_context.h>
+#include <grpcpp/impl/codegen/service_type.h>
+#include <grpcpp/impl/codegen/sync_stream.h>
+namespace org {
+namespace jeecg {
+namespace defsPatrol {
+namespace grpc {
+
+}  // namespace org
+}  // namespace jeecg
+}  // namespace defsPatrol
+}  // namespace grpc
+

+ 40 - 0
src/driver/driver_cloud_grpc_client_BS/VehiclePatrol.grpc.pb.h

@@ -0,0 +1,40 @@
+// Generated by the gRPC C++ plugin.
+// If you make any local change, they will be lost.
+// source: VehiclePatrol.proto
+#ifndef GRPC_VehiclePatrol_2eproto__INCLUDED
+#define GRPC_VehiclePatrol_2eproto__INCLUDED
+
+#include "VehiclePatrol.pb.h"
+
+#include <functional>
+#include <grpc/impl/codegen/port_platform.h>
+#include <grpcpp/impl/codegen/async_generic_service.h>
+#include <grpcpp/impl/codegen/async_stream.h>
+#include <grpcpp/impl/codegen/async_unary_call.h>
+#include <grpcpp/impl/codegen/client_callback.h>
+#include <grpcpp/impl/codegen/client_context.h>
+#include <grpcpp/impl/codegen/completion_queue.h>
+#include <grpcpp/impl/codegen/message_allocator.h>
+#include <grpcpp/impl/codegen/method_handler.h>
+#include <grpcpp/impl/codegen/proto_utils.h>
+#include <grpcpp/impl/codegen/rpc_method.h>
+#include <grpcpp/impl/codegen/server_callback.h>
+#include <grpcpp/impl/codegen/server_callback_handlers.h>
+#include <grpcpp/impl/codegen/server_context.h>
+#include <grpcpp/impl/codegen/service_type.h>
+#include <grpcpp/impl/codegen/status.h>
+#include <grpcpp/impl/codegen/stub_options.h>
+#include <grpcpp/impl/codegen/sync_stream.h>
+
+namespace org {
+namespace jeecg {
+namespace defsPatrol {
+namespace grpc {
+
+}  // namespace grpc
+}  // namespace defsPatrol
+}  // namespace jeecg
+}  // namespace org
+
+
+#endif  // GRPC_VehiclePatrol_2eproto__INCLUDED

+ 92 - 0
src/driver/driver_cloud_grpc_client_BS/VehiclePatrol_service.grpc.pb.cc

@@ -0,0 +1,92 @@
+// Generated by the gRPC C++ plugin.
+// If you make any local change, they will be lost.
+// source: VehiclePatrol_service.proto
+
+#include "VehiclePatrol_service.pb.h"
+#include "VehiclePatrol_service.grpc.pb.h"
+
+#include <functional>
+#include <grpcpp/impl/codegen/async_stream.h>
+#include <grpcpp/impl/codegen/async_unary_call.h>
+#include <grpcpp/impl/codegen/channel_interface.h>
+#include <grpcpp/impl/codegen/client_unary_call.h>
+#include <grpcpp/impl/codegen/client_callback.h>
+#include <grpcpp/impl/codegen/message_allocator.h>
+#include <grpcpp/impl/codegen/method_handler.h>
+#include <grpcpp/impl/codegen/rpc_service_method.h>
+#include <grpcpp/impl/codegen/server_callback.h>
+#include <grpcpp/impl/codegen/server_callback_handlers.h>
+#include <grpcpp/impl/codegen/server_context.h>
+#include <grpcpp/impl/codegen/service_type.h>
+#include <grpcpp/impl/codegen/sync_stream.h>
+namespace org {
+namespace jeecg {
+namespace defsPatrol {
+namespace grpc {
+
+static const char* VehiclePatrolException_method_names[] = {
+  "/org.jeecg.defsPatrol.grpc.VehiclePatrolException/uploadVehiclePatrolInfo",
+};
+
+std::unique_ptr< VehiclePatrolException::Stub> VehiclePatrolException::NewStub(const std::shared_ptr< ::grpc::ChannelInterface>& channel, const ::grpc::StubOptions& options) {
+  (void)options;
+  std::unique_ptr< VehiclePatrolException::Stub> stub(new VehiclePatrolException::Stub(channel));
+  return stub;
+}
+
+VehiclePatrolException::Stub::Stub(const std::shared_ptr< ::grpc::ChannelInterface>& channel)
+  : channel_(channel), rpcmethod_uploadVehiclePatrolInfo_(VehiclePatrolException_method_names[0], ::grpc::internal::RpcMethod::NORMAL_RPC, channel)
+  {}
+
+::grpc::Status VehiclePatrolException::Stub::uploadVehiclePatrolInfo(::grpc::ClientContext* context, const ::org::jeecg::defsPatrol::grpc::PatrolRequest& request, ::org::jeecg::defsPatrol::grpc::Empty* response) {
+  return ::grpc::internal::BlockingUnaryCall(channel_.get(), rpcmethod_uploadVehiclePatrolInfo_, context, request, response);
+}
+
+void VehiclePatrolException::Stub::experimental_async::uploadVehiclePatrolInfo(::grpc::ClientContext* context, const ::org::jeecg::defsPatrol::grpc::PatrolRequest* request, ::org::jeecg::defsPatrol::grpc::Empty* response, std::function<void(::grpc::Status)> f) {
+  ::grpc::internal::CallbackUnaryCall(stub_->channel_.get(), stub_->rpcmethod_uploadVehiclePatrolInfo_, context, request, response, std::move(f));
+}
+
+void VehiclePatrolException::Stub::experimental_async::uploadVehiclePatrolInfo(::grpc::ClientContext* context, const ::org::jeecg::defsPatrol::grpc::PatrolRequest* request, ::org::jeecg::defsPatrol::grpc::Empty* response, ::grpc::experimental::ClientUnaryReactor* reactor) {
+  ::grpc::internal::ClientCallbackUnaryFactory::Create(stub_->channel_.get(), stub_->rpcmethod_uploadVehiclePatrolInfo_, context, request, response, reactor);
+}
+
+::grpc::ClientAsyncResponseReader< ::org::jeecg::defsPatrol::grpc::Empty>* VehiclePatrolException::Stub::PrepareAsyncuploadVehiclePatrolInfoRaw(::grpc::ClientContext* context, const ::org::jeecg::defsPatrol::grpc::PatrolRequest& request, ::grpc::CompletionQueue* cq) {
+  return ::grpc::internal::ClientAsyncResponseReaderFactory< ::org::jeecg::defsPatrol::grpc::Empty>::Create(channel_.get(), cq, rpcmethod_uploadVehiclePatrolInfo_, context, request, false);
+}
+
+::grpc::ClientAsyncResponseReader< ::org::jeecg::defsPatrol::grpc::Empty>* VehiclePatrolException::Stub::AsyncuploadVehiclePatrolInfoRaw(::grpc::ClientContext* context, const ::org::jeecg::defsPatrol::grpc::PatrolRequest& request, ::grpc::CompletionQueue* cq) {
+  auto* result =
+    this->PrepareAsyncuploadVehiclePatrolInfoRaw(context, request, cq);
+  result->StartCall();
+  return result;
+}
+
+VehiclePatrolException::Service::Service() {
+  AddMethod(new ::grpc::internal::RpcServiceMethod(
+      VehiclePatrolException_method_names[0],
+      ::grpc::internal::RpcMethod::NORMAL_RPC,
+      new ::grpc::internal::RpcMethodHandler< VehiclePatrolException::Service, ::org::jeecg::defsPatrol::grpc::PatrolRequest, ::org::jeecg::defsPatrol::grpc::Empty>(
+          [](VehiclePatrolException::Service* service,
+             ::grpc::ServerContext* ctx,
+             const ::org::jeecg::defsPatrol::grpc::PatrolRequest* req,
+             ::org::jeecg::defsPatrol::grpc::Empty* resp) {
+               return service->uploadVehiclePatrolInfo(ctx, req, resp);
+             }, this)));
+}
+
+VehiclePatrolException::Service::~Service() {
+}
+
+::grpc::Status VehiclePatrolException::Service::uploadVehiclePatrolInfo(::grpc::ServerContext* context, const ::org::jeecg::defsPatrol::grpc::PatrolRequest* request, ::org::jeecg::defsPatrol::grpc::Empty* response) {
+  (void) context;
+  (void) request;
+  (void) response;
+  return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+}
+
+
+}  // namespace org
+}  // namespace jeecg
+}  // namespace defsPatrol
+}  // namespace grpc
+

+ 298 - 0
src/driver/driver_cloud_grpc_client_BS/VehiclePatrol_service.grpc.pb.h

@@ -0,0 +1,298 @@
+// Generated by the gRPC C++ plugin.
+// If you make any local change, they will be lost.
+// source: VehiclePatrol_service.proto
+#ifndef GRPC_VehiclePatrol_5fservice_2eproto__INCLUDED
+#define GRPC_VehiclePatrol_5fservice_2eproto__INCLUDED
+
+#include "VehiclePatrol_service.pb.h"
+
+#include <functional>
+#include <grpc/impl/codegen/port_platform.h>
+#include <grpcpp/impl/codegen/async_generic_service.h>
+#include <grpcpp/impl/codegen/async_stream.h>
+#include <grpcpp/impl/codegen/async_unary_call.h>
+#include <grpcpp/impl/codegen/client_callback.h>
+#include <grpcpp/impl/codegen/client_context.h>
+#include <grpcpp/impl/codegen/completion_queue.h>
+#include <grpcpp/impl/codegen/message_allocator.h>
+#include <grpcpp/impl/codegen/method_handler.h>
+#include <grpcpp/impl/codegen/proto_utils.h>
+#include <grpcpp/impl/codegen/rpc_method.h>
+#include <grpcpp/impl/codegen/server_callback.h>
+#include <grpcpp/impl/codegen/server_callback_handlers.h>
+#include <grpcpp/impl/codegen/server_context.h>
+#include <grpcpp/impl/codegen/service_type.h>
+#include <grpcpp/impl/codegen/status.h>
+#include <grpcpp/impl/codegen/stub_options.h>
+#include <grpcpp/impl/codegen/sync_stream.h>
+
+namespace org {
+namespace jeecg {
+namespace defsPatrol {
+namespace grpc {
+
+class VehiclePatrolException final {
+ public:
+  static constexpr char const* service_full_name() {
+    return "org.jeecg.defsPatrol.grpc.VehiclePatrolException";
+  }
+  class StubInterface {
+   public:
+    virtual ~StubInterface() {}
+    virtual ::grpc::Status uploadVehiclePatrolInfo(::grpc::ClientContext* context, const ::org::jeecg::defsPatrol::grpc::PatrolRequest& request, ::org::jeecg::defsPatrol::grpc::Empty* response) = 0;
+    std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::org::jeecg::defsPatrol::grpc::Empty>> AsyncuploadVehiclePatrolInfo(::grpc::ClientContext* context, const ::org::jeecg::defsPatrol::grpc::PatrolRequest& request, ::grpc::CompletionQueue* cq) {
+      return std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::org::jeecg::defsPatrol::grpc::Empty>>(AsyncuploadVehiclePatrolInfoRaw(context, request, cq));
+    }
+    std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::org::jeecg::defsPatrol::grpc::Empty>> PrepareAsyncuploadVehiclePatrolInfo(::grpc::ClientContext* context, const ::org::jeecg::defsPatrol::grpc::PatrolRequest& request, ::grpc::CompletionQueue* cq) {
+      return std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::org::jeecg::defsPatrol::grpc::Empty>>(PrepareAsyncuploadVehiclePatrolInfoRaw(context, request, cq));
+    }
+    class experimental_async_interface {
+     public:
+      virtual ~experimental_async_interface() {}
+      virtual void uploadVehiclePatrolInfo(::grpc::ClientContext* context, const ::org::jeecg::defsPatrol::grpc::PatrolRequest* request, ::org::jeecg::defsPatrol::grpc::Empty* response, std::function<void(::grpc::Status)>) = 0;
+      #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+      virtual void uploadVehiclePatrolInfo(::grpc::ClientContext* context, const ::org::jeecg::defsPatrol::grpc::PatrolRequest* request, ::org::jeecg::defsPatrol::grpc::Empty* response, ::grpc::ClientUnaryReactor* reactor) = 0;
+      #else
+      virtual void uploadVehiclePatrolInfo(::grpc::ClientContext* context, const ::org::jeecg::defsPatrol::grpc::PatrolRequest* request, ::org::jeecg::defsPatrol::grpc::Empty* response, ::grpc::experimental::ClientUnaryReactor* reactor) = 0;
+      #endif
+    };
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+    typedef class experimental_async_interface async_interface;
+    #endif
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+    async_interface* async() { return experimental_async(); }
+    #endif
+    virtual class experimental_async_interface* experimental_async() { return nullptr; }
+  private:
+    virtual ::grpc::ClientAsyncResponseReaderInterface< ::org::jeecg::defsPatrol::grpc::Empty>* AsyncuploadVehiclePatrolInfoRaw(::grpc::ClientContext* context, const ::org::jeecg::defsPatrol::grpc::PatrolRequest& request, ::grpc::CompletionQueue* cq) = 0;
+    virtual ::grpc::ClientAsyncResponseReaderInterface< ::org::jeecg::defsPatrol::grpc::Empty>* PrepareAsyncuploadVehiclePatrolInfoRaw(::grpc::ClientContext* context, const ::org::jeecg::defsPatrol::grpc::PatrolRequest& request, ::grpc::CompletionQueue* cq) = 0;
+  };
+  class Stub final : public StubInterface {
+   public:
+    Stub(const std::shared_ptr< ::grpc::ChannelInterface>& channel);
+    ::grpc::Status uploadVehiclePatrolInfo(::grpc::ClientContext* context, const ::org::jeecg::defsPatrol::grpc::PatrolRequest& request, ::org::jeecg::defsPatrol::grpc::Empty* response) override;
+    std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::org::jeecg::defsPatrol::grpc::Empty>> AsyncuploadVehiclePatrolInfo(::grpc::ClientContext* context, const ::org::jeecg::defsPatrol::grpc::PatrolRequest& request, ::grpc::CompletionQueue* cq) {
+      return std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::org::jeecg::defsPatrol::grpc::Empty>>(AsyncuploadVehiclePatrolInfoRaw(context, request, cq));
+    }
+    std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::org::jeecg::defsPatrol::grpc::Empty>> PrepareAsyncuploadVehiclePatrolInfo(::grpc::ClientContext* context, const ::org::jeecg::defsPatrol::grpc::PatrolRequest& request, ::grpc::CompletionQueue* cq) {
+      return std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::org::jeecg::defsPatrol::grpc::Empty>>(PrepareAsyncuploadVehiclePatrolInfoRaw(context, request, cq));
+    }
+    class experimental_async final :
+      public StubInterface::experimental_async_interface {
+     public:
+      void uploadVehiclePatrolInfo(::grpc::ClientContext* context, const ::org::jeecg::defsPatrol::grpc::PatrolRequest* request, ::org::jeecg::defsPatrol::grpc::Empty* response, std::function<void(::grpc::Status)>) override;
+      #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+      void uploadVehiclePatrolInfo(::grpc::ClientContext* context, const ::org::jeecg::defsPatrol::grpc::PatrolRequest* request, ::org::jeecg::defsPatrol::grpc::Empty* response, ::grpc::ClientUnaryReactor* reactor) override;
+      #else
+      void uploadVehiclePatrolInfo(::grpc::ClientContext* context, const ::org::jeecg::defsPatrol::grpc::PatrolRequest* request, ::org::jeecg::defsPatrol::grpc::Empty* response, ::grpc::experimental::ClientUnaryReactor* reactor) override;
+      #endif
+     private:
+      friend class Stub;
+      explicit experimental_async(Stub* stub): stub_(stub) { }
+      Stub* stub() { return stub_; }
+      Stub* stub_;
+    };
+    class experimental_async_interface* experimental_async() override { return &async_stub_; }
+
+   private:
+    std::shared_ptr< ::grpc::ChannelInterface> channel_;
+    class experimental_async async_stub_{this};
+    ::grpc::ClientAsyncResponseReader< ::org::jeecg::defsPatrol::grpc::Empty>* AsyncuploadVehiclePatrolInfoRaw(::grpc::ClientContext* context, const ::org::jeecg::defsPatrol::grpc::PatrolRequest& request, ::grpc::CompletionQueue* cq) override;
+    ::grpc::ClientAsyncResponseReader< ::org::jeecg::defsPatrol::grpc::Empty>* PrepareAsyncuploadVehiclePatrolInfoRaw(::grpc::ClientContext* context, const ::org::jeecg::defsPatrol::grpc::PatrolRequest& request, ::grpc::CompletionQueue* cq) override;
+    const ::grpc::internal::RpcMethod rpcmethod_uploadVehiclePatrolInfo_;
+  };
+  static std::unique_ptr<Stub> NewStub(const std::shared_ptr< ::grpc::ChannelInterface>& channel, const ::grpc::StubOptions& options = ::grpc::StubOptions());
+
+  class Service : public ::grpc::Service {
+   public:
+    Service();
+    virtual ~Service();
+    virtual ::grpc::Status uploadVehiclePatrolInfo(::grpc::ServerContext* context, const ::org::jeecg::defsPatrol::grpc::PatrolRequest* request, ::org::jeecg::defsPatrol::grpc::Empty* response);
+  };
+  template <class BaseClass>
+  class WithAsyncMethod_uploadVehiclePatrolInfo : public BaseClass {
+   private:
+    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
+   public:
+    WithAsyncMethod_uploadVehiclePatrolInfo() {
+      ::grpc::Service::MarkMethodAsync(0);
+    }
+    ~WithAsyncMethod_uploadVehiclePatrolInfo() override {
+      BaseClassMustBeDerivedFromService(this);
+    }
+    // disable synchronous version of this method
+    ::grpc::Status uploadVehiclePatrolInfo(::grpc::ServerContext* /*context*/, const ::org::jeecg::defsPatrol::grpc::PatrolRequest* /*request*/, ::org::jeecg::defsPatrol::grpc::Empty* /*response*/) override {
+      abort();
+      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+    }
+    void RequestuploadVehiclePatrolInfo(::grpc::ServerContext* context, ::org::jeecg::defsPatrol::grpc::PatrolRequest* request, ::grpc::ServerAsyncResponseWriter< ::org::jeecg::defsPatrol::grpc::Empty>* response, ::grpc::CompletionQueue* new_call_cq, ::grpc::ServerCompletionQueue* notification_cq, void *tag) {
+      ::grpc::Service::RequestAsyncUnary(0, context, request, response, new_call_cq, notification_cq, tag);
+    }
+  };
+  typedef WithAsyncMethod_uploadVehiclePatrolInfo<Service > AsyncService;
+  template <class BaseClass>
+  class ExperimentalWithCallbackMethod_uploadVehiclePatrolInfo : public BaseClass {
+   private:
+    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
+   public:
+    ExperimentalWithCallbackMethod_uploadVehiclePatrolInfo() {
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+      ::grpc::Service::
+    #else
+      ::grpc::Service::experimental().
+    #endif
+        MarkMethodCallback(0,
+          new ::grpc::internal::CallbackUnaryHandler< ::org::jeecg::defsPatrol::grpc::PatrolRequest, ::org::jeecg::defsPatrol::grpc::Empty>(
+            [this](
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+                   ::grpc::CallbackServerContext*
+    #else
+                   ::grpc::experimental::CallbackServerContext*
+    #endif
+                     context, const ::org::jeecg::defsPatrol::grpc::PatrolRequest* request, ::org::jeecg::defsPatrol::grpc::Empty* response) { return this->uploadVehiclePatrolInfo(context, request, response); }));}
+    void SetMessageAllocatorFor_uploadVehiclePatrolInfo(
+        ::grpc::experimental::MessageAllocator< ::org::jeecg::defsPatrol::grpc::PatrolRequest, ::org::jeecg::defsPatrol::grpc::Empty>* allocator) {
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+      ::grpc::internal::MethodHandler* const handler = ::grpc::Service::GetHandler(0);
+    #else
+      ::grpc::internal::MethodHandler* const handler = ::grpc::Service::experimental().GetHandler(0);
+    #endif
+      static_cast<::grpc::internal::CallbackUnaryHandler< ::org::jeecg::defsPatrol::grpc::PatrolRequest, ::org::jeecg::defsPatrol::grpc::Empty>*>(handler)
+              ->SetMessageAllocator(allocator);
+    }
+    ~ExperimentalWithCallbackMethod_uploadVehiclePatrolInfo() override {
+      BaseClassMustBeDerivedFromService(this);
+    }
+    // disable synchronous version of this method
+    ::grpc::Status uploadVehiclePatrolInfo(::grpc::ServerContext* /*context*/, const ::org::jeecg::defsPatrol::grpc::PatrolRequest* /*request*/, ::org::jeecg::defsPatrol::grpc::Empty* /*response*/) override {
+      abort();
+      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+    }
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+    virtual ::grpc::ServerUnaryReactor* uploadVehiclePatrolInfo(
+      ::grpc::CallbackServerContext* /*context*/, const ::org::jeecg::defsPatrol::grpc::PatrolRequest* /*request*/, ::org::jeecg::defsPatrol::grpc::Empty* /*response*/)
+    #else
+    virtual ::grpc::experimental::ServerUnaryReactor* uploadVehiclePatrolInfo(
+      ::grpc::experimental::CallbackServerContext* /*context*/, const ::org::jeecg::defsPatrol::grpc::PatrolRequest* /*request*/, ::org::jeecg::defsPatrol::grpc::Empty* /*response*/)
+    #endif
+      { return nullptr; }
+  };
+  #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+  typedef ExperimentalWithCallbackMethod_uploadVehiclePatrolInfo<Service > CallbackService;
+  #endif
+
+  typedef ExperimentalWithCallbackMethod_uploadVehiclePatrolInfo<Service > ExperimentalCallbackService;
+  template <class BaseClass>
+  class WithGenericMethod_uploadVehiclePatrolInfo : public BaseClass {
+   private:
+    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
+   public:
+    WithGenericMethod_uploadVehiclePatrolInfo() {
+      ::grpc::Service::MarkMethodGeneric(0);
+    }
+    ~WithGenericMethod_uploadVehiclePatrolInfo() override {
+      BaseClassMustBeDerivedFromService(this);
+    }
+    // disable synchronous version of this method
+    ::grpc::Status uploadVehiclePatrolInfo(::grpc::ServerContext* /*context*/, const ::org::jeecg::defsPatrol::grpc::PatrolRequest* /*request*/, ::org::jeecg::defsPatrol::grpc::Empty* /*response*/) override {
+      abort();
+      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+    }
+  };
+  template <class BaseClass>
+  class WithRawMethod_uploadVehiclePatrolInfo : public BaseClass {
+   private:
+    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
+   public:
+    WithRawMethod_uploadVehiclePatrolInfo() {
+      ::grpc::Service::MarkMethodRaw(0);
+    }
+    ~WithRawMethod_uploadVehiclePatrolInfo() override {
+      BaseClassMustBeDerivedFromService(this);
+    }
+    // disable synchronous version of this method
+    ::grpc::Status uploadVehiclePatrolInfo(::grpc::ServerContext* /*context*/, const ::org::jeecg::defsPatrol::grpc::PatrolRequest* /*request*/, ::org::jeecg::defsPatrol::grpc::Empty* /*response*/) override {
+      abort();
+      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+    }
+    void RequestuploadVehiclePatrolInfo(::grpc::ServerContext* context, ::grpc::ByteBuffer* request, ::grpc::ServerAsyncResponseWriter< ::grpc::ByteBuffer>* response, ::grpc::CompletionQueue* new_call_cq, ::grpc::ServerCompletionQueue* notification_cq, void *tag) {
+      ::grpc::Service::RequestAsyncUnary(0, context, request, response, new_call_cq, notification_cq, tag);
+    }
+  };
+  template <class BaseClass>
+  class ExperimentalWithRawCallbackMethod_uploadVehiclePatrolInfo : public BaseClass {
+   private:
+    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
+   public:
+    ExperimentalWithRawCallbackMethod_uploadVehiclePatrolInfo() {
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+      ::grpc::Service::
+    #else
+      ::grpc::Service::experimental().
+    #endif
+        MarkMethodRawCallback(0,
+          new ::grpc::internal::CallbackUnaryHandler< ::grpc::ByteBuffer, ::grpc::ByteBuffer>(
+            [this](
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+                   ::grpc::CallbackServerContext*
+    #else
+                   ::grpc::experimental::CallbackServerContext*
+    #endif
+                     context, const ::grpc::ByteBuffer* request, ::grpc::ByteBuffer* response) { return this->uploadVehiclePatrolInfo(context, request, response); }));
+    }
+    ~ExperimentalWithRawCallbackMethod_uploadVehiclePatrolInfo() override {
+      BaseClassMustBeDerivedFromService(this);
+    }
+    // disable synchronous version of this method
+    ::grpc::Status uploadVehiclePatrolInfo(::grpc::ServerContext* /*context*/, const ::org::jeecg::defsPatrol::grpc::PatrolRequest* /*request*/, ::org::jeecg::defsPatrol::grpc::Empty* /*response*/) override {
+      abort();
+      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+    }
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+    virtual ::grpc::ServerUnaryReactor* uploadVehiclePatrolInfo(
+      ::grpc::CallbackServerContext* /*context*/, const ::grpc::ByteBuffer* /*request*/, ::grpc::ByteBuffer* /*response*/)
+    #else
+    virtual ::grpc::experimental::ServerUnaryReactor* uploadVehiclePatrolInfo(
+      ::grpc::experimental::CallbackServerContext* /*context*/, const ::grpc::ByteBuffer* /*request*/, ::grpc::ByteBuffer* /*response*/)
+    #endif
+      { return nullptr; }
+  };
+  template <class BaseClass>
+  class WithStreamedUnaryMethod_uploadVehiclePatrolInfo : public BaseClass {
+   private:
+    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
+   public:
+    WithStreamedUnaryMethod_uploadVehiclePatrolInfo() {
+      ::grpc::Service::MarkMethodStreamed(0,
+        new ::grpc::internal::StreamedUnaryHandler<
+          ::org::jeecg::defsPatrol::grpc::PatrolRequest, ::org::jeecg::defsPatrol::grpc::Empty>(
+            [this](::grpc::ServerContext* context,
+                   ::grpc::ServerUnaryStreamer<
+                     ::org::jeecg::defsPatrol::grpc::PatrolRequest, ::org::jeecg::defsPatrol::grpc::Empty>* streamer) {
+                       return this->StreameduploadVehiclePatrolInfo(context,
+                         streamer);
+                  }));
+    }
+    ~WithStreamedUnaryMethod_uploadVehiclePatrolInfo() override {
+      BaseClassMustBeDerivedFromService(this);
+    }
+    // disable regular version of this method
+    ::grpc::Status uploadVehiclePatrolInfo(::grpc::ServerContext* /*context*/, const ::org::jeecg::defsPatrol::grpc::PatrolRequest* /*request*/, ::org::jeecg::defsPatrol::grpc::Empty* /*response*/) override {
+      abort();
+      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+    }
+    // replace default version of method with streamed unary
+    virtual ::grpc::Status StreameduploadVehiclePatrolInfo(::grpc::ServerContext* context, ::grpc::ServerUnaryStreamer< ::org::jeecg::defsPatrol::grpc::PatrolRequest,::org::jeecg::defsPatrol::grpc::Empty>* server_unary_streamer) = 0;
+  };
+  typedef WithStreamedUnaryMethod_uploadVehiclePatrolInfo<Service > StreamedUnaryService;
+  typedef Service SplitStreamedService;
+  typedef WithStreamedUnaryMethod_uploadVehiclePatrolInfo<Service > StreamedService;
+};
+
+}  // namespace grpc
+}  // namespace defsPatrol
+}  // namespace jeecg
+}  // namespace org
+
+
+#endif  // GRPC_VehiclePatrol_5fservice_2eproto__INCLUDED

+ 31 - 0
src/driver/driver_cloud_grpc_client_BS/VehicleUpload.grpc.pb.cc

@@ -0,0 +1,31 @@
+// Generated by the gRPC C++ plugin.
+// If you make any local change, they will be lost.
+// source: VehicleUpload.proto
+
+#include "VehicleUpload.pb.h"
+#include "VehicleUpload.grpc.pb.h"
+
+#include <functional>
+#include <grpcpp/impl/codegen/async_stream.h>
+#include <grpcpp/impl/codegen/async_unary_call.h>
+#include <grpcpp/impl/codegen/channel_interface.h>
+#include <grpcpp/impl/codegen/client_unary_call.h>
+#include <grpcpp/impl/codegen/client_callback.h>
+#include <grpcpp/impl/codegen/message_allocator.h>
+#include <grpcpp/impl/codegen/method_handler.h>
+#include <grpcpp/impl/codegen/rpc_service_method.h>
+#include <grpcpp/impl/codegen/server_callback.h>
+#include <grpcpp/impl/codegen/server_callback_handlers.h>
+#include <grpcpp/impl/codegen/server_context.h>
+#include <grpcpp/impl/codegen/service_type.h>
+#include <grpcpp/impl/codegen/sync_stream.h>
+namespace org {
+namespace jeecg {
+namespace defsDetails {
+namespace grpc {
+
+}  // namespace org
+}  // namespace jeecg
+}  // namespace defsDetails
+}  // namespace grpc
+

+ 40 - 0
src/driver/driver_cloud_grpc_client_BS/VehicleUpload.grpc.pb.h

@@ -0,0 +1,40 @@
+// Generated by the gRPC C++ plugin.
+// If you make any local change, they will be lost.
+// source: VehicleUpload.proto
+#ifndef GRPC_VehicleUpload_2eproto__INCLUDED
+#define GRPC_VehicleUpload_2eproto__INCLUDED
+
+#include "VehicleUpload.pb.h"
+
+#include <functional>
+#include <grpc/impl/codegen/port_platform.h>
+#include <grpcpp/impl/codegen/async_generic_service.h>
+#include <grpcpp/impl/codegen/async_stream.h>
+#include <grpcpp/impl/codegen/async_unary_call.h>
+#include <grpcpp/impl/codegen/client_callback.h>
+#include <grpcpp/impl/codegen/client_context.h>
+#include <grpcpp/impl/codegen/completion_queue.h>
+#include <grpcpp/impl/codegen/message_allocator.h>
+#include <grpcpp/impl/codegen/method_handler.h>
+#include <grpcpp/impl/codegen/proto_utils.h>
+#include <grpcpp/impl/codegen/rpc_method.h>
+#include <grpcpp/impl/codegen/server_callback.h>
+#include <grpcpp/impl/codegen/server_callback_handlers.h>
+#include <grpcpp/impl/codegen/server_context.h>
+#include <grpcpp/impl/codegen/service_type.h>
+#include <grpcpp/impl/codegen/status.h>
+#include <grpcpp/impl/codegen/stub_options.h>
+#include <grpcpp/impl/codegen/sync_stream.h>
+
+namespace org {
+namespace jeecg {
+namespace defsDetails {
+namespace grpc {
+
+}  // namespace grpc
+}  // namespace defsDetails
+}  // namespace jeecg
+}  // namespace org
+
+
+#endif  // GRPC_VehicleUpload_2eproto__INCLUDED

+ 134 - 0
src/driver/driver_cloud_grpc_client_BS/VehicleUpload_service.grpc.pb.cc

@@ -0,0 +1,134 @@
+// Generated by the gRPC C++ plugin.
+// If you make any local change, they will be lost.
+// source: VehicleUpload_service.proto
+
+#include "VehicleUpload_service.pb.h"
+#include "VehicleUpload_service.grpc.pb.h"
+
+#include <functional>
+#include <grpcpp/impl/codegen/async_stream.h>
+#include <grpcpp/impl/codegen/async_unary_call.h>
+#include <grpcpp/impl/codegen/channel_interface.h>
+#include <grpcpp/impl/codegen/client_unary_call.h>
+#include <grpcpp/impl/codegen/client_callback.h>
+#include <grpcpp/impl/codegen/message_allocator.h>
+#include <grpcpp/impl/codegen/method_handler.h>
+#include <grpcpp/impl/codegen/rpc_service_method.h>
+#include <grpcpp/impl/codegen/server_callback.h>
+#include <grpcpp/impl/codegen/server_callback_handlers.h>
+#include <grpcpp/impl/codegen/server_context.h>
+#include <grpcpp/impl/codegen/service_type.h>
+#include <grpcpp/impl/codegen/sync_stream.h>
+namespace org {
+namespace jeecg {
+namespace defsDetails {
+namespace grpc {
+
+static const char* DataExchange_method_names[] = {
+  "/org.jeecg.defsDetails.grpc.DataExchange/uploadVehicleInfo",
+  "/org.jeecg.defsDetails.grpc.DataExchange/uploadPath",
+};
+
+std::unique_ptr< DataExchange::Stub> DataExchange::NewStub(const std::shared_ptr< ::grpc::ChannelInterface>& channel, const ::grpc::StubOptions& options) {
+  (void)options;
+  std::unique_ptr< DataExchange::Stub> stub(new DataExchange::Stub(channel));
+  return stub;
+}
+
+DataExchange::Stub::Stub(const std::shared_ptr< ::grpc::ChannelInterface>& channel)
+  : channel_(channel), rpcmethod_uploadVehicleInfo_(DataExchange_method_names[0], ::grpc::internal::RpcMethod::NORMAL_RPC, channel)
+  , rpcmethod_uploadPath_(DataExchange_method_names[1], ::grpc::internal::RpcMethod::NORMAL_RPC, channel)
+  {}
+
+::grpc::Status DataExchange::Stub::uploadVehicleInfo(::grpc::ClientContext* context, const ::org::jeecg::defsDetails::grpc::UplinkRequest& request, ::org::jeecg::defsDetails::grpc::ResponseMessage* response) {
+  return ::grpc::internal::BlockingUnaryCall(channel_.get(), rpcmethod_uploadVehicleInfo_, context, request, response);
+}
+
+void DataExchange::Stub::experimental_async::uploadVehicleInfo(::grpc::ClientContext* context, const ::org::jeecg::defsDetails::grpc::UplinkRequest* request, ::org::jeecg::defsDetails::grpc::ResponseMessage* response, std::function<void(::grpc::Status)> f) {
+  ::grpc::internal::CallbackUnaryCall(stub_->channel_.get(), stub_->rpcmethod_uploadVehicleInfo_, context, request, response, std::move(f));
+}
+
+void DataExchange::Stub::experimental_async::uploadVehicleInfo(::grpc::ClientContext* context, const ::org::jeecg::defsDetails::grpc::UplinkRequest* request, ::org::jeecg::defsDetails::grpc::ResponseMessage* response, ::grpc::experimental::ClientUnaryReactor* reactor) {
+  ::grpc::internal::ClientCallbackUnaryFactory::Create(stub_->channel_.get(), stub_->rpcmethod_uploadVehicleInfo_, context, request, response, reactor);
+}
+
+::grpc::ClientAsyncResponseReader< ::org::jeecg::defsDetails::grpc::ResponseMessage>* DataExchange::Stub::PrepareAsyncuploadVehicleInfoRaw(::grpc::ClientContext* context, const ::org::jeecg::defsDetails::grpc::UplinkRequest& request, ::grpc::CompletionQueue* cq) {
+  return ::grpc::internal::ClientAsyncResponseReaderFactory< ::org::jeecg::defsDetails::grpc::ResponseMessage>::Create(channel_.get(), cq, rpcmethod_uploadVehicleInfo_, context, request, false);
+}
+
+::grpc::ClientAsyncResponseReader< ::org::jeecg::defsDetails::grpc::ResponseMessage>* DataExchange::Stub::AsyncuploadVehicleInfoRaw(::grpc::ClientContext* context, const ::org::jeecg::defsDetails::grpc::UplinkRequest& request, ::grpc::CompletionQueue* cq) {
+  auto* result =
+    this->PrepareAsyncuploadVehicleInfoRaw(context, request, cq);
+  result->StartCall();
+  return result;
+}
+
+::grpc::Status DataExchange::Stub::uploadPath(::grpc::ClientContext* context, const ::org::jeecg::defsDetails::grpc::UploadPathRequest& request, ::org::jeecg::defsDetails::grpc::Empty* response) {
+  return ::grpc::internal::BlockingUnaryCall(channel_.get(), rpcmethod_uploadPath_, context, request, response);
+}
+
+void DataExchange::Stub::experimental_async::uploadPath(::grpc::ClientContext* context, const ::org::jeecg::defsDetails::grpc::UploadPathRequest* request, ::org::jeecg::defsDetails::grpc::Empty* response, std::function<void(::grpc::Status)> f) {
+  ::grpc::internal::CallbackUnaryCall(stub_->channel_.get(), stub_->rpcmethod_uploadPath_, context, request, response, std::move(f));
+}
+
+void DataExchange::Stub::experimental_async::uploadPath(::grpc::ClientContext* context, const ::org::jeecg::defsDetails::grpc::UploadPathRequest* request, ::org::jeecg::defsDetails::grpc::Empty* response, ::grpc::experimental::ClientUnaryReactor* reactor) {
+  ::grpc::internal::ClientCallbackUnaryFactory::Create(stub_->channel_.get(), stub_->rpcmethod_uploadPath_, context, request, response, reactor);
+}
+
+::grpc::ClientAsyncResponseReader< ::org::jeecg::defsDetails::grpc::Empty>* DataExchange::Stub::PrepareAsyncuploadPathRaw(::grpc::ClientContext* context, const ::org::jeecg::defsDetails::grpc::UploadPathRequest& request, ::grpc::CompletionQueue* cq) {
+  return ::grpc::internal::ClientAsyncResponseReaderFactory< ::org::jeecg::defsDetails::grpc::Empty>::Create(channel_.get(), cq, rpcmethod_uploadPath_, context, request, false);
+}
+
+::grpc::ClientAsyncResponseReader< ::org::jeecg::defsDetails::grpc::Empty>* DataExchange::Stub::AsyncuploadPathRaw(::grpc::ClientContext* context, const ::org::jeecg::defsDetails::grpc::UploadPathRequest& request, ::grpc::CompletionQueue* cq) {
+  auto* result =
+    this->PrepareAsyncuploadPathRaw(context, request, cq);
+  result->StartCall();
+  return result;
+}
+
+DataExchange::Service::Service() {
+  AddMethod(new ::grpc::internal::RpcServiceMethod(
+      DataExchange_method_names[0],
+      ::grpc::internal::RpcMethod::NORMAL_RPC,
+      new ::grpc::internal::RpcMethodHandler< DataExchange::Service, ::org::jeecg::defsDetails::grpc::UplinkRequest, ::org::jeecg::defsDetails::grpc::ResponseMessage>(
+          [](DataExchange::Service* service,
+             ::grpc::ServerContext* ctx,
+             const ::org::jeecg::defsDetails::grpc::UplinkRequest* req,
+             ::org::jeecg::defsDetails::grpc::ResponseMessage* resp) {
+               return service->uploadVehicleInfo(ctx, req, resp);
+             }, this)));
+  AddMethod(new ::grpc::internal::RpcServiceMethod(
+      DataExchange_method_names[1],
+      ::grpc::internal::RpcMethod::NORMAL_RPC,
+      new ::grpc::internal::RpcMethodHandler< DataExchange::Service, ::org::jeecg::defsDetails::grpc::UploadPathRequest, ::org::jeecg::defsDetails::grpc::Empty>(
+          [](DataExchange::Service* service,
+             ::grpc::ServerContext* ctx,
+             const ::org::jeecg::defsDetails::grpc::UploadPathRequest* req,
+             ::org::jeecg::defsDetails::grpc::Empty* resp) {
+               return service->uploadPath(ctx, req, resp);
+             }, this)));
+}
+
+DataExchange::Service::~Service() {
+}
+
+::grpc::Status DataExchange::Service::uploadVehicleInfo(::grpc::ServerContext* context, const ::org::jeecg::defsDetails::grpc::UplinkRequest* request, ::org::jeecg::defsDetails::grpc::ResponseMessage* response) {
+  (void) context;
+  (void) request;
+  (void) response;
+  return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+}
+
+::grpc::Status DataExchange::Service::uploadPath(::grpc::ServerContext* context, const ::org::jeecg::defsDetails::grpc::UploadPathRequest* request, ::org::jeecg::defsDetails::grpc::Empty* response) {
+  (void) context;
+  (void) request;
+  (void) response;
+  return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+}
+
+
+}  // namespace org
+}  // namespace jeecg
+}  // namespace defsDetails
+}  // namespace grpc
+

+ 499 - 0
src/driver/driver_cloud_grpc_client_BS/VehicleUpload_service.grpc.pb.h

@@ -0,0 +1,499 @@
+// Generated by the gRPC C++ plugin.
+// If you make any local change, they will be lost.
+// source: VehicleUpload_service.proto
+#ifndef GRPC_VehicleUpload_5fservice_2eproto__INCLUDED
+#define GRPC_VehicleUpload_5fservice_2eproto__INCLUDED
+
+#include "VehicleUpload_service.pb.h"
+
+#include <functional>
+#include <grpc/impl/codegen/port_platform.h>
+#include <grpcpp/impl/codegen/async_generic_service.h>
+#include <grpcpp/impl/codegen/async_stream.h>
+#include <grpcpp/impl/codegen/async_unary_call.h>
+#include <grpcpp/impl/codegen/client_callback.h>
+#include <grpcpp/impl/codegen/client_context.h>
+#include <grpcpp/impl/codegen/completion_queue.h>
+#include <grpcpp/impl/codegen/message_allocator.h>
+#include <grpcpp/impl/codegen/method_handler.h>
+#include <grpcpp/impl/codegen/proto_utils.h>
+#include <grpcpp/impl/codegen/rpc_method.h>
+#include <grpcpp/impl/codegen/server_callback.h>
+#include <grpcpp/impl/codegen/server_callback_handlers.h>
+#include <grpcpp/impl/codegen/server_context.h>
+#include <grpcpp/impl/codegen/service_type.h>
+#include <grpcpp/impl/codegen/status.h>
+#include <grpcpp/impl/codegen/stub_options.h>
+#include <grpcpp/impl/codegen/sync_stream.h>
+
+namespace org {
+namespace jeecg {
+namespace defsDetails {
+namespace grpc {
+
+class DataExchange final {
+ public:
+  static constexpr char const* service_full_name() {
+    return "org.jeecg.defsDetails.grpc.DataExchange";
+  }
+  class StubInterface {
+   public:
+    virtual ~StubInterface() {}
+    virtual ::grpc::Status uploadVehicleInfo(::grpc::ClientContext* context, const ::org::jeecg::defsDetails::grpc::UplinkRequest& request, ::org::jeecg::defsDetails::grpc::ResponseMessage* response) = 0;
+    std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::org::jeecg::defsDetails::grpc::ResponseMessage>> AsyncuploadVehicleInfo(::grpc::ClientContext* context, const ::org::jeecg::defsDetails::grpc::UplinkRequest& request, ::grpc::CompletionQueue* cq) {
+      return std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::org::jeecg::defsDetails::grpc::ResponseMessage>>(AsyncuploadVehicleInfoRaw(context, request, cq));
+    }
+    std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::org::jeecg::defsDetails::grpc::ResponseMessage>> PrepareAsyncuploadVehicleInfo(::grpc::ClientContext* context, const ::org::jeecg::defsDetails::grpc::UplinkRequest& request, ::grpc::CompletionQueue* cq) {
+      return std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::org::jeecg::defsDetails::grpc::ResponseMessage>>(PrepareAsyncuploadVehicleInfoRaw(context, request, cq));
+    }
+    virtual ::grpc::Status uploadPath(::grpc::ClientContext* context, const ::org::jeecg::defsDetails::grpc::UploadPathRequest& request, ::org::jeecg::defsDetails::grpc::Empty* response) = 0;
+    std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::org::jeecg::defsDetails::grpc::Empty>> AsyncuploadPath(::grpc::ClientContext* context, const ::org::jeecg::defsDetails::grpc::UploadPathRequest& request, ::grpc::CompletionQueue* cq) {
+      return std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::org::jeecg::defsDetails::grpc::Empty>>(AsyncuploadPathRaw(context, request, cq));
+    }
+    std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::org::jeecg::defsDetails::grpc::Empty>> PrepareAsyncuploadPath(::grpc::ClientContext* context, const ::org::jeecg::defsDetails::grpc::UploadPathRequest& request, ::grpc::CompletionQueue* cq) {
+      return std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::org::jeecg::defsDetails::grpc::Empty>>(PrepareAsyncuploadPathRaw(context, request, cq));
+    }
+    class experimental_async_interface {
+     public:
+      virtual ~experimental_async_interface() {}
+      virtual void uploadVehicleInfo(::grpc::ClientContext* context, const ::org::jeecg::defsDetails::grpc::UplinkRequest* request, ::org::jeecg::defsDetails::grpc::ResponseMessage* response, std::function<void(::grpc::Status)>) = 0;
+      #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+      virtual void uploadVehicleInfo(::grpc::ClientContext* context, const ::org::jeecg::defsDetails::grpc::UplinkRequest* request, ::org::jeecg::defsDetails::grpc::ResponseMessage* response, ::grpc::ClientUnaryReactor* reactor) = 0;
+      #else
+      virtual void uploadVehicleInfo(::grpc::ClientContext* context, const ::org::jeecg::defsDetails::grpc::UplinkRequest* request, ::org::jeecg::defsDetails::grpc::ResponseMessage* response, ::grpc::experimental::ClientUnaryReactor* reactor) = 0;
+      #endif
+      virtual void uploadPath(::grpc::ClientContext* context, const ::org::jeecg::defsDetails::grpc::UploadPathRequest* request, ::org::jeecg::defsDetails::grpc::Empty* response, std::function<void(::grpc::Status)>) = 0;
+      #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+      virtual void uploadPath(::grpc::ClientContext* context, const ::org::jeecg::defsDetails::grpc::UploadPathRequest* request, ::org::jeecg::defsDetails::grpc::Empty* response, ::grpc::ClientUnaryReactor* reactor) = 0;
+      #else
+      virtual void uploadPath(::grpc::ClientContext* context, const ::org::jeecg::defsDetails::grpc::UploadPathRequest* request, ::org::jeecg::defsDetails::grpc::Empty* response, ::grpc::experimental::ClientUnaryReactor* reactor) = 0;
+      #endif
+    };
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+    typedef class experimental_async_interface async_interface;
+    #endif
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+    async_interface* async() { return experimental_async(); }
+    #endif
+    virtual class experimental_async_interface* experimental_async() { return nullptr; }
+  private:
+    virtual ::grpc::ClientAsyncResponseReaderInterface< ::org::jeecg::defsDetails::grpc::ResponseMessage>* AsyncuploadVehicleInfoRaw(::grpc::ClientContext* context, const ::org::jeecg::defsDetails::grpc::UplinkRequest& request, ::grpc::CompletionQueue* cq) = 0;
+    virtual ::grpc::ClientAsyncResponseReaderInterface< ::org::jeecg::defsDetails::grpc::ResponseMessage>* PrepareAsyncuploadVehicleInfoRaw(::grpc::ClientContext* context, const ::org::jeecg::defsDetails::grpc::UplinkRequest& request, ::grpc::CompletionQueue* cq) = 0;
+    virtual ::grpc::ClientAsyncResponseReaderInterface< ::org::jeecg::defsDetails::grpc::Empty>* AsyncuploadPathRaw(::grpc::ClientContext* context, const ::org::jeecg::defsDetails::grpc::UploadPathRequest& request, ::grpc::CompletionQueue* cq) = 0;
+    virtual ::grpc::ClientAsyncResponseReaderInterface< ::org::jeecg::defsDetails::grpc::Empty>* PrepareAsyncuploadPathRaw(::grpc::ClientContext* context, const ::org::jeecg::defsDetails::grpc::UploadPathRequest& request, ::grpc::CompletionQueue* cq) = 0;
+  };
+  class Stub final : public StubInterface {
+   public:
+    Stub(const std::shared_ptr< ::grpc::ChannelInterface>& channel);
+    ::grpc::Status uploadVehicleInfo(::grpc::ClientContext* context, const ::org::jeecg::defsDetails::grpc::UplinkRequest& request, ::org::jeecg::defsDetails::grpc::ResponseMessage* response) override;
+    std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::org::jeecg::defsDetails::grpc::ResponseMessage>> AsyncuploadVehicleInfo(::grpc::ClientContext* context, const ::org::jeecg::defsDetails::grpc::UplinkRequest& request, ::grpc::CompletionQueue* cq) {
+      return std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::org::jeecg::defsDetails::grpc::ResponseMessage>>(AsyncuploadVehicleInfoRaw(context, request, cq));
+    }
+    std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::org::jeecg::defsDetails::grpc::ResponseMessage>> PrepareAsyncuploadVehicleInfo(::grpc::ClientContext* context, const ::org::jeecg::defsDetails::grpc::UplinkRequest& request, ::grpc::CompletionQueue* cq) {
+      return std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::org::jeecg::defsDetails::grpc::ResponseMessage>>(PrepareAsyncuploadVehicleInfoRaw(context, request, cq));
+    }
+    ::grpc::Status uploadPath(::grpc::ClientContext* context, const ::org::jeecg::defsDetails::grpc::UploadPathRequest& request, ::org::jeecg::defsDetails::grpc::Empty* response) override;
+    std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::org::jeecg::defsDetails::grpc::Empty>> AsyncuploadPath(::grpc::ClientContext* context, const ::org::jeecg::defsDetails::grpc::UploadPathRequest& request, ::grpc::CompletionQueue* cq) {
+      return std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::org::jeecg::defsDetails::grpc::Empty>>(AsyncuploadPathRaw(context, request, cq));
+    }
+    std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::org::jeecg::defsDetails::grpc::Empty>> PrepareAsyncuploadPath(::grpc::ClientContext* context, const ::org::jeecg::defsDetails::grpc::UploadPathRequest& request, ::grpc::CompletionQueue* cq) {
+      return std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::org::jeecg::defsDetails::grpc::Empty>>(PrepareAsyncuploadPathRaw(context, request, cq));
+    }
+    class experimental_async final :
+      public StubInterface::experimental_async_interface {
+     public:
+      void uploadVehicleInfo(::grpc::ClientContext* context, const ::org::jeecg::defsDetails::grpc::UplinkRequest* request, ::org::jeecg::defsDetails::grpc::ResponseMessage* response, std::function<void(::grpc::Status)>) override;
+      #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+      void uploadVehicleInfo(::grpc::ClientContext* context, const ::org::jeecg::defsDetails::grpc::UplinkRequest* request, ::org::jeecg::defsDetails::grpc::ResponseMessage* response, ::grpc::ClientUnaryReactor* reactor) override;
+      #else
+      void uploadVehicleInfo(::grpc::ClientContext* context, const ::org::jeecg::defsDetails::grpc::UplinkRequest* request, ::org::jeecg::defsDetails::grpc::ResponseMessage* response, ::grpc::experimental::ClientUnaryReactor* reactor) override;
+      #endif
+      void uploadPath(::grpc::ClientContext* context, const ::org::jeecg::defsDetails::grpc::UploadPathRequest* request, ::org::jeecg::defsDetails::grpc::Empty* response, std::function<void(::grpc::Status)>) override;
+      #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+      void uploadPath(::grpc::ClientContext* context, const ::org::jeecg::defsDetails::grpc::UploadPathRequest* request, ::org::jeecg::defsDetails::grpc::Empty* response, ::grpc::ClientUnaryReactor* reactor) override;
+      #else
+      void uploadPath(::grpc::ClientContext* context, const ::org::jeecg::defsDetails::grpc::UploadPathRequest* request, ::org::jeecg::defsDetails::grpc::Empty* response, ::grpc::experimental::ClientUnaryReactor* reactor) override;
+      #endif
+     private:
+      friend class Stub;
+      explicit experimental_async(Stub* stub): stub_(stub) { }
+      Stub* stub() { return stub_; }
+      Stub* stub_;
+    };
+    class experimental_async_interface* experimental_async() override { return &async_stub_; }
+
+   private:
+    std::shared_ptr< ::grpc::ChannelInterface> channel_;
+    class experimental_async async_stub_{this};
+    ::grpc::ClientAsyncResponseReader< ::org::jeecg::defsDetails::grpc::ResponseMessage>* AsyncuploadVehicleInfoRaw(::grpc::ClientContext* context, const ::org::jeecg::defsDetails::grpc::UplinkRequest& request, ::grpc::CompletionQueue* cq) override;
+    ::grpc::ClientAsyncResponseReader< ::org::jeecg::defsDetails::grpc::ResponseMessage>* PrepareAsyncuploadVehicleInfoRaw(::grpc::ClientContext* context, const ::org::jeecg::defsDetails::grpc::UplinkRequest& request, ::grpc::CompletionQueue* cq) override;
+    ::grpc::ClientAsyncResponseReader< ::org::jeecg::defsDetails::grpc::Empty>* AsyncuploadPathRaw(::grpc::ClientContext* context, const ::org::jeecg::defsDetails::grpc::UploadPathRequest& request, ::grpc::CompletionQueue* cq) override;
+    ::grpc::ClientAsyncResponseReader< ::org::jeecg::defsDetails::grpc::Empty>* PrepareAsyncuploadPathRaw(::grpc::ClientContext* context, const ::org::jeecg::defsDetails::grpc::UploadPathRequest& request, ::grpc::CompletionQueue* cq) override;
+    const ::grpc::internal::RpcMethod rpcmethod_uploadVehicleInfo_;
+    const ::grpc::internal::RpcMethod rpcmethod_uploadPath_;
+  };
+  static std::unique_ptr<Stub> NewStub(const std::shared_ptr< ::grpc::ChannelInterface>& channel, const ::grpc::StubOptions& options = ::grpc::StubOptions());
+
+  class Service : public ::grpc::Service {
+   public:
+    Service();
+    virtual ~Service();
+    virtual ::grpc::Status uploadVehicleInfo(::grpc::ServerContext* context, const ::org::jeecg::defsDetails::grpc::UplinkRequest* request, ::org::jeecg::defsDetails::grpc::ResponseMessage* response);
+    virtual ::grpc::Status uploadPath(::grpc::ServerContext* context, const ::org::jeecg::defsDetails::grpc::UploadPathRequest* request, ::org::jeecg::defsDetails::grpc::Empty* response);
+  };
+  template <class BaseClass>
+  class WithAsyncMethod_uploadVehicleInfo : public BaseClass {
+   private:
+    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
+   public:
+    WithAsyncMethod_uploadVehicleInfo() {
+      ::grpc::Service::MarkMethodAsync(0);
+    }
+    ~WithAsyncMethod_uploadVehicleInfo() override {
+      BaseClassMustBeDerivedFromService(this);
+    }
+    // disable synchronous version of this method
+    ::grpc::Status uploadVehicleInfo(::grpc::ServerContext* /*context*/, const ::org::jeecg::defsDetails::grpc::UplinkRequest* /*request*/, ::org::jeecg::defsDetails::grpc::ResponseMessage* /*response*/) override {
+      abort();
+      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+    }
+    void RequestuploadVehicleInfo(::grpc::ServerContext* context, ::org::jeecg::defsDetails::grpc::UplinkRequest* request, ::grpc::ServerAsyncResponseWriter< ::org::jeecg::defsDetails::grpc::ResponseMessage>* response, ::grpc::CompletionQueue* new_call_cq, ::grpc::ServerCompletionQueue* notification_cq, void *tag) {
+      ::grpc::Service::RequestAsyncUnary(0, context, request, response, new_call_cq, notification_cq, tag);
+    }
+  };
+  template <class BaseClass>
+  class WithAsyncMethod_uploadPath : public BaseClass {
+   private:
+    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
+   public:
+    WithAsyncMethod_uploadPath() {
+      ::grpc::Service::MarkMethodAsync(1);
+    }
+    ~WithAsyncMethod_uploadPath() override {
+      BaseClassMustBeDerivedFromService(this);
+    }
+    // disable synchronous version of this method
+    ::grpc::Status uploadPath(::grpc::ServerContext* /*context*/, const ::org::jeecg::defsDetails::grpc::UploadPathRequest* /*request*/, ::org::jeecg::defsDetails::grpc::Empty* /*response*/) override {
+      abort();
+      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+    }
+    void RequestuploadPath(::grpc::ServerContext* context, ::org::jeecg::defsDetails::grpc::UploadPathRequest* request, ::grpc::ServerAsyncResponseWriter< ::org::jeecg::defsDetails::grpc::Empty>* response, ::grpc::CompletionQueue* new_call_cq, ::grpc::ServerCompletionQueue* notification_cq, void *tag) {
+      ::grpc::Service::RequestAsyncUnary(1, context, request, response, new_call_cq, notification_cq, tag);
+    }
+  };
+  typedef WithAsyncMethod_uploadVehicleInfo<WithAsyncMethod_uploadPath<Service > > AsyncService;
+  template <class BaseClass>
+  class ExperimentalWithCallbackMethod_uploadVehicleInfo : public BaseClass {
+   private:
+    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
+   public:
+    ExperimentalWithCallbackMethod_uploadVehicleInfo() {
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+      ::grpc::Service::
+    #else
+      ::grpc::Service::experimental().
+    #endif
+        MarkMethodCallback(0,
+          new ::grpc::internal::CallbackUnaryHandler< ::org::jeecg::defsDetails::grpc::UplinkRequest, ::org::jeecg::defsDetails::grpc::ResponseMessage>(
+            [this](
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+                   ::grpc::CallbackServerContext*
+    #else
+                   ::grpc::experimental::CallbackServerContext*
+    #endif
+                     context, const ::org::jeecg::defsDetails::grpc::UplinkRequest* request, ::org::jeecg::defsDetails::grpc::ResponseMessage* response) { return this->uploadVehicleInfo(context, request, response); }));}
+    void SetMessageAllocatorFor_uploadVehicleInfo(
+        ::grpc::experimental::MessageAllocator< ::org::jeecg::defsDetails::grpc::UplinkRequest, ::org::jeecg::defsDetails::grpc::ResponseMessage>* allocator) {
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+      ::grpc::internal::MethodHandler* const handler = ::grpc::Service::GetHandler(0);
+    #else
+      ::grpc::internal::MethodHandler* const handler = ::grpc::Service::experimental().GetHandler(0);
+    #endif
+      static_cast<::grpc::internal::CallbackUnaryHandler< ::org::jeecg::defsDetails::grpc::UplinkRequest, ::org::jeecg::defsDetails::grpc::ResponseMessage>*>(handler)
+              ->SetMessageAllocator(allocator);
+    }
+    ~ExperimentalWithCallbackMethod_uploadVehicleInfo() override {
+      BaseClassMustBeDerivedFromService(this);
+    }
+    // disable synchronous version of this method
+    ::grpc::Status uploadVehicleInfo(::grpc::ServerContext* /*context*/, const ::org::jeecg::defsDetails::grpc::UplinkRequest* /*request*/, ::org::jeecg::defsDetails::grpc::ResponseMessage* /*response*/) override {
+      abort();
+      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+    }
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+    virtual ::grpc::ServerUnaryReactor* uploadVehicleInfo(
+      ::grpc::CallbackServerContext* /*context*/, const ::org::jeecg::defsDetails::grpc::UplinkRequest* /*request*/, ::org::jeecg::defsDetails::grpc::ResponseMessage* /*response*/)
+    #else
+    virtual ::grpc::experimental::ServerUnaryReactor* uploadVehicleInfo(
+      ::grpc::experimental::CallbackServerContext* /*context*/, const ::org::jeecg::defsDetails::grpc::UplinkRequest* /*request*/, ::org::jeecg::defsDetails::grpc::ResponseMessage* /*response*/)
+    #endif
+      { return nullptr; }
+  };
+  template <class BaseClass>
+  class ExperimentalWithCallbackMethod_uploadPath : public BaseClass {
+   private:
+    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
+   public:
+    ExperimentalWithCallbackMethod_uploadPath() {
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+      ::grpc::Service::
+    #else
+      ::grpc::Service::experimental().
+    #endif
+        MarkMethodCallback(1,
+          new ::grpc::internal::CallbackUnaryHandler< ::org::jeecg::defsDetails::grpc::UploadPathRequest, ::org::jeecg::defsDetails::grpc::Empty>(
+            [this](
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+                   ::grpc::CallbackServerContext*
+    #else
+                   ::grpc::experimental::CallbackServerContext*
+    #endif
+                     context, const ::org::jeecg::defsDetails::grpc::UploadPathRequest* request, ::org::jeecg::defsDetails::grpc::Empty* response) { return this->uploadPath(context, request, response); }));}
+    void SetMessageAllocatorFor_uploadPath(
+        ::grpc::experimental::MessageAllocator< ::org::jeecg::defsDetails::grpc::UploadPathRequest, ::org::jeecg::defsDetails::grpc::Empty>* allocator) {
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+      ::grpc::internal::MethodHandler* const handler = ::grpc::Service::GetHandler(1);
+    #else
+      ::grpc::internal::MethodHandler* const handler = ::grpc::Service::experimental().GetHandler(1);
+    #endif
+      static_cast<::grpc::internal::CallbackUnaryHandler< ::org::jeecg::defsDetails::grpc::UploadPathRequest, ::org::jeecg::defsDetails::grpc::Empty>*>(handler)
+              ->SetMessageAllocator(allocator);
+    }
+    ~ExperimentalWithCallbackMethod_uploadPath() override {
+      BaseClassMustBeDerivedFromService(this);
+    }
+    // disable synchronous version of this method
+    ::grpc::Status uploadPath(::grpc::ServerContext* /*context*/, const ::org::jeecg::defsDetails::grpc::UploadPathRequest* /*request*/, ::org::jeecg::defsDetails::grpc::Empty* /*response*/) override {
+      abort();
+      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+    }
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+    virtual ::grpc::ServerUnaryReactor* uploadPath(
+      ::grpc::CallbackServerContext* /*context*/, const ::org::jeecg::defsDetails::grpc::UploadPathRequest* /*request*/, ::org::jeecg::defsDetails::grpc::Empty* /*response*/)
+    #else
+    virtual ::grpc::experimental::ServerUnaryReactor* uploadPath(
+      ::grpc::experimental::CallbackServerContext* /*context*/, const ::org::jeecg::defsDetails::grpc::UploadPathRequest* /*request*/, ::org::jeecg::defsDetails::grpc::Empty* /*response*/)
+    #endif
+      { return nullptr; }
+  };
+  #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+  typedef ExperimentalWithCallbackMethod_uploadVehicleInfo<ExperimentalWithCallbackMethod_uploadPath<Service > > CallbackService;
+  #endif
+
+  typedef ExperimentalWithCallbackMethod_uploadVehicleInfo<ExperimentalWithCallbackMethod_uploadPath<Service > > ExperimentalCallbackService;
+  template <class BaseClass>
+  class WithGenericMethod_uploadVehicleInfo : public BaseClass {
+   private:
+    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
+   public:
+    WithGenericMethod_uploadVehicleInfo() {
+      ::grpc::Service::MarkMethodGeneric(0);
+    }
+    ~WithGenericMethod_uploadVehicleInfo() override {
+      BaseClassMustBeDerivedFromService(this);
+    }
+    // disable synchronous version of this method
+    ::grpc::Status uploadVehicleInfo(::grpc::ServerContext* /*context*/, const ::org::jeecg::defsDetails::grpc::UplinkRequest* /*request*/, ::org::jeecg::defsDetails::grpc::ResponseMessage* /*response*/) override {
+      abort();
+      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+    }
+  };
+  template <class BaseClass>
+  class WithGenericMethod_uploadPath : public BaseClass {
+   private:
+    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
+   public:
+    WithGenericMethod_uploadPath() {
+      ::grpc::Service::MarkMethodGeneric(1);
+    }
+    ~WithGenericMethod_uploadPath() override {
+      BaseClassMustBeDerivedFromService(this);
+    }
+    // disable synchronous version of this method
+    ::grpc::Status uploadPath(::grpc::ServerContext* /*context*/, const ::org::jeecg::defsDetails::grpc::UploadPathRequest* /*request*/, ::org::jeecg::defsDetails::grpc::Empty* /*response*/) override {
+      abort();
+      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+    }
+  };
+  template <class BaseClass>
+  class WithRawMethod_uploadVehicleInfo : public BaseClass {
+   private:
+    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
+   public:
+    WithRawMethod_uploadVehicleInfo() {
+      ::grpc::Service::MarkMethodRaw(0);
+    }
+    ~WithRawMethod_uploadVehicleInfo() override {
+      BaseClassMustBeDerivedFromService(this);
+    }
+    // disable synchronous version of this method
+    ::grpc::Status uploadVehicleInfo(::grpc::ServerContext* /*context*/, const ::org::jeecg::defsDetails::grpc::UplinkRequest* /*request*/, ::org::jeecg::defsDetails::grpc::ResponseMessage* /*response*/) override {
+      abort();
+      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+    }
+    void RequestuploadVehicleInfo(::grpc::ServerContext* context, ::grpc::ByteBuffer* request, ::grpc::ServerAsyncResponseWriter< ::grpc::ByteBuffer>* response, ::grpc::CompletionQueue* new_call_cq, ::grpc::ServerCompletionQueue* notification_cq, void *tag) {
+      ::grpc::Service::RequestAsyncUnary(0, context, request, response, new_call_cq, notification_cq, tag);
+    }
+  };
+  template <class BaseClass>
+  class WithRawMethod_uploadPath : public BaseClass {
+   private:
+    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
+   public:
+    WithRawMethod_uploadPath() {
+      ::grpc::Service::MarkMethodRaw(1);
+    }
+    ~WithRawMethod_uploadPath() override {
+      BaseClassMustBeDerivedFromService(this);
+    }
+    // disable synchronous version of this method
+    ::grpc::Status uploadPath(::grpc::ServerContext* /*context*/, const ::org::jeecg::defsDetails::grpc::UploadPathRequest* /*request*/, ::org::jeecg::defsDetails::grpc::Empty* /*response*/) override {
+      abort();
+      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+    }
+    void RequestuploadPath(::grpc::ServerContext* context, ::grpc::ByteBuffer* request, ::grpc::ServerAsyncResponseWriter< ::grpc::ByteBuffer>* response, ::grpc::CompletionQueue* new_call_cq, ::grpc::ServerCompletionQueue* notification_cq, void *tag) {
+      ::grpc::Service::RequestAsyncUnary(1, context, request, response, new_call_cq, notification_cq, tag);
+    }
+  };
+  template <class BaseClass>
+  class ExperimentalWithRawCallbackMethod_uploadVehicleInfo : public BaseClass {
+   private:
+    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
+   public:
+    ExperimentalWithRawCallbackMethod_uploadVehicleInfo() {
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+      ::grpc::Service::
+    #else
+      ::grpc::Service::experimental().
+    #endif
+        MarkMethodRawCallback(0,
+          new ::grpc::internal::CallbackUnaryHandler< ::grpc::ByteBuffer, ::grpc::ByteBuffer>(
+            [this](
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+                   ::grpc::CallbackServerContext*
+    #else
+                   ::grpc::experimental::CallbackServerContext*
+    #endif
+                     context, const ::grpc::ByteBuffer* request, ::grpc::ByteBuffer* response) { return this->uploadVehicleInfo(context, request, response); }));
+    }
+    ~ExperimentalWithRawCallbackMethod_uploadVehicleInfo() override {
+      BaseClassMustBeDerivedFromService(this);
+    }
+    // disable synchronous version of this method
+    ::grpc::Status uploadVehicleInfo(::grpc::ServerContext* /*context*/, const ::org::jeecg::defsDetails::grpc::UplinkRequest* /*request*/, ::org::jeecg::defsDetails::grpc::ResponseMessage* /*response*/) override {
+      abort();
+      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+    }
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+    virtual ::grpc::ServerUnaryReactor* uploadVehicleInfo(
+      ::grpc::CallbackServerContext* /*context*/, const ::grpc::ByteBuffer* /*request*/, ::grpc::ByteBuffer* /*response*/)
+    #else
+    virtual ::grpc::experimental::ServerUnaryReactor* uploadVehicleInfo(
+      ::grpc::experimental::CallbackServerContext* /*context*/, const ::grpc::ByteBuffer* /*request*/, ::grpc::ByteBuffer* /*response*/)
+    #endif
+      { return nullptr; }
+  };
+  template <class BaseClass>
+  class ExperimentalWithRawCallbackMethod_uploadPath : public BaseClass {
+   private:
+    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
+   public:
+    ExperimentalWithRawCallbackMethod_uploadPath() {
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+      ::grpc::Service::
+    #else
+      ::grpc::Service::experimental().
+    #endif
+        MarkMethodRawCallback(1,
+          new ::grpc::internal::CallbackUnaryHandler< ::grpc::ByteBuffer, ::grpc::ByteBuffer>(
+            [this](
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+                   ::grpc::CallbackServerContext*
+    #else
+                   ::grpc::experimental::CallbackServerContext*
+    #endif
+                     context, const ::grpc::ByteBuffer* request, ::grpc::ByteBuffer* response) { return this->uploadPath(context, request, response); }));
+    }
+    ~ExperimentalWithRawCallbackMethod_uploadPath() override {
+      BaseClassMustBeDerivedFromService(this);
+    }
+    // disable synchronous version of this method
+    ::grpc::Status uploadPath(::grpc::ServerContext* /*context*/, const ::org::jeecg::defsDetails::grpc::UploadPathRequest* /*request*/, ::org::jeecg::defsDetails::grpc::Empty* /*response*/) override {
+      abort();
+      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+    }
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+    virtual ::grpc::ServerUnaryReactor* uploadPath(
+      ::grpc::CallbackServerContext* /*context*/, const ::grpc::ByteBuffer* /*request*/, ::grpc::ByteBuffer* /*response*/)
+    #else
+    virtual ::grpc::experimental::ServerUnaryReactor* uploadPath(
+      ::grpc::experimental::CallbackServerContext* /*context*/, const ::grpc::ByteBuffer* /*request*/, ::grpc::ByteBuffer* /*response*/)
+    #endif
+      { return nullptr; }
+  };
+  template <class BaseClass>
+  class WithStreamedUnaryMethod_uploadVehicleInfo : public BaseClass {
+   private:
+    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
+   public:
+    WithStreamedUnaryMethod_uploadVehicleInfo() {
+      ::grpc::Service::MarkMethodStreamed(0,
+        new ::grpc::internal::StreamedUnaryHandler<
+          ::org::jeecg::defsDetails::grpc::UplinkRequest, ::org::jeecg::defsDetails::grpc::ResponseMessage>(
+            [this](::grpc::ServerContext* context,
+                   ::grpc::ServerUnaryStreamer<
+                     ::org::jeecg::defsDetails::grpc::UplinkRequest, ::org::jeecg::defsDetails::grpc::ResponseMessage>* streamer) {
+                       return this->StreameduploadVehicleInfo(context,
+                         streamer);
+                  }));
+    }
+    ~WithStreamedUnaryMethod_uploadVehicleInfo() override {
+      BaseClassMustBeDerivedFromService(this);
+    }
+    // disable regular version of this method
+    ::grpc::Status uploadVehicleInfo(::grpc::ServerContext* /*context*/, const ::org::jeecg::defsDetails::grpc::UplinkRequest* /*request*/, ::org::jeecg::defsDetails::grpc::ResponseMessage* /*response*/) override {
+      abort();
+      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+    }
+    // replace default version of method with streamed unary
+    virtual ::grpc::Status StreameduploadVehicleInfo(::grpc::ServerContext* context, ::grpc::ServerUnaryStreamer< ::org::jeecg::defsDetails::grpc::UplinkRequest,::org::jeecg::defsDetails::grpc::ResponseMessage>* server_unary_streamer) = 0;
+  };
+  template <class BaseClass>
+  class WithStreamedUnaryMethod_uploadPath : public BaseClass {
+   private:
+    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
+   public:
+    WithStreamedUnaryMethod_uploadPath() {
+      ::grpc::Service::MarkMethodStreamed(1,
+        new ::grpc::internal::StreamedUnaryHandler<
+          ::org::jeecg::defsDetails::grpc::UploadPathRequest, ::org::jeecg::defsDetails::grpc::Empty>(
+            [this](::grpc::ServerContext* context,
+                   ::grpc::ServerUnaryStreamer<
+                     ::org::jeecg::defsDetails::grpc::UploadPathRequest, ::org::jeecg::defsDetails::grpc::Empty>* streamer) {
+                       return this->StreameduploadPath(context,
+                         streamer);
+                  }));
+    }
+    ~WithStreamedUnaryMethod_uploadPath() override {
+      BaseClassMustBeDerivedFromService(this);
+    }
+    // disable regular version of this method
+    ::grpc::Status uploadPath(::grpc::ServerContext* /*context*/, const ::org::jeecg::defsDetails::grpc::UploadPathRequest* /*request*/, ::org::jeecg::defsDetails::grpc::Empty* /*response*/) override {
+      abort();
+      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+    }
+    // replace default version of method with streamed unary
+    virtual ::grpc::Status StreameduploadPath(::grpc::ServerContext* context, ::grpc::ServerUnaryStreamer< ::org::jeecg::defsDetails::grpc::UploadPathRequest,::org::jeecg::defsDetails::grpc::Empty>* server_unary_streamer) = 0;
+  };
+  typedef WithStreamedUnaryMethod_uploadVehicleInfo<WithStreamedUnaryMethod_uploadPath<Service > > StreamedUnaryService;
+  typedef Service SplitStreamedService;
+  typedef WithStreamedUnaryMethod_uploadVehicleInfo<WithStreamedUnaryMethod_uploadPath<Service > > StreamedService;
+};
+
+}  // namespace grpc
+}  // namespace defsDetails
+}  // namespace jeecg
+}  // namespace org
+
+
+#endif  // GRPC_VehicleUpload_5fservice_2eproto__INCLUDED

+ 47 - 10
src/driver/driver_cloud_grpc_client_BS/vehicle_control.cpp

@@ -7,6 +7,23 @@ extern std::string gstruploadMapInterval;
 extern std::string gstrid;
 extern std::string gstrplateNumber;
 
+namespace iv {
+struct msgunit
+{
+    char mstrmsgname[256];
+    int mnBufferSize = 10000;
+    int mnBufferCount = 1;
+    void * mpa;
+    std::shared_ptr<char> mpstrmsgdata;
+    int mndatasize = 0;
+    bool mbRefresh = false;
+    bool mbImportant = false;
+    int mnkeeptime = 100;
+};
+}
+
+extern iv::msgunit shmRemoteCtrl;
+
 using org::jeecg::defsControl::grpc::Empty; ///< other message
 using org::jeecg::defsControl::grpc::GPSPoint;
 using org::jeecg::defsControl::grpc::MapPoint;
@@ -28,7 +45,7 @@ void VehicleControlClient::VehicleControlClientSend(void)
 {
     mpa = new iv::modulecommext::modulecommmsg<iv::remotectrl>();
 
-    mpa->RegisterSend("remotectrl",10000,1);
+    mpa->RegisterSend(shmRemoteCtrl.mstrmsgname,shmRemoteCtrl.mnBufferSize,shmRemoteCtrl.mnBufferCount);
 }
 
 std::string VehicleControlClient::vehicleControl(void)
@@ -91,11 +108,34 @@ void VehicleControlClient::updateControlData(void)
     std::cout<<"brake:"<<brakeCMD<<std::endl;
 #endif
     iv::remotectrl xmsg;
-    xmsg.set_ntype(iv::remotectrl::CtrlType::remotectrl_CtrlType_REMOTE);
-    xmsg.set_acc(0.0);
-    xmsg.set_brake(0.0);
-    xmsg.set_wheel(0.0);
-    xmsg.set_shift(0);
+    if(modeCMD == CtrlMode::CMD_REMOTE || modeCMD == CtrlMode::CMD_CLOUD_PLATFORM)
+        xmsg.set_ntype(iv::remotectrl::CtrlType::remotectrl_CtrlType_REMOTE);
+    else if(modeCMD == CtrlMode::CMD_AUTO)
+        xmsg.set_ntype(iv::remotectrl::CtrlType::remotectrl_CtrlType_AUTO);
+    else if(modeCMD == CtrlMode::CMD_EMERGENCY_STOP)
+        xmsg.set_ntype(iv::remotectrl::CtrlType::remotectrl_CtrlType_STOP);
+
+    if(modeCMD == CtrlMode::CMD_REMOTE || modeCMD == CtrlMode::CMD_CLOUD_PLATFORM)
+    {
+        xmsg.set_acc(throttleCMD);
+        xmsg.set_brake(brakeCMD);
+        xmsg.set_wheel(steeringWheelAngleCMD);
+
+        if(shiftCMD == org::jeecg::defsControl::grpc::ShiftStatus::SHIFT_DRIVE)
+            xmsg.set_shift(1);
+        else if(shiftCMD == org::jeecg::defsControl::grpc::ShiftStatus::SHIFT_REVERSE)
+            xmsg.set_shift(-1);
+        else
+            xmsg.set_shift(0);
+    }
+    else
+    {
+        xmsg.set_acc(0.0);
+        xmsg.set_brake(100.0);
+        xmsg.set_wheel(0.0);
+        xmsg.set_shift(0);
+    }
+
     mpa->ModuleSendMsg(xmsg);
 }
 
@@ -111,10 +151,7 @@ void VehicleControlClient::run()
         {
             std::string reply = vehicleControl();
             std::cout<< reply <<std::endl;
-            if(modeCMD == CtrlMode::CMD_REMOTE || modeCMD == CtrlMode::CMD_CLOUD_PLATFORM)
-            {
-                updateControlData();
-            }
+            updateControlData();
             lastTime = xTime.elapsed();
         }
     }

+ 1 - 0
src/driver/driver_cloud_grpc_client_BS/vehicle_control.h

@@ -15,6 +15,7 @@
 
 #include "VehicleControl_service.grpc.pb.h"
 #include "VehicleControl.grpc.pb.h"
+
 #include "modulecommext.h"
 #include "remotectrl.pb.h"
 

+ 1 - 0
src/driver/driver_cloud_grpc_client_BS/vehicle_upload.h

@@ -16,6 +16,7 @@
 #include "VehicleUpload_service.grpc.pb.h"
 #include "VehicleUpload.grpc.pb.h"
 #include "modulecommext.h"
+
 using grpc::Channel;
 using grpc::ClientContext;
 using grpc::Status;