12 KiB
Tracking App API
This document describes the API used by the tracking smartphone apps.
Host, Protocol, Port
There are many hosts (not one). Hosts are a subdomain in sapsailing.com, e.g. kielerwoche2014.sapsailing.com.
Protocol is generally http, port is 80.
All connection details are contained in the QR code:
{protocol://server:port}/apps/com.sap.sailing.android.tracking.app.apk
?leaderboard={...}
&raceColumn={...}
&fleet={...}
&competitor={...}
Event Details
The following GET call returns event details.
Verb
GET
Path
For single event:
/sailingserver/api/v1/events/{event-id}
Response
{
"id": "863a5c30-cbea-4f1c-8fb1-54fffa6b7319",
"name": "Extreme Sailing Series 2012 Rio",
"description": "",
"officialWebsiteURL": "http://www.extremesailingseries.com",
"logoImageURL": "http://static.sapsailing.com/ubilabsimages/ESS2014/esslogo.jpg",
"startDate": 1354189140000,
"endDate": 1354448040000,
"venue": {
"name": "Rio",
"courseAreas": [
{
"name": "Rio",
"id": "e956b2d1-2429-4b18-b655-662c6098cbb9"
}
]
},
"imageURLs": [
"http://www.extremesailingseries.com/images/gallery/2012/2012_ESS_map_800.jpg"
],
"videoURLs": [],
"sponsorImageURLs": [],
"leaderboardGroups": [
{
"id": "d1d09698-81c1-4caf-9790-abb431c7a5dc",
"name": "Extreme Sailing Series 2012",
"description": "Muscat - Qingdao - Istanbul - Porto - Cardiff - Nice - Rio de Janeiro",
"displayName": null,
"hasOverallLeaderboard": true
}
],
"imageSizes": [
{
"imageURL": "http://www.extremesailingseries.com/images/gallery/2012/2012_ESS_map_800.jpg",
"imageWidth": 800,
"imageHeight": 462
},
{
"imageURL": "http://static.sapsailing.com/ubilabsimages/ESS2014/esslogo.jpg",
"imageWidth": 209,
"imageHeight": 65
}
]
}
Device Mapping
Following POST call maps smartphones to competitors.
Verb
POST
Path
/sailingserver/rc/racelog
?leaderboard=Guy%27s+Regatta
&raceColumn=M1
&fleet=Default
&clientuuid=92669a6c-72c9-46d2-a815-f51ff15a4369
Query Parameters
Query parameters are required and are encoded in QR code.
clientuuid Competitor ID
Request Body
{
"timestamp": 1413460233257,
"id": "c72eabea-f456-4b29-9ba0-dadd06f5a179",
"passId": 0,
"fromMillis": 1413459900000,
"@class": "DeviceCompetitorMappingEvent",
"createdAt": 1413460233258,
"item": {
"id": "da815c7f-c935-44f5-b01d-20b750ce75ab",
"nationality": "",
"displayColor": null,
"idtype": "java.util.UUID",
"name": null,
"nationalityISO3": "",
"sailID": "",
"nationalityISO2": ""
},
"authorName": "Tracking App",
"competitors": [ ],
"device": {
"stringRepresentation": "147d8230-4db0-11e4-916c-0800200c9a66",
"id": "147d8230-4db0-11e4-916c-0800200c9a66",
"type": "smartphoneUUID"
},
"authorPriority": 0,
"toMillis": 1413460500000
}
Properties
item.id Competitor ID, contained in QR code
device.stringRepresentation and device.id Device UDID, generated by app
fromMillis Start of mapping, contained in QR code
toMillis End of mapping, contained in QR code
Response Body
[
{
"@class": "RaceLogStartProcedureChangedEvent",
"id": "1e76925c-6518-434c-8d43-f5abf97154bf",
"createdAt": 1413794205930,
"timestamp": 1413794205905,
"passId": 0,
"competitors": [],
"authorName": "Shore",
"authorPriority": 4,
"startProcedureType": "RRS26"
},
{
"@class": "RaceLogStartTimeEvent",
"id": "978701be-d087-4ac1-a263-db2d7059e5d8",
"createdAt": 1413794205931,
"timestamp": 1413794205905,
"passId": 0,
"competitors": [],
"authorName": "Shore",
"authorPriority": 4,
"nextStatus": "SCHEDULED",
"startTime": 1413794160000
},
{
"@class": "DenoteForTrackingEvent",
"id": "f332a53b-db8c-4e22-b250-042400e08c9a",
"createdAt": 1413460016871,
"timestamp": 1413460016869,
"passId": 0,
"competitors": [],
"authorName": "com.sap.sailing.server.RacingEventService",
"authorPriority": 1,
"raceName": "Guy's Regatta M1 Default",
"boatClass": "Small",
"raceId": "dee82eb7-4d0f-4d1b-b834-9d1faa6b2517"
},
{
"@class": "RegisterCompetitorEvent",
"id": "f381d118-3344-41d3-bd47-4a2beb206d30",
"createdAt": 1413460067296,
"timestamp": 1413460067294,
"passId": 0,
"competitors": [
{
"idtype": "java.util.UUID",
"id": "da815c7f-c935-44f5-b01d-20b750ce75ab",
"name": "Competitor A",
"displayColor": null,
"sailID": "A",
"nationality": "",
"nationalityISO2": "",
"nationalityISO3": ""
}
],
"authorName": "com.sap.sailing.server.RacingEventService",
"authorPriority": 1
},
{
"@class": "RegisterCompetitorEvent",
"id": "f7e6da48-d245-4615-8cbb-f7b4a96c7566",
"createdAt": 1413460067298,
"timestamp": 1413460067297,
"passId": 0,
"competitors": [
{
"idtype": "java.util.UUID",
"id": "9c09ad1a-e05c-45d2-8b08-b8a6f4b03004",
"name": "Competitor B",
"displayColor": null,
"sailID": "B",
"nationality": "",
"nationalityISO2": "",
"nationalityISO3": ""
}
],
"authorName": "com.sap.sailing.server.RacingEventService",
"authorPriority": 1
},
{
"@class": "DefineMarkEvent",
"id": "87b347c8-ad57-47ca-9b67-2fe01ac72e3f",
"createdAt": 1413461050887,
"timestamp": 1413461050886,
"passId": 0,
"competitors": [],
"authorName": "com.sap.sailing.server.RacingEventService",
"authorPriority": 1,
"mark": {
"@class": "Mark",
"name": "Buoy 1",
"id": "a8f20289-0246-438f-a4de-9bc1c30b9fc3",
"color": "",
"pattern": "",
"shape": "CONICAL",
"type": "BUOY"
}
},
{
"@class": "DefineMarkEvent",
"id": "d48d2e37-496b-48b8-8fb6-5233638c018b",
"createdAt": 1413461060946,
"timestamp": 1413461060946,
"passId": 0,
"competitors": [],
"authorName": "com.sap.sailing.server.RacingEventService",
"authorPriority": 1,
"mark": {
"@class": "Mark",
"name": "Buoy 2",
"id": "a8a84cf8-ad78-4db1-a593-91f43ced523a",
"color": "",
"pattern": "",
"shape": "CONICAL",
"type": "BUOY"
}
},
{
"@class": "RaceLogCourseDesignChangedEvent",
"id": "f4e0d5c6-494c-4492-a09d-1665baf385ca",
"createdAt": 1413461086484,
"timestamp": 1413461086483,
"passId": 0,
"competitors": [],
"authorName": "com.sap.sailing.server.RacingEventService",
"authorPriority": 1,
"courseDesign": {
"name": "Course for Guy's Regatta - M1 - Default",
"waypoints": [
{
"name": "Buoy 1",
"passingInstruction": "None",
"controlPoint": {
"@class": "Mark",
"name": "Buoy 1",
"id": "a8f20289-0246-438f-a4de-9bc1c30b9fc3",
"color": "",
"pattern": "",
"shape": "CONICAL",
"type": "BUOY"
}
},
{
"name": "Buoy 2",
"passingInstruction": "None",
"controlPoint": {
"@class": "Mark",
"name": "Buoy 2",
"id": "a8a84cf8-ad78-4db1-a593-91f43ced523a",
"color": "",
"pattern": "",
"shape": "CONICAL",
"type": "BUOY"
}
}
]
}
},
{
"@class": "DeviceCompetitorMappingEvent",
"id": "cf5995a4-6cca-4cca-a6cc-2357a32bb436",
"createdAt": 1413463043674,
"timestamp": 1413463043674,
"passId": 0,
"competitors": [],
"authorName": "Tracking App",
"authorPriority": 0,
"fromMillis": 1413461400000,
"toMillis": 1413464100000,
"item": {
"idtype": "java.util.UUID",
"id": "da815c7f-c935-44f5-b01d-20b750ce75ab",
"name": "Competitor A",
"displayColor": null,
"sailID": "A",
"nationality": "",
"nationalityISO2": "",
"nationalityISO3": ""
},
"device": {
"type": "smartphoneUUID",
"id": "147d8230-4db0-11e4-916c-0800200c9a66",
"stringRepresentation": "147d8230-4db0-11e4-916c-0800200c9a66"
}
},
{
"@class": "RevokeEvent",
"id": "481e710e-9f8d-4222-a4ae-ec4b15b7a8bd",
"createdAt": 1413793852767,
"timestamp": 1413793852767,
"passId": 0,
"competitors": [],
"authorName": "com.sap.sailing.server.RacingEventService",
"authorPriority": 0,
"revokedEventId": "f332a53b-db8c-4e22-b250-042400e08c9a"
},
{
"@class": "DenoteForTrackingEvent",
"id": "740701f2-639b-4bfb-8f72-06093b0ac1e8",
"createdAt": 1413793857143,
"timestamp": 1413793857143,
"passId": 0,
"competitors": [],
"authorName": "com.sap.sailing.server.RacingEventService",
"authorPriority": 0,
"raceName": "Guy's Regatta M1 Default",
"boatClass": "Small",
"raceId": "8fd69b14-f9bf-46bc-8bda-def5814d8758"
},
...
]
The response is a JSON array containing all events pertaining to leaderboard.
Properties
id UDID of event
timestamp Time of event
createdAt Time at which event log was created.
@class Event type, one of following values:
-
RaceLogStartProcedureChangedEvent??? -
RaceLogStartTimeEvent??? -
DenoteForTrackingEvent??? -
RegisterCompetitorEventAdd new competitor. -
DefineMarkEventAdd new mark (e.g. buoy). -
RaceLogCourseDesignChangedEventCalled when defining course with marks. -
DeviceCompetitorMappingEventTriggered when device and competitor are mapped. -
RevokeEventCalled e.g. when deleting a device / competitor mapping.
authorName Application that generated event log
Send Geolocation
Verb
POST
Path
/tracking/recordFixesFlatJson
Body
{
"bearingDeg":48,
"timeMillis":1414504349713,
"speedMperS":0,
"lonDeg":9.9650613,
"deviceUuid":"147d8230-4db0-11e4-916c-0800200c9a66",
"latDeg":53.5510491
}
Response
200