Swift och Protobuf

Hej! Som jag förstår det så måste man använda Googles Protobuf istället för JSON ibland.
Verkar krångligare att använda, kan ni ge lite råd?
Lars Persson

Kommentarer

  • Hej Lars,

    Protobuf används som dataformat för realtidsdata i GTFS-standarden, och används därför i GTFS Regional Realtime samt GTFS Sweden 3 Realtime. Detta för att formatet är kompakt och snabbt att läsa, något som blir viktigt vid dataströmmar med mycket data som uppdateras ofta (till exempel fordonspositioner som uppdateras varje sekund för vissa operatörer).

    Det finns två sätt att gå tillvägs för att läsa protobuf data:
    - Man använder en protobuf-bibliotek (som ger stöd för protobuf formatet själv) i kombination med en .proto fil som definierar strukturen som används i GTFS-standarden.
    - Man använder en gtfs-realtime bibliotek, som gör samma sak som ovan, men där man redan har kombinerat protobuf-formatet och gtfs-strukturen till 1 bibliotek som är enklare att använda.

    Hur man läser protobuf data i olika programmeringsspråk hittar man här, med exempel i olika språk som tex C++: https://protobuf.dev/overview/

    Proto-filen för GTFS Realtime hittar man här: https://gtfs.org/documentation/realtime/gtfs-realtime.proto

    Färdiga gtfs-realtime bibliotek för olika språk hittar du här: https://github.com/MobilityData/gtfs-realtime-bindings/tree/master

    Det finns inga bibliotek specifik för Swift, eftersom realtidsdata måste kombineras med statisk data. Detta görs typiskt på en server, eftersom tex mobiltelefoner inte är lämpad för att hantera de stora statiska datamängder. Servern däremot kan kombinera realtidsdatat med det som behövs from det statiska data (tex linjenummer, transportmedel, nästa hållplats) och returnera den som JSON data till en front-end lösning (web, app, ...).

    Hälsningar,
    Bert
    Bert på Trafiklab
  • Ok, tack så jättemycket! Då ska jag nog kunna lösa det.
    Lars Persson
  • Hej! Detta var svårare än jag trodde. Det verkar finnas ett "packet" till Swift som heter Swift-protobuf.

    Hur jag sedan ska gå vidare vet jag inte.

    Det finns inte någon ni vet som har implementerat det i någon iPhone-lösning?

    Skånetrafiken har ju bussar i realtid så de kanske använder era API.
    Dock vill de kanske inte dela information.
    Lars Persson
  • Hej Lars,

    Skånetrafikens busspositioner finns i realtid, tillsammans med information om nyttjandegrad, hur trångt det är ombord på bussen.

    Som jag skrev tidigare så brukar man inte hämta positioner direkt till en mobiltelefon, utan implementerar man en liten serverapplikation som tar hand om realtidsdata och tillgängliggör den i ett format som passar mobilappen, tex som JSON.

    Kvota på nyckeln kommer antagligen inte räcka till för att förse alla användare av en mobilapplikation med realtidspositioner, vilket är en till anledning till att hämta all protobuf data till en server, där man kombinerar realtidsdata och statiskt data, cachar resultatet, och skickar vidare till mobilapplikationen.

    Hälsningar,
    Bert
    Bert på Trafiklab
  • Hej! Jag fick rådet att ha en server som hanterar datan eftersom en mobil inte är lämpad för stora mängder data.

    Har detta något att göra med hur ofta man anropar sitt API?

    Om jag använder en separat server, finns det begränsningar då?
    Lars Persson
  • Hej,

    Detta har att göra med att realtidsdatat bara innehåller vad som har ändrats gentemot de planerade data. Man behöver alltså ladda ner de planerade data och läsa in dem, för att kunna tolka realtidsdatat. Eftersom de planerade data är flera hundra megabytes stor, skulle det vara väldigt segt att hantera på mobila apparat. Däremot kan man hantera de planerade data på en server (som bara behöver läsa datat en gång för alla användare), därefter kan den skicka exakt de data som behövs till de mobila apparater.

    Till exempel kan planerade data innehålla att "902100001" är malmö C, och att " 1212000000123" är buss 1 mot malmö som avgår kl 12.00.
    Realtidsdatat innehåller sen endast "Tur 1212000000123 är försenad med en minut vid 902100001" eller "Fordonet som kör tur 1212000000123 är vid koordinaterna x,y".Servern kan kombinera denna information så att mobilapplikationen kan efterfråga information för buss 1, varpå servern kan svara med tex "avgår kl 12.00 från hållplats med namn x, försenad med 1 minut och befinner sig vid koordinaterna x,y".

    Något liknande har vi själv gjort för platsuppslag och stolptidtabeller med våra nya Trafiklab Realtime API:er, dock innehåller dessa inga realtidspositioner.

    Bert på Trafiklab
  • Ok, tack! Kan man då använda ett webbhotell som server?
    Lars Persson
  • Det beror på. Man vill kunna köra sin egen kod i programmeringsspråket som man har valt till servern. En del webbhotell har tex endast stöd för statiska filer (där ingen kod körs på servern) eller har endast stöd för specifika språk. Man måste alltså välja rätt. Har man ingen erfarenhet med detta kan det vara värt att leta efter någon som man kan samarbeta med, eller börja med att använda sin egen dator som server under utvecklingen så att man kan välja rätt senare i projektet.

    Hälsningar,
    Bert
    Bert på Trafiklab

Kommentera eller skriv ett nytt inlägg

Ditt namn och inlägg kan ses av alla. Din e-post visas aldrig publikt.