Skip to content

Commit b0d4bfe

Browse files
authored
Feature/initial release fixes (#6)
This branch contains a collection of fixes and documentation updates required for the initial public release. **Bug Fixes** - Require Python 3.13+ across all `pyproject.toml` manifests to resolve a `SIGKILL` crash caused by `wasmtime>=43` being incompatible with Python 3.9 - Fix MQTT topic patterns in Python and Node loopback, speed monitor, and vehicle examples to match the correct broker topic structure for private/public messages - Fix identity artifact field names in Node examples (`device_id` → `deviceId`, `expiration_time` → `expirationTime`) for consistency with the API - Add `type=float` to `--lat`/`--lon` CLI arguments in Python examples to prevent string comparison errors at runtime **Project / Build** - Bump version to `0.3.0` across all manifests (`VERSION`, `CMakeLists.txt`, `pyproject.toml`, `package.json` files) - Rename npm and Python workspace packages from `etx-starter-kit` to `etx-sample-client` - Add `uninstall-js` Makefile target hooked into `install-js` and `purge` - Add `j2735codec/package.json` and `package-lock.json`; update root lock files - Remove stale `.python-version` pin (`3.9`); update `uv.lock` to reflect Python 3.13 constraint and wasmtime 43.0.0 - Update `.gitignore`: replace `certs/` with `registrations/`, add `.claude/` **Documentation** - Fix all GitHub URLs from `5GRealityLab/etx-starter-kit` to `Verizon/EdgeTransportationExchange_SampleClient` - Update cert output path references from `certs/` to `registrations/` across all READMEs and example run commands - Fix typos, remove emoji from headings, and improve markdown formatting consistency across root, `etx/`, and example READMEs - Add usage hints clarifying that speed monitor and vehicle examples each require a separate registration profile
2 parents 9681d4d + 8c468b9 commit b0d4bfe

31 files changed

Lines changed: 1710 additions & 536 deletions

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ Thumbs.db
1414
*.sln
1515
*.vcxproj
1616
*.user
17+
.claude/
1718

1819
# --- General Build Artifacts ---
1920
# Catches all C++, Python, and Node build directories
@@ -82,6 +83,6 @@ yarn-error.log*
8283
logs/
8384
*.log
8485
config.json
85-
certs/
86+
registrations/
8687

8788
# =============================================================================

.python-version

Lines changed: 0 additions & 1 deletion
This file was deleted.

README.md

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,9 @@ The official onboarding resource for Verizon Edge Transportation Exchange. This
1414

1515
Navigate to the ***[examples](etx/examples/)*** directory or select from the following links to get started:
1616

17-
[Python](etx/examples/python/)\
18-
[Node](etx/examples/node/)
17+
**[Python](etx/examples/python/)**
18+
19+
**[Node](etx/examples/node/)**
1920

2021
## Key Features
2122

@@ -51,27 +52,28 @@ The codec and language bindings can be found and installed directly from the rel
5152
### Python
5253

5354
*UV*:
55+
5456
```bash
55-
uv add "https://github.com/5GRealityLab/etx-starter-kit/releases/download/v0.0.0-alpha/python-j2735codec-0.0.0-py3-none-any.whl"
57+
uv add "https://github.com/Verizon/EdgeTransportationExchange_SampleClient/releases/download/v0.0.0-alpha/python-j2735codec-0.0.0-py3-none-any.whl"
5658
```
5759

5860
*Pip*:
61+
5962
```bash
60-
pip install "https://github.com/5GRealityLab/etx-starter-kit/releases/download/v0.0.0-alpha/python-j2735codec-0.0.0-py3-none-any.whl"
63+
pip install "https://github.com/Verizon/EdgeTransportationExchange_SampleClient/releases/download/v0.0.0-alpha/python-j2735codec-0.0.0-py3-none-any.whl"
6164
```
6265

6366
### Node
6467

65-
*NPM*
68+
*NPM*:
6669

6770
```bash
68-
npm install "https://github.com/5GRealityLab/etx-starter-kit/releases/download/v0.0.0-alpha/node-j2735codec-0.2.0.tgz"
71+
npm install "https://github.com/Verizon/EdgeTransportationExchange_SampleClient/releases/download/v0.0.0-alpha/node-j2735codec-0.2.0.tgz"
6972
```
7073

7174
**Note**: The release links above are not valid. Please see release page for proper links to to use. You can also download the files from the release page and install locally as well.
7275

73-
**For more advance users and contributors**, it is possible to install these packages directly from the source tree as well. The instructions [can be found here](/j2735codec/README.md).
74-
76+
**For more advance users and contributors**, it is possible to install these packages directly from the source tree as well. The instructions [can be found here](/j2735codec/README.md).
7577

7678
## Version Management (For Contributors Only)
7779

@@ -83,5 +85,6 @@ To propagate a version change from the root `VERSION` file to all sub-manifests:
8385
make sync-version
8486
```
8587

86-
## ⚖️ License
88+
## License
89+
8790
Licensed under the Apache License 2.0. See [LICENSE](LICENSE) and [NOTICE](NOTICE) for details.

VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
0.2.0
1+
0.3.0

etx/README.md

Lines changed: 26 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
# Edge Transportation Exchange (ETX)
22

3-
## 🌐 Overview
4-
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.
3+
## Overview
4+
5+
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.
56

67
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.
78

8-
## 🛠 Technical Specifications
9+
## Technical Specifications
10+
911
| Feature | Implementation |
1012
| :--- | :--- |
1113
| **Protocol** | MQTT 3.1.1 (v4) |
@@ -14,50 +16,55 @@ Unlike traditional V2X models that rely heavily on physical roadside units (RSUs
1416
| **Payload Format** | J2735 UPER wrapped in Protobuf |
1517
| **QoS Levels** | 0 (Preferred), 1 supported |
1618

17-
> **For more information and API specification please visit the [link here](https://thingspace.verizon.com/documentation/api-documentation.html#/http/specialized-apis/edge-transportation-exchange/mqtt-api).**
19+
> **For more information and API specification please visit the [link here](https://thingspace.verizon.com/documentation/api-documentation.html#/http/specialized-apis/edge-transportation-exchange).**
1820
19-
## 🔄 How Message Routing Works
21+
## How Message Routing Works
2022

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

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

2527
### 1. J2735 Encoding
28+
2629
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.
2730

2831
### 2. Protobuf Wrapping
32+
2933
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:
30-
* **Payload**: The raw J2735 UPER binary.
31-
* **Location**: High-precision GPS coordinates (Lat/Long).
32-
* **Timestamp**: Creation time for latency tracking.
34+
35+
- **Payload**: The raw J2735 UPER binary.
36+
- **Location**: High-precision GPS coordinates (Lat/Long).
37+
- **Timestamp**: Creation time for latency tracking.
3338

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

3641
### 3. MQTT Transport
42+
3743
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/...`).
3844

3945
### 4. Spatial Delivery
46+
4047
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.
4148

42-
## 📡 Messaging Patterns
49+
## Messaging Patterns
50+
4351
ETX supports four distinct communication patterns to meet diverse ITS requirements:
4452

45-
* **Public Broadcast**: Ecosystem-wide safety alerts (BSM/PSM).
46-
* **Private Broadcast**: Proprietary fleet-wide updates.
47-
* **Public Targeted**: Direct, point-to-point interactions (Session ID based).
48-
* **Private Targeted**: Secure, authorized exchanges between specific peers.
53+
- **Status Messages**: Ecosystem-wide status messages (BSM/PSM). Distributed to applications monitoring the area where the clients are.
54+
- **Broadcast Alert Messages**: Ecosystem-wide safety alerts (TIM/RSA). Anyone in the area is notified.
55+
- **Targeted Alert Messages**: Direct, point-to-point interactions messages. Delivering alerts/notifications to a particular client.
4956

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

52-
## Documents
59+
## Documents
5360

5461
- A debugging guide for ETX registration is [provided here](./docs/DEBUGGING.md).
5562

56-
## 🛠️ Generate Protobuf Bindings
63+
## Generate Protobuf Bindings
5764

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

60-
**NOTE: Protobuf encoding/decoding is already happening in the langauge bindings provided!**
67+
**NOTE: Protobuf encoding/decoding is already happening in the language bindings provided!**
6168

6269
### Python
6370

@@ -66,31 +73,16 @@ Protobuf bindings are needed if you want to interact with ETX directly without t
6673
mkdir -p ./proto/dist/python
6774

6875
# 2. Install grpc tools.
69-
pip install grpcio-tools
76+
pip3 install grpcio-tools
7077

7178
# 3. Generate protobuf output.
72-
python -m grpc_tools.protoc \
79+
python3 -m grpc_tools.protoc \
7380
-I=./proto \
7481
--python_out=./proto/dist/python \
7582
--pyi_out=./proto/dist/python \
7683
./proto/georoutedmsg.proto
7784
```
7885

79-
Our bindings use the following version grpcio-tools:
80-
81-
```text
82-
Name: grpcio-tools
83-
Version: 1.76.0
84-
Summary: Protobuf code generator for gRPC
85-
Home-page: https://grpc.io
86-
Author: The gRPC Authors
87-
Author-email: grpc-io@googlegroups.com
88-
License: Apache License 2.0
89-
Location: /Users/hsuyu/.virtualenvs/test2/lib/python3.11/site-packages
90-
Requires: grpcio, protobuf, setuptools
91-
Required-by:
92-
```
93-
9486
### Node
9587

9688
```bash
@@ -111,13 +103,3 @@ npx protoc \
111103
-I=./proto \
112104
./proto/georoutedmsg.proto
113105
```
114-
115-
Our bindings use the follow version:
116-
117-
```text
118-
etx-starter-kit@0.2.0 /Users/hsuyu/Documents/projects/v2x/oss/etx-starter-kit
119-
└── ts-proto@2.11.0
120-
121-
etx-starter-kit@0.2.0 /Users/hsuyu/Documents/projects/v2x/oss/etx-starter-kit
122-
└── protobufjs@8.0.0
123-
```

etx/examples/node/README.md

Lines changed: 38 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,14 @@ This version of the client sample has been tested against **v22.16.0**. It utili
1010

1111
### Prerequisite - Setup
1212

13-
The fastest way to get started is to download the packages from release. The latest release can be [found here](https://github.com/5GRealityLab/etx-starter-kit/releases/latest).
13+
The fastest way to get started is to download the packages from release. The latest release can be [found here](https://github.com/Verizon/EdgeTransportationExchange_SampleClient/releases/latest).
1414

1515
The file to download will look like: `node-etx-sample-x.x.x.zip`, where x.x.x is the version fo the project.
1616

17-
1. **Install Dependencies**:
18-
19-
**Install With Pip**
17+
1. **Install Dependencies**:
2018

2119
```bash
22-
curl -L -O https://github.com/5GRealityLab/etx-starter-kit/releases/latest/download/node-etx-sample-x.x.x.zip
20+
curl -L -O https://github.com/Verizon/EdgeTransportationExchange_SampleClient/releases/latest/download/node-etx-sample-x.x.x.zip
2321
unzip node-etx-sample-x.x.x.zip -d node-etx-sample
2422
cd node-etx-sample
2523
npm install ./j2735codec/j2735codec-*.tgz
@@ -38,15 +36,16 @@ The file to download will look like: `node-etx-sample-x.x.x.zip`, where x.x.x is
3836
| **identity** | `user` | String | Your Verizon ThingSpace account username. |
3937
| | `password` | String | Your Verizon ThingSpace account password. |
4038
| | `token` | String | The Base64 encoded Application Token (Client ID:Client Secret) from ThingSpace. |
41-
| **attributes**| `clientType` | String | The broad category of the client (e.g., `Vehicle`, `VulnerableRoadUser`, etc). |
39+
| **attributes** | `clientType` | String | The broad category of the client (e.g., `Vehicle`, `VulnerableRoadUser`, etc). |
4240
| | `clientSubType` | String | The specific type of vehicle (e.g., `PassengerCar`, `Truck`, `Radar`, etc). |
4341
| | `vendorId` | String | An identifier for the software or hardware provider. |
4442
| **location** | `lat` | Float | The initial latitude for the device (used during registration/geofencing). |
4543
| | `lon` | Float | The initial longitude for the device. |
4644

47-
**Note: The latitude and longitude determines which edge server you will conenct to.**
45+
**Note: The latitude and longitude determines which edge server you will connect to.**
4846

4947
**Note: The `Endpoints` section in the config is optional and does not have to be filled out or included in the final `config.json`.**
48+
5049
```json
5150
"endpoints": {
5251
"oauthUrl": "https://thingspace.verizon.com/api/ts/v1/oauth2/token",
@@ -71,22 +70,23 @@ The following command line arguments are supported by all examples in the next s
7170

7271
### 0. Registration Example
7372

74-
The registration example is a precursor to performing any other operations on ETX. This step retrieves a unique **Device ID** and the **mTLS certificates** (CA, Certificate, and Private Key) required to connect.
73+
The registration example is a precursor to performing any other operations on ETX. This step retrieves a unique **Device ID** and the **mTLS certificates** (CA, Certificate, and Private Key) required to connect.
7574

7675
**IMPORTANT**: Each vendor ID has a fixed quota of device IDs. Always keep track of your registrations and deregister when finished.
7776

7877
#### How to Run
78+
7979
```bash
80-
npm run registration -- --config config.json --cert-dir ./certs
80+
npm run registration -- --config config.json --cert-dir ./registrations
8181
```
8282

83-
**Output**: The above command generates a JSON "Identity Artifact" in the `./certs/` folder. This file contains everything needed to "re-hydrate" your identity in the following examples.
83+
**Output**: The above command generates a JSON "Identity Artifact" in the `./registrations/` folder. This file contains everything needed to "re-hydrate" your identity in the following examples.
8484

8585
#### Supported Arguments
8686

8787
| Arg | Required | Default | Description |
8888
| :--- | :--- | :--- | :--- |
89-
| --cert-dir| False | ./cert/ | The local directory where security certificates and keys are generated after registration completes. |
89+
| --cert-dir | False | ./cert/ | The local directory where security certificates and keys are generated after registration completes. |
9090
| --config | False | config.json | The configuration file to use for registration. |
9191

9292
---
@@ -97,9 +97,10 @@ The deregistration example removes the registered device from ETX. Every vendor
9797

9898
#### How to Run
9999

100-
The command format to run this example (from the project root):
100+
The command format to run this example (from the project root):
101+
101102
```bash
102-
npm run deregistration -- --device-files ./certs/20260119_0101_f355703d.json
103+
npm run deregistration -- --device-file ./registrations/20260119_0101_f355703d.json
103104
```
104105

105106
#### Supported Arguments
@@ -110,7 +111,7 @@ npm run deregistration -- --device-files ./certs/20260119_0101_f355703d.json
110111

111112
---
112113

113-
### 2. Private Loopback Example
114+
### 2. Private Loopback Example
114115

115116
A diagnostic tool to verify bidirectional private communication.
116117

@@ -119,9 +120,11 @@ A diagnostic tool to verify bidirectional private communication.
119120
3. Publishes a BSM to itself to verify the mTLS loop is closed.
120121

121122
#### How to Run
123+
122124
```bash
123-
npm run loopback -- --device-file ./certs/20260119_0101_f355703d.json --count 5
125+
npm run loopback -- --device-file ./registrations/20260119_0101_f355703d.json --count 5
124126
```
127+
125128
#### Supported Arguments
126129

127130
| Arg | Required | Default | Description |
@@ -134,13 +137,17 @@ npm run loopback -- --device-file ./certs/20260119_0101_f355703d.json --count 5
134137
### 3. Speed Monitor Example (RSU/App)
135138

136139
Demonstrates a "Virtual Speed Trap" application.
140+
137141
1. **Geohashing**: Subscribes to regional topics by delimiting geohashes (e.g., `d/r/5/r/9/y`).
138142
2. **Real-time Analytics**: Decodes BSMs from all vehicles in the neighborhood.
139143
3. **Targeted Advisory**: If a vehicle exceeds the `--limit`, it sends a **TIM (Traveler Information Message)** warning directly to that specific vehicle's private topic.
140144

145+
**Hint**: Run the Vehicle Example with a separate registration to trigger the speeding alert. **Remember to use two different registration profiles! One for the monitor and one for the vehicle.**
146+
141147
#### How to Run
148+
142149
```bash
143-
npm run speedmon -- --device-file ./certs/20260119_0101_f355703d.json --limit 25
150+
npm run speedmon -- --device-file ./registrations/20260119_0101_f355703d.json --limit 25
144151
```
145152

146153
#### Supported Arguments
@@ -149,47 +156,52 @@ npm run speedmon -- --device-file ./certs/20260119_0101_f355703d.json --limit 2
149156
| :--- | :--- | :--- | :--- |
150157
| --device-file | True | - | The device file to use for ETX connection. |
151158
| --lat | False | - | The default value is defined in the registration config file. |
152-
| --lon | False | - | The default value is defined in the registraiton config file. |
159+
| --lon | False | - | The default value is defined in the registration config file. |
153160
| --limit | False | 25 | The speed limit in mph to send out warnings. |
154161

155162
---
156163

157164
### 4. Vehicle Example (OBU)
158165

159166
Simulates a mobile entity (On-Board Unit). It demonstrates the "Public Broadcast" pattern used in real-world V2X.
167+
160168
1. **Session Handshake**: Connects and retrieves a Session ID from `vzimp/1/ClientInfo`.
161169
2. **Periodic Broadcast**: Runs a background thread to publish BSMs to the `GeoRelevance` topic at 1Hz.
162170
3. **Regional Listening**: Subscribes to regional safety messages (TIM, SPaT, MAP).
163171

172+
**Hint**: Run this example with the Speed Monitor Example running at the same time to trigger the speeding alert. Make sure the speed value is above the speed limit configured in the monitoring application. **Remember to use two different registration profiles! One for the monitor and one for the vehicle.**
173+
164174
#### How to Run
175+
165176
```bash
166-
npm run vehicle -- --device-file ./certs/20260119_0101_f355703d.json --speed 25
177+
npm run vehicle -- --device-file ./registrations/20260119_0101_f355703d.json --speed 25
167178
```
168179

169-
**Note**: You can try running both the speed monitor and vehicle example together to see when TIM messages are sent to warn the vehicle of speed limit violations. **Remember to use two different registration profiles! One for the monitor and one for the vehicle.**
170-
171180
#### Supported Arguments
172181

173182
| Arg | Required | Default | Description |
174183
| :--- | :--- | :--- | :--- |
175184
| --device-file | True | - | The device file to use for ETX connection. |
176185
| --lat | False | - | The default value is defined in the registration config file. |
177-
| --lon | False | - | The default value is defined in the registraiton config file. |
186+
| --lon | False | - | The default value is defined in the registration config file. |
178187
| --speed | False | 30 | The speed in which the vehicle is traveling at. |
188+
179189
---
180190

181191
### Install and Running From Source (For Project Contributors)
182192

183-
It is possible to run the examples directly from this project as well. Check the prequisites for the building the [language bindings here](/README.md#2-source-install).
193+
It is possible to run the examples directly from this project as well.
194+
195+
**Note: Make sure that you satisfy the prerequisites for building the [language bindings](/j2735codec/README.md#source-installation) before building the node js examples.**
184196

185197
```bash
186-
git clone https://github.com/5GRealityLab/etx-starter-kit.git
187-
cd etx-starter-kit
198+
git clone https://github.com/Verizon/EdgeTransportationExchange_SampleClient.git
199+
cd EdgeTransportationExchange_SampleClient/j2735codec
188200
make install-js
189201
cd etx/examples/node
202+
npm run registration -- --config config.json --cert-dir ./registrations
190203

191-
# Run examples above
192-
204+
# Run examples above.
193205
```
194206

195207
---

0 commit comments

Comments
 (0)