سفرهای استخر مشترک سفرهای مشترک برای چندین مصرف کننده است که به طور همزمان وسیله نقلیه را به اشتراک می گذارند. یعنی سفرها همزمان است نه مستقل. نحوه کار این کار شبیه به روش شاتل های فرودگاهی است، با این تفاوت که راننده می تواند مصرف کنندگان را در طول مسیر پیاده کند.
تفاوت اصلی بین سفر با استخر مشترک و سفر تک مقصد این است که در سفر با استخر مشترک، اپراتور سفر میتواند همزمان بیش از یک سوار را حمل کند.
این آموزش شما را در فرآیند ایجاد یک سفر استخر مشترک راهنمایی می کند. همچنین نشان می دهد که چگونه می توانید آن سفر را با برنامه مصرف کننده خود ادغام کنید تا مشتریان شما بتوانند پیشرفت سفر را از طریق تلفن خود تجسم کنند. شما این ادغام را با استفاده از Consumer SDK انجام می دهید.
مرحله 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;
}
برای ایجاد Vehicle
که از سفرهای استخر مشترک پشتیبانی می کند، باید TripType.SHARED
را به لیست انواع سفرهای پشتیبانی شده در شی Vehicle
ارسال شده به CreateVehicleRequest
اضافه کنید.
Vehicle vehicle = Vehicle.newBuilder()
.setVehicleState(VehicleState.OFFLINE)
.addSupportedTripTypes(TripType.SHARED)
.setMaximumCapacity(4)
.setVehicleType(VehicleType.newBuilder().setCategory(VehicleType.Category.AUTO))
.build();
مرحله 2. ردیابی موقعیت مکانی را فعال کنید
ردیابی موقعیت مکانی به ردیابی مکان وسیله نقلیه در طول سفر اشاره دارد، جایی که برنامه راننده تله متری را به موتور ناوگان ارسال می کند، که حاوی مکان فعلی خودرو است. این جریان دائماً به روز شده اطلاعات موقعیت برای انتقال پیشرفت وسیله نقلیه در طول مسیر سفر استفاده می شود. هنگامی که ردیابی موقعیت مکانی را فعال می کنید، برنامه راننده شروع به ارسال این تله متری با فرکانس پیش فرض هر پنج ثانیه یک بار می کند.
ردیابی موقعیت مکانی را برای اندروید و iOS به صورت زیر فعال می کنید:
متد Driver SDK for Android
enableLocationTracking()
را فراخوانی کنید.Driver SDK for iOS ویژگی boolean
locationTrackingEnabled
را رویtrue
تنظیم کنید.
مثال
مثال کد زیر نحوه فعال کردن ردیابی موقعیت مکانی را نشان می دهد.
جاوا
RidesharingVehicleReporter vehicleReporter = ...;
vehicleReporter.enableLocationTracking();
کاتلین
val vehicleReporter = ...
vehicleReporter.enableLocationTracking()
سریع
vehicleReporter.locationTrackingEnabled = true
هدف-C
_vehicleReporter.locationTrackingEnabled = YES;
مرحله 3. وضعیت خودرو را روی حالت آنلاین تنظیم کنید
شما یک وسیله نقلیه را با تنظیم وضعیت آن بر روی آنلاین به خدمت می آورید (یعنی آن را برای استفاده در دسترس قرار می دهید)، اما تا زمانی که ردیابی موقعیت مکانی را فعال نکرده باشید نمی توانید این کار را انجام دهید.
وضعیت خودرو را به صورت آنلاین برای Android و iOS به صورت زیر تنظیم می کنید:
با متد Driver SDK for Android
setVehicleState(VehicleState.ONLINE)
تماس بگیرید.درایور SDK برای روش iOS
vehicleReporter.update(.online)
تماس بگیرید.
مثال
مثال کد زیر نحوه تنظیم وضعیت خودرو را بر روی ONLINE
نشان می دهد.
جاوا
vehicleReporter.setVehicleState(VehicleState.ONLINE);
کاتلین
vehicleReporter.setVehicleState(VehicleState.ONLINE)
سریع
vehicleReporter.update(.online)
هدف-C
[_vehicleReporter updateVehicleState:GMTDVehicleStateOnline];
مرحله 4. یک سفر در Fleet Engine ایجاد کنید
برای ایجاد یک سفر استخر مشترک، یک شی Trip
درست مانند یک سفر تک مقصد ایجاد می کنید.
سفر شیئی است که یک سفر را نشان می دهد که مجموعه نقاط مختصات جغرافیایی شامل مبدا، ایستگاه های بین راه و نقاط سقوط است. شما باید برای هر درخواست سفر یک شی Trip
ایجاد کنید تا بتوان درخواست را با یک وسیله نقلیه مطابقت داد و سپس ردیابی کرد.
- می توانید با فراخوانی متد
CreateTrip()
با پیام درخواستCreateTripRequest
یک سفر ایجاد کنید.
ارائه ویژگی های مورد نیاز
فیلدهای زیر برای ایجاد یک سفر استخر مشترک لازم است.
-
parent
- رشته ای که شامل شناسه ارائه دهنده است. این باید با شناسه پروژه Google Cloud Project که حاوی حسابهای سرویس مورد استفاده برای فراخوانی Fleet Engine است، باشد.
-
trip_id
- رشتهای که ایجاد میکنید، که بهطور منحصربهفردی این سفر را مشخص میکند.
-
trip
- شی
Trip
برای ایجاد.
این فیلدهای زیر باید در شی Trip
ارسال شده به CreateTripRequest
تنظیم شوند:
-
trip_type
-
TripType.SHARED
-
pickup_point
- نقطه مبدا سفر
-
dropoff_point
- نقطه خروج سفر این فیلد در ایجاد سفر مورد نیاز نیست و میتواند بعداً با تماس
UpdateTrip
تنظیم شود.
مثال
نمونه ادغام باطن زیر نحوه ایجاد یک سفر و اختصاص خودکار به وسیله نقلیه به عنوان استخر مشترک را نشان می دهد.
// Vehicle with VEHICLE_ID ID is already created and it is assigned Trip A.
static final String PROJECT_ID = "my-rideshare-co-gcp-project";
static final String TRIP_ID = "shared-trip-A";
static final String VEHICLE_ID = "your-vehicle-id";
static final String TRIP_A_ID = "trip-a-id";
static final String TRIP_B_ID = "trip-b-id";
TripServiceBlockingStub tripService = TripService.newBlockingStub(channel);
String parent = "providers/" + PROJECT_ID;
LatLng tripBPickup =
LatLng.newBuilder().setLatitude(-12.12314).setLongitude(88.142123).build();
LatLng tripBDropoff =
LatLng.newBuilder().setLatitude(-14.12314).setLongitude(90.142123).build();
TerminalLocation tripBPickupTerminalLocation =
TerminalLocation.newBuilder().setPoint(tripBPickup).build();
TerminalLocation tripBDropoffTerminalLocation =
TerminalLocation.newBuilder().setPoint(tripBDropoff).build();
// TripA already exists and it's assigned to a vehicle with VEHICLE_ID ID.
Trip tripB = Trip.newBuilder()
.setTripType(TripType.SHARED)
.setVehicleId(VEHICLE_ID)
.setPickupPoint(tripBPickupTerminalLocation)
.setDropoffPoint(tripBDropoffTerminalLocation)
.addAllVehicleWaypoints(
// This is where you define the arrival order for unvisited waypoints.
// If you don’t specify an order, then the Fleet Engine adds Trip B’s
// waypoints to the end of Trip A’s.
ImmutableList.of(
// Trip B’s pickup point.
TripWaypoint.newBuilder()
.setLocation(tripBPickupTerminalLocation)
.setTripId(TRIP_B_ID)
.setWaypointType(WaypointType.PICKUP_WAYPOINT_TYPE)
.build(),
// Trip A’s drop-off point.
TripWaypoint.newBuilder()
.setLocation(tripA.getDropoffPoint())
.setTripId(TRIP_A_ID)
.setWaypointType(WaypointType.DROP_OFF_WAYPOINT_TYPE)
.build(),
// Trip B’s drop-off point.
TripWaypoint.newBuilder()
.setLocation(tripBDropoffTerminalLocation)
.setTripId(TRIP_B_ID)
.setWaypointType(WaypointType.DROP_OFF_WAYPOINT_TYPE)
.build()))
.build();
// Create Trip request
CreateTripRequest createTripRequest = CreateTripRequest.newBuilder()
.setParent(parent)
.setTripId(TRIP_B_ID)
.setTrip(tripB)
.build();
try {
// createdTrip.remainingWaypoints will contain shared-pool waypoints.
// [tripB.pickup, tripA.dropoff, tripB.dropoff]
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. سفر را با شناسه وسیله نقلیه و ایستگاه های بین راهی به روز کنید
باید سفر را با شناسه وسیله نقلیه پیکربندی کنید تا Fleet Engine بتواند وسیله نقلیه را در طول مسیر خود ردیابی کند.
- می توانید سفر را با شناسه وسیله نقلیه با تماس با نقطه پایانی
UpdateTrip
باUpdateTripRequest
به روز کنید. از قسمتupdate_mask
برای مشخص کردن اینکه در حال به روز رسانی شناسه خودرو هستید استفاده کنید.
شما باید یک سفارش به ایستگاه های بین بازدید نشده در مجموعه ای از ایستگاه های بین راه وسیله نقلیه سفر ( Trip.vehicle_waypoints
) معرفی کنید. Fleet Engine از این لیست برای بهروزرسانی خودکار نقاط بین سفر برای همه سفرها در استخر مشترک استفاده میکند.
به عنوان مثال، دو سفر با استخر مشترک را در نظر بگیرید: سفر A و سفر B. سفر A در مسیر به سمت محل تخلیه خود است. سپس سفر B به همان وسیله نقلیه اضافه می شود. در یک UpdateTripRequest
برای سفر B ، vehicleId
را تنظیم میکنید، و همچنین Trip.vehicle_waypoints
را روی ترتیب بهینه نقطه راه تنظیم میکنید: B Pickup → A Drop-off → B Drop-off .
- فراخوانی
getVehicle()
لیستی از نقاط بین باقیمانده (remainingWaypoints
) را برمی گرداند که حاوی
B تحویل → A Drop-off → B Drop-off . - یا
getTrip()
یاonTripRemainingWaypointsUpdated
callback برای Trip A لیستی از نقاط بین باقیمانده (remainingWaypoints
) را برمی گرداند که حاوی B Pickup → A Drop-off است. - یا
getTrip()
یاonTripRemainingWaypointsUpdated
callback برای سفر B لیستی از نقاط بین باقیمانده (remainingWaypoints
) را برمی گرداند که حاوی B Pickup → A Drop-off → B Drop-off است .
مثال
نمونه ادغام باطن زیر نحوه بهروزرسانی یک سفر با شناسه وسیله نقلیه و ایستگاههای بین دو سفر با استخر مشترک را نشان میدهد.
static final String PROJECT_ID = "my-rideshare-co-gcp-project";
static final String TRIP_A_ID = "share-trip-A";
static final String TRIP_B_ID = "share-trip-B";
static final String VEHICLE_ID = "Vehicle";
String tripName = "providers/" + PROJECT_ID + "/trips/" + TRIP_B_ID;
// Get Trip A and Trip B objects from either the Fleet Engine or storage.
Trip tripA = …;
Trip tripB = …;
TripServiceBlockingStub tripService = TripService.newBlockingStub(channel);
// The trip settings to update.
Trip trip = Trip.newBuilder()
.setVehicleId(VEHICLE_ID)
.addAllVehicleWaypoints(
// This is where you define the arrival order for unvisited waypoints.
// If you don’t specify an order, then the Fleet Engine adds Trip B’s
// waypoints to the end of Trip A’s.
ImmutableList.of(
// Trip B’s pickup point.
TripWaypoint.newBuilder()
.setLocation(tripB.getPickupPoint())
.setTripId(TRIP_B_ID)
.setWaypointType(WaypointType.PICKUP_WAYPOINT_TYPE)
.build(),
// Trip A’s drop-off point.
TripWaypoint.newBuilder()
.setLocation(tripA.getDropoffPoint())
.setTripId(TRIP_A_ID)
.setWaypointType(WaypointType.DROP_OFF_WAYPOINT_TYPE)
.build(),
// Trip B’s drop-off point.
TripWaypoint.newBuilder()
.setLocation(tripB.getDropoffPoint())
.setTripId(TRIP_B_ID)
.setWaypointType(WaypointType.DROP_OFF_WAYPOINT_TYPE)
.build()))
.build();
// The trip update request.
UpdateTripRequest updateTripRequest = UpdateTripRequest.newBuilder()
.setName(tripName)
.setTrip(trip)
.setUpdateMask(FieldMask.newBuilder()
.addPaths("vehicle_id")
.addPaths("vehicle_waypoints"))
.build();
// Error handling. If Fleet Engine has both a trip and vehicle with the IDs,
// and if the credentials validate, and if the given vehicle_waypoints list
// is valid, 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: // Either the trip or vehicle does not exist.
break;
case PERMISSION_DENIED:
break;
case INVALID_REQUEST: // vehicle_waypoints is invalid.
break;
}
return;
}
مرحله 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. نمایش سفر در برنامه مصرف کننده
به صورت زیر می توانید به API های عنصر رابط کاربری Rides and Deliveries دسترسی داشته باشید:
شی Consumer SDK برای Android
ConsumerController
را دریافت کنید. برای اطلاعات بیشتر، به استفاده از APIهای عنصر رابط کاربری مراجعه کنید.شئ Consumer SDK برای iOS
GMTCMapView
را دریافت کنید. برای اطلاعات بیشتر، به استفاده از 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];
به طور پیشفرض، Consumer SDK فقط قسمت فعال مسیر را نشان میدهد، اما شما میتوانید قسمت باقیمانده را که شامل مقصد میشود، نمایش دهید.
اگر میخواهید اطلاعاتی در مورد ایستگاههای بین سفرهای دیگر نمایش دهید، میتوانید به تمام نقاط بین راهی مربوط به یک سفر به شرح زیر دسترسی داشته باشید:
با متد Consumer SDK برای اندروید
TripModel.getTripInfo()
تماس بگیرید. سپس باTripInfo.getRemainingWaypoints()
تماس بگیرید تاTripWaypoint
s را دریافت کنید. هر شیءTripWaypoint
شامل شناسه سفر، محل ایستگاه بین راهی و نوع ایستگاه بین راه است.Consumer SDK برای ویژگی iOS
GMTCTripModel.currentTrip
را دریافت کنید. سپس آرایهGMTSTrip.remainingWaypoints
را برای دسترسی بهGMTSTripWaypoint
دریافت کنید. هر شیءGMTSTripWaypoint
شامل شناسه سفر، محل ایستگاه بین راهی و نوع نقطه بین راه است.
مرحله 8. وضعیت سفر را در 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;
}