ایجاد و نمایش یک سفر مقصد واحد

این آموزش شما را در فرآیند ایجاد یک سفر با یک بار تحویل و تحویل و سپس به اشتراک گذاری آن سفر با مصرف کننده راهنمایی می کند.

پیش نیازها

برای تکمیل این آموزش حتما موارد زیر را کامل کنید:

  1. Fleet Engine را راه اندازی کنید. برای اطلاعات بیشتر، Fleet Engine: Initial setup را ببینید.

  2. برنامه خود را با Driver SDK ادغام کنید. برای اطلاعات بیشتر، به راه‌اندازی SDK درایور برای Android و راهنمای یکپارچه‌سازی برای Driver SDK برای iOS مراجعه کنید.

  3. برنامه مصرف کننده خود را با Consumer SDK ادغام کنید. برای اطلاعات بیشتر، شروع به کار با Consumer SDK برای Android و شروع به کار با Consumer SDK برای iOS را ببینید.

  4. توکن های مجوز را تنظیم کنید. برای کسب اطلاعات بیشتر در مورد نشانه‌های مجوز، به ایجاد یک نشانه وب JSON برای مجوز در راهنمای شروع به کار با Fleet Engine و احراز هویت و مجوز در مستندات Consumer SDK برای Fleet Engine مراجعه کنید.

مرحله 1. یک وسیله نقلیه در Fleet Engine ایجاد کنید

وسایل نقلیه اشیایی هستند که نشان دهنده وسایل نقلیه در ناوگان شما هستند. شما باید آنها را در Fleet Engine ایجاد کنید تا بتوانید آنها را در برنامه مصرف کننده ردیابی کنید.

می توانید با استفاده از یکی از دو روش زیر یک وسیله نقلیه ایجاد کنید:

gRPC
متد CreateVehicle() را با پیام درخواست CreateVehicleRequest فراخوانی کنید. برای فراخوانی CreateVehicle() باید امتیازات Fleet Engine Super User را داشته باشید.
باقی مانده
با https://fleetengine.googleapis.com/v1/providers.vehicles. create .

هشدارها

هشدارهای زیر هنگام ایجاد وسیله نقلیه اعمال می شود.

  • مطمئن شوید که وضعیت اولیه خودرو را روی OFFLINE تنظیم کنید. این تضمین می کند که Fleet Engine می تواند وسیله نقلیه شما را برای تطبیق سفر پیدا کند.

  • provider_id وسیله نقلیه باید با شناسه پروژه Google Cloud Project که شامل حساب‌های سرویس مورد استفاده برای فراخوانی Fleet Engine است، باشد. در حالی که چندین حساب خدمات می توانند به Fleet Engine برای یک ارائه دهنده اشتراک سواری دسترسی داشته باشند، Fleet Engine در حال حاضر از حساب های خدماتی از پروژه های مختلف Google Cloud که به خودروهای مشابه دسترسی دارند پشتیبانی نمی کند.

  • پاسخ برگشتی از CreateVehicle() حاوی نمونه Vehicle است. اگر با استفاده از UpdateVehicle() به‌روزرسانی نشده باشد، نمونه پس از هفت روز حذف می‌شود. باید قبل از فراخوانی CreateVehicle() GetVehicle() فراخوانی کنید تا تأیید کنید که وسیله نقلیه از قبل وجود ندارد. اگر GetVehicle() یک خطای NOT_FOUND برگرداند، باید با فراخوانی CreateVehicle() ادامه دهید. برای اطلاعات بیشتر، وسایل نقلیه و چرخه عمر آنها را ببینید.

مثال

نمونه کد ارائه دهنده زیر نحوه ایجاد یک وسیله نقلیه در Fleet Engine را نشان می دهد.

static final String PROJECT_ID = "my-rideshare-co-gcp-project";

VehicleServiceBlockingStub vehicleService = VehicleService.newBlockingStub(channel);

String parent = "providers/" + PROJECT_ID;

Vehicle vehicle = Vehicle.newBuilder()
    .setVehicleState(VehicleState.OFFLINE)  // Initial state
    .addSupportedTripTypes(TripType.EXCLUSIVE)
    .setMaximumCapacity(4)
    .setVehicleType(VehicleType.newBuilder().setCategory(VehicleType.Category.AUTO))
    .build();

CreateVehicleRequest createVehicleRequest = CreateVehicleRequest.newBuilder()
    .setParent(parent)
    .setVehicleId("8241890")  // Vehicle ID assigned by solution provider.
    .setVehicle(vehicle)      // Initial state.
    .build();

// The Vehicle is created in the OFFLINE state, and no initial position is
// provided.  When the driver app calls the rideshare provider, the state can be
// set to ONLINE, and the driver app updates the vehicle location.
try {
  Vehicle createdVehicle = vehicleService.createVehicle(createVehicleRequest);
} catch (StatusRuntimeException e) {
  Status s = e.getStatus();
  switch (s.getCode()) {
    case ALREADY_EXISTS:
      break;
    case PERMISSION_DENIED:
      break;
  }
  return;
}

مرحله 2. ردیابی موقعیت مکانی را فعال کنید

ردیابی موقعیت مکانی به ردیابی مکان وسیله نقلیه در طول سفر اشاره دارد، جایی که برنامه راننده تله متری را به موتور ناوگان ارسال می کند، که حاوی مکان فعلی خودرو است. این جریان دائماً به روز شده اطلاعات موقعیت برای انتقال پیشرفت وسیله نقلیه در طول مسیر سفر استفاده می شود. هنگامی که ردیابی موقعیت مکانی را فعال می کنید، برنامه راننده شروع به ارسال این تله متری با فرکانس پیش فرض هر پنج ثانیه یک بار می کند.

ردیابی موقعیت مکانی را برای اندروید و iOS به صورت زیر فعال می کنید:

مثال

مثال کد زیر نحوه فعال کردن ردیابی موقعیت مکانی را نشان می دهد.

جاوا

RidesharingVehicleReporter vehicleReporter = ...;

vehicleReporter.enableLocationTracking();

کاتلین

val vehicleReporter = ...

vehicleReporter.enableLocationTracking()

سریع

vehicleReporter.locationTrackingEnabled = true

هدف-C

_vehicleReporter.locationTrackingEnabled = YES;

مرحله 3. وضعیت خودرو را روی حالت آنلاین تنظیم کنید

شما یک وسیله نقلیه را با تنظیم وضعیت آن بر روی آنلاین به خدمت می آورید (یعنی آن را برای استفاده در دسترس قرار می دهید)، اما تا زمانی که ردیابی موقعیت مکانی را فعال نکرده باشید نمی توانید این کار را انجام دهید.

وضعیت خودرو را به صورت آنلاین برای Android و iOS به صورت زیر تنظیم می کنید:

مثال

مثال کد زیر نحوه تنظیم وضعیت خودرو را بر روی ONLINE نشان می دهد.

جاوا

vehicleReporter.setVehicleState(VehicleState.ONLINE);

کاتلین

vehicleReporter.setVehicleState(VehicleState.ONLINE)

سریع

vehicleReporter.update(.online)

هدف-C

[_vehicleReporter updateVehicleState:GMTDVehicleStateOnline];

مرحله 4. یک سفر در Fleet Engine ایجاد کنید

از نظر برنامه‌ریزی، یک Trip شیئی است که یک سفر را نشان می‌دهد و شما باید برای هر درخواست سفر یک مورد ایجاد کنید تا بتوان آنها را با وسایل نقلیه مطابقت داد و سپس ردیابی کرد.

ویژگی های مورد نیاز

فیلدهای زیر برای ایجاد یک سفر ضروری است.

parent
رشته ای که شامل شناسه ارائه دهنده است. این باید با شناسه پروژه Google Cloud Project که حاوی حساب‌های سرویس مورد استفاده برای فراخوانی Fleet Engine است، باشد.
trip_id
رشته‌ای که ایجاد می‌کنید، که به‌طور منحصربه‌فردی این سفر را مشخص می‌کند.
trip_type
یکی از مقادیر شمارش TripType ( SHARED یا EXCLUSIVE ).
pickup_point
نقطه مبدا سفر

وقتی سفری ایجاد می‌کنید، می‌توانید number_of_passengers ، dropoff_point و vehicle_id را ارائه کنید، اگرچه این فیلدها الزامی نیستند. هنگامی که یک vehicle_id را ارائه می کنید، سفر حاوی لیستی از نقاط بین راهی است که می توانید از آنها برای تعیین مقصد در برنامه راننده استفاده کنید.

مثال

مثال زیر نحوه ایجاد یک سفر به مرکز خرید Grand Indonesia East را نشان می دهد. این سفر شامل دو مسافر است، این سفر منحصر به فرد است و وضعیت آن جدید است. provider_id سفر باید با شناسه پروژه یکی باشد. در مثال، ارائه‌دهنده rideshare پروژه Google Cloud را با شناسه پروژه my-rideshare-co-gcp-project ایجاد کرد. این پروژه باید شامل یک حساب سرویس برای فراخوانی Fleet Engine باشد.

static final String PROJECT_ID = "my-rideshare-co-gcp-project";

TripServiceBlockingStub tripService = TripService.newBlockingStub(channel);

// Trip initial settings.
String parent = "providers/" + PROJECT_ID;

Trip trip = Trip.newBuilder()
    .setTripType(TripType.EXCLUSIVE) // Use TripType.SHARED for carpooling.
    .setPickupPoint(                 // Grand Indonesia East Mall.
        TerminalLocation.newBuilder().setPoint(
            LatLng.newBuilder()
                .setLatitude(-6.195139).setLongitude(106.820826)))
    .setNumberOfPassengers(2)
    // Provide the drop-off point if available.
    .setDropoffPoint(
        TerminalLocation.newBuilder().setPoint(
            LatLng.newBuilder()
                .setLatitude(-6.1275).setLongitude(106.6537)))
    .build();

// Create trip request
CreateTripRequest createTripRequest = CreateTripRequest.newBuilder()
    .setParent(parent)
    .setTripId("trip-8241890")  // Trip ID assigned by the provider.
    .setTrip(trip)              // The initial state is NEW.
    .build();

// Error handling.
try {
  Trip createdTrip = tripService.createTrip(createTripRequest);
} catch (StatusRuntimeException e) {
  Status s = e.getStatus();
  switch (s.getCode()) {
    case ALREADY_EXISTS:
      break;
    case PERMISSION_DENIED:
      break;
  }
  return;
}

مرحله 5. مقصد را در برنامه راننده تنظیم کنید

پس از جفت کردن مصرف کننده با راننده، باید مقصد سفر را در برنامه راننده پیکربندی کنید. می‌توانید مقصد وسیله نقلیه را از مجموعه ایستگاه‌های بین راهی که توسط GetTrip() ، UpdateTrip() و GetVehicle() برگردانده شده است، بازیابی کنید.

  • شما مقصد را با فراخوانی Navigation SDK for Android متد setDestination() یا با فراخوانی Navigation SDK for iOS متد setDestinations() تنظیم می‌کنید.

برای اینکه برنامه مصرف کننده بتواند سفر را به درستی رندر کند، مختصات جغرافیایی (LatLng) ارائه شده به setDestination() باید با آنهایی که در ایستگاه بین راه سفر هستند مطابقت داشته باشد. برای اطلاعات بیشتر، به آموزش های مسیر به یک مقصد و مسیر به مقصدهای متعدد مراجعه کنید.

مثال

نمونه کد زیر نحوه تنظیم مقصد را در برنامه راننده نشان می دهد.

جاوا

private void navigateToPlace(String placeId, RoutingOptions travelMode) {
  Waypoint destination;
  try {
    destination = Waypoint.fromPlaceId(placeId, null);
  } catch (Waypoint.UnsupportedPlaceIdException e) {
    displayMessage("Error starting navigation: Place ID is not supported.");
    return;
  }

  // Create a future to await the result of the asynchronous navigator task.
  ListenableResultFuture<Navigator.RouteStatus> pendingRoute =
      mNavigator.setDestination(destination, travelMode);

  // Define the action to perform when the SDK has determined the route.
  pendingRoute.setOnResultListener(
      new ListenableResultFuture.OnResultListener<Navigator.RouteStatus>() {
        @Override
        public void onResult(Navigator.RouteStatus code) {
          switch (code) {
            case OK:
              // Hide the toolbar to maximize the navigation UI.
              if (getActionBar() != null) {
                getActionBar().hide();
              }

              // Enable voice audio guidance (through the device speaker).
              mNavigator.setAudioGuidance(
                  Navigator.AudioGuidance.VOICE_ALERTS_AND_GUIDANCE);

              // Simulate vehicle progress along the route for demo/debug builds.
              if (BuildConfig.DEBUG) {
                mNavigator.getSimulator().simulateLocationsAlongExistingRoute(
                    new SimulationOptions().speedMultiplier(5));
              }

              // Start turn-by-turn guidance along the current route.
              mNavigator.startGuidance();
              break;
            // Handle error conditions returned by the navigator.
            case NO_ROUTE_FOUND:
              displayMessage("Error starting navigation: No route found.");
              break;
            case NETWORK_ERROR:
              displayMessage("Error starting navigation: Network error.");
              break;
            case ROUTE_CANCELED:
              displayMessage("Error starting navigation: Route canceled.");
              break;
            default:
              displayMessage("Error starting navigation: "
                  + String.valueOf(code));
          }
        }
      });
}

کاتلین

private fun navigateToPlace(placeId: String, travelMode: RoutingOptions) {
  val destination =
    try {
      Waypoint.fromPlaceId(placeId, null)
    } catch (e: Waypoint.UnsupportedPlaceIdException) {
      displayMessage("Error starting navigation: Place ID is not supported.")
      return@navigateToPlace
    }

  // Create a future to await the result of the asynchronous navigator task.
  val pendingRoute = mNavigator.setDestination(destination, travelMode)

  // Define the action to perform when the SDK has determined the route.
  pendingRoute.setOnResultListener(
    object : ListenableResultFuture.OnResultListener<Navigator.RouteStatus>() {
      override fun onResult(code: Navigator.RouteStatus) {
        when (code) {
          Navigator.RouteStatus.OK -> {
            // Hide the toolbar to maximize the navigation UI.
            getActionBar()?.hide()

            // Enable voice audio guidance (through the device speaker).
            mNavigator.setAudioGuidance(Navigator.AudioGuidance.VOICE_ALERTS_AND_GUIDANCE)

            // Simulate vehicle progress along the route for demo/debug builds.
            if (BuildConfig.DEBUG) {
              mNavigator
                .getSimulator()
                .simulateLocationsAlongExistingRoute(SimulationOptions().speedMultiplier(5))
            }

            // Start turn-by-turn guidance along the current route.
            mNavigator.startGuidance()
          }
          Navigator.RouteStatus.NO_ROUTE_FOUND -> {
            displayMessage("Error starting navigation: No route found.")
          }
          Navigator.RouteStatus.NETWORK_ERROR -> {
            displayMessage("Error starting navigation: Network error.")
          }
          Navigator.RouteStatus.ROUTE_CANCELED -> {
            displayMessage("Error starting navigation: Route canceled.")
          }
          else -> {
            displayMessage("Error starting navigation: ${code.name}")
          }
        }
      }
    }
  )
}

سریع

private func startNavigation() {
  let destinations = [
    GMSNavigationWaypoint(
      placeID: "ChIJnUYTpNASkFQR_gSty5kyoUk", title: "PCC Natural Market"),
    GMSNavigationWaypoint(
      placeID: "ChIJJ326ROcSkFQRBfUzOL2DSbo", title: "Marina Park"),
  ]

  mapView.navigator?.setDestinations(destinations, callback: { routeStatus in
    guard routeStatus == .OK else {
      // Error starting navigation.
      return
    }
    mapView.locationSimulator?.simulateLocationsAlongExistingRoute()
    mapView.navigator?.isGuidanceActive = true
    mapView.navigator?.sendsBackgroundNotifications = true
    mapView.cameraMode = .following
  })
}

هدف-C

- (void)startNavigation {
  NSArray<GMSNavigationWaypoint *> *destinations =
  @[[[GMSNavigationWaypoint alloc] initWithPlaceID:@"ChIJnUYTpNASkFQR_gSty5kyoUk"
                                             title:@"PCC Natural Market"],
    [[GMSNavigationWaypoint alloc] initWithPlaceID:@"ChIJJ326ROcSkFQRBfUzOL2DSbo"
                                             title:@"Marina Park"]];

  [_mapView.navigator setDestinations:destinations
                             callback:^(GMSRouteStatus routeStatus) {
                               if (routeStatus != GMSRouteStatusOK) {
                                 // Error starting navigation.
                                 return;
                               }
                               [_mapView.locationSimulator simulateLocationsAlongExistingRoute];
                               _mapView.navigator.guidanceActive = YES;
                               _mapView.navigator.sendsBackgroundNotifications = YES;
                               _mapView.cameraMode = GMSNavigationCameraModeFollowing;
                             }];
}

مرحله 6. به به روز رسانی سفر در برنامه مصرف کننده گوش دهید

  • برای اندروید، می‌توانید با دریافت یک شی TripModel از TripModelManager و ثبت یک شنونده TripModelCallback ، به به‌روزرسانی‌های داده از سفر گوش دهید.

  • برای iOS، می‌توانید با دریافت یک شی GMTCTripModel از GMTCTripService و ثبت نام مشترک GMTCTripModelSubscriber ، به به‌روزرسانی‌های داده از سفر گوش دهید.

یک شنونده TripModelCallback و مشترک GMTCTripModelSubscriber به برنامه شما اجازه می‌دهد تا به‌روزرسانی‌های دوره‌ای پیشرفت سفر را در هر بازخوانی بر اساس فاصله بازخوانی خودکار دریافت کند. فقط مقادیری که تغییر می‌کنند می‌توانند پاسخ تماس را راه‌اندازی کنند. در غیر این صورت، پاسخ به تماس بی‌صدا می‌ماند.

متدهای TripModelCallback.onTripUpdated() و tripModel(_:didUpdate:updatedPropertyFields:) همیشه فراخوانی می شوند، صرف نظر از هرگونه تغییر داده.

مثال 1

نمونه کد زیر نحوه دریافت TripModel از TripModelManager / GMTCTripService و تنظیم شنونده بر روی آن را نشان می دهد.

جاوا

// Start journey sharing after a trip has been created via Fleet Engine.
TripModelManager tripModelManager = consumerApi.getTripModelManager();

// Get a TripModel object.
TripModel tripModel = tripModelManager.getTripModel(tripName);

// Register a listener on the trip.
TripModelCallback tripCallback = new TripModelCallback() {
  ...
};
tripModel.registerTripCallback(tripCallback);

// Set the refresh interval.
TripModelOptions tripModelOptions = TripModelOptions.builder()
    .setRefreshInterval(5000) // interval in milliseconds, so 5 seconds
    .build();
tripModel.setTripModelOptions(tripModelOptions);

// The trip stops auto-refreshing when all listeners are unregistered.
tripModel.unregisterTripCallback(tripCallback);

کاتلین

// Start journey sharing after a trip has been created via Fleet Engine.
val tripModelManager = consumerApi.getTripModelManager()

// Get a TripModel object.
val tripModel = tripModelManager.getTripModel(tripName)

// Register a listener on the trip.
val tripCallback = TripModelCallback() {
  ...
}

tripModel.registerTripCallback(tripCallback)

// Set the refresh interval.
val tripModelOptions =
  TripModelOptions.builder()
    .setRefreshInterval(5000) // interval in milliseconds, so 5 seconds
    .build()

tripModel.setTripModelOptions(tripModelOptions)

// The trip stops auto-refreshing when all listeners are unregistered.
tripModel.unregisterTripCallback(tripCallback)

سریع

let tripService = GMTCServices.shared().tripService

// Create a tripModel instance for listening for updates from the trip
// specified by the trip name.
let tripModel = tripService.tripModel(forTripName: tripName)

// Register for the trip update events.
tripModel.register(self)

// Set the refresh interval (in seconds).
tripModel.options.autoRefreshTimeInterval = 5

// Unregister for the trip update events.
tripModel.unregisterSubscriber(self)

هدف-C

GMTCTripService *tripService = [GMTCServices sharedServices].tripService;

// Create a tripModel instance for listening for updates from the trip
// specified by the trip name.
GMTCTripModel *tripModel = [tripService tripModelForTripName:tripName];

// Register for the trip update events.
[tripModel registerSubscriber:self];

// Set the refresh interval (in seconds).
tripModel.options.autoRefreshTimeInterval = 5;

// Unregister for the trip update events.
[tripModel unregisterSubscriber:self];

مثال 2

نمونه کد زیر نحوه تنظیم یک شنونده TripModelCallback و مشترک GMTCTripModelSubscriber را نشان می دهد.

جاوا

// Implements a callback for the trip model so your app can listen for trip
// updates from Fleet Engine.
TripModelCallback subscriber =
  new TripModelCallback() {

    @Override
    public void onTripStatusUpdated(TripInfo tripInfo, @TripStatus int status) {
      // ...
    }

    @Override
    public void onTripActiveRouteUpdated(TripInfo tripInfo, List<LatLng> route) {
      // ...
    }

    @Override
    public void onTripVehicleLocationUpdated(
        TripInfo tripInfo, @Nullable VehicleLocation vehicleLocation) {
      // ...
    }

    @Override
    public void onTripPickupLocationUpdated(
        TripInfo tripInfo, @Nullable TerminalLocation pickup) {
      // ...
    }

    @Override
    public void onTripPickupTimeUpdated(TripInfo tripInfo, @Nullable Long timestampMillis) {
      // ...
    }

    @Override
    public void onTripDropoffLocationUpdated(
        TripInfo tripInfo, @Nullable TerminalLocation dropoff) {
      // ...
    }

    @Override
    public void onTripDropoffTimeUpdated(TripInfo tripInfo, @Nullable Long timestampMillis) {
      // ...
    }

    @Override
    public void onTripETAToNextWaypointUpdated(
        TripInfo tripInfo, @Nullable Long timestampMillis) {
      // ...
    }

    @Override
    public void onTripActiveRouteRemainingDistanceUpdated(
        TripInfo tripInfo, @Nullable Integer distanceMeters) {
      // ...
    }

    @Override
    public void onTripUpdateError(TripInfo tripInfo, TripUpdateError error) {
      // ...
    }

    @Override
    public void onTripUpdated(TripInfo tripInfo) {
      // ...
    }

    @Override
    public void onTripRemainingWaypointsUpdated(
        TripInfo tripInfo, List<TripWaypoint> waypointList) {
      // ...
    }

    @Override
    public void onTripIntermediateDestinationsUpdated(
        TripInfo tripInfo, List<TerminalLocation> intermediateDestinations) {
      // ...
    }

    @Override
    public void onTripRemainingRouteDistanceUpdated(
        TripInfo tripInfo, @Nullable Integer distanceMeters) {
      // ...
    }

    @Override
    public void onTripRemainingRouteUpdated(TripInfo tripInfo, List<LatLng> route) {
      // ...
    }
  };

کاتلین

// Implements a callback for the trip model so your app can listen for trip
// updates from Fleet Engine.
val subscriber =
  object : TripModelCallback() {
    override fun onTripStatusUpdated(tripInfo: TripInfo, status: @TripStatus Int) {
      // ...
    }

    override fun onTripActiveRouteUpdated(tripInfo: TripInfo, route: List<LatLng>) {
      // ...
    }

    override fun onTripVehicleLocationUpdated(
      tripInfo: TripInfo,
      vehicleLocation: VehicleLocation?
    ) {
      // ...
    }

    override fun onTripPickupLocationUpdated(tripInfo: TripInfo, pickup: TerminalLocation?) {
      // ...
    }

    override fun onTripPickupTimeUpdated(tripInfo: TripInfo, timestampMillis: Long?) {
      // ...
    }

    override fun onTripDropoffLocationUpdated(tripInfo: TripInfo, dropoff: TerminalLocation?) {
      // ...
    }

    override fun onTripDropoffTimeUpdated(tripInfo: TripInfo, timestampMillis: Long?) {
      // ...
    }

    override fun onTripETAToNextWaypointUpdated(tripInfo: TripInfo, timestampMillis: Long?) {
      // ...
    }

    override fun onTripActiveRouteRemainingDistanceUpdated(
      tripInfo: TripInfo,
      distanceMeters: Int?
    ) {
      // ...
    }

    override fun onTripUpdateError(tripInfo: TripInfo, error: TripUpdateError) {
      // ...
    }

    override fun onTripUpdated(tripInfo: TripInfo) {
      // ...
    }

    override fun onTripRemainingWaypointsUpdated(
      tripInfo: TripInfo,
      waypointList: List<TripWaypoint>
    ) {
      // ...
    }

    override fun onTripIntermediateDestinationsUpdated(
      tripInfo: TripInfo,
      intermediateDestinations: List<TerminalLocation>
    ) {
      // ...
    }

    override fun onTripRemainingRouteDistanceUpdated(tripInfo: TripInfo, distanceMeters: Int?) {
      // ...
    }

    override fun onTripRemainingRouteUpdated(tripInfo: TripInfo, route: List<LatLng>) {
      // ...
    }
  }

سریع

class TripModelSubscriber: NSObject, GMTCTripModelSubscriber {

  func tripModel(_: GMTCTripModel, didUpdate trip: GMTSTrip?, updatedPropertyFields: GMTSTripPropertyFields) {
    // Update the UI with the new `trip` data.
    updateUI(with: trip)
    ...
  }

  func tripModel(_: GMTCTripModel, didUpdate tripStatus: GMTSTripStatus) {
    // Handle trip status did change.
  }

  func tripModel(_: GMTCTripModel, didUpdateActiveRoute activeRoute: [GMTSLatLng]?) {
    // Handle trip active route did update.
  }

  func tripModel(_: GMTCTripModel, didUpdate vehicleLocation: GMTSVehicleLocation?) {
    // Handle vehicle location did update.
  }

  func tripModel(_: GMTCTripModel, didUpdatePickupLocation pickupLocation: GMTSTerminalLocation?) {
    // Handle pickup location did update.
  }

  func tripModel(_: GMTCTripModel, didUpdateDropoffLocation dropoffLocation: GMTSTerminalLocation?) {
    // Handle drop off location did update.
  }

  func tripModel(_: GMTCTripModel, didUpdatePickupETA pickupETA: TimeInterval) {
    // Handle the pickup ETA did update.
  }

  func tripModel(_: GMTCTripModel, didUpdateDropoffETA dropoffETA: TimeInterval) {
    // Handle the drop off ETA did update.
  }

  func tripModel(_: GMTCTripModel, didUpdateRemaining remainingWaypoints: [GMTSTripWaypoint]?) {
    // Handle updates to the pickup, dropoff or intermediate destinations of the trip.
  }

  func tripModel(_: GMTCTripModel, didFailUpdateTripWithError error: Error?) {
    // Handle the error.
  }

  func tripModel(_: GMTCTripModel, didUpdateIntermediateDestinations intermediateDestinations: [GMTSTerminalLocation]?) {
    // Handle the intermediate destinations being updated.
  }

  ...
}

هدف-C

@interface TripModelSubscriber : NSObject <GMTCTripModelSubscriber>
@end

@implementation TripModelSubscriber

- (void)tripModel:(GMTCTripModel *)tripModel
            didUpdateTrip:(nullable GMTSTrip *)trip
    updatedPropertyFields:(GMTSTripPropertyFields)updatedPropertyFields {
  // Update the UI with the new `trip` data.
  [self updateUIWithTrip:trip];
  ...
}

- (void)tripModel:(GMTCTripModel *)tripModel didUpdateTripStatus:(enum GMTSTripStatus)tripStatus {
  // Handle trip status did change.
}

- (void)tripModel:(GMTCTripModel *)tripModel
    didUpdateActiveRoute:(nullable NSArray<GMTSLatLng *> *)activeRoute {
  // Handle trip route did update.
}

- (void)tripModel:(GMTCTripModel *)tripModel
    didUpdateVehicleLocation:(nullable GMTSVehicleLocation *)vehicleLocation {
  // Handle vehicle location did update.
}

- (void)tripModel:(GMTCTripModel *)tripModel
    didUpdatePickupLocation:(nullable GMTSTerminalLocation *)pickupLocation {
  // Handle pickup location did update.
}

- (void)tripModel:(GMTCTripModel *)tripModel
    didUpdateDropoffLocation:(nullable GMTSTerminalLocation *)dropoffLocation {
  // Handle drop off location did update.
}

- (void)tripModel:(GMTCTripModel *)tripModel didUpdatePickupETA:(NSTimeInterval)pickupETA {
  // Handle the pickup ETA did update.
}

- (void)tripModel:(GMTCTripModel *)tripModel
    didUpdateRemainingWaypoints:(nullable NSArray<GMTSTripWaypoint *> *)remainingWaypoints {
  // Handle updates to the pickup, dropoff or intermediate destinations of the trip.
}

- (void)tripModel:(GMTCTripModel *)tripModel didUpdateDropoffETA:(NSTimeInterval)dropoffETA {
  // Handle the drop off ETA did update.
}

- (void)tripModel:(GMTCTripModel *)tripModel didFailUpdateTripWithError:(nullable NSError *)error {
  // Handle the error.
}

- (void)tripModel:(GMTCTripModel *)tripModel
    didUpdateIntermediateDestinations:
        (nullable NSArray<GMTSTerminalLocation *> *)intermediateDestinations {
  // Handle the intermediate destinations being updated.
}
…
@end

شما می توانید در هر زمان به اطلاعات سفر به شرح زیر دسترسی داشته باشید:

  • با متد Consumer SDK برای اندروید TripModel.getTripInfo() تماس بگیرید. فراخوانی این روش به اجبار به‌روزرسانی داده نمی‌شود، اگرچه داده‌ها همچنان در فرکانس تازه‌سازی به‌روزرسانی می‌شوند.

  • Consumer SDK برای ویژگی iOS GMTCTripModel.currentTrip را دریافت کنید.

مرحله 7. سفر را با شناسه وسیله نقلیه به روز کنید

باید سفر را با شناسه وسیله نقلیه پیکربندی کنید تا Fleet Engine بتواند وسیله نقلیه را در طول مسیر خود ردیابی کند.

  • می‌توانید سفر را با شناسه وسیله نقلیه با تماس با نقطه پایانی UpdateTrip با UpdateTripRequest به‌روزرسانی کنید. از قسمت update_mask برای مشخص کردن اینکه در حال به روز رسانی شناسه خودرو هستید استفاده کنید.

یادداشت

  • اگر هنگام ایجاد سفر مقصدی را مشخص نکرده‌اید، همیشه می‌توانید آن را در اینجا انجام دهید.

  • اگر در سفری که در حال انجام است نیاز به تغییر وسیله نقلیه دارید، باید وضعیت سفر را به حالت جدید برگردانید و سپس سفر را (همانطور که در بالا انجام دادید) با شناسه وسیله نقلیه جدید به‌روزرسانی کنید.

مثال

نمونه کد زیر نحوه به روز رسانی سفر با شناسه وسیله نقلیه را نشان می دهد.

static final String PROJECT_ID = "my-rideshare-co-gcp-project";
static final String TRIP_ID = "trip-8241890";

String tripName = "providers/" + PROJECT_ID + "/trips/" + TRIP_ID;

TripServiceBlockingStub tripService = TripService.newBlockingStub(channel);

// The trip settings to update.
Trip trip = Trip.newBuilder()
    .setVehicleId("8241890")
    .build();

// The trip update request.
UpdateTripRequest updateTripRequest =
    UpdateTripRequest.newBuilder()      // No need for the header.
        .setName(tripName)
        .setTrip(trip)
        .setUpdateMask(FieldMask.newBuilder().addPaths("vehicle_id"))
        .build();

// Error handling.
// If the Fleet Engine has both a trip and vehicle with IDs, and if the
// credentials validate, then the service updates the trip.
try {
  Trip updatedTrip = tripService.updateTrip(updateTripRequest);
} catch (StatusRuntimeException e) {
  Status s = e.getStatus();
  switch (s.getCode()) {
    case NOT_FOUND:                    // Neither the trip nor vehicle exist.
      break;
    case PERMISSION_DENIED:
      break;
  }
  return;
}

مرحله 8. نمایش سفر در برنامه مصرف کننده

از شی ConsumerController برای دسترسی به APIهای عنصر رابط کاربری Rides and Deliveries استفاده کنید.

برای اطلاعات بیشتر، به استفاده از APIهای عنصر رابط کاربری مراجعه کنید.

مثال

مثال کد زیر نحوه شروع رابط کاربری اشتراک گذاری سفر را نشان می دهد.

جاوا

JourneySharingSession session = JourneySharingSession.createInstance(tripModel);
consumerController.showSession(session);

کاتلین

val session = JourneySharingSession.createInstance(tripModel)
consumerController.showSession(session)

سریع

let journeySharingSession = GMTCJourneySharingSession(tripModel: tripModel)
mapView.show(journeySharingSession)

هدف-C

GMTCJourneySharingSession *journeySharingSession =
    [[GMTCJourneySharingSession alloc] initWithTripModel:tripModel];
[self.mapView showMapViewSession:journeySharingSession];

مرحله 9. وضعیت سفر را در Fleet Engine مدیریت کنید

شما وضعیت یک سفر را با استفاده از یکی از مقادیر شمارش TripStatus مشخص می کنید. وقتی وضعیت سفر تغییر می کند (به عنوان مثال، تغییر از ENROUTE_TO_PICKUP به ARRIVED_AT_PICKUP )، باید وضعیت سفر را از طریق Fleet Engine به روز کنید. حالت سفر همیشه با مقدار NEW شروع می شود و با مقدار COMPLETE یا CANCELED به پایان می رسد. برای اطلاعات بیشتر، trip_status ببینید.

مثال

نمونه کد زیر نحوه به‌روزرسانی وضعیت سفر در Fleet Engine را نشان می‌دهد.

static final String PROJECT_ID = "my-rideshare-co-gcp-project";
static final String TRIP_ID = "trip-8241890";

String tripName = "providers/" + PROJECT_ID + "/trips/" + TRIP_ID;

TripServiceBlockingStub tripService = TripService.newBlockingStub(channel);

// Trip settings to be updated.
Trip trip = Trip.newBuilder()
    .setTripStatus(TripStatus.ARRIVED_AT_PICKUP)
    .build();

// Trip update request
UpdateTripRequest updateTripRequest = UpdateTripRequest.newBuilder()
    .setName(tripName)
    .setTrip(trip)
    .setUpdateMask(FieldMask.newBuilder().addPaths("trip_status"))
    .build();

// Error handling.
try {
  Trip updatedTrip = tripService.updateTrip(updateTripRequest);
} catch (StatusRuntimeException e) {
  Status s = e.getStatus();
  switch (s.getCode()) {
    case NOT_FOUND:            // The trip doesn't exist.
      break;
    case FAILED_PRECONDITION:  // The given trip status is invalid.
      break;
    case PERMISSION_DENIED:
      break;
  }
  return;
}