summaryrefslogtreecommitdiff
path: root/doc/rvi_services.md
blob: 11d77dae369a6e4d71884a3c842233cf3dcf2038 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
<style type="text/css" media="print">
  div.pagebreak
  {
    page-break-before: always;
  }
</style>
Copyright (C) 2014, 2015 Jaguar Land Rover

This document is licensed under Creative Commons
Attribution-ShareAlike 4.0 International.

Remote Vehicle Interface (RVI) Core Services
============================================

This document specifies the core services of the Remote Vehicle Interface (RVI)
framework.

Remote Vehicle Interface (RVI) is a universal framework for devices to interact
with other devices. The term *device* losely refers to vehicles, mobile devices,
cloud servers etc. which all can transparently connect to and exchange data with
each other over a variety of networks.

RVI Core represents the core of the RVI framework. Any node looking to exchange
data with other nodes over RVI must implement RVI Core. Details on RVI Core and
the RVI specification in general can be found at
[RVI](https://github.com/PDXostc/rvi_core).

RVI Core itself is agnostic to the data that is sent. It provides, however, an
addressing and routing scheme that allows the indentification of a service on
any device in a global namespace. The syntax of a service name is

    [organization]/[path]
* [organization]
  A domain name describing the organization that hosts a sub-section of the root.
  All service paths under the domain name are managed by the given organization.
* [path]
  A path to access a given service. Path segments are separated by `/`.

Technically, the organization is just a part of the path. However, it is
separated because of the responsibility and ability of the organization to
manage all subpaths below itself.

A typical service name for a vehicle that specifies a service to lock a door:

    message:jaguarlandrover.com/vin/1HGCM82633A004352/services/body/lock
    
Services can freely be defined and implemented by anyone for any purpose as long
as the global name space is not violated (hence the organization). RVI defines
a couple of core services that are specified by this document.

RVI Service Messages
--------------------

RVI service messages are encoded as JavaScript Object Notation (JSON) Remote
Procedure Calls (RPC) (JSON-RPC).

    {
        "jsonrpc": "2.0",
        "id": 1,
        "method": "message",
        "service": "jlr.com/vin/123456/logging/subscribe",
        "timeout" : 5000,
        "params": {
            "channels":, ["location", "odometer", "speed"],
            "reporting_interval": 5000
         }
    }
		
* jsonrpc - JSON-RPC version number.
* id - Request ID, used to match the response to the request.
* method - Method to be invoked. For RVI the method is ```message```.
* service - The full service name.
* timeout - Timeout in seconds since UNIX Epoch UTC (January 1, 1970 UTC).
* params - Array of objects passed to `method` as parameters.


RVI Core Services
-----------------

### Device Management

Services for configuring the device after inital bootstrapping.

#### Certificates

Services to manage certificates.

##### Provision Signed Key

Provision a private-root-key-signed version of the device public key.

    {
        "jsonrpc": "2.0",
        "id": 1,
        "method": "message",
        "service": "jlr.com/vin/123456/dm/key_provision",
        "timeout" : 5000,
        "params": {
            "keyid" : "xyzzy123",
		    "key": "[JWT-encoded key]"
         }
    }

The parameters are:

* keyid - Unique key ID.
* key - JWT encoded key, signed by the private root key, where the
  payload is a JWK-formatted JSON object.
  
After receiving a key the device will typically store it in its key store.

<div class="pagebreak"></div>

##### Provision Certificate

Provision a certificate from a server to a client.

    {
        "jsonrpc": "2.0",
        "id": 1,
        "method": "message",
        "service": "jlr.com/vin/123456/dm/cert_provision",
        "timeout" : 5000,
        "params": {
            "certid" : "cx2343",
            "checksum": <md5_checksum>,
            "certificate": "<certificate>",
         }
    }

The parameters are:

* certid - Unique certificate ID.
* checksum - The md5 checksum calculated over the entire certificate
* certificate - The certificate encoded as base64.
  
After receiving a certificate the device will typically store it in its certificate
store.

##### Erase Certificate

Erase a certificate from the device's certificate store.

    {
        "jsonrpc": "2.0",
        "id": 1,
        "method": "message",
        "service": "jlr.com/vin/123456/dm/cert_erase",
        "timeout" : 5000,
        "params": {
            "certid" : "cx2343",
         }
    }

The parameters are:

* certid - Unique certificate ID.
  
After receiving an erase certificate request the device must remove it from its
certificate store.

<div class="pagebreak"></div>

##### Clear Certificates

Erase all certificates from the device's certificate store.

    {
        "jsonrpc": "2.0",
        "id": 1,
        "method": "message",
        "service": "jlr.com/vin/123456/dm/cert_clear",
        "timeout" : 5000,
        "params": {
            "dummy" : 0
         }
    }

The parameters are:

* dummy - Placeholder parameter

  
After receiving an erase certificate request the device must remove all certificates
from its certificate store.

##### Revoke Certificate

Revoke a certificate. This message is sent to all devices who may accept the
certificate to blacklist that certificate and all certificates that are derived
from it.

    {
        "jsonrpc": "2.0",
        "id": 1,
        "method": "message",
        "service": "jlr.com/vin/123456/dm/cert_revoke",
        "timeout" : 5000,
        "params": {
            "certid" : "cx2343",
         }
    }

The parameters are:

* certid - Unique certificate ID.
  
After receiving a revoke certificate request the device must add it to its
certificate blacklist. When the device is presented with a blacklisted certificate
or a certificate that has been derived from a blacklisted certificate it must
reject that certificate as invalid.

#### Configuration

Services to manage device configuration.

##### Read Configuration Variables

Retrieve the value of one or more configuration variables from the device.

The server sends to the device:

    {
        "jsonrpc": "2.0",
        "id": 1,
        "method": "message",
        "service": "jlr.com/vin/123456/dm/var_read",
        "timeout" : 5000,
        "params": {
            "variable" : ["varname1","varname2"]
         }
    }

The parameters are:

* variable - The name of the variable.
  
The device responds with:

    {
        "jsonrpc": "2.0",
        "id": 1,
        "method": "message",
        "service": "jlr.com/backend/dm/var_value",
        "timeout" : 5000,
        "params": {
            "vin": "1234",
            "variables" : [
                { "name" : "varname1", "value" : "Hello World" },
                { "name" : "varname2", "value" : "Hello Universe" },
            ]
         }
    }
  
The parameters are:

* vin - The VIN of the device reporting the variable.
* variables - An array of dictionaries with variable names and values.
* value - The value of the variable.

<div class="pagebreak"></div>

##### Write Configuration Variables

Set the value of one or more configuration variable in the device.

The server sends to the device:

    {
        "jsonrpc": "2.0",
        "id": 1,
        "method": "message",
        "service": "jlr.com/vin/123456/dm/var_write",
        "timeout" : 5000,
        "params": {
            "variables" : [
                { "name" : "varname1", "value" : "Hello World" },
                { "name" : "varname2", "value" : "Hello Universe" },
            ]
         }
    }

The parameters are:

* variables - An array of dictionaries with variable names and values.
* value - The value of the variable.


### Over-the-Air Update

RVI can transmit any type of file from one device to another. The most typical
application is software over the air updates (SOTA) where a server sends software
packages to a device for the device to install. RVI implements file transmission
through a series of services that are executed in a particular sequence of events.
For the following we use the term

* server - for a device withing to transmit a file to another device
* client - for a device receiving a file transmission

Sequence of events:

1. The server first sends the `notify` message to the client with the description
   of the download and a unique ID to identify the file transmission transaction.
   The client can use the description to inform a user of the pending download.
2. The client can then either
   * accept the file transmission by sending `initiate_download` to the server, or
   * reject the file transmission by sending `cancel_download` to the server
3. If the server receives an `initiate_download` response it initiates the file
   download by sinding `start` to the client together with the `file size` and a
   `chunk size` indicating the total size of the download and the size of the
   download portion in each message.
4. The server then immediately starts sending file portions, one per message, with
   the `chunk` message.
5. After the server has sent the last chunk it sends `finish` to the client.
6. Once the client receives the `finish` message and has assembled and verified
   the download it sends `download_complete` to the server with a status indicator.

<div class="pagebreak"></div>

#### Notify

Inform client of pending file transfer.

    {
        "jsonrpc": "2.0",
        "id": 1,
        "method": "message",
        "service": "jlr.com/vin/123456/sota/notify",
        "timeout" : 5000,
        "params": {
            "package": "Hello World Application Version 2",
            "retry": 1
         }
    }

The parameters are:

* package - Package/file description that the client may use to display a user
            message.
* retry - Unique numeric ID, used by the identify the download transaction.

#### Initiate Download

Tell server to start the download.

    {
        "jsonrpc": "2.0",
        "id": 1,
        "method": "message",
        "service": "jlr.com/backend/sota/initiate_download",
        "timeout" : 5000,
        "params": {
            "package": "HelloWorld-2.0.0.rpm",
            "destination" : "12345",
            "retry": 1
         }
    }

The parameters are:

* package - Package/file name.
* destination - VIN number of vehicle.
* retry - Unique numeric ID, used by the identify the download transaction. Must
          match the ID from the `notify` message this message is sent in response
          to.

<div class="pagebreak"></div>

#### Start Download

Initiate the download from the server to the client.

    {
        "jsonrpc": "2.0",
        "id": 1,
        "method": "message",
        "service": "jlr.com/vin/12345/sota/start",
        "timeout" : 5000,
        "params": {
            "package": "HelloWorld-2.0.0.rpm",
            "chunk_size" : 65535,
            "total_size": 23234334
         }
    }

The parameters are:

* package - Package/file name.
* chunk_size - Size of a file chunk in bytes.
* total_size - File size in bytes.

#### Transmit Chunk

Transmit a file chunk from the server to the client.

    {
        "jsonrpc": "2.0",
        "id": 1,
        "method": "message",
        "service": "jlr.com/vin/12345/sota/chunk",
        "timeout" : 5000,
        "params": {
            "index": 1,
            "msg" : <file chunk>
         }
    }

The parameters are:

* index - Chunk index for the client to assemble the chunks correctly. Chunks
          may not arrive in order.
* msg - File chunk encoded with base64.

<div class="pagebreak"></div>

#### Finish Transmission

Indication by the server to the client that the last chunk has been sent.

    {
        "jsonrpc": "2.0",
        "id": 1,
        "method": "message",
        "service": "jlr.com/vin/12345/sota/finish",
        "timeout" : 5000,
        "params": {
            "dummy": 0
         }
    }

The parameters are:

* dummy - Placeholder parameter.

#### Download Complete

Message from the client to the server to indicate that the client has received
the file.

    {
        "jsonrpc": "2.0",
        "id": 1,
        "method": "message",
        "service": "jlr.com/backend/sota/download_complete",
        "timeout" : 5000,
        "params": {
            "status": 0,
            "retry" : 1
         }
    }

The parameters are:

* status - `= 0` on success, `!= 0` failure
* retry - Unique numeric ID, used by the identify the download transaction. Must
          match the ID from the `notify` message this message is sent in response
          to.

<div class="pagebreak"></div>

#### Cancel Download

Tell server to cancel the download.

    {
        "jsonrpc": "2.0",
        "id": 1,
        "method": "message",
        "service": "jlr.com/backend/sota/cancel_download",
        "timeout" : 5000,
        "params": {
            "retry": 1
         }
    }

The parameters are:

* retry - Unique numeric ID, used by the identify the download transaction. Must
          match the ID from the `notify` message this message is sent in response
          to.

### Information Reporting

Services to observe data channels and/or to report them in regular
intervals.

#### Subscribe

Subscribe to one or more data channels. This message is typically implemented by
a client device.

    {
        "jsonrpc": "2.0",
        "id": 1,
        "method": "message",
        "service": "jlr.com/vin/123456/logging/subscribe",
        "timeout" : 5000,
        "params": {
            "channels":, ["location", "odometer", "speed"],
            "reporting_interval": 5000
         }
    }

The parameters are:

* channels - An array with the data channels to subscribe to.
* reporting_interval - The reporting interval in milliseconds [ms].

<div class="pagebreak"></div>

#### Unsubscribe

Unsubscribe from one of more data channels. This message is typically implemented
by a client device.

    {
        "jsonrpc": "2.0",
        "id": 2,
        "method": "message",
        "service": "jlr.com/vin/123456/logging/unsubscribe",
        "timeout" : 5000,
        "params": {
            "channels":, ["location", "speed"],
        }
    } 

The parameters are:

* channels - An array with the data channels from which to unsubscribe from.

#### Report

Report data channels. This message is typically implemented by a server device
receiving data.

    {
        "jsonrpc": "2.0",
        "id": 3,
        "method": "message",
        "service": "jlr.com/backend/logging/report",
        "timeout" : 5000,
        "params": {
            "vin": "1234",
            "timestamp": 1415143459110,
            "data": [
                { "channel": "location",
                  "value": { "lat": 39.0313, "lon": 125.3787, "alt”: 345.6 } },
                { "channel": "speed", "value": 15 },
                { "channel”: "odometer", "value": 10455 },
            ]
        }
    } 

The parameters are:

* vin - The VIN of the device reporting the data.
* timestamp - The timestamp of the data record in UTC formatted as
  YYYY-MM-DDThh:mm:ss.SSSZ for example: 2014-11-16T08:43:02.000Z
* data - The reported data. Data is always reported as a list of dictionaries, that is
  `key:value` pairs: `{"channel" : "channel_name", "value" : channel_value }`. The
   key `channel` is a string representing the name or identification of the channel
   as used by the `subscribe` and `unsubscribe` services. The `value` can be any
   JSON data type. In particular `value` can be a dictionary in itself, as it is
   with the `location` channel.

<div class="pagebreak"></div>

Currently defined channels:

| Channel   | Description                | Value Data Type                    |
| --------- | -------------------------- | ---------------------------------- |
| speed     | vehicle speed              | uint16                             |
| rpm       | engine rpm                 | uint16                             |
| ctemp     | engine coolant temperature | uint16                             |
| maf       | mass air flow              | uint16                             |
| ait       | air intake temperature     | int                                |
| eload     | engine load                | uint16                             |
| tpos      | throttle position          | uint16                             |
| bvolt     | battery voltage            | double                             |
| atemp     | ambient air temperature    | int                                |
| otemp     | engine oil temperature     | int                                |
| etime     | engine running time        | uint32                             |
| location  | vehicle location           | dict { “lat” : double , “lon” : double , “alt” : double , “dir” : uint16 }  |



### Remote Vehicle Control

Services to lock, unlock, etc, a vehicle


#### Lock / Unlock doors, trunks, etc

Lock one or more doors, trunks, and other hatches.

    {
        "jsonrpc": "2.0",
        "id": 1,
        "method": "message",
        "service": "jlr.com/vin/123456/control/lock",
        "timeout" : 5000,
        "params": {
			"action": "lock",
			"locks": [ "r1_lt", "r2_rt", "trunk" ]
		}
    }

The parameters are:

* action - Specifies if the doors should be locked or unlocked
  ```lock``` lock the doors<br>
  ```unlock``` unlock the doors.

* locks - An array specifying which doors to be locked<br>
  ```r1_lt``` and ```r1_rt``` are row one (front) doors.<br>
  ```r2_lt``` and ```r2_rt``` are row two (rear) doors.<br>
  ```trunk``` is the rear trunk.<br>
  ```hood``` is the rear hood.

<div class="pagebreak"></div>

#### Start / Stop Engine

Start or stop the engine.

    {
        "jsonrpc": "2.0",
        "id": 1,
        "method": "message",
        "service": "jlr.com/vin/123456/control/engine",
        "params": {
			"action": "start"
		}
    }

The parameters are:

* action - Specifies if the engine should be started or stopped
  ```start``` start the engine.<br>
  ```stop``` stop the engine.


#### Trunk Open/Close

Open or close a motorized trunk. Optionally, the trunk can be
opened/popped but not closed. In this case "close" is not supported.

    {
        "jsonrpc": "2.0",
        "id": 1,
        "method": "message",
        "service": "jlr.com/vin/123456/control/trunk",
        "timeout" : 5000,
        "params": {
			"action": "open"
		}
    }

The parameters are:

* action - Specifies if trunk should be opened or closed
  ```open``` open the trunk.<br>
  ```close``` close the trunk.

<div class="pagebreak"></div>

#### Horn
Activate the horn.

    {
        "jsonrpc": "2.0",
        "id": 1,
        "method": "message",
        "service": "jlr.com/vin/123456/control/horn",
        "timeout" : 5000,
        "params": {
			"duration": 1500
		}
    }

The parameters are:

* duration - The duration, in milliseconds, that the horn should be activated
  
#### Lights
Activate the horn.

    {
        "jsonrpc": "2.0",
        "id": 1,
        "method": "message",
        "service": "jlr.com/vin/123456/control/lights",
        "timeout" : 5000,
        "params": {
			"lights": [ "low", "interior"  ],
			"duration": 60000
		}
    }

The parameters are:

* duration - The duration, in milliseconds, that the lights should be on for


  
#### Windows
Open/close windows and other hatches 

    {
        "jsonrpc": "2.0",
        "id": 1,
        "method": "message",
        "service": "jlr.com/vin/123456/control/windows",
        "timeout" : 5000,
        "params": {
			"windows": [ "r1_lt", "r2_rt", "sunroof" ]
			"position": 75
		}
    }

The parameters are:

* windows - The windows to operate on
  ```r1_lt``` and ```r1_rt``` are row one (front) windows.<br>
  ```r2_lt``` and ```r2_rt``` are row two (rear) windows.<br>
  ```sunroof``` is the sunroof.<br>
  ```rear``` is the rear window.<br>

* position - The posistion to set the specified windows to.
  0 = fully closed<br>
  100 = fully open<br>


#### Capabilities

Sent from vehicle to connecting device to inform the device
which capabilities the vehicle has

    {
        "jsonrpc": "2.0",
        "id": 2,
        "method": "message",
        "service": "jlr.com/mobile/46701231234/control/capabilities",
        "timeout" : 5000,
        "params": {
			"windows": [ "r1_lt", "r1_rt", "r2_lt", "r2_rt" ],
			"locks: [ "r1_lt", "r1_rt", "r2_lt", "r2_rt", "trunk" ],
            "trunk":, ["open"],
            "engine":, "true", 
            "lights":, [ "interior", "high", "low", "running", "rear" ]
            "horn":, "false"
        }
    } 

The parameters are:

* windows - List all windows available for open and closing.<br>
  ```r1_lt``` and ```r1_rt``` are row one (front) left and right windows.<br>
  ```r2_lt``` and ```r2_rt``` are row two (rear) left and right windows.<br>
  ```r3_lt``` and ```r3_rt``` are row two (rear) left and right windows.<br>
  Etc.<br>
  ```sunroof``` is the sunroof.<br>
  ```rear``` is the rear window.<br>
  Set to "false" if not supported.
  

* locks - List all doors available for locking and closing.<br>
  ```r1_lt``` and ```r1_rt``` are row one (front) left and right doors.<br>
  ```r2_lt``` and ```r2_rt``` are row two (rear) left and right doors.<br>
  Etc.<br>
  ```trunk``` is the rear trunk.<br>
  ```hood``` is the rear hood.<br>
  Set to "false" if not supported.
  
* trunk - List operations available for trunk.<br>
  ```open``` The car can open or pop the trunk.<br>
  ```close``` The car can close the trunk.<br>
  Set to "false" if not supported.<br>
  Please note that opening and closing the trunk is different
  from locking and unlocking the trunk.

* lights - Specifies what lights can be turned on and off.
  ```low``` - low beam.<br>
  ```high``` - high beam.<br>
  ```running``` - running lights.<br>
  ```rear``` - rear lights.<br>
  ```interior``` - interior lighs.<br>
  ```side``` - side lights (or instep lights next to doors).<br>
  ```rear_fog``` - rear fog light.<br>
  ```front_fog``` - front fog light.<br>
  ```left_blinkers``` - left_blinkers.<br>
  ```right_blinkers``` - left_blinkers.<br>
  Set to "false" if not supported.

* engine - Specifies engine start/stop is supported.
  ```true``` - Engine can be started and stopped.<br>
  ```false``` - Engine cannot be started and stopped.<br>
  
* horn - Specifies if horn activation is supported.
  ```true``` - Horn can be activated.<br>
  ```false``` - Horn cannot be activated.<br>
  

#### Status
Sent from vehicle to connecting device to inform the device
of the current status of the vehicle. Only command and
parameters reported by a previous ```capabilities``` call
will be listed.

    {
        "jsonrpc": "2.0",
        "id": 2,
        "method": "message",
        "service": "jlr.com/mobile/46701231234/control/status",
        "timeout" : 5000,
        "params": {
			"windows": {
				"r1_lt": 70,
				"r1_rt": 0,
				"r2_lt": 0,
				"r2_rt": 0
			},
			"locks": {
				"r1_lt": "unlocked",
				"r1_rt": "locked",
				"r2_lt": "locked",,
				"r2_rt": "locked",
				"trunk": "locked"
			},
			"trunk": "closed",
			"horn": 0,
			"lights": {
				"high": 30000,
				"low": 0,
				"interior": 0,
				"side": 15000
			},
			"engine": "on",
        }
    } 

<div class="pagebreak"></div>

The parameters are:

* windows - List each window with its current position.

* locks - List each lock and its current status.
  
* trunk - Status of the trunk.

* lights - List each light and its remaining time on.<br>
  0 = Off.<br>
  The time remaining for the light to be on is given in
  milliseconds.

* engine - Status of the engine.
  
* horn - Milliseconds remaining on horn active.<br>
  0 = Horn not active.