Network Rail Data Feeds Developer Pack
Network Rail Data Feeds Developer Pack
V4.0
Contents
1 2 3 4 4.1 4.2 4.3 4.4 4.5 4.6 Introduction ............................................................................................................................................................. 3 Available Data Feeds .............................................................................................................................................. 4 User Account Creation and Data Feeds Subscription ............................................................................................. 5 Data Feed Channels ............................................................................................................................................... 6 Train Movements ............................................................................................................................................... 6 TD ...................................................................................................................................................................... 8 VSTP ................................................................................................................................................................. 8 RTPPM .............................................................................................................................................................. 9 TSR.................................................................................................................................................................... 9 SCHEDULE ..................................................................................................................................................... 10
5 Connecting to Data Feed Channels ............................................................................................................................ 21 5.1 5.1.1 5.1.2 5.1.3 5.2 6 6.1 6.2 6.2.1 6.2.2 6.3 6.3.1 6.3.2 6.3.3 6.3.4 6.3.5 6.3.6 ActiveMQ Topics .............................................................................................................................................. 21 Stomp Security................................................................................................................................................. 21 Working with Destinations with Stomp.............................................................................................................. 21 Connection Details ........................................................................................................................................... 21 Amazon S3 ...................................................................................................................................................... 21 Implementation Examples..................................................................................................................................... 23 Java ................................................................................................................................................................. 23 PHP ................................................................................................................................................................. 24 PHP Example................................................................................................................................................... 24 Durable Subscribers......................................................................................................................................... 24 Ruby ................................................................................................................................................................ 25 Overview .......................................................................................................................................................... 25 Example prerequisites...................................................................................................................................... 25 Configure the broker......................................................................................................................................... 25 Run the broker ................................................................................................................................................. 26 Run the Ruby listener ....................................................................................................................................... 26 Run the Ruby publisher .................................................................................................................................... 26
Example Ruby Client Code .............................................................................................................................. 27 Appendices........................................................................................................................................................... 28 Appendix 1 Sample Train Movement JSON Message................................................................................... 28 Appendix 2 Sample TD JSON Message ....................................................................................................... 32 Appendix 3 Sample VSTP JSON Message................................................................................................... 33 Appendix 4 Sample RTPPM JSON Message................................................................................................ 35 Appendix 5 Sample TSR JSON Message ..................................................................................................... 45 Appendix 6 Sample CIF JSON Message ...................................................................................................... 47
1 Introduction
The purpose of this document is to provide technical information on the Network Rail Data Feeds. This will cover the data formats and transport mechanisms, but does not cover how end users may interpret the information contained within the data feeds.
The TD feed (Train Describer) provides train positioning data at signal berth level. The VSTP (Very Short Term Planning) feed provides schedule records via the VSTP process (and thus not available via CIF). The RTPPM feed - Public Performance Measure shows the performance of trains against the timetable, measured as the percentage of trains arriving at destination. The TSR feed contains Temporary Speed Restrictions data. The Schedule feed is an extract of train schedules from the ITPS (Integration Train Planning System).
RTPPM
TSR SCHEDULE
Log in
Subscribe to Feeds
Download Data
The user account must be in Active status in order to be able to receive data from the feeds. If capacity exists on the Network Rail Data Feeds platform the account will be Active within 1 hour after registration. If the account is not used for 30 days then it will be automatically transitioned to the Inactive status and you will be able to access any data feeds. You can request reactivation of your account from the web application. Your account will only become Active if there is sufficient capacity on the system. If there is not sufficient capacity at the time of your request, your request will be queued and you will be automatically activated when free capacity becomes available. You will receive a confirmation email when the account becomes Active.
TRAIN_MVT_EF_TOC TRAIN_MVT_PF_TOC TRAIN_MVT_HA_TOC TRAIN_MVT_EA_TOC TRAIN_MVT_HV_TOC TRAIN_MVT_EC_TOC TRAIN_MVT_EE_TOC TRAIN_MVT_HM_TOC TRAIN_MVT_HZ_TOC TRAIN_MVT_EJ_TOC TRAIN_MVT_EK_TOC TRAIN_MVT_XC_TOC TRAIN_MVT_XE_TOC TRAIN_MVT_XB_TOC TRAIN_MVT_HE_TOC TRAIN_MVT_EB_TOC TRAIN_MVT_HB_TOC TRAIN_MVT_PG_TOC TRAIN_MVT_PR_TOC TRAIN_MVT_ED_TOC TRAIN_MVT_HU_TOC TRAIN_MVT_HW_TOC TRAIN_MVT_HY_TOC TRAIN_MVT_HO_TOC TRAIN_MVT_HF_TOC TRAIN_MVT_PA_TOC TRAIN_MVT_EI_TOC
First Great Western (EF) First Hull Trains (PF) First Scotrail (HA) First Transpennine Express (EA) Gatwick Express Ltd (HV) Grand Central (EC) Heathrow Connect (EE) Heathrow Express Ltd (HM) Island Lines (HZ) London Midland (EJ) London Overground (EK) LUL Bakerloo Line (XC) LUL District Line Richmond (XE) LUL District Line Wimbledon (XB) Merseyrail Electrics 2002 Ltd (HE) National Express East Anglia (EB) National Express East Coast (HB) Nexus (PG) North Yorkshire Moors Railway (PR) Northern Rail (ED) Southeastern (HU) Southern (HW) Stagecoach Sth Western Trains Ltd (HY) The Chiltern Railway Co. Ltd (HO) Virgin West Coast Trains (HF) West Coast Railway Co. (PA) Wrexham & Shropshire Railway (EI)
Examples of the Train Movements JSON message are available in Appendix 1 Sample
4.2 TD
The TD feed (Train Describer) provides train positioning data at signal berth level. This includes CA (Berth Step), CB (Berth Cancel), CC (Berth Interpose) and CT (Heartbeat) messages. The TD channels are real-time channels. This table shows the channels available on the TD data feed. Freight services are not included in these channels; only messages containing headcodes for classes 1, 2 and 9 are included in this feed.
Actual Channel Name TD_ALL_SIG_AREA TD_SE_SIG_AREA TD_SW_SIG_AREA TD_LNE_NE_SIG_AREA TD_MC_EM_SIG_AREA TD_LNE_GN_SIG_AREA TD_LNW_LC_SIG_AREA TD_LNW_C_SIG_AREA TD_LNW_WMC_SIG_AREA TD_WCS_SIG_AREA TD_ANG_SIG_AREA TD_KENT_MCC_SIG_AREA TD_SUSS_SIG_AREA TD_WESS_SIG_AREA TD_WTV_SIG_AREA TD_WWC_SIG_AREA TD_WWM_SIG_AREA All
Localised Name
Scotland East Scotland West LNE North Eastern M&C East Midlands LNE Great Northern LNW Lancs & Cumbria LNW Central LNW W.Mids & Chilterns West Coast South Anglia Kent & M&C Continental Sussex Wessex Western Thames Valley Western West Country Western Wales & Marches
4.3 VSTP
The VSTP (Very Short Term Planning) feed provides schedule records via the VSTP process (and thus not available via CIF). The VSTP channel is a real-time channel. Freight services are not included in these channels; only messages containing headcodes for classes 1, 2 and 9 are included in this feed. This table shows the channels available on the VSTP feed. Actual Channel Name VSTP_ALL Localised Name All
An example of the VSTP JSON message is available in Appendix 3 Sample VSTP JSON Message
4.4 RTPPM
The RTPPM feed - Public Performance Measure shows the performance of trains against the timetable, measured as the percentage of trains arriving at destination. The RTPPM channel is a real-time channel. Freight services are not included in this channel; all messages containing FOC codes are filtered out of the channel.
An example of the RTPPM JSON message is available in Appendix 4 Sample RTPPM JSON
The TSR feed contains Temporary Speed Restrictions data. The TSR channel is a real-time channel. This table shows the channels available on the TSR feed. Actual Channel Name TSR_ALL_ROUTE TSR_ANG_ROUTE TSR_WEST_ROUTE TSR_KENT_SUSS_ROUTE TSR_WESS_ROUTE All Anglia Western Kent & Sussex Wessex Localised Name
10
Scotland London North Eastern (South) London North Eastern (Central) London North Eastern (North) London North Western (South) London North Western (North) East Midlands
An example of the TD JSON message is available in Appendix 5 Sample TSR JSON Message
4.6 SCHEDULE
The Schedule feed is an extract of train schedules from the Integration Train Planning System. The Schedule channel is a semi-static channel and information is published onto Amazons S3 server. There are different buckets which store full and daily updates either for all TOCs or broken down per TOC. A daily full schedule file is available to be downloaded, either for all TOCs or on an individual TOC basis. A "full schedule" is a snapshot of the timetable database. It will contain any schedule whose end date is the current day or earlier. The update files, also available for all TOCs or individual TOCs, are the differences between the current days and the previous days files. Update files need to be applied in order, starting with a full schedule. If you apply a full schedule update on a Monday you then need to apply Tuesdays update, then Wednesdays, and so on. At any time you can clear out your timetable database, take a full extract and then keep up to date with the daily updates from then on. Freight services are not included in the schedule; all messages containing FOC codes are filtered out. The below table shows the structure and file name convention. The files are compressed using gzip.
11
toc-update-sun.json.gz CIF_HL_FULL_DAILY CIF_HL_UPDATE_DAILY toc-full.json.gz toc-update-mon.json.gz toc-update-tue.json.gz toc-update-wed.json.gz toc-update-thu.json.gz toc-update-fri.json.gz toc-update-sat.json.gz toc-update-sun.json.gz CIF_HT_FULL_DAILY CIF_HT_UPDATE_DAILY toc-full.json.gz toc-update-mon.json.gz toc-update-tue.json.gz toc-update-wed.json.gz toc-update-thu.json.gz toc-update-fri.json.gz toc-update-sat.json.gz toc-update-sun.json.gz CIF_EH_FULL_DAILY CIF_EH_UPDATE_DAILY toc-full.json.gz toc-update-mon.json.gz toc-update-tue.json.gz toc-update-wed.json.gz toc-update-thu.json.gz toc-update-fri.json.gz toc-update-sat.json.gz toc-update-sun.json.gz CIF_EN_FULL_DAILY CIF_EN_UPDATE_DAILY toc-full.json.gz toc-update-mon.json.gz toc-update-tue.json.gz toc-update-wed.json.gz toc-update-thu.json.gz Devon & Cornwall Railways (EN) CrossCountry (EH) c2c (HT) Arriva Trains Wales (HL)
12
toc-update-fri.json.gz toc-update-sat.json.gz toc-update-sun.json.gz CIF_EM_FULL_DAILY CIF_EM_UPDATE_DAILY toc-full.json.gz toc-update-mon.json.gz toc-update-tue.json.gz toc-update-wed.json.gz toc-update-thu.json.gz toc-update-fri.json.gz toc-update-sat.json.gz toc-update-sun.json.gz CIF_GA_FULL_DAILY CIF_GA_UPDATE_DAILY toc-full.json.gz toc-update-mon.json.gz toc-update-tue.json.gz toc-update-wed.json.gz toc-update-thu.json.gz toc-update-fri.json.gz toc-update-sat.json.gz toc-update-sun.json.gz CIF_XJ_FULL_DAILY CIF_XJ_UPDATE_DAILY toc-full.json.gz toc-update-mon.json.gz toc-update-tue.json.gz toc-update-wed.json.gz toc-update-thu.json.gz toc-update-fri.json.gz toc-update-sat.json.gz toc-update-sun.json.gz CIF_EG_FULL_DAILY CIF_EG_UPDATE_DAILY toc-full.json.gz toc-update-mon.json.gz toc-update-tue.json.gz First Capital Connect (EG) Ffestiniog Railway (XJ) Eurostar (UK) Ltd (GA) East Midlands Trains (EM)
13
toc-update-wed.json.gz toc-update-thu.json.gz toc-update-fri.json.gz toc-update-sat.json.gz toc-update-sun.json.gz CIF_EF_FULL_DAILY CIF_EF_UPDATE_DAILY toc-full.json.gz toc-update-mon.json.gz toc-update-tue.json.gz toc-update-wed.json.gz toc-update-thu.json.gz toc-update-fri.json.gz toc-update-sat.json.gz toc-update-sun.json.gz CIF_PF_FULL_DAILY CIF_PF_UPDATE_DAILY toc-full.json.gz toc-update-mon.json.gz toc-update-tue.json.gz toc-update-wed.json.gz toc-update-thu.json.gz toc-update-fri.json.gz toc-update-sat.json.gz toc-update-sun.json.gz CIF_HA_FULL_DAILY CIF_HA_UPDATE_DAILY toc-full.json.gz toc-update-mon.json.gz toc-update-tue.json.gz toc-update-wed.json.gz toc-update-thu.json.gz toc-update-fri.json.gz toc-update-sat.json.gz toc-update-sun.json.gz CIF_EA_FULL_DAILY toc-full.json.gz First Transpennine Express (EA) First Scotrail (HA) First Hull Trains (PF) First Great Western (EF)
14
CIF_EA_UPDATE_DAILY
CIF_HV_FULL_DAILY CIF_HV_UPDATE_DAILY
CIF_EC_FULL_DAILY CIF_EC_UPDATE_DAILY
CIF_EE_FULL_DAILY CIF_EE_UPDATE_DAILY
15
toc-update-sun.json.gz CIF_HM_FULL_DAILY CIF_HM_UPDATE_DAILY toc-full.json.gz toc-update-mon.json.gz toc-update-tue.json.gz toc-update-wed.json.gz toc-update-thu.json.gz toc-update-fri.json.gz toc-update-sat.json.gz toc-update-sun.json.gz CIF_HZ_FULL_DAILY CIF_HZ_UPDATE_DAILY toc-full.json.gz toc-update-mon.json.gz toc-update-tue.json.gz toc-update-wed.json.gz toc-update-thu.json.gz toc-update-fri.json.gz toc-update-sat.json.gz toc-update-sun.json.gz CIF_EJ_FULL_DAILY CIF_EJ_UPDATE_DAILY toc-full.json.gz toc-update-mon.json.gz toc-update-tue.json.gz toc-update-wed.json.gz toc-update-thu.json.gz toc-update-fri.json.gz toc-update-sat.json.gz toc-update-sun.json.gz CIF_EK_FULL_DAILY CIF_EK_UPDATE_DAILY toc-full.json.gz toc-update-mon.json.gz toc-update-tue.json.gz toc-update-wed.json.gz toc-update-thu.json.gz London Overground (EK) London Midland (EJ) Island Lines (HZ) Heathrow Express Ltd (HM)
16
toc-update-fri.json.gz toc-update-sat.json.gz toc-update-sun.json.gz CIF_XC_FULL_DAILY CIF_XC_UPDATE_DAILY toc-full.json.gz toc-update-mon.json.gz toc-update-tue.json.gz toc-update-wed.json.gz toc-update-thu.json.gz toc-update-fri.json.gz toc-update-sat.json.gz toc-update-sun.json.gz CIF_XE_FULL_DAILY CIF_XE_UPDATE_DAILY toc-full.json.gz toc-update-mon.json.gz toc-update-tue.json.gz toc-update-wed.json.gz toc-update-thu.json.gz toc-update-fri.json.gz toc-update-sat.json.gz toc-update-sun.json.gz CIF_XB_FULL_DAILY CIF_XB_UPDATE_DAILY toc-full.json.gz toc-update-mon.json.gz toc-update-tue.json.gz toc-update-wed.json.gz toc-update-thu.json.gz toc-update-fri.json.gz toc-update-sat.json.gz toc-update-sun.json.gz CIF_HE_FULL_DAILY CIF_HE_UPDATE_DAILY toc-full.json.gz toc-update-mon.json.gz toc-update-tue.json.gz Merseyrail Electrics 2002 Ltd (HE) LUL District Line Wimbledon (XB) LUL District Line Richmond (XE) LUL Bakerloo Line (XC)
17
toc-update-wed.json.gz toc-update-thu.json.gz toc-update-fri.json.gz toc-update-sat.json.gz toc-update-sun.json.gz CIF_EB_FULL_DAILY CIF_EB_UPDATE_DAILY toc-full.json.gz toc-update-mon.json.gz toc-update-tue.json.gz toc-update-wed.json.gz toc-update-thu.json.gz toc-update-fri.json.gz toc-update-sat.json.gz toc-update-sun.json.gz CIF_HB_FULL_DAILY CIF_HB_UPDATE_DAILY toc-full.json.gz toc-update-mon.json.gz toc-update-tue.json.gz toc-update-wed.json.gz toc-update-thu.json.gz toc-update-fri.json.gz toc-update-sat.json.gz toc-update-sun.json.gz CIF_PG_FULL_DAILY CIF_PG_UPDATE_DAILY toc-full.json.gz toc-update-mon.json.gz toc-update-tue.json.gz toc-update-wed.json.gz toc-update-thu.json.gz toc-update-fri.json.gz toc-update-sat.json.gz toc-update-sun.json.gz CIF_PR_FULL_DAILY toc-full.json.gz North Yorkshire Moors Railway Nexus (PG) National Express East Coast (HB) National Express East Anglia (EB)
18
CIF_PR_UPDATE_DAILY
(PR)
CIF_ED_FULL_DAILY CIF_ED_UPDATE_DAILY
CIF_HU_FULL_DAILY CIF_HU_UPDATE_DAILY
Southeastern (HU)
CIF_HW_FULL_DAILY CIF_HW_UPDATE_DAILY
Southern (HW)
19
toc-update-sun.json.gz CIF_HY_FULL_DAILY CIF_HY_UPDATE_DAILY toc-full.json.gz toc-update-mon.json.gz toc-update-tue.json.gz toc-update-wed.json.gz toc-update-thu.json.gz toc-update-fri.json.gz toc-update-sat.json.gz toc-update-sun.json.gz CIF_HO_FULL_DAILY CIF_HO_UPDATE_DAILY toc-full.json.gz toc-update-mon.json.gz toc-update-tue.json.gz toc-update-wed.json.gz toc-update-thu.json.gz toc-update-fri.json.gz toc-update-sat.json.gz toc-update-sun.json.gz CIF_HF_FULL_DAILY CIF_HF_UPDATE_DAILY toc-full.json.gz toc-update-mon.json.gz toc-update-tue.json.gz toc-update-wed.json.gz toc-update-thu.json.gz toc-update-fri.json.gz toc-update-sat.json.gz toc-update-sun.json.gz CIF_PA_FULL_DAILY CIF_PA_UPDATE_DAILY toc-full.json.gz toc-update-mon.json.gz toc-update-tue.json.gz toc-update-wed.json.gz toc-update-thu.json.gz West Coast Railway Co. (PA) Virgin West Coast Trains (HF) The Chiltern Railway Co. Ltd (HO) Stagecoach Sth Western Trains Ltd (HY)
20
toc-update-fri.json.gz toc-update-sat.json.gz toc-update-sun.json.gz CIF_EI_FULL_DAILY CIF_EI_UPDATE_DAILY toc-full.json.gz toc-update-mon.json.gz toc-update-tue.json.gz toc-update-wed.json.gz toc-update-thu.json.gz toc-update-fri.json.gz toc-update-sat.json.gz toc-update-sun.json.gz Wrexham & Shropshire Railway (EI)
21
ActiveMQ Topics distribute the message-based data sources; namely Train Movements, TD, VSTP, TSR & RTPPM. Topics are a Publish-Subscribe design pattern that enables many clients to subscribe to a single channel with READ access. This is a one-to-many broadcast mechanism. The channels will be output using the Stomp protocol.
5.1.1
Stomp Security
Stomp implementation fully supports an ActiveMQ security mechanism. This means that the CONNECT command will return an ERROR frame on unsuccessful authentication. Also, the authorization policies will be applied when you try to access (read/write) certain destinations. If you use synchronous operations (by using receipts) you can expect an ERROR frame in case of unauthorized access attempt. In other case, operations will be discarded but the client will not be informed of errors. This also stands for all other errors that can happen on the broker side. 5.1.2 Working with Destinations with Stomp
Note that the prefix in stomp /queue/ or /topic/ is removed from the string before passing it to ActiveMQ as a JMS destination. Also note that the default separator in MOM systems is. (DOT). So DATA.FEEDS is the normal syntax of a MOM queue - the Stomp equivalent would be /queue/DATA.FEEDS Be careful about starting destinations with / . For those familiar with JMS, where you would use data/feeds, in JMS, you would use /queue/data/feeds in Stomp. 5.1.3 Connection Details
To connect to the topics using Stomp use the following details: Hostname: datafeeds.networkrail.co.uk Port: 61618
5.2 Amazon S3
The files from the SCHEDULE feed are stored on Amazons Simple Storage Service (S3) and can be accessible from https://datafeeds.networkrail.co.uk. The requests are automatically redirected to Amazon S3. The users will have to be subscribed to the correct file that they are trying to access. If they are subscribed they will be able to download the files by navigating to https://datafeeds.networkrail.co.uk/ntrod/CifFileAuthenticate and passing the following parameters:
22
Type: Bucket name in section 4.6 SCHEDULE (directory). Day: The user needs to use this parameter to specify the day to download for the updates. Please see examples below. If a user wishes to download more than one day will have to do it in different requests.
Example 1: Downloading Monday update for all TOCs: https://datafeeds.networkrail.co.uk/ntrod /CifFileAuthenticate?type=CIF_ALL_UPDATE_DAILY&day=tocupdate-mon Example 2: Downloading full daily for Northern Rail: https://datafeeds.networkrail.co.uk/ntrod /CifFileAuthenticate?type=CIF_ED_FULL_DAILY&day=toc-full
As this is using the Amazon service by co-locating on the Amazon cloud you will be able to benefit from reduced costs and improved performance.
23
6 Implementation Examples
This section contains information on how to implement a Stomp client using Java, PHP and Ruby to connect to the Data Feeds. When connecting you will need to use the username/password you used to subscribe to the feeds in the Web Application. The system takes absolute credential values for authentication validation so ensure that there are no additional space characters when trying to authenticate. The Security Token is currently not required. The examples assume that you have subscribed to the TRAIN_MVT_ALL_TOC data feed in the Web Application.
6.1 Java
Since version 5.2, there is a simple Java Stomp API distributed with ActiveMQ. The following code snippet provides a simple example of using this API:
StompConnection connection = new StompConnection(); connection.open("datafeeds.networkrail.co.uk", 61618); connection.connect("system", "manager"); StompFrame connect = connection.receive(); if (!connect.getAction().equals(Stomp.Responses.CONNECTED)) { throw new Exception ("Not connected"); } connection.begin("tx1"); connection.send("/topic/TRAIN_MVT_ALL_TOC", "message1", "tx1", null); connection.send("/topic/TRAIN_MVT_ALL_TOC", "message2", "tx1", null); connection.commit("tx1"); connection.subscribe("/topic/TRAIN_MVT_ALL_TOC", Subscribe.AckModeValues.CLIENT); connection.begin("tx2"); StompFrame message = connection.receive(); System.out.println(message.getBody()); connection.ack(message, "tx2"); message = connection.receive(); System.out.println(message.getBody()); connection.ack(message, "tx2"); connection.commit("tx2"); connection.disconnect();
This example is distributed with the ActiveMQ distribution. You can run it from the example folder with ant stomp
24
6.2 PHP
Obtain the source of the library by downloading the distribution and add its content to your include_path. Alternatively, you can grab the source and add src/main folder to your include_path. Examples are located in src/examples folder. Before running them, be sure you have installed this library properly and you have started ActiveMQ broker (recommended version 5.5.0 or higher) with Stomp connector enabled. You can start the first example by running
Also, be sure to check comments in the particular examples for some special configuration steps (if needed). 6.2.1 PHP Example
The simplest example shows how you can connect to the ActiveMQ message broker and send/receive a message from the queue. <? // include a library require_once("Stomp.php"); // make a connection $con = new Stomp("tcp://datafeeds.networkrail.co.uk:61618"); // connect $con->connect(); // subscribe to the topic $con->subscribe("/topic/TRAIN_MVT_ALL_TOC"); // receive a message from the topic $msg = $con->readFrame(); // do what you want with the message if ( $msg != null) { echo "Received message with body '$msg->body'\n"; // mark the message as received in the queue $con->ack($msg); } else { echo "Failed to receive a message\n"; } // disconnect $con->disconnect(); ?> 6.2.2 Durable Subscribers
25
Durable topic subscribers are not part of the Stomp protocol, but an ActiveMQ feature that allow topic subscribers to receive messages sent to the topic while there were offline. Stomp protocol implementation in ActiveMQ enables this feature for Stomp subscribers as well. To use this feature, first you need to define a client id your consumer will use, like this <? $consumer = new Stomp("tcp://datafeeds.networkrail.co.uk:61618"); $consumer->clientId = "test"; ?> Next, you client need to provide this id while subscribing to the topic. This is done by passing special activemq.subcriptionName header along with the SUBSCRIBE frame. But once, you've set the client id to your consumer, PHP Stomp client will do this work for you. So you can subscribe to the topic, just as you'd normally do <? $consumer->subscribe("/topic/TRAIN_MVT_ALL_TOC"); ?>
6.3 Ruby
6.3.1 Overview
This is sample code in ActiveMQInstallDir/example/ruby that enables you to experiment with the Stomp protocol in the Ruby programming language. 6.3.2 Example prerequisites
You must download and install the requisite packages to support the Ruby programming language before you can run the Stomp example. Install the following packages:
Ruby programming languagedownload and install the Ruby programming language from http://www.ruby-lang.org/en/downloads. Add the Ruby /bin directory to your PATH. RubyGems package managerRubyGems (http://www.rubygems.org) is a utility for installing and managing add-ons to the Ruby language. Download and install RubyGems as follows: 1. Download a RubyGems archive file (.tgz, .zip, or .gem) from the RubyForge (http://rubyforge.org/frs/?group_id=126). 2. Unzip the RubyGems archive. 3. Initialize RubyGems by entering the following command: ruby GemsInstallDir/setup.rb
4. Add GemsInstallDir/bin to your PATH. Stomp package for Rubyinstall the Stomp package for Ruby by running the following command:
gem install stomp RubyGems downloads and installs the requisite package to support the Ruby Stomp client API.
To try out the Stomp protocol, perform the following steps. 6.3.3 Configure the broker
Check that the the Stomp connector is present in the broker configuration file (in InstallDir/conf/activemq.xml) as follows:
26
<beans> ... <transportConnectors> ... <transportConnector uri="stomp://datafeeds.networkrail.co.uk:61618"/> </transportConnectors> ... </beans> 6.3.4 Run the broker
name="stomp"
activemq
The default broker automatically takes its configuration from the default configuration file.
Note The activemq script automatically sets the ACTIVEMQ_HOME and ACTIVEMQ_BASE environment variables to FuseInstallDir/fuse-messagebroker-Version by default. If you want the activemq script to pick up its configuration from a nondefault conf directory, you can set ACTIVEMQ_BASE explicitly in your environment. The configuration files will then be taken from $ACTIVEMQ_BASE/conf.
6.3.5
To connect the listener tool to the stomp://hostname:port endpoint (Stomp over TCP), change directory to ActiveMQInstallDir/example/ruby and enter the following command:
ruby listener.rb
They Ruby listener connects to the endpoint, stomp://hostname:port, by default. You could change this endpoint address by editing the listener.rb script. 6.3.6 Run the Ruby publisher
To connect the publisher tool to the stomp://hostname:port endpoint (Stomp over TCP), change directory to ActiveMQInstallDir/example/ruby and enter the following command: ruby publisher.rb You should see some output like the following: Sent 1000 messages Sent 2000 messages Sent 3000 messages Sent 4000 messages Sent 5000 messages Sent 6000 messages Sent 7000 messages Sent 8000 messages Sent 9000 messages Sent 10000 messages Received report: Received 10000 in 4.567 seconds, remaining: 9
27
6.3.7
require 'rubygems' require 'stomp' begin @port = 61618 @host = "datafeeds.networkrail.co.uk" @user = ENV["STOMP_USER"]; @password = ENV["STOMP_PASSWORD"] @host = ENV["STOMP_HOST"] if ENV["STOMP_HOST"] != NIL @port = ENV["STOMP_PORT"] if ENV["STOMP_PORT"] != NIL @destination = "/topic/TRAIN_MVT_ALL_TOC" @destination = $*[0] if $*[0] != NIL $stderr.print "Connecting to stomp://#{@host}:#{@port} as #{@user}\n" @conn = Stomp::Connection.open @user, @password, @host, @port, true $stderr.print "Getting output from #{@destination}\n" @conn.subscribe @destination, { :ack =>"client" } while true @msg = @conn.receive $stdout.print @msg.body $stdout.flush @conn.ack @msg.headers["message-id"] end @conn.disconnect rescue end
28
7 Appendices
7.1 Appendix 1 Sample Train Movement JSON Message
Message 1 0001 Activation Message { "header": { "msg_type": "0001", "source_dev_id": "E0000000", "user_id": "NETWORK9", "original_data_source": "TOPS", "msg_queue_timestamp": "1263825942000", "source_system_id": "TRUST" }, "body": { "schedule_source": "V", "train_file_address": "001", "schedule_end_date": "2006-06-09", "train_id": "1214567890", "tp_origin_timestamp": "2006-02-08", "creation_timestamp": "1170937266000", "tp_origin_stanox": "", "origin_dep_timestamp": "1170928800000", "train_service_code": "22112001", "toc_id": "65", "d1266_record_number": "00230", "train_call_type": "AUTOMATIC", "train_uid": "C12664", "train_call_mode": "NORMAL", "schedule_type": "P", "sched_origin_stanox": "07257", "schedule_wtt_id": "1M99M", "schedule_start_date": "2005-12-12" } }
Message 2 0002 Cancellation { "header": { "msg_type": "0002", "source_dev_id": "VRX6", "user_id": "#QRP4099", "original_data_source": "SDR", "msg_queue_timestamp": "1286962693000", "source_system_id": "TRUST" }, "body": { "train_file_address": null, "train_service_code": "24680004", "orig_loc_stanox": "", "toc_id": "91", "dep_timestamp": "1286960880000", "division_code": "91",
29
"loc_stanox": "72359", "canx_timestamp": "1286966280000", "canx_reason_code": "TX", "train_id": "722H36ME13", "orig_loc_timestamp": "", "canx_type": "AT ORIGIN" } } Message 3 0003 Train Movement { "header": { "msg_type": "0003", "source_dev_id": "VDVF", "user_id": "#CF1CV26", "original_data_source": "SDR", "msg_queue_timestamp": "1263825971000", "source_system_id": "TRUST" }, "body": { "event_type": "ARRIVAL", "gbtt_timestamp": "1167905726000", "original_loc_stanox": "", "planned_timestamp": "1136369727000", "timetable_variation": "0", "original_loc_timestamp": "", "current_train_id": "", "delay_monitoring_point": "true", "next_report_run_time": "", "reporting_stanox": "42140", "actual_timestamp": "1167905725000", "correction_ind": "false", "event_source": "MANUAL", "train_file_address": "7JK", "platform": "AA", "division_code": "71", "train_terminated": "true", "train_id": "1214567890", "offroute_ind": "false", "variation_status": "ON TIME", "train_service_code": "22340000", "toc_id": "71", "loc_stanox": "42140", "auto_expected": "true", "direction_ind": "", "route": "0", "planned_event_type": "DESTINATION", "next_report_stanox": "", "line_ind": "" } } Message 4 0004 Unidentified Train { "header": { "msg_type": "0004",
30
"source_dev_id": "CCCCDDEE", "user_id": "AAAABBCC", "original_data_source": "ABCDEFGHIJKLMNOPQNNN", "msg_queue_timestamp": "1263825998000", "source_system_id": "ABCDEFGHIJKLMNOPQMMM" }, "body": { "platform": "12", "division_code": "A", "loc_stanox": "12345", "route": "A", "direction_ind": "UP", "event_type": "ARRIVAL", "line_ind": "F", "wtt_id": "1234", "event_timestamp": "1172830525000" } } Message 5 0005 Train Reinstatement { "header": { "msg_type": "0005", "source_dev_id": "VDVF", "user_id": "#CF1CV26", "original_data_source": "SDR", "msg_queue_timestamp": "1263826017000", "source_system_id": "TRUST" }, "body": { "current_train_id": "651F45MN08", "original_loc_timestamp": "", "train_file_address": "899", "train_service_code": "22300003", "toc_id": "71", "dep_timestamp": "1173192480000", "division_code": "66", "loc_stanox": "42140", "train_id": "1214567890", "original_loc_stanox": "", "reinstatement_timestamp": "1173197040000" } } Message 6 0006 Train Change of Origin { "header": { "msg_type": "0006", "source_dev_id": "LUAM", "user_id": "#CF1CV26", "original_data_source": "TRUST DA", "msg_queue_timestamp": "1263826048000", "source_system_id": "TRUST" }, "body": { "reason_code": "AA",
31
"current_train_id": "1294567899", "original_loc_timestamp": "1172852700000", "train_file_address": "8MV", "train_service_code": "22108001", "toc_id": "71", "dep_timestamp": "1141312680000", "coo_timestamp": "1172852700000", "division_code": "06", "loc_stanox": "65311", "train_id": "1214567890", "original_loc_stanox": "" } } Message 7 0007 Train Change of Identity { "header": { "msg_type": "0007", "source_dev_id": "CY99996", "user_id": "", "original_data_source": "TOPS", "msg_queue_timestamp": "1263826847000", "source_system_id": "TRUST" }, "body": { "current_train_id": "422P182Q08", "train_file_address": "005", "train_service_code": "22320003", "revised_train_id": "422X112Q08", "train_id": "1214567890", "event_timestamp": "1172849234000" } } Message 8 0008 Train Change of Location { "header": { "msg_type": "0008", "source_dev_id": "CCCCDDEE", "user_id": "AAAABBCC", "original_data_source": "ABCDEFGHIJKLMNOPQNNN", "msg_queue_timestamp": "1263826911000", "source_system_id": "ABCDEFGHIJKLMNOPQMMM" }, "body": { "original_loc_timestamp": "1136369726000", "current_train_id": "", "train_file_address": "ABC", "train_service_code": "ABCDEFGH", "dep_timestamp": "1172830526000", "loc_stanox": "12345", "train_id": "1214567890", "original_loc_stanox": "12345", "event_timestamp": "1172830525000" } }
32
CA Message { "CA_MSG": { "to": "0041", "time": "1338289664000", "area_id": "LB", "msg_type": "CA", "from": "0033", "descr": "2T33" } }
CB Message { "CB_MSG": { "time": "1338289665000", "area_id": "SK", "msg_type": "CB", "from": "4333", "descr": "1U29" } } CC Message { "CC_MSG": { "to": "FN13", "time": "1338289665000", "area_id": "ZG", "msg_type": "CC", "descr": "1A40" } }
CT Message { "CT_MSG": { "time": "1338289669000", "area_id": "WJ", "msg_type": "CT", "report_time": "0842" } }
33
34
"CIF_performance_allowance": "", "location": { "tiploc": { "tiploc_id": "LEEDS" } } }, { "scheduled_arrival_time": "135630", "scheduled_departure_time": "135700", "scheduled_pass_time": "", "public_arrival_time": "135700", "public_departure_time": "135700", "CIF_platform": "", "CIF_line": "", "CIF_path": "", "CIF_activity": "", "CIF_engineering_allowance": "", "CIF_pathing_allowance": "", "CIF_performance_allowance": "", "location": { "tiploc": { "tiploc_id": "HTNRIBL" } } }, { "scheduled_arrival_time": "150400", "scheduled_departure_time": "150430", "scheduled_pass_time": "", "public_arrival_time": "150400", "public_departure_time": "150400", "CIF_platform": "", "CIF_line": "", "CIF_path": "", "CIF_activity": "", "CIF_engineering_allowance": "", "CIF_pathing_allowance": "", "CIF_performance_allowance": "", "location": { "tiploc": { "tiploc_id": "LAZKRKO" } } }, { "scheduled_arrival_time": "153200", "scheduled_departure_time": "", "scheduled_pass_time": "", "public_arrival_time": "154200", "public_departure_time": "", "CIF_platform": "", "CIF_line": "", "CIF_path": "", "CIF_activity": "TF", "CIF_engineering_allowance": "", "CIF_pathing_allowance": "", "CIF_performance_allowance": "",
35
36
"text":"92" }, "RollingPPM":{ "trendInd":"-", "rag":"A", "text":"91" } }, "Sector":[ { "sectorDesc":"London and South East", "sectorCode":"LSE", "SectorPPM":{ "Total":"2548", "OnTime":"2374", "Late":"174", "CancelVeryLate":"45", "PPM":{ "rag":"G", "text":"93" }, "RollingPPM":{ "trendInd":"-", "rag":"G", "text":"92" } } }, { "sectorDesc":"Long Distance", "sectorCode":"LD", "SectorPPM":{ "Total":"267", "OnTime":"259", "Late":"8", "CancelVeryLate":"2", "PPM":{ "rag":"G", "text":"97" }, "RollingPPM":{ "trendInd":"=", "rag":"G", "text":"97" } } }, { "sectorDesc":"Regional", "sectorCode":"REG", "SectorPPM":{ "Total":"1164", "OnTime":"1071", "Late":"93", "CancelVeryLate":"30", "PPM":{ "rag":"G", "text":"92" }, "RollingPPM":{ "trendInd":"-", "rag":"A", "text":"91" } } }, {
37
"sectorDesc":"Scotland", "sectorCode":"SCO", "SectorPPM":{ "Total":"432", "OnTime":"367", "Late":"65", "CancelVeryLate":"7", "PPM":{ "rag":"R", "text":"84" }, "RollingPPM":{ "trendInd":"-", "rag":"R", "text":"82" } } } ], "Operator":[ { "code":"27", "keySymbol":"*", "name":"CrossCountry", "Total":"45", "PPM":{ "rag":"G", "text":"100" }, "RollingPPM":{ "trendInd":"=", "displayFlag":"Y", "rag":"G", "text":"100" } }, { "code":"24", "keySymbol":"^", "name":"Heathrow Connect", "Total":"19", "PPM":{ "rag":"G", "text":"100" }, "RollingPPM":{ "trendInd":"=", "displayFlag":"Y", "rag":"G", "text":"100" } }, { "code":"20", "keySymbol":"*", "name":"Transpennine Express", "Total":"55", "PPM":{ "rag":"G", "text":"100" }, "RollingPPM":{ "trendInd":"=", "displayFlag":"Y", "rag":"G", "text":"100" }
38
}, { "code":"74", "keySymbol":"^", "name":"Chiltern", "Total":"80", "PPM":{ "rag":"G", "text":"98" }, "RollingPPM":{ "trendInd":"+", "displayFlag":"Y", "rag":"G", "text":"100" } }, { "code":"28", "keySymbol":"", "name":"East Midlands Trains", "Total":"88", "PPM":{ "rag":"G", "text":"98" }, "RollingPPM":{ "trendInd":"=", "displayFlag":"Y", "rag":"G", "text":"98" } }, { "code":"30", "keySymbol":"^", "name":"London Overground", "Total":"189", "PPM":{ "rag":"G", "text":"97" }, "RollingPPM":{ "trendInd":"=", "displayFlag":"Y", "rag":"G", "text":"97" } }, { "code":"61", "keySymbol":"*", "name":"East Coast", "Total":"23", "PPM":{ "rag":"G", "text":"95" }, "RollingPPM":{ "trendInd":"-", "displayFlag":"Y", "rag":"G", "text":"94" } }, { "code":"84",
39
"keySymbol":"^", "name":"South West Trains", "Total":"325", "PPM":{ "rag":"G", "text":"95" }, "RollingPPM":{ "trendInd":"-", "displayFlag":"Y", "rag":"G", "text":"92" } }, { "code":"79", "keySymbol":"^", "name":"c2c", "Total":"89", "PPM":{ "rag":"G", "text":"95" }, "RollingPPM":{ "trendInd":"+", "displayFlag":"Y", "rag":"G", "text":"100" } }, { "code":"26", "keySymbol":"^", "name":"First Capital Connect", "Total":"222", "PPM":{ "rag":"G", "text":"93" }, "RollingPPM":{ "trendInd":"+", "displayFlag":"Y", "rag":"G", "text":"96" } }, { "code":"25", "keySymbol":"", "name":"First Great Western", "Total":"305", "PPM":{ "rag":"G", "text":"93" }, "RollingPPM":{ "trendInd":"+", "displayFlag":"Y", "rag":"G", "text":"95" } }, { "code":"29", "keySymbol":"^", "name":"London Midland", "Total":"260",
40
"PPM":{ "rag":"G", "text":"93" }, "RollingPPM":{ "trendInd":"-", "displayFlag":"Y", "rag":"A", "text":"91" } }, { "code":"23", "keySymbol":"^", "name":"Northern Rail", "Total":"506", "PPM":{ "rag":"G", "text":"93" }, "RollingPPM":{ "trendInd":"+", "displayFlag":"Y", "rag":"G", "text":"94" } }, { "code":"80", "keySymbol":"^", "name":"Southeastern", "Total":"491", "PPM":{ "rag":"G", "text":"93" }, "RollingPPM":{ "trendInd":"-", "displayFlag":"Y", "rag":"A", "text":"91" } }, { "code":"82", "keySymbol":"^", "name":"Southern", "Total":"503", "PPM":{ "rag":"G", "text":"92" }, "RollingPPM":{ "trendInd":"+", "displayFlag":"Y", "rag":"G", "text":"94" } }, { "code":"64", "keySymbol":"^", "name":"Merseyrail", "Total":"121", "PPM":{ "rag":"A", "text":"90"
41
}, "RollingPPM":{ "trendInd":"-", "displayFlag":"Y", "rag":"R", "text":"87" } }, { "code":"71", "keySymbol":"^", "name":"Arriva Trains Wales", "Total":"177", "PPM":{ "rag":"A", "text":"89" }, "RollingPPM":{ "trendInd":"-", "displayFlag":"Y", "rag":"R", "text":"88" } }, { "code":"65", "keySymbol":"*", "name":"Virgin Trains", "Total":"47", "PPM":{ "rag":"A", "text":"89" }, "RollingPPM":{ "trendInd":"-", "displayFlag":"Y", "rag":"R", "text":"88" } }, { "code":"21", "keySymbol":"", "name":"Greater Anglia", "Total":"430", "PPM":{ "rag":"R", "text":"85" }, "RollingPPM":{ "trendInd":"-", "displayFlag":"Y", "rag":"R", "text":"83" } }, { "code":"60", "keySymbol":"^", "name":"First ScotRail", "Total":"432", "PPM":{ "rag":"R", "text":"84" }, "RollingPPM":{ "trendInd":"-",
42
"displayFlag":"Y", "rag":"R", "text":"82" } }, { "code":"HX", "keySymbol":"", "name":"Thameslink", "Total":"0", "PPM":{ "rag":"W", "text":"-1" }, "RollingPPM":{ "displayFlag":"Y", "rag":"W", "text":"-1" } } ] }, "OOCPage":{ "WebDisplayPeriod":"30", "WebFixedMsg1":"The Public Performance Measure shows the performance of trains against the timetable, measured as the percentage of trains arriving at destination 'on time'. ^<5 mins; *<10 mins", "WebFixedMsg2":null, "Operator":[ { "code":"86", "keySymbol":"", "name":"Heathrow Express", "Total":"71", "PPM":{ "rag":"G", "text":"100" }, "RollingPPM":{ "trendInd":"=", "displayFlag":"Y", "rag":"G", "text":"100" } }, { "code":"55", "keySymbol":"*", "name":"Hull Trains", "Total":"1", "PPM":{ "rag":"W", "text":"-1" }, "RollingPPM":{ "displayFlag":"Y", "rag":"W", "text":"-1" } }, { "code":"06", "keySymbol":"", "name":"Eurostar", "Total":"10", "PPM":{ "rag":"A",
43
"text":"90" }, "RollingPPM":{ "trendInd":"-", "displayFlag":"Y", "rag":"R", "text":"85" } }, { "code":"22", "keySymbol":"*", "name":"Grand Central", "Total":"0", "PPM":{ "rag":"W", "text":"-1" }, "RollingPPM":{ "displayFlag":"Y", "rag":"W", "text":"-1" } } ] }, "CommonOperatorPage":{ "WebDisplayPeriod":"60", "WebFixedMsg1":"The Public Performance Measure shows the performance of trains against the timetable, measured as the percentage of trains arriving at destination 'on time'. ^<5 mins; *<10 mins", "WebFixedMsg2":null }, "OperatorPage":[ { "Operator":{ "code":"22", "keySymbol":"*", "name":"Grand Central", "Total":"0", "OnTime":"0", "Late":"0", "CancelVeryLate":"0", "PPM":{ "rag":"W", "text":"-1" }, "RollingPPM":{ "displayFlag":"Y", "rag":"W", "text":"-1" } } }, { "Operator":{ "code":"HX", "keySymbol":"", "name":"Thameslink", "Total":"0", "OnTime":"0", "Late":"0", "CancelVeryLate":"0", "PPM":{ "rag":"W", "text":"-1" },
44
"RollingPPM":{ "displayFlag":"Y", "rag":"W", "text":"-1" } } }, { "Operator":{ "code":"60", "keySymbol":"^", "name":"First ScotRail", "Total":"432", "OnTime":"367", "Late":"65", "CancelVeryLate":"7", "PPM":{ "rag":"R", "text":"84" }, "RollingPPM":{ "trendInd":"-", "displayFlag":"Y", "rag":"R", "text":"82" } }, "OprToleranceTotal":{ "timeband":"5", "Total":"432", "OnTime":"367", "Late":"65", "CancelVeryLate":"7" }, "OprServiceGrp":[ { "name":"East Coast Suburban", "timeband":"5", "sectorCode":"SCO", "Total":"33", "OnTime":"33", "Late":"0", "CancelVeryLate":"0", "PPM":{ "rag":"G", "text":"100" }, "RollingPPM":{ "trendInd":"=", "displayFlag":"Y", "rag":"G", "text":"100" } }, { "name":"Express", "timeband":"5", "sectorCode":"SCO", "Total":"47", "OnTime":"43", "Late":"4", "CancelVeryLate":"0", "PPM":{ "rag":"A", "text":"91" }, "RollingPPM":{
45
46
"MovingMileage": "false", "PassengerSpeed": "20", "FreightSpeed": "20", "ValidFromDate": "1321088400000", "ValidToDate": "64060675199000", "WONValidFrom": null, "WONValidTo": null, "Reason": "Condition Of Bridge", "Requestor": "Network Rail Kent (London Bridge)", "Comments": "20MPH SPEED IMPOSED DUE TO CONDITION OF 507 BRIDGE TIMBERS.", "Direction": "up" }, { "TSRID": "68116", "creationDate": "1252419148000", "publishDate": "1388898005000", "publishEvent": "nonSpecific", "RouteGroupName": "Kent & Sussex", "RouteCode": "SO500", "RouteOrder": "4101", "TSRReference": "T2008/68116", "FromLocation": "Stoats Nest Jn", "ToLocation": "Stoats Nest Jn", "LineName": "Up Redhill/Slow", "SubunitType": "chains", "MileageFrom": "14", "SubunitFrom": "26", "MileageTo": "14", "SubunitTo": "10", "MovingMileage": "false", "PassengerSpeed": "60", "FreightSpeed": "60", "ValidFromDate": "1252382400000", "ValidToDate": "64060675199000", "WONValidFrom": null, "WONValidTo": null, "Reason": "Condition Of Track", "Requestor": "Sussex IMDM Croydon (SU02 East Croydon)", "Comments": "Responsible Manager: Track Engineer.\nTSR Over Crossovers 1660Apts, 1661A/Bpts and 1662pts from Up Slow to Up Fast.", "Direction": "up" }, "TSRID": "84130", "creationDate": "1325878000000", "publishDate": "1388898005000", "publishEvent": "nonSpecific", "RouteGroupName": "Kent & Sussex", "RouteCode": "SO520", "RouteOrder": "3801", "TSRReference": "T2011/84130", "FromLocation": "Ford", "ToLocation": "Barnham", "LineName": "Down Main/Brighton", "SubunitType": "chains", "MileageFrom": "20", "SubunitFrom": "79", "MileageTo": "21", "SubunitTo": "0", "MovingMileage": "false", "PassengerSpeed": "20", "FreightSpeed": "20", "ValidFromDate": "1325878000000", "ValidToDate": "64060675199000", "WONValidFrom": null, "WONValidTo": null, "Reason": "Condition Of Level Crossing", "Requestor": "Network Rail Sussex SU09 Outer South Coast West (Barnham)",
47
48
"tiploc_code": "FRTWJYD", "tiploc_instance": null, "arrival": "1641", "public_arrival": null, "platform": null, "path": null } ], "schedule_days_runs": "1111100", "schedule_end_date": "2012-12-07", "schedule_segment": { "traction_class": "", "uic_code": "" }, "schedule_start_date": "2011-12-12", "stp_indicator": null, "train_status": "P", "train_uid": null, "transaction_type": "Create" }{ "CIF_bank_holiday_running": null, "CIF_stp_indicator": "P", "CIF_train_uid": "P80019", "applicable_timetable": "Y", "atoc_code": "WR", "locations": [ { "location_type": "LO", "record_identity": "LO", "tiploc_code": "FRTWLM", "tiploc_instance": null, "departure": "1015", "public_departure": "1015", "platform": "2", "line": null, "engineering_allowance": null, "pathing_allowance": null, "performance_allowance": null }, { "location_type": "LI", "record_identity": "LI", "tiploc_code": "FRTWJN", "tiploc_instance": null, "arrival": null, "departure": null, "pass": "1018H", "public_arrival": null, "public_departure": null, "platform": null, "line": null, "path": null, "engineering_allowance": null, "pathing_allowance": null, "performance_allowance": null }, { "location_type": "LI", "record_identity": "LI", "tiploc_code": "BANAVIE", "tiploc_instance": null, "arrival": null, "departure": null, "pass": "1021H", "public_arrival": null, "public_departure": null, "platform": null,
49
"line": null, "path": null, "engineering_allowance": null, "pathing_allowance": null, "performance_allowance": null }, { "location_type": "LI", "record_identity": "LI", "tiploc_code": "LCEILOB", "tiploc_instance": null, "arrival": "1033", "departure": "1035", "pass": null, "public_arrival": null, "public_departure": null, "platform": null, "line": null, "path": null, "engineering_allowance": null, "pathing_allowance": null, "performance_allowance": null }, { "location_type": "LI", "record_identity": "LI", "tiploc_code": "GLNFNNN", "tiploc_instance": null, "arrival": "1054", "departure": "1122", "pass": null, "public_arrival": null, "public_departure": null, "platform": null, "line": null, "path": null, "engineering_allowance": null, "pathing_allowance": null, "performance_allowance": null }, { "location_type": "LI", "record_identity": "LI", "tiploc_code": "ARISAIG", "tiploc_instance": null, "arrival": "1202", "departure": "1207", "pass": null, "public_arrival": null, "public_departure": null, "platform": null, "line": null, "path": null, "engineering_allowance": null, "pathing_allowance": null, "performance_allowance": null }, { "location_type": "LT", "record_identity": "LT", "tiploc_code": "MLAIG", "tiploc_instance": null, "arrival": "1226", "public_arrival": "1226", "platform": "1", "path": null }
50
], "schedule_days_runs": "1111100", "schedule_end_date": "2012-06-15", "schedule_segment": { "traction_class": "", "uic_code": "" }, "schedule_start_date": "2012-05-14", "stp_indicator": null, "train_status": "P", "train_uid": null, "transaction_type": "Create" }{ "CIF_bank_holiday_running": null, "CIF_stp_indicator": "P", "CIF_train_uid": "P80020", "applicable_timetable": "Y", "atoc_code": "WR", "locations": [ { "location_type": "LO", "record_identity": "LO", "tiploc_code": "MLAIG", "tiploc_instance": null, "departure": "1411", "public_departure": "1409", "platform": "2", "line": null, "engineering_allowance": null, "pathing_allowance": null, "performance_allowance": null }, { "location_type": "LI", "record_identity": "LI", "tiploc_code": "MORAR", "tiploc_instance": null, "arrival": "1422", "departure": "1423", "pass": null, "public_arrival": null, "public_departure": null, "platform": null, "line": null, "path": null, "engineering_allowance": null, "pathing_allowance": null, "performance_allowance": null }, { "location_type": "LI", "record_identity": "LI", "tiploc_code": "ARISAIG", "tiploc_instance": null, "arrival": "1438", "departure": "1439", "pass": null, "public_arrival": null, "public_departure": null, "platform": null, "line": null, "path": null, "engineering_allowance": null, "pathing_allowance": null, "performance_allowance": null }, {
51
"location_type": "LI", "record_identity": "LI", "tiploc_code": "GLNFNNN", "tiploc_instance": null, "arrival": "1518", "departure": "1520", "pass": null, "public_arrival": null, "public_departure": null, "platform": null, "line": null, "path": null, "engineering_allowance": null, "pathing_allowance": null, "performance_allowance": null }, { "location_type": "LI", "record_identity": "LI", "tiploc_code": "LCEILOB", "tiploc_instance": null, "arrival": "1538H", "departure": "1540H", "pass": null, "public_arrival": null, "public_departure": null, "platform": null, "line": null, "path": null, "engineering_allowance": null, "pathing_allowance": null, "performance_allowance": null }, { "location_type": "LI", "record_identity": "LI", "tiploc_code": "BANAVIE", "tiploc_instance": null, "arrival": null, "departure": null, "pass": "1554H", "public_arrival": null, "public_departure": null, "platform": null, "line": null, "path": null, "engineering_allowance": null, "pathing_allowance": "1H", "performance_allowance": null }, { "location_type": "LI", "record_identity": "LI", "tiploc_code": "FRTWJN", "tiploc_instance": null, "arrival": null, "departure": null, "pass": "1559", "public_arrival": null, "public_departure": null, "platform": null, "line": null, "path": null, "engineering_allowance": null, "pathing_allowance": null, "performance_allowance": null },
52
{ "location_type": "LT", "record_identity": "LT", "tiploc_code": "FRTWLM", "tiploc_instance": null, "arrival": "1603", "public_arrival": "1603", "platform": "2", "path": null } ], "schedule_days_runs": "1111100", "schedule_end_date": "2012-06-15", "schedule_segment": { "traction_class": "", "uic_code": "" }, "schedule_start_date": "2012-05-14", "stp_indicator": null, "train_status": "P", "train_uid": null, "transaction_type": "Create" }{ "EOF": true }