<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class=""><div class=""><br class=""></div><div class="">A big update to the v3 OVMS Server.</div><div class=""><br class=""></div><div class=""><ol class="MailOutline"><li class="">I re-factored the ApiV2 plugin to move all the connection information to Core, and made it shareable between modules. This includes virtualising the actions to receive and transmit data from connections. The advantage here is that vehicles and apps no longer need to use the same protocol. So for example, this should allow an HTTP API App to connect to a v2 api vehicle. The HTTP API has been held back for some time because of this, but it will also affect MQTT connections.<br class=""><br class=""></li><li class="">If anyone is using ‘db’ style function callbacks, please note the new ‘Db’ standardised prefix (before some were db and others were Db - messy).<br class=""><br class=""></li><li class="">A lot of little bug fixes and cleanups were made at the same time. I hope it hasn’t broken anything.<br class=""><br class=""></li><li class="">The first use of #1 is to implement websockets for apiv2. The standard server now supports this as ‘<a href="ws://api.openvehicles.com:6867/apiv2'" class="">ws://api.openvehicles.com:6867/apiv2'</a> and ‘<a href="wss://api.openvehicles.com:6870/apiv2'" class="">wss://api.openvehicles.com:6870/apiv2'</a>. For example:<br class=""><br class=""><font face="Andale Mono" class=""><span style="font-style: normal; font-size: 14px;" class=""><span style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0);" class="">% wsta -p 60 --ping-msg 'A' -I <a href="wss://api.openvehicles.com:6870/apiv2/" class="">wss://api.openvehicles.com:6870/apiv2/</a><br class=""></span><span style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0);" class="">WebSocket upgrade request<br class=""></span>---<br class=""><span style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0);" class="">Host: <a href="http://api.openvehicles.com:6870" class="">api.openvehicles.com:6870</a><br class=""></span><span style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0);" class="">Connection: Upgrade<br class=""></span><span style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0);" class="">Upgrade: websocket<br class=""></span><span style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0);" class="">Sec-WebSocket-Version: 13<br class=""></span><span style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0);" class="">Sec-WebSocket-Key: UWfgAzvxoM/cyT35flkuIA==<br class=""></span><span style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0);" class="">Origin: <a href="https://api.openvehicles.com" class="">https://api.openvehicles.com</a><br class=""></span><br class=""><span style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0);" class="">WebSocket upgrade response<br class=""></span>---<br class=""><span style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0);" class="">101 Switching Protocols<br class=""></span><span style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0);" class="">Upgrade: WebSocket<br class=""></span><span style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0);" class="">Connection: Upgrade<br class=""></span><span style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0);" class="">Sec-WebSocket-Accept: lHNFo4fdGzWc/GfTq7bJXm7jamw=<br class=""></span><br class=""><span style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0);" class="">Connected to <a href="wss://api.openvehicles.com:6870/apiv2/" class="">wss://api.openvehicles.com:6870/apiv2/</a><br class=""></span><br class="">MP-A 1 <username> <password> DEMO<br class="">MP-S 1 <username> DEMO DEMO CAR2 CAR3 CAR4 ...<br class="">Z1<br class="">F1.5.0,VIN123456789012345,5,1,TRDM<br class="">S31,K,220,13,charging,standard,109,98,13,1,0,0,5,1,0,0,0,1<br class=""></span><span style="font-size: 14px;" class="">…</span></font><br class=""><br class="">It works by picking up the HTTP 'GET /apiv2/ HTTP/1.1’ line as the first line of the protocol negotiation (where it was expecting MP-C, MP-A, etc). If found, it will switch to handshake a websocket connection, and from then onwards websocket messages are simply apiv2 lines (without the CRLF). When combined with SSL and crypto 0x31 authentication, it is pretty cool (as seen above).<br class=""><br class=""></li><li class="">You will need to include the perl library Protocol::WebSocket (from cpan/package/etc).<br class=""><br class=""></li><li class="">I also extended the crypto 0x31 mechanism to send the list of accessible vehicle IDs (as well as the selected vehicle ID). This should be very useful for Apps and Cars to be able to auto-discover the available vehicles on the account. Remember that ‘*’ can be used to auto-select the first vehicle on the account. So you can send ‘MP-A 1 <username> <password> *’, and get back a connection to the first vehicle plus a list of alternatives vehicles available.</li></ol></div><div class=""><br class=""></div><div class="">This has been a lot of work putting together the pieces for something more interesting. More on that in a subsequent mailing (but you can probably guess)...</div><div class=""><br class=""></div><div class="">Regards, Mark.</div><div class=""><br class=""></div></body></html>