WebSocket is the primary means of communicating with the SDL Core component from the vehicle. In a basic example, an HTML5 HMI would use a native WebSocket library to communicate with SDL Core.
The HMI Adapter must:
For opening a WebSocket connection, a handshake must be performed.
connectToSDL() { this.socket = new WebSocket("ws://localhost:8087") this.socket.onopen = this.onopen.bind(this) this.socket.onclose = this.onclose.bind(this) this.socket.onmessage = this.onmessage.bind(this) }
SDL Core accepts multiple WebSocket clients and the HMI can choose to connect each interface to SDL Core via individual WebSocket connections.
The HMI must register each component which can communicate with SDL Core using the following RPC format.
Key | Value Info |
---|---|
"id" | A multiple of 100 (100, 200, 300, ...) |
"jsonrpc" | "2.0" - constant for all messages between SDL Core and the HMI |
"method" | "MB.registerComponent" - the request is assigned to SDL Core's MessageBroker where the component name will be associated with the socket ID. Further, SDL Core will send messages related to the named component over the corresponding connection |
"componentName" | The name of the component being registered. Must correspond to the appropriate component name described in the current guidelines. |
Example Request:
{ "jsonrpc": "2.0", "id": 100, "method": "MB.registerComponent", "params": { "componentName": "BasicCommunication" } }
The possible componentNames are:
BasicCommunication
- Generic interface responsible for a collection of information and user actions. Includes UpdateAppList
and OnAppRegistered
.UI
- Interface responsible for RPC events and information made visible to the user. Includes Show
and Alert
. Buttons
- Interface responsible for RPC events and information related to hard and soft buttons in the vehicle. Includes OnButtonPress
and OnButtonEvent
.VR
- Interface responsible for RPC events and information related to voice recognition. Contains RPC voice recognition counterparts to the UI component RPCs.TTS
- Interface responsible for RPC events and information related to text to speech capabilities. Includes RPC Speak
.Navigation
- Interface responsible for RPC events and information related to navigation. Includes StartStream
and GetWayPoints
.VehicleInfo
- Interface responsible for RPC events and information related to vehicle data. Includes GetVehicleData
and SubscribeVehicleData
.RC
- Interface responsible for RPC events and information related to the Remote Control Feature.AppService
- Interface responsible for RPC events and information related to the App Services Feature.SDL provides a JSON Response
Key | Value Info |
---|---|
"id" | The value from the corresponding request |
"result" | Value of id multiplied by 10. HMI can treat this as a successful registration |
Example Response:
{ "id": 100, "jsonrpc": "2.0", "result": 1000 }
Once the components are registered, the HMI must notify SDL Core that it is ready to begin further communication using the BasicCommunication.OnReady notification.
Upon receipt of the OnReady notification, SDL Core will begin checking the availability of the different HMI components via a chain of requests:
UI.IsReady
- The display availabilityVR.IsReady
- The voice recognition module availabilityTTS.IsReady
- The text to speech module availabilityNavigation.IsReady
- Navigation engine availabilityVehicleInfo.IsReady
- Indicates whether vehicle information can be collected and providedRC.IsReady
- Indicates whether vehicle RC modules are present and ready to communicate with SDL CoreIn the case of a WebSocket connection, RPCs to each of the components are sent within a separate WebSocket connection.
If the response to any of the component IsReady
requests contains {"available": false}
, SDL Core will no longer communicate with that component.
The HMI must also register for notifications individually using the following RPC format.
{ "jsonrpc": "2.0", "id": -1, "method": "MB.subscribeTo", "params": { "propertyName": notificationName } }
"propertyName" is the name of the notification the HMI will receive from Core. Some examples include:
Core's MessageBroker will not route notifications to the HMI unless the notifications are subscribed to.
The HMI must:
* Register its components
* Send the OnReady notification
* Respond to each of the IsReady
RPCs
* Register for the notifications it would like to receive
The above steps should only occur once per life cycle of SDL Core
This section describes the message structure for communication between your HMI and SDL Core.
From this point forward the actors for exchanging messages will be considered:
- Client - can send requests and notifications
- Server - can provide responses to requests from a Client and send notifications
An RPC call is represented by sending a Request object to a Server. The Request object has the following properties
Property | Description |
---|---|
"id" | An identifier established by the Client. This value must be of unsigned int type in the frames of communication between your HMI and SDL Core. The value should never be null. If "id" is not included the message is assumed to be a notification and the receiver should not respond. |
"jsonrpc" | A string specifying the version of JSON RPC protocol being used. Must be exactly "2.0" currently in all versions of SDL Core. |
"method" | A String containing the information of the method to be invoked. The format is [componentName].[methodName] . |
"params" | A structured object that holds the parameter values to be used during the invocation of the method. This property may be omitted. |
{ "id": 125, "jsonrpc": "2.0", "method": "Buttons.GetCapabilities" }
{ "id": 92, "jsonrpc": "2.0", "method": "UI.Alert", "params": { "alertStrings": [ { "fieldName": "alertText1", "fieldText": "WARNING" }, { "fieldName": "alertText2", "fieldText": "Adverse Weather Conditions Ahead" } ], "duration": 4000, "softButtons": [ { "type": "TEXT", "text": "OK", "softButtonID": 697, "systemAction": "STEAL_FOCUS" } ], "appID": 8218 } }
A notification is a Request object without an id
property. For all the other properties, see the Request section above.
The receiver should not reply to a notification, i.e. no response object needs to be returned to the client upon receipt of a notification.
{ "jsonrpc": "2.0", "method": "UI.OnReady" }
{ "jsonrpc": "2.0", "method": "BasicCommunication.OnAppActivated", "params": { "appID": 6578 } } { "jsonrpc": "2.0", "method": "Buttons.OnButtonPress", "params": { "mode": "SHORT", "name": "OK" } }
On receipt of a request message, the server must reply with a Response. The Response is expressed as a single JSON Object with the following properties.
Property | Description |
---|---|
"id" | Required property which must be the same as the value of the associated request object. If there was an error in detecting the id in the request object, this value must be null. |
"jsonrpc" | Must be exactly "2.0" |
"result" | Required on success or warning. Must not exist if there was an error invoking the method. The result property must contain a method field which is the same as the corresponding request and a corresponding result code should be sent in the result property. The result property may also include additional properties as defined in the HMI API. |
{ "id": 167, "jsonrpc": "2.0", "result": { "code": 0, "method": "UI.Alert" } }
{ "id": 125, "jsonrpc": "2.0", "result": { "capabilities" : [ { "longPressAvailable" : true, "name" : "PRESET_0", "shortPressAvailable" : true, "upDownAvailable" : true }, { "longPressAvailable" : true, "name" : "TUNEDOWN", "shortPressAvailable" : true, "upDownAvailable" : true } ], "presetBankCapabilities": { "onScreenPresetsAvailable" : true }, "code" : 0, "method" : "Buttons.GetCapabilities" } }
When an RPC encounters an error, the response object must contain the error
property instead of the result
property.
The error object has the following members:
Property | Description |
---|---|
"id" | Required to be the same as the value of "id" in the corresponding Request object. If there was an error in detecting the id of the request object, then this property must be null. |
"jsonrpc" | Must be exactly "2.0" |
"error" | Required on error. Must not exist if there was no error triggered during invocation. The error field must contain a code field with the result code value that indicates the error type that occurred, a message field containing the string that provides a short description of the error, and a data field that must contain the method from the original request. |
{ "id": 103, "jsonrpc": "2.0", "error": { "code": 13, "message": "One of the provided IDs is not valid", "data": { "method": "VehicleInfo.GetDTCs" } } }