├── spec
├── images
│ ├── covesa.jpg
│ ├── vss-tree.jpg
│ ├── pki-based-flow.png
│ ├── signal-request.png
│ ├── token-based-flow.jpg
│ ├── VISSv3-abstract-flow.jpg
│ ├── consent-architecture.jpg
│ ├── mqtt_vissv3_protocol.jpg
│ ├── oauth2-protocol-flow.jpg
│ ├── VISSv3-payload-encoding.jpg
│ ├── access-control-selection.jpg
│ ├── file-upload-sequence-diagram.png
│ ├── access-control-selection-model.jpg
│ ├── data-compression-scheme-coding.jpg
│ ├── file-download-sequence-diagram.png
│ ├── data-compression-sequence-diagram.png
│ ├── signal-request.svg
│ └── grant-token-request-pki.svg
├── resources
│ ├── README.md
│ ├── server.yml.txt
│ ├── vissv3.0.proto.txt
│ └── vissv3.0-schema.json
├── VISSv3.0_PayloadEncoding.html
└── VISSv3.0_Transport.html
├── .github
└── workflows
│ ├── create_draft_release.yml
│ └── pdf_build.yml
├── README.md
├── VISS-explainer.md
└── LICENSE
/spec/images/covesa.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/COVESA/vehicle-information-service-specification/HEAD/spec/images/covesa.jpg
--------------------------------------------------------------------------------
/spec/images/vss-tree.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/COVESA/vehicle-information-service-specification/HEAD/spec/images/vss-tree.jpg
--------------------------------------------------------------------------------
/spec/images/pki-based-flow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/COVESA/vehicle-information-service-specification/HEAD/spec/images/pki-based-flow.png
--------------------------------------------------------------------------------
/spec/images/signal-request.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/COVESA/vehicle-information-service-specification/HEAD/spec/images/signal-request.png
--------------------------------------------------------------------------------
/spec/images/token-based-flow.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/COVESA/vehicle-information-service-specification/HEAD/spec/images/token-based-flow.jpg
--------------------------------------------------------------------------------
/spec/images/VISSv3-abstract-flow.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/COVESA/vehicle-information-service-specification/HEAD/spec/images/VISSv3-abstract-flow.jpg
--------------------------------------------------------------------------------
/spec/images/consent-architecture.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/COVESA/vehicle-information-service-specification/HEAD/spec/images/consent-architecture.jpg
--------------------------------------------------------------------------------
/spec/images/mqtt_vissv3_protocol.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/COVESA/vehicle-information-service-specification/HEAD/spec/images/mqtt_vissv3_protocol.jpg
--------------------------------------------------------------------------------
/spec/images/oauth2-protocol-flow.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/COVESA/vehicle-information-service-specification/HEAD/spec/images/oauth2-protocol-flow.jpg
--------------------------------------------------------------------------------
/spec/images/VISSv3-payload-encoding.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/COVESA/vehicle-information-service-specification/HEAD/spec/images/VISSv3-payload-encoding.jpg
--------------------------------------------------------------------------------
/spec/images/access-control-selection.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/COVESA/vehicle-information-service-specification/HEAD/spec/images/access-control-selection.jpg
--------------------------------------------------------------------------------
/spec/images/file-upload-sequence-diagram.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/COVESA/vehicle-information-service-specification/HEAD/spec/images/file-upload-sequence-diagram.png
--------------------------------------------------------------------------------
/spec/images/access-control-selection-model.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/COVESA/vehicle-information-service-specification/HEAD/spec/images/access-control-selection-model.jpg
--------------------------------------------------------------------------------
/spec/images/data-compression-scheme-coding.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/COVESA/vehicle-information-service-specification/HEAD/spec/images/data-compression-scheme-coding.jpg
--------------------------------------------------------------------------------
/spec/images/file-download-sequence-diagram.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/COVESA/vehicle-information-service-specification/HEAD/spec/images/file-download-sequence-diagram.png
--------------------------------------------------------------------------------
/spec/images/data-compression-sequence-diagram.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/COVESA/vehicle-information-service-specification/HEAD/spec/images/data-compression-sequence-diagram.png
--------------------------------------------------------------------------------
/spec/resources/README.md:
--------------------------------------------------------------------------------
1 | ## File extension explanation
2 | The files
3 | * server.yml.txt
4 | * vissv3.0.proto.txt
5 |
6 | were given the file extension ".txt" for the purpose of being properly rendered in the VISSv3.0 specification document.
7 | This file extension should be removed before the files are consumed in the contexts they were created for.
8 |
--------------------------------------------------------------------------------
/.github/workflows/create_draft_release.yml:
--------------------------------------------------------------------------------
1 | name: Create Draft Release
2 |
3 | on:
4 | push:
5 | tags:
6 | - "*.*"
7 |
8 | # Needed if GITHUB_TOKEN by default do not have right to create release
9 | permissions:
10 | contents: write
11 | packages: write
12 |
13 | jobs:
14 | call_pdf_build:
15 | uses: ./.github/workflows/pdf_build.yml
16 |
17 | create_release:
18 | runs-on: ubuntu-latest
19 | needs:
20 | [
21 | call_pdf_build
22 | ]
23 | steps:
24 | - name: Checkout
25 | uses: actions/checkout@v4
26 |
27 | - name: Download all artifacts
28 | uses: actions/download-artifact@v4
29 | with:
30 | path: build-artifacts
31 | merge-multiple: true
32 | - name: Display structure of downloaded files
33 | run: |
34 | ls -R build-artifacts
35 |
36 | - name: Create release
37 | id: create_release
38 | uses: softprops/action-gh-release@v2
39 | with:
40 | draft: true
41 | name: VISS ${{ github.ref_name }}
42 | fail_on_unmatched_files: true
43 | files: |
44 | build-artifacts/*
45 |
--------------------------------------------------------------------------------
/.github/workflows/pdf_build.yml:
--------------------------------------------------------------------------------
1 | # Copyright (c) 2024 Contributors to COVESA
2 | #
3 | # This program and the accompanying materials are made available under the
4 | # terms of the Mozilla Public License 2.0 which is available at
5 | # https://www.mozilla.org/en-US/MPL/2.0/
6 | #
7 | # SPDX-License-Identifier: MPL-2.0
8 |
9 | name: viss_build
10 |
11 | on:
12 | push:
13 | pull_request:
14 | workflow_call:
15 | workflow_dispatch:
16 |
17 | concurrency:
18 | group: ${{ github.ref }}-${{ github.workflow }}
19 | cancel-in-progress: true
20 |
21 | jobs:
22 | build-pdf:
23 | runs-on: ubuntu-latest
24 |
25 | steps:
26 | - uses: actions/checkout@v4
27 | with:
28 | submodules: recursive
29 |
30 | - name: Building
31 | run: |
32 | wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
33 | sudo dpkg -i google-chrome-stable_current_amd64.deb
34 | google-chrome-stable --headless --print-to-pdf=VISSv3.0_Core.pdf spec/VISSv3.0_Core.html
35 | google-chrome-stable --headless --print-to-pdf=VISSv3.0_Transport.pdf spec/VISSv3.0_Transport.html
36 | google-chrome-stable --headless --print-to-pdf=VISSv3.0_PayloadEncoding.pdf spec/VISSv3.0_PayloadEncoding.html
37 |
38 | - name: "Upload PDFs"
39 | uses: actions/upload-artifact@v4
40 | with:
41 | name: viss-pdfs
42 | path: '*.pdf'
43 |
44 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | 
2 |
3 | # vehicle-information-service-specification
4 |
5 | [](https://opensource.org/licenses/MPL-2.0)
6 |
7 | ### Maintainers
8 |
9 | Ulf Björkengren - Ford Motor Company
10 |
11 | Ted Guild - Geotab Inc.
12 |
13 | Peter Winzell - Volvo Cars
14 |
15 | Wonsuk Lee - 한국전자통신연구원(ETRI)
16 |
17 | ### Lead editors
18 |
19 | Ulf Björkengren - Ford Motor Company
20 |
21 | ### Working group meetings
22 | The VISS working group meets every other Monday at 16.00 CET.
23 | The schedule and link to meeting can be found [here](https://wiki.covesa.global/display/WIK4/COVESA+Common+Meeting+Schedule).
24 | Minutes of meetings is found [here](https://covesa.atlassian.net/wiki/spaces/WIK4/pages/39068133/VISS+Meeting+Topics+and+Meeting+Notes).
25 |
26 | ## Overview
27 |
28 | >Vehicle Information Service Specification (VISS) is an API for accessing the COVESA Vehicle Signal Specification (VSS) data. The work started at [The World Wide Web Consortium (W3C)](https://www.w3.org) in collaboration with GENIVI and its successor COVESA. The W3C Automotive Working Group closed in February of 2024 and the work is continuing at COVESA.
29 |
30 | To see the most recent HTML rendered version of the specifications from this repository can be found at the following:
31 |
32 | - [COVESA VISS version 3.0 - Core](https://raw.githack.com/COVESA/vehicle-information-service-specification/main/spec/VISSv3.0_Core.html)
33 | - [COVESA VISS version 3.0-Payload Encoding](https://raw.githack.com/COVESA/vehicle-information-service-specification/main/spec/VISSv3.0_PayloadEncoding.html)
34 | - [COVESA VISS version 3.0-Transport](https://raw.githack.com/COVESA/vehicle-information-service-specification/main/spec/VISSv3.0_Transport.html)
35 |
36 | The [VISS explainer](./VISS-explainer.md) gives some background and rationale to this interface.
37 |
38 | ## Latest version
39 | [VISS version 3.0](https://github.com/COVESA/vehicle-information-service-specification/releases/tag/v3.0)
40 |
41 | ## Previous versions
42 | [VISS version 2.0](https://github.com/COVESA/vehicle-information-service-specification/releases/tag/v2.0)
43 |
44 | [VISS version 1](https://www.w3.org/TR/vehicle-information-service/)
45 |
46 | ## Reference Implementation
47 | [http://github.com/COVESA/vissr](http://github.com/COVESA/vissr)
48 |
49 | ## Specification references
50 | The Adaptive AUTOSAR R24-11 official publication.
51 |
52 | [AUTOSAR](https://www.autosar.org/) released the [Adaptive AUTOSAR R24-11](https://www.autosar.org/search?tx_solr%5Bfilter%5D%5B1%5D=platform%3AAP&tx_solr%5Bfilter%5D%5B2%5D=category%3AR24-11&tx_solr%5Bq%5D=) including Automotive API Gateway specification at the end of December 2024. Automotive API Gateway specification is developed based on the [COVESA VISS v2-Core](https://github.com/COVESA/vehicle-information-service-specification/releases/tag/v2.0) and [COVESA VISS v2-Transport](https://github.com/COVESA/vehicle-information-service-specification/releases/tag/v2.0) specifications. The related standards and technical documents are as follows:
53 | - [Explanation of Automotive API](https://www.autosar.org/fileadmin/standards/R24-11/AP/AUTOSAR_AP_EXP_AutomotiveAPI.pdf)
54 | - [Requirements on Automotive API Gateway](https://www.autosar.org/fileadmin/standards/R24-11/AP/AUTOSAR_AP_RS_AutomotiveAPIGateway.pdf)
55 | - [Specification of Automotive API Gateway](https://www.autosar.org/fileadmin/standards/R24-11/AP/AUTOSAR_AP_SWS_AutomotiveAPIGateway.pdf)
56 | - [Technical Report on VSS Representation](https://www.autosar.org/fileadmin/standards/R24-11/AP/AUTOSAR_AP_TR_VSSRepresentation.pdf)
57 | - [Adaptive Platform Release Overview](https://www.autosar.org/fileadmin/standards/R24-11/AP/AUTOSAR_AP_TR_ReleaseOverview.pdf)
58 |
59 | ## Tools
60 |
61 | - [ReSpec](https://www.w3.org/respec/) has been used to style the specifications allowing the editors to focus on functionality and ensure consistency and referential integrity
62 | - The [API Design Cookbook](http://www.w3.org/TR/api-design/) has been used as a guide for the use of WebIDL
63 |
64 | ## Style Guidelines
65 |
66 | ### JavaScript Style Guidelines
67 | JavaScript should be written using the [JSCS](http://jscs.info/) rule set defined by [Echidna](https://github.com/w3c/echidna/blob/master/.jscs.json).
68 |
69 | ## Contributors
70 | VISS is an open standard and we invite anybody to contribute. Currently VISS contains - among others - significant contributions from
71 |
72 | - [Volvo Cars](https://www.volvocars.com/)
73 | - [Geotab Inc](https://www.geotab.com/about/)
74 | - [Ford Motor Company](https://www.ford.com/)
75 | - [한국전자통신연구원(ETRI)](https://etri.re.kr/eng/main/main.etri)
76 | - [Mitsubishi Electric](https://www.mitsubishielectric.com/en/)
77 | - [Jaguar Land Rover](https://www.jaguarlandrover.com/)
78 |
--------------------------------------------------------------------------------
/spec/resources/server.yml.txt:
--------------------------------------------------------------------------------
1 | #
2 | # The server capabilities declaration.
3 | #
4 | Server:
5 | type: branch
6 | description: Root for the server capabilities.
7 |
8 | Server.Support:
9 | type: branch
10 | description: Top branch declaring the server supported features.
11 |
12 | Server.Support.Protocol:
13 | type: attribute
14 | datatype: string[]
15 | description: List of supported transport protocols.
16 |
17 | Server.Support.Security:
18 | type: attribute
19 | datatype: string[]
20 | description: List of supported security related features.
21 |
22 | Server.Support.Filter:
23 | type: attribute
24 | datatype: string[]
25 | description: List of supported filter features.
26 |
27 | Server.Support.Encoding:
28 | type: attribute
29 | datatype: string[]
30 | description: List of supported payload encoding features.
31 |
32 | Server.Support.Filetransfer:
33 | type: attribute
34 | datatype: string[]
35 | description: List of supported file transfer features.
36 |
37 | Server.Support.DataCompression:
38 | type: attribute
39 | datatype: string[]
40 | description: List of supported data compression features.
41 |
42 | Server.Config:
43 | type: branch
44 | description: Top branch declaring the configuration of server supported features.
45 |
46 | Server.Config.Protocol:
47 | type: branch
48 | description: Top branch declaring the configuration of server supported protocols.
49 |
50 | Server.Config.Protocol.Http:
51 | type: branch
52 | description: Top branch for the server supported HTTP protocol.
53 |
54 | Server.Config.Protocol.Http.Primary:
55 | type: branch
56 | description: HTTP configuration for the primary payload format.
57 |
58 | Server.Config.Protocol.Http.Primary.PortNum:
59 | type: attribute
60 | datatype: uint32
61 | description: HTTP port number for the primary payload format.
62 |
63 | Server.Config.Protocol.Websocket:
64 | type: branch
65 | description: Top branch for the server supported Websocket protocol.
66 |
67 | Server.Config.Protocol.Websocket.Primary:
68 | type: branch
69 | description: Websocket configuration for the primary payload format.
70 |
71 | Server.Config.Protocol.Websocket.Primary.PortNum:
72 | type: attribute
73 | datatype: uint32
74 | description: Websocket protocol port number for the primary payload format.
75 |
76 | Server.Config.Protocol.Websocket.Protobuf:
77 | type: branch
78 | description: Websocket configuration for the protobuf encoded payload format.
79 |
80 | Server.Config.Protocol.Websocket.Protobuf.PortNum:
81 | type: attribute
82 | datatype: uint32
83 | description: Websocket protocol port number for the protobuf encoded payload format.
84 |
85 | Server.Config.Protocol.Mqtt:
86 | type: branch
87 | description: Top branch for the server supported MQTT protocol.
88 |
89 | Server.Config.Protocol.Mqtt.PortNum:
90 | type: attribute
91 | datatype: uint32
92 | description: MQTT port number.
93 |
94 | Server.Config.Protocol.Mqtt.Primary:
95 | type: branch
96 | description: MQTT configuration for the primary payload format.
97 |
98 | Server.Config.Protocol.Mqtt.Primary.Topic:
99 | type: attribute
100 | datatype: string
101 | description: MQTT topic name for the primary payload format.
102 |
103 | Server.Config.Protocol.Mqtt.Protobuf:
104 | type: branch
105 | description: MQTT configuration for the protobuf encoded payload format.
106 |
107 | Server.Config.Protocol.Mqtt.Protobuf.Topic:
108 | type: attribute
109 | datatype: string
110 | description: MQTT topic name for the protobuf encoded payload format.
111 |
112 | Server.Config.Protocol.Mqtt.Protobuf.DataCompression:
113 | type: attribute
114 | datatype: string[]
115 | description: List of supported data compression variants.
116 |
117 | Server.Config.Protocol.Grpc:
118 | type: branch
119 | description: Top branch for the server supported gRPC protocol.
120 |
121 | Server.Config.Protocol.Grpc.Protobuf:
122 | type: branch
123 | description: gRPC configuration with the protobuf encoded payload format.
124 |
125 | Server.Config.Protocol.Grpc.Protobuf.PortNum:
126 | type: attribute
127 | datatype: uint32
128 | description: gRPC port number for the protobuf encoded payload format.
129 |
130 | Server.Config.AccessControl:
131 | type: branch
132 | description: Access control configuration.
133 |
134 | Server.Config.AccessControl.AgtsUrl:
135 | type: attribute
136 | datatype: string
137 | description: Access Grant Token Server URL including port number and path.
138 |
139 | Server.Config.AccessControl.AtsPortNum:
140 | type: attribute
141 | datatype: uint32
142 | description: Access Token Server port number.
143 |
144 | Server.Config.AccessControl.Flow:
145 | type: attribute
146 | datatype: string
147 | description: Supported access control flows.
148 |
149 | Server.Config.Consent:
150 | type: branch
151 | description: Consent configuration.
152 |
153 | Server.Config.Consent.Ecf:
154 | type: attribute
155 | datatype: string
156 | description: External Consent Framework description.
157 |
158 |
--------------------------------------------------------------------------------
/spec/resources/vissv3.0.proto.txt:
--------------------------------------------------------------------------------
1 | syntax = "proto3";
2 | package grpcProtobufMessages;
3 |
4 | enum ResponseStatus {
5 | SUCCESS = 0;
6 | ERROR = 1;
7 | }
8 |
9 | enum SubscribeResponseType {
10 | RESPONSE = 0;
11 | EVENT = 1;
12 | }
13 |
14 | service VISS {
15 | rpc GetRequest (GetRequestMessage) returns (GetResponseMessage);
16 |
17 | rpc SetRequest (SetRequestMessage) returns (SetResponseMessage);
18 |
19 | rpc SubscribeRequest (SubscribeRequestMessage) returns (stream SubscribeStreamMessage);
20 |
21 | rpc UnsubscribeRequest (UnsubscribeRequestMessage) returns (UnsubscribeResponseMessage);
22 | }
23 |
24 | message ErrorResponseMessage {
25 | string Number = 1;
26 | string Reason = 2;
27 | string Description = 3;
28 | }
29 |
30 | message FilterExpressions {
31 | message FilterExpression {
32 | enum FilterVariant {
33 | PATHS = 0;
34 | TIMEBASED = 1;
35 | RANGE = 2;
36 | CHANGE = 3;
37 | CURVELOG = 4;
38 | HISTORY = 5;
39 | METADATA = 6;
40 | }
41 | FilterVariant Variant = 1;
42 |
43 | message FilterValue {
44 | message PathsValue {
45 | repeated string RelativePath = 1;
46 | }
47 | optional PathsValue ValuePaths = 1;
48 |
49 | message TimebasedValue {
50 | string Period = 1;
51 | }
52 | optional TimebasedValue ValueTimebased = 2;
53 |
54 | message RangeValue {
55 | string LogicOperator = 1;
56 | string Boundary = 2;
57 | }
58 | repeated RangeValue ValueRange = 3;
59 |
60 | message ChangeValue {
61 | string LogicOperator = 1;
62 | string Diff = 2;
63 | }
64 | optional ChangeValue ValueChange = 4;
65 |
66 | message CurvelogValue {
67 | string MaxErr = 1;
68 | string BufSize = 2;
69 | }
70 | optional CurvelogValue ValueCurvelog = 5;
71 |
72 | message HistoryValue {
73 | string TimePeriod = 1; //ISO8601 period expression
74 | }
75 | optional HistoryValue ValueHistory = 6;
76 |
77 | message MetadataValue {
78 | string Tree = 1;
79 | }
80 | optional MetadataValue ValueMetadata = 7;
81 | }
82 | FilterValue Value = 2;
83 | }
84 | repeated FilterExpression FilterExp = 1;
85 | }
86 |
87 | message DataPackages {
88 | message DataPackage {
89 | string Path = 1;
90 |
91 | message DataPoint {
92 | string Value = 1;
93 | string Ts = 2;
94 | }
95 | repeated DataPoint Dp = 2;
96 | }
97 | repeated DataPackage Data = 1;
98 | }
99 |
100 | message GetRequestMessage {
101 | string Path = 1;
102 | optional FilterExpressions Filter = 2;
103 | optional string Authorization = 3;
104 | optional string DataCompression = 4;
105 | optional string RequestId = 5;
106 | }
107 |
108 | message GetResponseMessage {
109 | ResponseStatus Status = 1;
110 | message SuccessResponseMessage {
111 | optional DataPackages DataPack = 1;
112 | optional string Metadata = 2; // replaces DataPack in metadata variant
113 | }
114 | optional SuccessResponseMessage SuccessResponse = 2;
115 | optional ErrorResponseMessage ErrorResponse = 3;
116 | optional string RequestId = 4;
117 | string Ts = 5;
118 | optional string Authorization = 6;
119 | }
120 |
121 | message SetRequestMessage {
122 | string Path = 1;
123 | string Value = 2;
124 | optional string Authorization = 3;
125 | optional string RequestId = 4;
126 | }
127 |
128 | message SetResponseMessage {
129 | ResponseStatus Status = 1;
130 | optional ErrorResponseMessage ErrorResponse = 2;
131 | optional string RequestId = 3;
132 | string Ts = 4;
133 | optional string Authorization = 5;
134 | }
135 |
136 | message SubscribeRequestMessage {
137 | string Path = 1;
138 | optional FilterExpressions Filter = 2;
139 | optional string Authorization = 3;
140 | optional string DataCompression = 4;
141 | string RequestId = 5;
142 | }
143 |
144 | message SubscribeStreamMessage {
145 | SubscribeResponseType MType = 1;
146 | ResponseStatus Status = 2;
147 |
148 | message SubscribeResponseMessage {
149 | optional ErrorResponseMessage ErrorResponse = 1;
150 | optional string SubscriptionId = 2;
151 | string RequestId = 3;
152 | string Ts = 4;
153 | optional string Authorization = 5;
154 | }
155 | optional SubscribeResponseMessage Response = 3;
156 |
157 | message SubscribeEventMessage {
158 | string SubscriptionId = 1;
159 | message SuccessResponseMessage {
160 | DataPackages DataPack = 1;
161 | }
162 | optional SuccessResponseMessage SuccessResponse = 2;
163 | optional ErrorResponseMessage ErrorResponse = 3;
164 | string Ts = 4;
165 | }
166 | optional SubscribeEventMessage Event = 4;
167 | }
168 |
169 | message UnsubscribeRequestMessage {
170 | string SubscriptionId = 1;
171 | optional string RequestId = 2;
172 | }
173 |
174 | message UnsubscribeResponseMessage {
175 | ResponseStatus Status = 1;
176 | optional ErrorResponseMessage ErrorResponse = 2;
177 | optional string RequestId = 3;
178 | string Ts = 4;
179 | }
180 |
--------------------------------------------------------------------------------
/VISS-explainer.md:
--------------------------------------------------------------------------------
1 | # VISS - Vehicle Information Service Specification Explainer
2 |
3 | Modern vehicles use hundreds of sensors which produce thousands of different data points, or signals, amounting to terabytes of data available per vehicle per day. The data points available on modern vehicles range from door lock state, fuel or charge level to tire pressure sensors and anti-lock brake control unit status. There is no question vehicles are transforming, becoming connected, electric and autonomous all of which relies extensively on signals data.
4 | A common and standardized data model and interface facilitates rapid innovation and development of various use cases involving this data.
5 |
6 | At the center of this effort is a common data model for these vehicle signals, namely the Vehicle Signal Specification ([VSS](https://covesa.github.io/vehicle_signal_specification/)) which is explained here [explainer](https://covesa.global/vehicle-signal-specification/). To access this data in a standardized way an effort to develop an interface was initially started by W3C in collaboration with COVESA and in 2024 was transferred fully to [COVESA](https://covesa.global), the Vehicle Information Service Specification (VISS). The service can reside either in the vehicle, or in the cloud. Client applications can also reside in the vehicle, cloud or running on a nomad device such as a smartphone.
7 |
8 | Vehicle signals, the definition and access to them, has historically been OEM proprietary. This has made it difficult for suppliers, commercial fleets,
9 | tech companies, insurance companies, regulators and other interested parties to integrate across vehicle brands. Furthermore, since VISS and VSS are open standards their use will reduce cost, promote innovation, interoperability and facilitate third party software development.
10 |
11 | VSS uses a tree structure with well-defined open definitions, but it also has the ability to be extended to handle new and /or proprietary signals if
12 | needed. The [transport](https://raw.githack.com/COVESA/vehicle-information-service-specification/main/spec/VISSv2_Transport.html) and [access (API)](https://raw.githack.com/COVESA/vehicle-information-service-specification/main/spec/VISSv2_Core.html) together comprise the VISS version 2 specification, that includes HTTPS, MQTT, as well as Websockets which was the only
13 | transport protocol supported in the [first version of VISS](https://www.w3.org/TR/vehicle-information-service/). The second and current version of VISS also includes a complete access control model, ability to support a consent model, and filtering techniques to better fit OEM requirements.
14 |
15 | The intention is to use web technologies to facilitate development of applications with limited, trusted entities and not to make vehicles available for arbitrary connections over the web. Access to specific data points and use of the information is outside the scope of this work. It is expected automotive manufacturers will govern which parties can run logic on or against vehicles, manage permissions, conduct security and legal/privacy audits. Regulators and courts, [Massachussets Right to Repair lawsuit as an example](https://www.natlawreview.com/article/automakers-lawsuit-opposing-updates-to-massachusetts-right-to-repair-law-lingers) and the [EU data act](https://www.eu-data-act.com) will undoubtedly influence this as well. VISS was designed as a technical solution to be flexible in accomodating the future business ecosystem. The COVESA Security and Data Expert Groups formal best practices which will include security and privacy aspects.
16 |
17 | VISS version 1 deferred on access control to individual implementations and as mentioned only supported Websockets. Of the thousands of data points potentially available, a client application could subscribe to an allowed subset, and thus receive initial and updated values over time. The second version expanded on the filters available for Websocket and MQTT subscriptions and also allows for individual requests over these protocols and HTTPS of individual signals or if allowed a set of specified signals. For example, issuing a request to the node Vehicle.Drivetrain.Transmission would, if authorized, return all data available for a vehicle's transmission.
18 |
19 | _Notes on implementation and use_
20 |
21 | VISS has known implementations by Volvo, BMW, JLR, Renesas, Bosch, Visteon, Geotab, AGL and Mitsubishi Electric to name a few.
22 | The underlying data model VSS is seeing much wider adoption, e.g. within AWS Fleetwise, Blackberry Ivy as well as having accompanying ontology ([VSSo](https://www.w3.org/TR/vsso/)) and graph schema for machine learning and generating knowledge graphs, since its uses go far beyond a single API.
23 |
24 | A client application for example could reside on the vehicle itself on an on-board logic, telematics or head unit. From there it can authenticate itself against VISS and based on permissions granted for the specific application, can read or even write data to/from the vehicle. Applications may be user facing, providing information to operator or occupants or performing data sampling for analysis.
25 |
26 | There are multiple uses for vehicle telematics data. Electric vehicle charging events can be combined with charging infrastructure, route planning and weather conditions to plan trips on a vehicles' behalf and ensure battery is not depleted. Insurance companies can use it, with owner/operator permission and typically in exchange for a discount on premium, to assess driving behavior. Fleet operators and mechanic services can assess vehicles performance and predict maintenance issues before they arise and leave a vehicle stranded. Information about a vehicles' status, location, fuel/charge level, diagnostics, etc can be conveyed to the owner on the head unit/in-vehicle infotainment or a trusted, paired smartphone.
27 |
28 | Several projects gathered under the umbrella [COVESA CVII](https://wiki.covesa.global/display/WIK4/Common+Vehicle+Interface+Initiative+-+Home) are addressing the mentioned use cases and the required connectivity building blocks where VISS is an important component to address needs within the vehicle, cloud, AI/knowledge graph, service and solution level all centered on the common vehicle data model VSS. Various potential architectures are under discussion, especially as COVESA and AUTOSAR are seeking to increase collaboration.
29 | [Architectural terms](https://wiki.covesa.global/pages/viewpage.action?pageId=46628901) are maintained by COVESA as well as a Mira board of potential architecures which VISS might be a part of.
30 |
31 | A standards based interface, and data model, supports interoperability between vehicle brands, and thus enables an open ecosystem where innovation of new services can thrive.
32 |
--------------------------------------------------------------------------------
/spec/images/signal-request.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/spec/images/grant-token-request-pki.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | Mozilla Public License Version 2.0
2 | ==================================
3 |
4 | 1. Definitions
5 | --------------
6 |
7 | 1.1. "Contributor"
8 | means each individual or legal entity that creates, contributes to
9 | the creation of, or owns Covered Software.
10 |
11 | 1.2. "Contributor Version"
12 | means the combination of the Contributions of others (if any) used
13 | by a Contributor and that particular Contributor's Contribution.
14 |
15 | 1.3. "Contribution"
16 | means Covered Software of a particular Contributor.
17 |
18 | 1.4. "Covered Software"
19 | means Source Code Form to which the initial Contributor has attached
20 | the notice in Exhibit A, the Executable Form of such Source Code
21 | Form, and Modifications of such Source Code Form, in each case
22 | including portions thereof.
23 |
24 | 1.5. "Incompatible With Secondary Licenses"
25 | means
26 |
27 | (a) that the initial Contributor has attached the notice described
28 | in Exhibit B to the Covered Software; or
29 |
30 | (b) that the Covered Software was made available under the terms of
31 | version 1.1 or earlier of the License, but not also under the
32 | terms of a Secondary License.
33 |
34 | 1.6. "Executable Form"
35 | means any form of the work other than Source Code Form.
36 |
37 | 1.7. "Larger Work"
38 | means a work that combines Covered Software with other material, in
39 | a separate file or files, that is not Covered Software.
40 |
41 | 1.8. "License"
42 | means this document.
43 |
44 | 1.9. "Licensable"
45 | means having the right to grant, to the maximum extent possible,
46 | whether at the time of the initial grant or subsequently, any and
47 | all of the rights conveyed by this License.
48 |
49 | 1.10. "Modifications"
50 | means any of the following:
51 |
52 | (a) any file in Source Code Form that results from an addition to,
53 | deletion from, or modification of the contents of Covered
54 | Software; or
55 |
56 | (b) any new file in Source Code Form that contains any Covered
57 | Software.
58 |
59 | 1.11. "Patent Claims" of a Contributor
60 | means any patent claim(s), including without limitation, method,
61 | process, and apparatus claims, in any patent Licensable by such
62 | Contributor that would be infringed, but for the grant of the
63 | License, by the making, using, selling, offering for sale, having
64 | made, import, or transfer of either its Contributions or its
65 | Contributor Version.
66 |
67 | 1.12. "Secondary License"
68 | means either the GNU General Public License, Version 2.0, the GNU
69 | Lesser General Public License, Version 2.1, the GNU Affero General
70 | Public License, Version 3.0, or any later versions of those
71 | licenses.
72 |
73 | 1.13. "Source Code Form"
74 | means the form of the work preferred for making modifications.
75 |
76 | 1.14. "You" (or "Your")
77 | means an individual or a legal entity exercising rights under this
78 | License. For legal entities, "You" includes any entity that
79 | controls, is controlled by, or is under common control with You. For
80 | purposes of this definition, "control" means (a) the power, direct
81 | or indirect, to cause the direction or management of such entity,
82 | whether by contract or otherwise, or (b) ownership of more than
83 | fifty percent (50%) of the outstanding shares or beneficial
84 | ownership of such entity.
85 |
86 | 2. License Grants and Conditions
87 | --------------------------------
88 |
89 | 2.1. Grants
90 |
91 | Each Contributor hereby grants You a world-wide, royalty-free,
92 | non-exclusive license:
93 |
94 | (a) under intellectual property rights (other than patent or trademark)
95 | Licensable by such Contributor to use, reproduce, make available,
96 | modify, display, perform, distribute, and otherwise exploit its
97 | Contributions, either on an unmodified basis, with Modifications, or
98 | as part of a Larger Work; and
99 |
100 | (b) under Patent Claims of such Contributor to make, use, sell, offer
101 | for sale, have made, import, and otherwise transfer either its
102 | Contributions or its Contributor Version.
103 |
104 | 2.2. Effective Date
105 |
106 | The licenses granted in Section 2.1 with respect to any Contribution
107 | become effective for each Contribution on the date the Contributor first
108 | distributes such Contribution.
109 |
110 | 2.3. Limitations on Grant Scope
111 |
112 | The licenses granted in this Section 2 are the only rights granted under
113 | this License. No additional rights or licenses will be implied from the
114 | distribution or licensing of Covered Software under this License.
115 | Notwithstanding Section 2.1(b) above, no patent license is granted by a
116 | Contributor:
117 |
118 | (a) for any code that a Contributor has removed from Covered Software;
119 | or
120 |
121 | (b) for infringements caused by: (i) Your and any other third party's
122 | modifications of Covered Software, or (ii) the combination of its
123 | Contributions with other software (except as part of its Contributor
124 | Version); or
125 |
126 | (c) under Patent Claims infringed by Covered Software in the absence of
127 | its Contributions.
128 |
129 | This License does not grant any rights in the trademarks, service marks,
130 | or logos of any Contributor (except as may be necessary to comply with
131 | the notice requirements in Section 3.4).
132 |
133 | 2.4. Subsequent Licenses
134 |
135 | No Contributor makes additional grants as a result of Your choice to
136 | distribute the Covered Software under a subsequent version of this
137 | License (see Section 10.2) or under the terms of a Secondary License (if
138 | permitted under the terms of Section 3.3).
139 |
140 | 2.5. Representation
141 |
142 | Each Contributor represents that the Contributor believes its
143 | Contributions are its original creation(s) or it has sufficient rights
144 | to grant the rights to its Contributions conveyed by this License.
145 |
146 | 2.6. Fair Use
147 |
148 | This License is not intended to limit any rights You have under
149 | applicable copyright doctrines of fair use, fair dealing, or other
150 | equivalents.
151 |
152 | 2.7. Conditions
153 |
154 | Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
155 | in Section 2.1.
156 |
157 | 3. Responsibilities
158 | -------------------
159 |
160 | 3.1. Distribution of Source Form
161 |
162 | All distribution of Covered Software in Source Code Form, including any
163 | Modifications that You create or to which You contribute, must be under
164 | the terms of this License. You must inform recipients that the Source
165 | Code Form of the Covered Software is governed by the terms of this
166 | License, and how they can obtain a copy of this License. You may not
167 | attempt to alter or restrict the recipients' rights in the Source Code
168 | Form.
169 |
170 | 3.2. Distribution of Executable Form
171 |
172 | If You distribute Covered Software in Executable Form then:
173 |
174 | (a) such Covered Software must also be made available in Source Code
175 | Form, as described in Section 3.1, and You must inform recipients of
176 | the Executable Form how they can obtain a copy of such Source Code
177 | Form by reasonable means in a timely manner, at a charge no more
178 | than the cost of distribution to the recipient; and
179 |
180 | (b) You may distribute such Executable Form under the terms of this
181 | License, or sublicense it under different terms, provided that the
182 | license for the Executable Form does not attempt to limit or alter
183 | the recipients' rights in the Source Code Form under this License.
184 |
185 | 3.3. Distribution of a Larger Work
186 |
187 | You may create and distribute a Larger Work under terms of Your choice,
188 | provided that You also comply with the requirements of this License for
189 | the Covered Software. If the Larger Work is a combination of Covered
190 | Software with a work governed by one or more Secondary Licenses, and the
191 | Covered Software is not Incompatible With Secondary Licenses, this
192 | License permits You to additionally distribute such Covered Software
193 | under the terms of such Secondary License(s), so that the recipient of
194 | the Larger Work may, at their option, further distribute the Covered
195 | Software under the terms of either this License or such Secondary
196 | License(s).
197 |
198 | 3.4. Notices
199 |
200 | You may not remove or alter the substance of any license notices
201 | (including copyright notices, patent notices, disclaimers of warranty,
202 | or limitations of liability) contained within the Source Code Form of
203 | the Covered Software, except that You may alter any license notices to
204 | the extent required to remedy known factual inaccuracies.
205 |
206 | 3.5. Application of Additional Terms
207 |
208 | You may choose to offer, and to charge a fee for, warranty, support,
209 | indemnity or liability obligations to one or more recipients of Covered
210 | Software. However, You may do so only on Your own behalf, and not on
211 | behalf of any Contributor. You must make it absolutely clear that any
212 | such warranty, support, indemnity, or liability obligation is offered by
213 | You alone, and You hereby agree to indemnify every Contributor for any
214 | liability incurred by such Contributor as a result of warranty, support,
215 | indemnity or liability terms You offer. You may include additional
216 | disclaimers of warranty and limitations of liability specific to any
217 | jurisdiction.
218 |
219 | 4. Inability to Comply Due to Statute or Regulation
220 | ---------------------------------------------------
221 |
222 | If it is impossible for You to comply with any of the terms of this
223 | License with respect to some or all of the Covered Software due to
224 | statute, judicial order, or regulation then You must: (a) comply with
225 | the terms of this License to the maximum extent possible; and (b)
226 | describe the limitations and the code they affect. Such description must
227 | be placed in a text file included with all distributions of the Covered
228 | Software under this License. Except to the extent prohibited by statute
229 | or regulation, such description must be sufficiently detailed for a
230 | recipient of ordinary skill to be able to understand it.
231 |
232 | 5. Termination
233 | --------------
234 |
235 | 5.1. The rights granted under this License will terminate automatically
236 | if You fail to comply with any of its terms. However, if You become
237 | compliant, then the rights granted under this License from a particular
238 | Contributor are reinstated (a) provisionally, unless and until such
239 | Contributor explicitly and finally terminates Your grants, and (b) on an
240 | ongoing basis, if such Contributor fails to notify You of the
241 | non-compliance by some reasonable means prior to 60 days after You have
242 | come back into compliance. Moreover, Your grants from a particular
243 | Contributor are reinstated on an ongoing basis if such Contributor
244 | notifies You of the non-compliance by some reasonable means, this is the
245 | first time You have received notice of non-compliance with this License
246 | from such Contributor, and You become compliant prior to 30 days after
247 | Your receipt of the notice.
248 |
249 | 5.2. If You initiate litigation against any entity by asserting a patent
250 | infringement claim (excluding declaratory judgment actions,
251 | counter-claims, and cross-claims) alleging that a Contributor Version
252 | directly or indirectly infringes any patent, then the rights granted to
253 | You by any and all Contributors for the Covered Software under Section
254 | 2.1 of this License shall terminate.
255 |
256 | 5.3. In the event of termination under Sections 5.1 or 5.2 above, all
257 | end user license agreements (excluding distributors and resellers) which
258 | have been validly granted by You or Your distributors under this License
259 | prior to termination shall survive termination.
260 |
261 | ************************************************************************
262 | * *
263 | * 6. Disclaimer of Warranty *
264 | * ------------------------- *
265 | * *
266 | * Covered Software is provided under this License on an "as is" *
267 | * basis, without warranty of any kind, either expressed, implied, or *
268 | * statutory, including, without limitation, warranties that the *
269 | * Covered Software is free of defects, merchantable, fit for a *
270 | * particular purpose or non-infringing. The entire risk as to the *
271 | * quality and performance of the Covered Software is with You. *
272 | * Should any Covered Software prove defective in any respect, You *
273 | * (not any Contributor) assume the cost of any necessary servicing, *
274 | * repair, or correction. This disclaimer of warranty constitutes an *
275 | * essential part of this License. No use of any Covered Software is *
276 | * authorized under this License except under this disclaimer. *
277 | * *
278 | ************************************************************************
279 |
280 | ************************************************************************
281 | * *
282 | * 7. Limitation of Liability *
283 | * -------------------------- *
284 | * *
285 | * Under no circumstances and under no legal theory, whether tort *
286 | * (including negligence), contract, or otherwise, shall any *
287 | * Contributor, or anyone who distributes Covered Software as *
288 | * permitted above, be liable to You for any direct, indirect, *
289 | * special, incidental, or consequential damages of any character *
290 | * including, without limitation, damages for lost profits, loss of *
291 | * goodwill, work stoppage, computer failure or malfunction, or any *
292 | * and all other commercial damages or losses, even if such party *
293 | * shall have been informed of the possibility of such damages. This *
294 | * limitation of liability shall not apply to liability for death or *
295 | * personal injury resulting from such party's negligence to the *
296 | * extent applicable law prohibits such limitation. Some *
297 | * jurisdictions do not allow the exclusion or limitation of *
298 | * incidental or consequential damages, so this exclusion and *
299 | * limitation may not apply to You. *
300 | * *
301 | ************************************************************************
302 |
303 | 8. Litigation
304 | -------------
305 |
306 | Any litigation relating to this License may be brought only in the
307 | courts of a jurisdiction where the defendant maintains its principal
308 | place of business and such litigation shall be governed by laws of that
309 | jurisdiction, without reference to its conflict-of-law provisions.
310 | Nothing in this Section shall prevent a party's ability to bring
311 | cross-claims or counter-claims.
312 |
313 | 9. Miscellaneous
314 | ----------------
315 |
316 | This License represents the complete agreement concerning the subject
317 | matter hereof. If any provision of this License is held to be
318 | unenforceable, such provision shall be reformed only to the extent
319 | necessary to make it enforceable. Any law or regulation which provides
320 | that the language of a contract shall be construed against the drafter
321 | shall not be used to construe this License against a Contributor.
322 |
323 | 10. Versions of the License
324 | ---------------------------
325 |
326 | 10.1. New Versions
327 |
328 | Mozilla Foundation is the license steward. Except as provided in Section
329 | 10.3, no one other than the license steward has the right to modify or
330 | publish new versions of this License. Each version will be given a
331 | distinguishing version number.
332 |
333 | 10.2. Effect of New Versions
334 |
335 | You may distribute the Covered Software under the terms of the version
336 | of the License under which You originally received the Covered Software,
337 | or under the terms of any subsequent version published by the license
338 | steward.
339 |
340 | 10.3. Modified Versions
341 |
342 | If you create software not governed by this License, and you want to
343 | create a new license for such software, you may create and use a
344 | modified version of this License if you rename the license and remove
345 | any references to the name of the license steward (except to note that
346 | such modified license differs from this License).
347 |
348 | 10.4. Distributing Source Code Form that is Incompatible With Secondary
349 | Licenses
350 |
351 | If You choose to distribute Source Code Form that is Incompatible With
352 | Secondary Licenses under the terms of this version of the License, the
353 | notice described in Exhibit B of this License must be attached.
354 |
355 | Exhibit A - Source Code Form License Notice
356 | -------------------------------------------
357 |
358 | This Source Code Form is subject to the terms of the Mozilla Public
359 | License, v. 2.0. If a copy of the MPL was not distributed with this
360 | file, You can obtain one at http://mozilla.org/MPL/2.0/.
361 |
362 | If it is not possible or desirable to put the notice in a particular
363 | file, then You may include the notice in a location (such as a LICENSE
364 | file in a relevant directory) where a recipient would be likely to look
365 | for such a notice.
366 |
367 | You may add additional accurate notices of copyright ownership.
368 |
369 | Exhibit B - "Incompatible With Secondary Licenses" Notice
370 | ---------------------------------------------------------
371 |
372 | This Source Code Form is "Incompatible With Secondary Licenses", as
373 | defined by the Mozilla Public License, v. 2.0.
374 |
--------------------------------------------------------------------------------
/spec/VISSv3.0_PayloadEncoding.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
Copyright © 2025 COVESA®.
108 |110 | The Vehicle Information Service Specification (VISS) is a 111 | service for accessing vehicle information, including signals from sensors 112 | on control units within a vehicle's network. This information is exposed through a hierarchical, 113 | tree-like taxonomy as defined in the COVESA Vehicle Signal Specification (VSS), 114 | and is provided in JSON format. The VISS service may be hosted within the vehicle or on external servers, 115 | using data that has already been off-boarded. 116 |
117 |118 | VISS enables a broad range of use cases, including predictive maintenance, usage-based insurance, fleet management, 119 | and real-time driver assistance services. 120 | In the context of artificial intelligence, VISS serves as a critical data access layer, providing high-quality, 121 | real-time vehicle data that can be utilized by AI algorithms for tasks such as anomaly detection, 122 | driver behavior analysis, energy optimization, and contextual decision-making. 123 |
124 |125 | This specification describes the third version of VISS, which 126 | has been implemented and deployed in production vehicles. 127 | The first version of VISS supported only WebSocket as a 128 | transport protocol, the second version is generalized to work 129 | across different protocols as some are better suited for 130 | different use cases. 131 | The second version added support for the HTTP and MQTT transport 132 | protocols, improved subscription capabilities and added an 133 | access control mechanism. 134 |
135 | 136 |137 | There are three parts to this specification, [[CORE]], [[TRANSPORT]], and PAYLOAD ENCODING. This document, the VISS version 3.0 PAYLOAD ENCODING specification, 138 | describes the VISSv3.0 payload encodings that is used in some cases. 139 | The companion specifications [[CORE]] describes the messaging layer, 140 | and [[TRANSPORT]] describes the deviations form the CORE specification that are used by some transport protocols. 141 |
142 |This specification describes the payload encodings used by some transport protocols. 147 |
148 |155 | The acronym 'VISSv3.0' is used to refer to this document, the VISS version 3.0 specification. 156 | The acronym 'VSS' is used to refer to the 'Vehicle Signal Specification' 157 | which is hosted by COVESA. 158 | The term 'WebSocket' when used in this specification, is as defined in the 159 | W3C WebSocket API and [[RFC6455]], the WebSocket Protocol. 160 |
161 |The payload primary format is JSON. This means that the payloads received by a client SHALL have the JSON format, 166 | unless an implementation deliberately deviates from this. 167 | Refer to the [[CORE]] specification for the JSON payload format of the messages for the different transport protocols. 168 |
169 |Protocol Buffers (Protobuf) is a language-neutral, platform-neutral, extensible mechanism for serializing structured data, developed by Google. 174 | This encoding method is particularly beneficial for efficient data serialization and deserialization, ensuring low latency and reduced payload size, 175 | which are crucial for vehicle information services. 176 |
177 |The Vehicle Information Service Specification (VISS) defines a standard protocol for accessing vehicle data in a standardized manner. 178 | As vehicles become more connected and data-driven, the need for efficient data exchange methods becomes paramount. 179 | Protobuf encoding serves as an optimal solution within VISS due to its compact binary format and schema evolution capabilities. 180 |
181 |In this section, we outline the integration of Protobuf encoding with VISS version 3.0, providing comprehensive details on schema definitions, 182 | encoding and decoding processes, and practical examples. This will enable seamless implementation and interoperability across different systems and 183 | platforms within the automotive ecosystem. 184 |
185 | 186 |189 | The following protobuf schema defines the VISS message payloads. 190 | When saved in a file (e.g., named "viss.proto"), the Protobuf compiler (protoc) can be used to create helper functions that can be called to encode and decode 191 | between the JSON and Protobuf formats. 192 | The protobuf schema below also contains a "service" clause that the protoc compiler uses to create a gRPC based communication framework. 193 |
194 | 195 |
196 | syntax = "proto3";
197 | package grpcProtobufMessages;
198 |
199 | enum ResponseStatus {
200 | SUCCESS = 0;
201 | ERROR = 1;
202 | }
203 |
204 | enum SubscribeResponseType {
205 | RESPONSE = 0;
206 | EVENT = 1;
207 | }
208 |
209 | service VISS {
210 | rpc GetRequest (GetRequestMessage) returns (GetResponseMessage);
211 |
212 | rpc SetRequest (SetRequestMessage) returns (SetResponseMessage);
213 |
214 | rpc SubscribeRequest (SubscribeRequestMessage) returns (stream SubscribeStreamMessage);
215 |
216 | rpc UnsubscribeRequest (UnsubscribeRequestMessage) returns (UnsubscribeResponseMessage);
217 | }
218 |
219 | message ErrorResponseMessage {
220 | string Number = 1;
221 | string Reason = 2;
222 | string Description = 3;
223 | }
224 |
225 | message FilterExpressions {
226 | message FilterExpression {
227 | enum FilterVariant {
228 | PATHS = 0;
229 | TIMEBASED = 1;
230 | RANGE = 2;
231 | CHANGE = 3;
232 | CURVELOG = 4;
233 | HISTORY = 5;
234 | METADATA = 6;
235 | }
236 | FilterVariant Variant = 1;
237 |
238 | message FilterValue {
239 | message PathsValue {
240 | repeated string RelativePath = 1;
241 | }
242 | optional PathsValue ValuePaths = 1;
243 |
244 | message TimebasedValue {
245 | string Period = 1;
246 | }
247 | optional TimebasedValue ValueTimebased = 2;
248 |
249 | message RangeValue {
250 | string LogicOperator = 1;
251 | string Boundary = 2;
252 | }
253 | repeated RangeValue ValueRange = 3;
254 |
255 | message ChangeValue {
256 | string LogicOperator = 1;
257 | string Diff = 2;
258 | }
259 | optional ChangeValue ValueChange = 4;
260 |
261 | message CurvelogValue {
262 | string MaxErr = 1;
263 | string BufSize = 2;
264 | }
265 | optional CurvelogValue ValueCurvelog = 5;
266 |
267 | message HistoryValue {
268 | string TimePeriod = 1; //ISO8601 period expression
269 | }
270 | optional HistoryValue ValueHistory = 6;
271 |
272 | message MetadataValue {
273 | string Tree = 1;
274 | }
275 | optional MetadataValue ValueMetadata = 7;
276 | }
277 | FilterValue Value = 2;
278 | }
279 | repeated FilterExpression FilterExp = 1;
280 | }
281 |
282 | message DataPackages {
283 | message DataPackage {
284 | string Path = 1;
285 |
286 | message DataPoint {
287 | string Value = 1;
288 | string Ts = 2;
289 | }
290 | repeated DataPoint Dp = 2;
291 | }
292 | repeated DataPackage Data = 1;
293 | }
294 |
295 | message GetRequestMessage {
296 | string Path = 1;
297 | optional FilterExpressions Filter = 2;
298 | optional string Authorization = 3;
299 | optional string DataCompression = 4;
300 | optional string RequestId = 5;
301 | }
302 |
303 | message GetResponseMessage {
304 | ResponseStatus Status = 1;
305 | message SuccessResponseMessage {
306 | optional DataPackages DataPack = 1;
307 | optional string Metadata = 2; // replaces DataPack in metadata variant
308 | }
309 | optional SuccessResponseMessage SuccessResponse = 2;
310 | optional ErrorResponseMessage ErrorResponse = 3;
311 | optional string RequestId = 4;
312 | string Ts = 5;
313 | optional string Authorization = 6;
314 | }
315 |
316 | message SetRequestMessage {
317 | string Path = 1;
318 | string Value = 2;
319 | optional string Authorization = 3;
320 | optional string RequestId = 4;
321 | }
322 |
323 | message SetResponseMessage {
324 | ResponseStatus Status = 1;
325 | optional ErrorResponseMessage ErrorResponse = 2;
326 | optional string RequestId = 3;
327 | string Ts = 4;
328 | optional string Authorization = 5;
329 | }
330 |
331 | message SubscribeRequestMessage {
332 | string Path = 1;
333 | optional FilterExpressions Filter = 2;
334 | optional string Authorization = 3;
335 | optional string DataCompression = 4;
336 | string RequestId = 5;
337 | }
338 |
339 | message SubscribeStreamMessage {
340 | SubscribeResponseType MType = 1;
341 | ResponseStatus Status = 2;
342 |
343 | message SubscribeResponseMessage {
344 | optional ErrorResponseMessage ErrorResponse = 1;
345 | optional string SubscriptionId = 2;
346 | string RequestId = 3;
347 | string Ts = 4;
348 | optional string Authorization = 5;
349 | }
350 | optional SubscribeResponseMessage Response = 3;
351 |
352 | message SubscribeEventMessage {
353 | string SubscriptionId = 1;
354 | message SuccessResponseMessage {
355 | DataPackages DataPack = 1;
356 | }
357 | optional SuccessResponseMessage SuccessResponse = 2;
358 | optional ErrorResponseMessage ErrorResponse = 3;
359 | string Ts = 4;
360 | }
361 | optional SubscribeEventMessage Event = 4;
362 | }
363 |
364 | message UnsubscribeRequestMessage {
365 | string SubscriptionId = 1;
366 | optional string RequestId = 2;
367 | }
368 |
369 | message UnsubscribeResponseMessage {
370 | ResponseStatus Status = 1;
371 | optional ErrorResponseMessage ErrorResponse = 2;
372 | optional string RequestId = 3;
373 | string Ts = 4;
374 | }
375 |
376 | This part outlines how Protobuf encoding is realized across various transport protocols, including gRPC, WebSocket, and MQTT. 385 |
386 | 387 |390 | The 'service' clause in the Protobuf schema is used by the Protobuf compiler(protoc) to automatically generate code for gRPC-based communication. 391 | This generated code simplifies the development of server and client interactions by abstracting the network communication layer, 392 | allowing developers to focus on the application logic. 393 |
394 |399 | If a server supports protobuf payload encoding over the Websocket protocol, it SHALL be shown in the server capabilities data 400 | how the client configures this. Two mechanisms are defined: 401 |
411 | If a server supports protobuf payload encoding over the MQTT protocol, it SHALL be shown in the server capabilities data 412 | which topic name that the server uses to listen for clients that want to issue requests with protobuf encoded payloads. 413 | The recommended topic name is the topic name used for the unencoded payload channel appended with the string "/protobuf". 414 |
415 |422 | The protobuf compiler uses the protobuf schema to generate an API to helper functions that can be used to implement the encoding and decoding 423 | between JSON and the protobuf format for the various VISS messages. 424 | The implementation of the encoding and the decoding is out-of-scope for this specification. 425 |
426 |432 | Several Interface Definition Languages (IDLs), such as OpenAPI and AsyncAPI, can utilize a JSON Schema representation as input. 433 | The JSON scheme representation of the VISSv3.0 interface in the [[CORE]] specification can be used for such a purpose. 434 |
435 |Copyright © 2025 COVESA®.
108 |110 | The Vehicle Information Service Specification (VISS) is a 111 | service for accessing vehicle information, including signals from sensors 112 | on control units within a vehicle's network. This information is exposed through a hierarchical, 113 | tree-like taxonomy as defined in the COVESA Vehicle Signal Specification (VSS), 114 | and is provided in JSON format. The VISS service may be hosted within the vehicle or on external servers, 115 | using data that has already been off-boarded. 116 |
117 |118 | VISS enables a broad range of use cases, including predictive maintenance, usage-based insurance, fleet management, 119 | and real-time driver assistance services. 120 | In the context of artificial intelligence, VISS serves as a critical data access layer, providing high-quality, 121 | real-time vehicle data that can be utilized by AI algorithms for tasks such as anomaly detection, 122 | driver behavior analysis, energy optimization, and contextual decision-making. 123 |
124 |125 | This specification describes the third version of VISS, which 126 | has been implemented and deployed in production vehicles. 127 | The first version of VISS supported only WebSocket as a 128 | transport protocol, the second version is generalized to work 129 | across different protocols as some are better suited for 130 | different use cases. 131 | The second version added support for the HTTP and MQTT transport 132 | protocols, improved subscription capabilities and added an 133 | access control mechanism. 134 |
135 | 136 |137 | This specification consists of three parts, [[CORE]], [[PAYLOAD ENCODING]], and TRANSPORT. This document, the VISS version 3.0 TRANSPORT specification, 138 | describes the VISSv3 transport protocols, and how the message layer is mapped to each transport. 139 | The companion specification [[CORE]] describes the messaging layer, and [[PAYLOAD ENCODING]] describes payload encodings to/from the primary JSON payload format. 140 |
141 |This specification provides examples of how the message payloads defined in [[CORE]] are used together with different transport protocols.
146 | The Websocket protocol([[RFC6455]]) is used to give an example of how the JSON primary payload format is directly used.
147 | This is followed by examples of other transport protocols that introduce exceptions or transformations to the primary payload format.
148 | The Vehicle Information Service Specification, version 3.0, allows the use of any transport protocol that can carry the unaltered primary payload format.
149 | If a transport protocol requires modifications or transformations, those MUST be specified either in this document or in the [[PAYLOAD ENCODING]] document.
150 | The transport protocols that define such deviations in this document are listed below.
151 |
| Protocol name | 154 |Reference | 155 |
|---|---|
| HTTP | 158 |[[RFC9112]] | 159 |
| MQTT | 162 |[[MQTT]] | 163 |
| gRPC | 166 |[gRPC] | 167 |
178 | The acronym 'VISSv3.0' refer to this document, the VISS version 3.0 specification. 179 | The acronym 'VSS' refer to the 'Vehicle Signal Specification' 180 | which is maintained by COVESA. 181 | The term 'WebSocket', as used in this specification, follows the definition in the 182 | W3C WebSocket API and [[RFC6455]], the WebSocket Protocol. 183 |
184 |This section defines features that SHALL be common for all transport protocols.
189 | 190 |A server implementing this specification SHALL support the error codes, reasons, and descriptions listed in the table below,
193 | across all supported transport protocols.
194 | The server MAY dynamically replace the error description with one of the alternatives
195 | described in the following sub-sections, or with any other relevant message.
196 | The client MAY support any status code defined in [[RFC2616]].
| Error Number (Code) | 200 |Error Reason | 201 |Error Description | 202 |
|---|---|---|
| 400 (Bad Request) | 205 |bad_request | 206 |The request is malformed | 207 |
| 400 (Bad Request) | 210 |invalid_data | 211 |Data in the request is invalid | 212 |
| 401 (Unauthorized) | 215 |invalid_token | 216 |Access token is invalid | 217 |
| 403 (Forbidden) | 220 |forbidden_request | 221 |The server refuses to carry out the request | 222 |
| 404 (Not Found) | 225 |unavailable_data | 226 |The requested data was not found | 227 |
| 408 (Request Timeout) | 230 |request_timeout | 231 |Subscribe duration limit exceeded | 232 |
| 429 (Too Many Requests) | 235 |too_many_requests | 236 |Rate-limiting due to too many requests | 237 |
| 502 (Bad Gateway) 240 | | bad_gateway | 241 |The upstream server response was invalid | 242 |
| 503 (Service Unavailable) | 245 |service_unavailable | 246 |The server is temporarily unable to handle the request | 247 |
| 504 (Gateway Timeout) | 250 |gateway_timeout | 251 |The upstream server took too long to respond | 252 |
258 | A client MAY issue one request to get or subscribe to multiple signals. 259 | If one or more of the requested signals are temporarily unavaliable, the server has two response options: 260 |
261 |
275 | {
276 | "action": "get",
277 | "data": [
278 | {
279 | "dp": {
280 | "ts": "2025-02-04T15:48:43.739Z",
281 | "value": "viss-inline:Data-not-available"
282 | },
283 | "path": "Vehicle.ADAS.ABS.IsEnabled"
284 | },
285 | {
286 | "dp": {
287 | "ts": "2025-02-04T15:48:43.739Z",
288 | "value": "true"
289 | },
290 | "path": "Vehicle.ADAS.ABS.IsError"
291 | }
292 | ],
293 | "requestId": "237",
294 | "ts": "2025-02-04T15:48:43.739Z"
295 | }
296 | In-line error reporting SHALL NOT be used when access control is required for the request.
297 | The reason for this is that the purpose that is associated with the set of requested data can not be met
298 | with a reduced data set, thus the "contract" between client and data owner becomes invalid.
299 | 304 | The following table outlines common error scenarios that clients may encounter, 305 | along with the corresponding error messages that the server is expected to return. 306 |
307 || Error Scenario | 310 |Error Message | 311 |Comment | 312 |
|---|---|---|
| Incorrect datatype | 315 |400 - invalid_data - Incorrect data type | 316 |Mismatch with the datatype in the VSS tree | 317 |
| Signal currently not available | 320 |404 - unavailable_data - Data temporarily unaccessible | 321 |Vehicle is currently not offering the signal | 322 |
| Unknown signal | 325 |404 - unavailable_data - Data is unknown | 326 |Signal is not part of the VSS tree | 327 |
| Misused filter | 330 |400 - bad_request - Missing or invalid filter | 331 |Missing or invalid filter | 332 |
| Incorrect filter | 335 |400 - bad_request - Incorrect filter | 336 |Filter type not allowed with request method | 337 |
| Unknown subscription Id | 340 |404 - unavailable_data - Unknown subscription Id | 341 |Filter type not allowed with request method | 342 |
| Unsupported feature Id | 345 |404 - unavailable_data - Unsupported feature | 346 |The feature is not a server capability | 347 |
| Invalid access rights | 350 |401 - invalid_token - Access token is invalid | 351 |Access right is expired or otherwise invalid | 352 |
359 | The 400 Bad Request error code and its associated reason SHALL be used for errors related to the JSON schema. 360 | The default error description is listed in the table above. However, the server MAY dynamically replace 361 | it with one of the following error descriptions, or with any other relevant description: 362 |
363 |actionpathfiltervalue374 | The 400 Invalid Data error code and reason SHALL be used for errors that are not covered by 375 | the JSON schema, but instead violate rules defined by a VSS property. 376 | The default error description is provided in the table above. However, the server MAY dynamically replace 377 | it with one of the following descriptions, or with any other relevant error message: 378 |
379 |403 | The 404 Not Found error code and reason SHALL be used when the server does not have access to the requested data. 404 | The default error description is listed in the table above. The server MAY dynamically replace 405 | it with one of the following messages, or with any other relevant description: 406 |
407 |417 | The payload SHALL be formatted in JSON. 418 | Refer to the section A. JSON Schema of appendix in the [[CORE]] specification for details on the primary payload format. 419 |
420 |
437 | The VISSv3.0 specification lists the transport protocols HTTP, WebSocket, gRPC, and MQTT as supported.
438 | However, this is not necessarily a final list as says that any protocol that transport the primary payloads of this specification,
439 | or an encoded version of the primary payloads, can be included on this list.
440 | The specification does not mandate the use of a specific transport protocol,
441 | but at least one of the listed transport protocols MUST be supported.
442 |
447 | The WebSocket protocol is used in this document to provide examples of a protocol that does not apply any deviations to the primary payload format.
448 | As it does not implicitly provide a logical association between the request and response messages,
449 | a key-value pair with the key name "requestId" MUST be added to the data components, as described in the [[CORE]] specification.
450 | Additionally, since WebSocket does not define explicit methods, another key-value pair, "action", MUST also be included.
451 | Refer to the for detailed descriptions of these key-value pairs.
452 | All data components are mapped to the payload.
453 |
If the client application is an HTML Application running in a web runtime or is a web page running 462 | in a browser, the WebSocket instance may either be instantiated natively or be created using 463 | a 'standards compliant' WebSocket JavaScript library.
464 |A WebSocket can also be initiated from a native application (e.g., written in C++) 465 | or from a managed runtime environment such as Java or C#. 466 | In these cases, it is assumed that the client uses a standards-compliant WebSocket library 467 | to request a connection with the server.
468 | 469 |Implementations that support additional devices or multiple VISSv3 services 470 | should provide discovery. Alternatively, the location of a particular VISSv3 471 | Server instance on the local vehicle network may be handled by 472 | configuration, either as part of a package manifest or by consulting a 473 | registry on application install. The 'wwwVISSv3' hostname in this 474 | specification is used an example. 475 |
476 | 477 |A client running on the vehicle is able to connect to the 478 | VISSv3 Server instance using the hostname e.g. 'wwwVISSv3' and uses the 479 | default port 6443. The hostname 'wwwVISSv3' may locally be mapped to the localhost 480 | IP address 127.0.0.1 e.g. by adding an entry to the /etc/hosts file.
481 | 482 |The sub-protocol name SHALL be 'VISSv3' with the digit 3 being the version number. 483 | The sub-protocol version will 484 | be associated with exactly one VISS Server Specification version so that the client and server can 485 | correctly validate and parse request and response message packets.
486 |
487 | var vehicle = new WebSocket("wss://wwwVISSv3:6443", "VISSv3");
488 |
489 | The client SHALL connect to the server over HTTPS and request that 490 | the server opens a WebSocket. All WebSocket communications between 491 | the client and server MUST use ‘wss’ (WebSocket Secure). Non encrypted communication 492 | is not supported, hence the server MUST reject ‘ws’ connection requests.
493 | 494 |This specification assumes that a single WebSocket is used to enable communication between a client application 495 | and the server. The client MAY open more than one websocket. 496 | However, the server MAY reject to open a subsequent WebSocket connection and 497 | the client is responsible for handling this gracefully. 498 |
499 |If multiple WebSocket connection is established between a client application and the server 500 | then each connection MUST be managed independently. For example, subscriptions created 501 | through one connection can only trigger events through that same connection, 502 | and the client MUST use the same connection to unsubscribe. 503 |
504 |If multiple WebSocket connection has been established 505 | between one or more clients and a particular server instance, there 506 | is a risk that race conditions and concurrency issues could occur. 507 | For instance, simultaneous updates to the same signal from different connections 508 | could result in conflicts. 509 |
510 | 511 |Unless explicitly stated otherwise, the client MAY assume that the server implements 512 | a basic concurrency model, meaning that lost updates or dirty reads could occur 513 | when multiple WebSocket connections are in use. 514 |
515 |The WebSocket connection MAY be closed by either the client or the 520 | server by invoking the ‘close()’ method on the WebSocket 521 | instance.
522 | 523 |The following example shows the typical lifecycle of a WebSocket connection on the client side:
524 |
525 | // Open the WebSocket
526 | var vehicle = new WebSocket("wss://wwwVISSv3:6443", "VISSv3");
527 | …
528 | // Close the WebSocket
529 | vehicle.close();
530 |
531 | 532 | The VISSv3 server MAY also terminate the connection if it does not receive any requests from the client 533 | within a server-defined timeout period. 534 | In such cases, the client MUST handle the closure gracefully, and if needed, re-establish the connection and request new subscriptions, where required. 535 |
536 |The client MAY send a getRequest 545 | message to the server to get the value of one or more vehicle signals. 546 | If the server can fulfill the request, it SHALL return a 547 | getSuccessResponse message. 548 | If an error occurs, the server SHALL return a 549 | getErrorResponse message. 550 | The structure of these message objects is defined in the tables below: 551 |
| Object Name | Attribute | Type | Required |
|---|---|---|---|
| getRequest | action | Action | Yes |
| path | string | Yes | |
| filter | string | Optional | |
| authorization | string | Optional | |
| data compression | string | Optional | |
| requestId | string | Yes |
| Object Name | Attribute | Type | Required |
|---|---|---|---|
| getSuccessResponse | action | Action | Yes |
| requestId | string | Yes | |
| data | object/array | Yes | |
| ts | string | Yes |
578 | In the table above, the "data" attribute is either an object containing "value" and "ts" name/value pairs, or an array of such objects. 579 |
580 || Object Name | Attribute | Type | Required |
|---|---|---|---|
| getErrorResponse | action | Action | Yes |
| requestId | string | Yes | |
| error | Error | Yes | |
| ts | string | Yes |
592 | Example:
593 | Request:
594 |
595 | {
596 | "action": "get",
597 | "path": "Vehicle.Powertrain.CombustionEngine.RPM",
598 | "requestId": "8756"
599 | }
600 |
601 | Successful response:
602 |
603 | {
604 | "action": "get",
605 | "requestId": "8756",
606 | "data":{"path":"Vehicle.Powertrain.CombustionEngine.RPM",
607 | "dp":{"value":"2372", "ts":"2020-04-15T13:37:00Z"}
608 | },
609 | "ts":"2020-04-15T13:37:05Z"
610 | }
611 |
612 | Error response:
613 |
614 | {
615 | "action": "get",
616 | "requestId": "8756",
617 | "error": {"number": "404", "reason": "unavailable_data", "description": "The requested data was not found."},
618 | "ts": "2020-04-15T13:37:00Z"
619 | }
620 |
621 |
622 |
623 |
657 |
658 | The client MAY issue a search read request to retrieve multiple signal values in one request message. 661 | This is realized by adding a "filter" object following the section 7.1 Paths Filter Operation described in the [[CORE]] specification. 662 |
663 |
664 | Example:
665 | Request:
666 |
667 | {
668 | "action": "get",
669 | "path": "Vehicle.Cabin",
670 | "filter": {"variant":"paths", "parameter":["Door.*.*.IsOpen", "DriverPosition"]},
671 | "requestId": "5688"
672 | }
673 |
674 | Response:
675 |
676 | {
677 | "action": "get",
678 | "data":[{"path":"Vehicle.Cabin.Door.Row1.Left.IsOpen", "dp":{"value":"false", "ts":"2020-04-15T13:37:00Z"}},
679 | {...},…
680 | {"path":"Vehicle.Cabin.Door.Row4.Right.IsOpen", "dp":{"value":"true", "ts":"2020-04-15T13:37:01Z"}},
681 | {"path":"Vehicle.Cabin.DriverPosition", "dp":{"value":"1", "ts":"2020-04-15T07:00:01Z"}}
682 | ],
683 | "requestId": "5688",
684 | "ts":"2020-04-15T07:00:02Z"
685 | }
686 |
687 |
688 | A client MAY issue a history read request to retrieve previously recorded data points. 693 | This is realized by adding a "filter" object following the section 7.2 History Filter Operation described in the [[CORE]] specification. 694 |
695 |
696 | Example:
697 | Request:
698 |
699 | {
700 | "action": "get",
701 | "path": "Vehicle.Acceleration.Longitudinal",
702 | "filter": {"variant":"history", "parameter":"P2DT12H"},
703 | "requestId": "5688"
704 | }
705 |
706 | Response:
707 |
708 | {
709 | "action": "get",
710 | "data": {"path": "Vehicle.Acceleration.Longitudinal", "dp": [{"value": "0.123", "ts": "2020-04-15T13:00:00Z"}, {"value": "0.125", "ts": "2020-04-15T13:37:02Z"}]},
711 | "requestId": "5688",
712 | "ts": "2020-04-15T13:37:02Z"
713 | }
714 |
715 |
716 | 721 | To retrieve metadata about the VSS tree, the client MAY issue a signal discovery read request. 722 | This is realized by adding a "filter" object following the section 7.7 Metadata Filter Operation described in the [[CORE]] specification. 723 | The response includes metadata for all nodes in the subtree rooted at the node specified by the path, 724 | limited to the number of generations set by the "parameter" value. 725 |
726 |
727 | Example:
728 | Request:
729 |
730 | {
731 | "action": "get",
732 | "path": "Vehicle.Powertrain.FuelSystem",
733 | "filter":{"variant":"metadata", "parameter":"2"},
734 | "requestId": "5687"
735 | }
736 |
737 | Response:
738 |
739 | {
740 | "action": "get",
741 | "requestId": "5687",
742 | "metadata": {"FuelSystem":{"type":"branch","children":["HybridType", ... ]}},
743 | "ts": "2020-04-15T13:37:00Z"
744 | }
745 |
746 |
747 | 753 | The client MAY send a request to the server to set the value of a signal. 754 | If the server can fulfill the request successfully, it SHALL return a 755 | setSuccessResponse message. 756 | If an error occurs, the server SHALL return a 757 | setErrorResponse message. 758 | The structure of these message objects is defined below: 759 |
760 || Object Name | Attribute | Type | Required |
|---|---|---|---|
| setRequest | action | Action | Yes |
| path | string | Yes | |
| value | string/array/object | Yes | |
| authorization | string | Optional | |
| requestId | string | Yes |
| Object Name | Attribute | Type | Required |
|---|---|---|---|
| setSuccessResponse | action | Action | Yes |
| requestId | string | Yes | |
| ts | string | Yes |
| Object Name | Attribute | Type | Required |
|---|---|---|---|
| setErrorResponse | action | Action | Yes |
| requestId | string | Yes | |
| error | Error | Yes | |
| ts | string | Yes |
796 | Example:
797 | Request:
798 |
799 | {
800 | "action": "set",
801 | "path": "Vehicle.Powertrain.Transmission.PerformanceMode",
802 | "value": "sport",
803 | "requestId": "5687"
804 | }
805 |
806 | Successful response:
807 |
808 | {
809 | "action": "set",
810 | "requestId": "5687",
811 | "ts": "2020-04-15T13:37:00Z"
812 | }
813 |
814 | Error response:
815 |
816 | {
817 | "action": "set",
818 | "requestId": "5687",
819 | "error": {"number": "404", "reason": "unavailable_data", "description": "The requested data was not found."},
820 | "ts": "2020-04-15T13:37:00Z"
821 | }
822 |
823 |
824 |
856 |
861 | The client MAY send a subscribeRequest message
862 | to request a subscription to one or more signals,
863 | thereby requesting the server to repeatedly return subscription event messages based on
864 | the section 7. Filter Request described in the [[CORE]] specification.
865 | To reduce processing load, the server MAY limit the number of
866 | subcriptionEvent messages sent.
867 | If the server can fulfill the request, it SHALL return a
868 | subscribeSuccessResponse message.
869 | If an error occurs while processing the request, the server SHALL return a
870 | subscribeErrorResponse message.
871 | If an error occurs during an active subscription session, the server SHALL return a
872 | subscriptionErrorEvent message.
873 | The structure of the subscription messages is defined below.
874 | As specified in the [[CORE]] specification, the supported subscription variants are:
875 |
| Object Name | Attribute | Type | Required |
|---|---|---|---|
| subscribeRequest | action | Action | Yes |
| path | string | Yes | |
| filter | string | Yes | |
| authorization | string | Optional | |
| data compression | string | Optional | |
| requestId | string | Yes |
| Object Name | Attribute | Type | Required |
|---|---|---|---|
| subscribeSuccessResponse | action | Action | Yes |
| requestId | string | Yes | |
| subscriptionId | string | Yes | |
| ts | string | Yes |
| Object Name | Attribute | Type | Required |
|---|---|---|---|
| subscribeErrorResponse | action | Action | Yes |
| requestId | string | Yes | |
| error | Error | Yes | |
| ts | string | Yes |
| Object Name | Attribute | Type | Required |
|---|---|---|---|
| subscriptionEvent | action | Action | Yes |
| subscriptionId | string | Yes | |
| data | object/array | Yes | |
| ts | string | Yes |
| Object Name | Attribute | Type | Required |
|---|---|---|---|
| subscriptionErrorEvent | action | Action | Yes |
| subscriptionId | string | Yes | |
| error | Error | Yes | |
| ts | string | Yes |
945 | Example:
946 | Request:
947 |
948 | {
949 | "action": "subscribe",
950 | "path": "Vehicle.Powertrain.FuelSystem.Level",
951 | "filter": {"variant":"timebased", "parameter":{"period":"500"}},
952 | "requestId": "6578"
953 | }
954 |
955 | Successful response:
956 |
957 | {
958 | "action": "subscribe",
959 | "subscriptionId": "12345",
960 | "requestId": "6578",
961 | "ts": "2020-04-15T13:37:00Z"
962 | }
963 |
964 | Error response:
965 |
966 | {
967 | "action": "subscribe",
968 | "requestId": "6578",
969 | "error": {"number": "404", "reason": "unavailable_data", "description": "The requested data was not found."},
970 | "ts": "2020-04-15T13:37:00Z"
971 | }
972 |
973 | Event:
974 |
975 | {
976 | "action": "subscription",
977 | "subscriptionId": "12345",
978 | "data": {"path": "Vehicle.Powertrain.FuelSystem.Level",
979 | "dp": {"value": "50", "ts": "2020-04-15T13:37:00Z"}
980 | },
981 | "ts": "2020-04-15T13:37:00Z"
982 | }
983 |
984 | Error event:
985 |
986 | {
987 | "action": "subscription",
988 | "subscriptionId": "12345",
989 | "error": {"number": "401", "reason": "expired_token", "description": "Access token has expired."},
990 | "ts": "2020-04-15T13:37:00Z"
991 | }
992 |
993 |
994 |
995 |
1039 |
1040 | 1043 | Curve logging data compression by eliminating data points that are within a set error margin is activated via a subscription request. 1044 | Event messages will be issued when the buffer becomes full, after insignificant data points have been eliminated, 1045 | refer to the section 7.6 Curve logging Filter Operation in the [[CORE]] specification. 1046 |
1047 |
1048 | Example:
1049 | Request:
1050 |
1051 | {
1052 | "action": "subscribe",
1053 | "path": "Vehicle.Powertrain.FuelSystem.Level",
1054 | "filter": {"variant":"curvelog", "parameter":{"maxerr":"0.5", "bufsize":"100"}},
1055 | "requestId": "6578"
1056 | }
1057 |
1058 | Successful response:
1059 |
1060 | {
1061 | "action": "subscribe",
1062 | "subscriptionId": "12345",
1063 | "requestId": "6578",
1064 | "ts": "2020-04-15T13:37:00Z"
1065 | }
1066 |
1067 | Event:
1068 |
1069 | {
1070 | "action": "subscription",
1071 | "subscriptionId": "12345",
1072 | "data":{"path": "Vehicle.Powertrain.FuelSystem.Level",
1073 | "dp":[{"value": "50", "ts": "2020-04-15T13:38:00Z"}, ..., {"value": "25", "ts": "2020-04-15T13:39:30Z"}]
1074 | },
1075 | "ts": "2020-04-15T13:37:00Z"
1076 | }
1077 |
1078 |
1079 | 1084 | Subscription to a range of values, 1085 | that can have either a single boundary, or multipe boundaries as in the example below. 1086 | For a more information how to use range of values, refer to the section 7.4 Range Filter Operation in the [[CORE]] specification. 1087 |
1088 |
1089 | Example:
1090 | Request:
1091 |
1092 | {
1093 | "action": "subscribe",
1094 | "path": "Vehicle.Powertrain.FuelSystem.Level",
1095 | "filter": "filter":{"variant":"range","parameter":[{"logic-op":"lt","boundary":"50","combination-op":"OR"},{"logic-op":"gt","boundary":"55"}]},
1096 | "requestId": "6578"
1097 | }
1098 |
1099 | Successful response:
1100 |
1101 | {
1102 | "action": "subscribe",
1103 | "subscriptionId": "12345",
1104 | "requestId": "6578",
1105 | "ts": "2020-04-15T13:37:00Z"
1106 | }
1107 |
1108 | Event:
1109 |
1110 | {
1111 | "action": "subscription",
1112 | "subscriptionId": "12345",
1113 | "data":{"path": "Vehicle.Powertrain.FuelSystem.Level",
1114 | "dp":{"value": "51", "ts": "2020-04-15T14:00:00Z"}},
1115 | "ts": "2020-04-15T14:00:00Z"
1116 | }
1117 |
1118 |
1119 | 1124 | Subscription to when a signal has changed between two sequential captures. 1125 | For a more information how to use change of values, refer to the section 7.5 Change Filter Operation in the [[CORE]] specification. 1126 |
1127 |
1128 | Example:
1129 | Request:
1130 |
1131 | {
1132 | "action": "subscribe",
1133 | "path": "Vehicle.Powertrain.FuelSystem.Level",
1134 | "filter":{"variant":"change","parameter":{"logic-op":"gt","diff":"10"}},
1135 | "requestId": "6578"
1136 | }
1137 |
1138 | Successful response:
1139 |
1140 | {
1141 | "action": "subscribe",
1142 | "subscriptionId": "12345",
1143 | "requestId": "6578",
1144 | "ts": "2020-04-15T13:37:00Z"
1145 | }
1146 |
1147 | Event:
1148 |
1149 | {
1150 | "action": "subscription",
1151 | "subscriptionId": "12345",
1152 | "data":{"path": "Vehicle.Powertrain.FuelSystem.Level",
1153 | "dp":{"value": "101", "ts": "2020-04-15T14:00:00Z"}},
1154 | "ts": "2020-04-15T14:00:00Z"
1155 | }
1156 |
1157 |
1158 |
1164 | To unsubscribe from a subscription, the client SHALL send an
1165 | unsubscribeRequest message to the server.
1166 | If the server can fulfill the request successfully, it SHALL returns an
1167 | unsubscribeSuccessResponse message.
1168 | If an error occurs, an
1169 | unsubscribeErrorResponse message SHALL be returned.
1170 |
1171 | If the client has created multiple WebSocket instance, it MUST unsubscribe
1172 | using the same WebSocket instance that was originally used to create the subscription.
1173 |
| Object Name | Attribute | Type | Required |
|---|---|---|---|
| unsubscribeRequest | action | Action | Yes |
| subscriptionId | string | Yes | |
| requestId | string | Yes |
| Object Name | Attribute | Type | Required |
|---|---|---|---|
| unsubscribeSuccessResponse | action | Action | Yes |
| requestId | string | Yes | |
| ts | string | Yes |
| Object Name | Attribute | Type | Required |
|---|---|---|---|
| unsubscribeErrorResponse | action | Action | Yes |
| requestId | string | Yes | |
| error | Error | Yes | |
| ts | string | Yes |
1208 | Example:
1209 | Request:
1210 |
1211 | {
1212 | "action": "unsubscribe",
1213 | "subscriptionId": "12345",
1214 | "requestId": "5786"
1215 | }
1216 |
1217 | Successful response:
1218 |
1219 | {
1220 | "action": "unsubscribe",
1221 | "requestId": "5786",
1222 | "ts": "2020-04-15T13:37:00Z"
1223 | }
1224 |
1225 | Error response:
1226 |
1227 | {
1228 | "action": "unsubscribe",
1229 | "requestId": "6578",
1230 | "error": {"number": "400", "reason": "invalid_data", "description": "Data present in the request is invalid."},
1231 | "ts": "2020-04-15T13:37:00Z"
1232 | }
1233 |
1234 |
1235 | 1242 | The message data components described in the [[CORE]] specification are primarily mapped to standard HTTP parameters. 1243 | Only when no suitable mapping is available are they included in the payload. 1244 | The most significant deviations are as follows: 1245 |
Initialization involves setting up a secure HTTPS session between the client and the server.
1259 | This ensures encrypted communication for data transmission.
1260 | To initialize a secure session, the client sends a request to the server using the HTTPS protocol.
1261 | This is achieved by connecting to the server's designated URL using the 'https://' scheme.
1262 | The client can use a web browser, a native application, or a suitable library in the case of programmatically managed sessions.
1263 | While the client typically connects to the server using the specified hostname, which often includes the "www" prefix,
1264 | it's important to note that this convention may not apply in situations where VISS operates within a local, in-vehicle network or if remote vehicle connections are allowed.
1265 | The communication SHALL use port 443, the default port for secure HTTPS connections.
1266 | Hostname resolution can be achieved using DNS or configured through local settings.
1267 |
Closure entails ending the established HTTPS session when the communication is complete or when the client no longer requires the connection.
1273 | Either the client or the server can initiate the session closure. The client can signal the end of the session by sending an appropriate request to the server,
1274 | indicating the intent to close the connection.
1275 | Upon session closure, any allocated resources, such as server-side threads or memory, are released, improving overall system efficiency.
1276 |
1286 | The client MAY send a HTTPS GET request message to the server to get one or more value(s) of one or more vehicle signal(s). 1287 | If the server can fulfill the request, it SHALL return a response containing the requested value(s). 1288 | If the server is unable to fulfill the request, e.g. because the client is not authorized to retrieve one or more of the signals, 1289 | then it SHALL respond with an appropriate error status code. 1290 |
1291 |1292 | Example: 1293 | Request: 1294 |
1295 | GET /Vehicle/Cabin/SeatPosCount HTTP/1.1
1296 | Host: 127.0.0.1:1337
1297 | Accept: application/json
1298 | ...
1299 |
1300 | Successful response:
1301 |
1302 | HTTP/1.1 200 OK
1303 | Content-Type: application/json; charset=utf-8
1304 | ...
1305 | {
1306 | "data":{"path":"Vehicle.Cabin.SeatPosCount",
1307 | "dp":{"value":["2", "3", "2"], "ts":"2020-04-15T13:37:00Z"}
1308 | },
1309 | "ts": "2020-04-15T13:37:00Z"
1310 | }
1311 |
1312 | Error response:
1313 |
1314 | HTTP/1.1 404 Not Found
1315 | Content-Type: application/json; charset=utf-8
1316 | ...
1317 | {
1318 | "error": {"number": "404", "reason": "unavailable_data", "description": "The requested data was not found."},
1319 | "ts": "2020-04-15T13:37:00Z"
1320 | }
1321 |
1322 |
1323 |
1324 |
1368 |
1369 |
1372 | The search read request uses the section 7.1 Paths Filter Operation
1373 | described in the [[CORE]] specification to define one or more path expressions, relative to the path in the GET URL.
1374 | Example:
1375 | Request:
1376 |
1377 | GET /Vehicle/Cabin/Door?filter={"variant":"paths", "parameter":"*/*/IsOpen"} HTTP/1.1
1378 | Host: 127.0.0.1:1337
1379 | Accept: application/json
1380 | ...
1381 |
1382 | Response:
1383 |
1384 | HTTP/1.1 200 OK
1385 | Content-Type: application/json; charset=utf-8
1386 | ...
1387 | {
1388 | "data":[{"path":"Vehicle.Cabin.Door.Row1.Left.IsOpen", "dp":{"value":"false", "ts":"2020-04-15T13:37:00Z"}},
1389 | {...},…
1390 | {"path":"Vehicle.Cabin.Door.Row4.Right.IsOpen", "dp":{"value":"true", "ts":"2020-04-15T13:37:00Z"}}
1391 | ],
1392 | "ts": "2020-04-15T13:37:00Z"
1393 | }
1394 |
1395 | Error response:
1396 |
1397 | HTTP/1.1 404 Not Found
1398 | Content-Type: application/json; charset=utf-8
1399 | ...
1400 | {
1401 | "error": {"number": "404", "reason": "unavailable_data", "description": "The requested data was not found."},
1402 | "ts": "2020-04-15T13:37:00Z"
1403 | }
1404 |
1405 |
1406 |
1411 | The history read request uses the section 7.2 History Filter Operation
1412 | described in the [[CORE]] specification to read recorded values
1413 | for a specific past duration.
1414 | Example:
1415 | Request:
1416 |
1417 | GET /Vehicle.Acceleration.Longitudinal?filter={"variant":"history", "parameter":"P2DT12H"} HTTP/1.1
1418 | Host: 127.0.0.1:1337
1419 | Accept: application/json
1420 | ...
1421 |
1422 | Response:
1423 |
1424 | HTTP/1.1 200 OK
1425 | Content-Type: application/json; charset=utf-8
1426 | ...
1427 | {
1428 | "data":{"path":"Vehicle.Acceleration.Longitudinal", "dp":[{"value":"0.123", "ts":"2020-04-15T13:00:00Z"}, ..., {"value":"0.125", "ts":"2020-04-15T13:37:00Z"}]},
1429 | "ts": "2020-04-15T13:37:00Z"
1430 | }
1431 |
1432 |
1433 |
1438 | The signal discovery request uses the section 7.7 Metadata Filter Operation
1439 | described in the [[CORE]] specification to retrieve metadata from a specified subtree in the VSS tree.
1440 | A successful response will contain the requested metadata from all nodes of the subtree defined by
1441 | the subtree root node addressed by the path.
1442 | The depth of metadata retrieval is controlled by the "parameter" value.
1443 | Example:
1444 | Request:
1445 |
1446 | GET /Vehicle/Powertrain/FuelSystem?filter={"variant":"metadata", "parameter":"0"} HTTP/1.1
1447 | Host: 127.0.0.1:1337
1448 | Accept: application/json
1449 | ...
1450 |
1451 | Response:
1452 |
1453 | HTTP/1.1 200 OK
1454 | Content-Type: application/json; charset=utf-8
1455 | ...
1456 | {
1457 | "metadata": {"FuelSystem":{"type":"branch","description":"Fuel system data.","children":{"HybridType, ... }}},
1458 | "ts": "2020-04-15T13:37:00Z"
1459 | }
1460 |
1461 |
1462 | 1468 | The client MAY send a request to update the value of a signal. 1469 | If the server can fulfill the request, it SHALL return a 1470 | setSuccessResponse message. 1471 | If an error occurs, e.g. because the client is not authorized to set the requested value, or the value is read-only, 1472 | the server SHALL return a 1473 | setErrorResponse message. 1474 |
1475 |1476 | Example: 1477 |
1478 | POST /Vehicle/Powertrain/Transmission/PerformanceMode HTTP/1.1
1479 | Host: 127.0.0.1:1337
1480 | Accept: application/json
1481 | ...
1482 | {
1483 | "value": "sport"
1484 | }
1485 |
1486 | Successful response:
1487 |
1488 | HTTP/1.1 200 OK
1489 | Content-Type: application/json; charset=utf-8
1490 | ...
1491 | {
1492 | "ts": "2020-04-15T13:37:00Z"
1493 | }
1494 |
1495 | Error response:
1496 |
1497 | HTTP/1.1 404 Not Found
1498 | Content-Type: application/json; charset=utf-8
1499 | ...
1500 | {
1501 | "error": {"number": "404", "reason": "unavailable_data", "description": "The requested data was not found."},
1502 | "ts": "2020-04-15T13:37:00Z"
1503 | }
1504 |
1505 |
1506 |
1507 |
1526 |
1533 | The MQTT protocol operates on a publish-subscribe communication model, whereas the VISS is designed around a client-server interaction model.
1534 | To reconcile these differences, a lightweight application-level protocol is introduced on top of MQTT.
1535 | This protocol encapsulates VISS messages within MQTT messages and includes additional metadata required to support client-server semantics.
1536 | Details of this abstraction mechanism are provided in the following sections.
1537 | The VISS messages transmitted over MQTT SHALL conform to the primary payload format without modification.
1538 |
1543 | For MQTT to support the full VISSv3 interface, as decribed in the section 5. Interface of the [[CORE]] specification,
1544 | an application-level protocol that runs on top of MQTT is required.
1545 | This protocol is described below and illustrated in the accompanying sequence diagram.
1546 | To emulate the client-server pattern that is described in the [[CORE]] specification,
1547 | the vehicle server—via its vehicle-side client—MUST subscribe to the broker on a topic named VID/Vehicle,
1548 | where VID represents a unique identifier that links the vehicle to the access control ecosystem.
1549 | This vehicle identifier is not necessarily the manufacturer's Vehicle Identification Number (VIN).
1550 | The cloud-side client is expected to have access to this vehicle identifier.
1551 | How it obtains it is out of scope for this specification.
1552 | When the cloud client intends to send a request to the vehicle server,
1553 | it first generates a unique topic name and subscribes to it via the broker.
1554 | The client then generates a JSON formatted payload with the following structure:
1555 |
1556 | {"topic":"aUniqueTopic", "request":"VISSv3Request"}
1557 |
1558 | Here, "aUniqueTopic" is the topic name just subscribed to, and "VISSv3Request" is the actual request directed to the vehicle server.
1559 | This request MUST follow the primary payload format of this specification.
1560 | This JSON message is then published to the broker under the VID/Vehicle topic.
1561 | The broker forwards the message to the vehicle client, which extracts the value of the "request" field and forwards it
1562 | to the vehicle server. Upon receiving a response, the vehicle client publishes the response message to the topic specified
1563 | by the original "topic" field in the received message.
1564 | The broker then forwards this response to the cloud client, completing the client-server request-response cycle
1565 | as described in the [[CORE]] specification.
1582 | 1590 | The MQTT architecture requires the use of a broker, which serves as an intermediary between the client and server endpoints 1591 | (referred to as the subscriber and publisher in MQTT terminology). 1592 | Since each TLS channel terminates at the broker, it has full access to all plaintext communication 1593 | between these endpoints. 1594 | This security consideration SHALL be taken into account when selecting MQTT as a transport protocol. 1595 |
1596 |1601 | As described in the "Application Level Protocol" section, each request message sent to the broker SHALL include 1602 | two JSON-formatted key-value pairs. 1603 | The value of the request key MUST be a string containing the client request intended for the vehicle server. 1604 | This request MUST strictly adhere to the primary payload format defined in this specification. 1605 |
1606 |1612 | The gRPC protocol uses Protocol Buffers (Protobuf) for message serialization. 1613 | The Protobuf message definitions SHALL be specified in a .proto file. 1614 | The .proto file that defines the encoding of the VISS primary payload format is provided in the [[PAYLOAD ENCODING]] specification. 1615 | A Protobuf compiler (e.g., protoc) is used to generate source code from the .proto file. 1616 | This generated code facilitates the encoding and decoding between Protobuf and JSON payload formats. 1617 | This code can be implemented in different languages, and is out of scope for the VISS standardization. 1618 | An example implementation in the Go programming language can be found 1619 | here. 1620 |
1621 || Attribute | 1632 |Type | 1633 |Description | 1634 |
|---|---|---|
| action | 1637 |Action | 1638 |The type of action requested by the client or delivered by the server. | 1639 |
| path | 1642 |string | 1643 |The path to a node in the VSS tree, as defined by the 1644 | Vehicle Signal Specification (VSS). | 1645 |
| requestId | 1648 |string | 1649 |Unique id value assigned by the client. Returned by the server in 1650 | the response and used by the client to link the request and response 1651 | messages. The value MAY be an integer or a Universally Unique Identifier (UUID). | 1652 |
| subscriptionId | 1655 |string | 1656 |Value returned by the server to uniquely identify each subscription session. | 1657 |
| authorization | 1660 |string | 1661 |A JSON Web Token (JWT) formatted security token. | 1662 |
| data | 1665 |object / array | 1666 |Data contains one or more objects each consisting of a path and a dp (data point). | 1667 |
| dp | 1670 |object / array | 1671 |A data point contains one or more objects each consisting of a value and a ts (timestamp). | 1672 |
| ts | 1675 |string | 1676 |The Coordinated Universal Time (UTC) timestamp that represents the capture of the value. | 1677 |
| value | 1680 |string/ object / array | 1681 |The actual value associated with the signal path. | 1682 |
| filter | 1685 |string | 1686 |A query string defining a filter to optimize subscriptions. Refer to the section 7. Filter Request of the [[CORE]] specification. | 1687 |
| data compression | 1690 |string | 1691 |Compression of path and/or timestamp data. | 1692 |
| metadata | 1695 |object | 1696 |Metadata describing the potentially available signal (sub)tree. | 1697 |
| error | 1700 |Error | 1701 |An object containing error code, reason, and description. | 1702 |
The Action enumeration is used to define the type of action requested by the client. 1709 | All client messages MUST contain a JSON structure that has an 1710 | action name/value pair and the 1711 | value of the action property 1712 | MUST be one of the values specified in the enumeration:
1713 | 1714 |The error number SHOULD be a status code defined in [[RFC2616]], c. f. section "Status codes". 1731 | The error reason SHOULD be short. two or three words connected by underscore. 1732 | It SHOULD relate to the reason-phrase from [[RFC2616]] for the corresponding status code. 1733 | The error description is meant to give more precise information of the error. 1734 |
1735 || Object Name | Attribute | Type | Required |
|---|---|---|---|
| Error | 1742 |number | string | Yes |
| reason | string | Yes | |
| description | string | Yes |