Skip to content

Latest commit

 

History

History

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 

README.md

Edge Transportation Exchange (ETX)

Overview

The Edge Transportation Exchange (ETX) is a high-performance, mobile-network-integrated V2X (Vehicle-to-Everything) communication platform. By leveraging Verizon networks alongside low-latency Mobile Edge Compute (MEC), ETX enables near-real-time bidirectional data sharing between vehicles, vulnerable road users (pedestrians and cyclists), and intelligent infrastructure.

Unlike traditional V2X models that rely heavily on physical roadside units (RSUs), ETX uses a virtualized architecture and a sophisticated geospatial routing engine. This engine organizes the world into high-precision Geohashes, ensuring that messages—from safety-critical BSMs to traffic signal timings (SPaT)—are delivered only to participants within relevant proximity, maximizing system efficiency and reducing network noise.

Technical Specifications

Feature Implementation
Protocol MQTT 3.1.1 (v4)
Security TLS 1.2+ Mutual Authentication
Routing Geospatial (Geohash-based)
Payload Format J2735 UPER wrapped in Protobuf
QoS Levels 0 (Preferred), 1 supported

For more information and API specification please visit the link here.

How Message Routing Works

Georouting in the ETX ecosystem follows a highly structured "wrapper" pipeline to balance standardized V2X intelligence with high-speed delivery.

Note: The encoding and wrapping mechanism (e.g. steps 1 and 2) is included in the language bindings.

1. J2735 Encoding

The process begins with a J2735 message (such as a BSM), which is encoded into a compact, binary UPER format using the core C++/WASM codec.

2. Protobuf Wrapping

Because standard MQTT brokers are "location-blind," the raw binary is encapsulated within a Protobuf wrapper (GeoRoutedMsg). This acts as a metadata envelope, attaching critical attributes:

  • Payload: The raw J2735 UPER binary.
  • Location: High-precision GPS coordinates (Lat/Long).
  • Timestamp: Creation time for latency tracking.

Note: See below for how to generate these bindings yourself.

3. MQTT Transport

The serialized Protobuf object is sent as the MQTT payload to a topic structured by the client's current Geohash (e.g., vzimp/1/GeoRelevance/...).

4. Spatial Delivery

The ETX broker parses the Geohash from the topic and the coordinates from the Protobuf header. It then "shuttles" the message to all relevant subscribers within a neighboring grid, ensuring the data reaches exactly who needs it based on physical proximity.

Messaging Patterns

ETX supports four distinct communication patterns to meet diverse ITS requirements:

  • Status Messages: Ecosystem-wide status messages (BSM/PSM). Distributed to applications monitoring the area where the clients are.
  • Broadcast Alert Messages: Ecosystem-wide safety alerts (TIM/RSA). Anyone in the area is notified.
  • Targeted Alert Messages: Direct, point-to-point interactions messages. Delivering alerts/notifications to a particular client.

Note: The reliability of these messages are subject to the delivery semantics of the MQTT standards. Please view our API for more information.

Documents

Generate Protobuf Bindings

Protobuf bindings are needed if you want to interact with ETX directly without the help of the language bindings provided in this project.

NOTE: Protobuf encoding/decoding is already happening in the language bindings provided!

Python

# 1. Create distribution folder.
mkdir -p ./proto/dist/python

# 2. Install grpc tools.
pip3 install grpcio-tools

# 3. Generate protobuf output. 
python3 -m grpc_tools.protoc \
    -I=./proto \
    --python_out=./proto/dist/python \
    --pyi_out=./proto/dist/python \
    ./proto/georoutedmsg.proto

Node

# 1. Create distribution folder
mkdir -p ./proto/dist/node

# 2. Install the modern TypeScript generator and runtime
# ts-proto: The compiler plugin
# protobufjs: The required lightweight runtime
npm install --save-dev ts-proto
npm install protobufjs

# 3. Generate pure TypeScript files
# --ts_proto_out: tells protoc to use the ts-proto plugin
npx protoc \
  --ts_proto_out=./proto/dist/node \
  --ts_proto_opt=esModuleInterop=true \
  -I=./proto \
  ./proto/georoutedmsg.proto