PUBLIC TRANSPORT API’sHOW WE ARE USING AND CREATING LONG LASTING API’S AT NOBINA
@ULRIKAPARK & PETTER KVARNFORS
RES I STHLM – THE JOURNEY PLANNER FOR STOCKHOLM PUBLIC TRANSPORT
TRAFIKLAB – A COMMUNITY FOR OPEN DATA IN PUBLIC TRANSPORT
HOW TO ADDRESS THE CHALLENGES• For long term solutions: Influence
Trafiklab, SL, bus & train operators – working on source data, make data reliable
For urgent solutions: Build our own solutions – for bad and good. Ex: ”the Jesus problem”, ”Where is the bus?”
Design for error – Design the app for expected errors in data
Co-operate with the community. Communities have new ideas and solutions – for instance the ”Right exit”
Central computer
WiFi antenna and router
Antennas on the roof
Computer for destination
displays
Ethernet switch
Onboard computer
MQTT Broker
GW400 Door2MQTT
Passenger Counter
Door Sensor
Passenger sensor
Position Tracker
GPS
Field Gateway
GPS Antenna Sensors
Interface programs
Broker
Programs
#define MQTT_HOSTNAME "localhost"#define MQTT_PORT 1883#define MQTT_TOPIC "nobina/position/gps"
struct mosquitto *mosq;
int main(int argc, char* argv[]){ initialize_mqtt();
mosquitto_connect(mosq, MQTT_HOSTNAME, MQTT_PORT, 60); mosquitto_loop_forever(mosq, -1, 1);
mosquitto_destroy(mosq); mosquitto_lib_cleanup();}
void mqtt_connect_callback(struct mosquitto *mosq, void* userdata, int result){ if (!result) { mosquitto_subscribe (mosq, NULL, MQTT_TOPIC, 0); } else { fprintf(stderr, "Connection failed\n"); }}
void mqtt_message_callback(struct mosquitto *mosq, void *obj, const struct mosquitto_message *message) { send_to_event_hub((char *)message->payload); }
#define MQTT_HOSTNAME "localhost"#define MQTT_PORT 1883#define MQTT_TOPIC "nobina/position/gps"
struct mosquitto *mosq;
int main(int argc, char* argv[]){ initialize_mqtt();
mosquitto_connect(mosq, MQTT_HOSTNAME, MQTT_PORT, 60); mosquitto_loop_forever(mosq, -1, 1);
mosquitto_destroy(mosq); mosquitto_lib_cleanup();}
void mqtt_connect_callback(struct mosquitto *mosq, void* userdata, int result){ if (!result) { mosquitto_subscribe (mosq, NULL, MQTT_TOPIC, 0); } else { fprintf(stderr, "Connection failed\n"); }}
void mqtt_message_callback(struct mosquitto *mosq, void *obj, const struct mosquitto_message *message) { send_to_event_hub((char *)message->payload); }
#define MQTT_HOSTNAME "localhost"#define MQTT_PORT 1883#define MQTT_TOPIC "nobina/position/gps"
struct mosquitto *mosq;
int main(int argc, char* argv[]){ initialize_mqtt();
mosquitto_connect(mosq, MQTT_HOSTNAME, MQTT_PORT, 60); mosquitto_loop_forever(mosq, -1, 1);
mosquitto_destroy(mosq); mosquitto_lib_cleanup();}
void mqtt_connect_callback(struct mosquitto *mosq, void* userdata, int result){ if (!result) { mosquitto_subscribe (mosq, NULL, MQTT_TOPIC, 0); } else { fprintf(stderr, "Connection failed\n"); }}
void mqtt_message_callback(struct mosquitto *mosq, void *obj, const struct mosquitto_message *message) { send_to_event_hub((char *)message->payload); }
#define MQTT_HOSTNAME "localhost"#define MQTT_PORT 1883#define MQTT_TOPIC "nobina/position/gps"
struct mosquitto *mosq;
int main(int argc, char* argv[]){ initialize_mqtt();
mosquitto_connect(mosq, MQTT_HOSTNAME, MQTT_PORT, 60); mosquitto_loop_forever(mosq, -1, 1);
mosquitto_destroy(mosq); mosquitto_lib_cleanup();}
void mqtt_connect_callback(struct mosquitto *mosq, void* userdata, int result){ if (!result) { mosquitto_subscribe (mosq, NULL, MQTT_TOPIC, 0); } else { fprintf(stderr, "Connection failed\n"); }}
void mqtt_message_callback(struct mosquitto *mosq, void *obj, const struct mosquitto_message *message) { send_to_event_hub((char *)message->payload); }
#define MQTT_HOSTNAME "localhost"#define MQTT_PORT 1883#define MQTT_TOPIC "nobina/position/gps"
struct mosquitto *mosq;
int main(int argc, char* argv[]){ initialize_mqtt();
mosquitto_connect(mosq, MQTT_HOSTNAME, MQTT_PORT, 60); mosquitto_loop_forever(mosq, -1, 1);
mosquitto_destroy(mosq); mosquitto_lib_cleanup();}
void mqtt_connect_callback(struct mosquitto *mosq, void* userdata, int result){ if (!result) { mosquitto_subscribe (mosq, NULL, MQTT_TOPIC, 0); } else { fprintf(stderr, "Connection failed\n"); }}
void mqtt_message_callback(struct mosquitto *mosq, void *obj, const struct mosquitto_message *message) { send_to_event_hub((char *)message->payload); }
Event Hub
App Servic
e
Blob storage
API
IoT Unit
Nobina Backoffice
MS Azure
Event Hub
App Servic
e
Blob storage
API
IoT Unit App
trafiklab.se
Backend
Res i Stockholm
Nobina Backoffice
MS Azure
Event Hub
Nobina Backoffice
App Servic
e
API
IoT Unit
trafiklab.se
Other apps
AppBackend
Res i Stockholm
MS Azure
Blob storage
Thanks for listening!
COLLABORATE WITH COMMUNITY
DESIGN FOR CHANGE
USE STANDARDS
EXPERIMENT