Code Monkey home page Code Monkey logo

kuksa.val's Introduction

This repository is deprecated

NOTE: All content in this repository will reach End-of-Life 2024-12-31!

Components intended to be maintained has been moved to other repositories:

Component New Repository
KUKSA Databroker https://github.com/eclipse-kuksa/kuksa-databroker
KUKSA Go Client https://github.com/eclipse-kuksa/kuksa-incubation
KUKSA Python SDK https://github.com/eclipse-kuksa/kuksa-python-sdk

KUKSA.VAL

kuksa.val Logo

This is KUKSA.val, the KUKSA Vehicle Abstraction Layer.

KUKSA.val provides in-vehicle software components for working with in-vehicle signals modelled using the COVESA VSS data model.

If you are new here, try the Quickstart, which should not take more than 10 min of your time.

License Gitter

Build kuksa-val-server codecov

KUKSA.val contains several components

Component Description
KUKSA Databroker Efficient in-vehicle signal broker written in RUST providing authorized access to VSS data using gRPC Note: Moved to the kuksa-databroker repository! Last commit with Databroker from this repository available in the deprecated_databroker branch!
KUKSA Server Feature rich in-vehicle data server written in C++ providing authorized access to VSS data using W3C VISS websocket protocol Note: KUKSA Server is deprecated and will reach End-of-Life 2024-12-31!
KUKSA Python SDK Command line tool to interactively explore and modify the VSS data points and data structure. Python library for easy interaction with KUKSA Databroker and Server. Note: Moved to kuksa-python-sdk repository!
KUKSA GO Client Example client written in the GO programming language for easy interaction with KUKSA Databroker and Server Note: Moved to a kuksa-incubation repository!
Example Applications Some example apps for different programming languages and frameworks
Feeders and Providers Multiple feeders and providers for exchanging vehicle data with KUKSA databroker and Server

More information

Pre-commit set up

This repository is set up to use pre-commit hooks. Use pip install pre-commit to install pre-commit. After you clone the project, run pre-commit install to install pre-commit into your git hooks. Pre-commit will now run on every commit. Every time you clone a project using pre-commit running pre-commit install should always be the first thing you do.

kuksa.val's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

kuksa.val's Issues

Include directory error

While building the latest version, I've found out that some directories are inconsistent, therefore making errors.

After including the jsoncons library to the include directory as below:

$ sudo cp -R jsoncons-x.xxx.x/include/* /usr/include/

It makes sense to change jsonpath directories from kuksa.val/src/SubscriptionHandler.cpp, kuksa.val/src/VssDatabase.cpp and kuksa.val/src/main.cpp as below:

#include <jsonpath/json_query.hpp> => #include <jsoncons_ext/jsonpath/json_query.hpp>

This way, building was successful.

VSS-Testclient load token from file

Currently when using authorizein the testclient it expects the token as first paramater. It would be nice if alternatively it would also accept a file, e.g.

VSS Client> connect 
Websocket connected!!
VSS Client> authorize ./tokens/mymagictoken.json.token

It should somehow "cleverly" decide whether it is a file or not (i.e. check if a file exists, fi not send the parameter verbatim). Autocomplete on filenames would be a bonus

@nayakned Do you think this is possible?

New testclient, websocket connection handling

Something seems to be wrong with websocket connection handling

Reproduce

  • Start server
  • Connect with new testclient (connect authorize setValue)
  • works fine
  • Restart server (so the old connection is broken/invalid)
  • in testclient type "connect"
  • authorize: That works! (so I assume it DID reconnect?)
  • setValue: first time works
  • setValue second time: Exception: websockets.exceptions.ConnectionClosedError: code = 1006 (connection closed abnormally [internal]), no reason
  • Ctrl-C gives back prompt
  • setValue works again

Already not perfect, but now the super strange thing:
type connect again: Looks fine, but now roughly every second call to setValue succeeds while the others give 403
Do we have two sessions now, that are randomly used

@nayakned Can you check, and maybe push a fix?

Unittest cleanup

We have sort of some unit tests, but they are not well documented. I am not sure the used testing harness is the right one or used correctly and they are not in our CI pipeline

We should do some cleaning up here

  • if necessary change the framework around our unit tests
  • run them on Jenkins generating useful output

rename executable

the executable should reflect the kuksaval project name better. Currently it is called w3c-visserver

  • change cmake
  • change dockers
  • change docu

Improve code structure for VSSCommandSet

As remarked in
#113

you are right with readability. But in this case, I do not think, that putting everything inside one loop is less readable than using 3 loops. If you like to improve the readability, better refact the method with multiple functions. It is always best practices to have smaller function/method, better than a function with more than 100 lines of code. But If you like, you can create an issue for this, instead of fixing it now.

Improve code structure for VSSCommandSet

Build unittests in CI

Our Jenkins doesn't build (let alone run...) our unittests.

It did go unnoticed, that they didn't survive the jsoncons upgrade and repo reorganisation, see #63

At the bare minimum we should build unittests during CI builds

`getValue Vehicle.Cabin.Infotainment.Navigation.CurrentLocation` does not work as earlier

tested with 5cd2c9c0eaa06df6a9d1c8301c62a00d469e2b27,

VSS Client> getValue Vehicle.Cabin.Infotainment.Navigation.CurrentLocation
{
    "action": "get", 
    "requestId": "92cf14cf-4ec6-4156-88dd-4edc1240b7ae", 
    "timestamp": 1612550316, 
    "value": {
        "Vehicle.Cabin.Infotainment.Navigation.CurrentLocation.Accuracy": "0", 
        "Vehicle.Cabin.Infotainment.Navigation.CurrentLocation.Altitude": "0.0", 
        "Vehicle.Cabin.Infotainment.Navigation.CurrentLocation.Heading": "---", 
        "Vehicle.Cabin.Infotainment.Navigation.CurrentLocation.Latitude": "48.786033333", 
        "Vehicle.Cabin.Infotainment.Navigation.CurrentLocation.Longitude": "8.92855", 
        "Vehicle.Cabin.Infotainment.Navigation.CurrentLocation.Speed": "30.028"
    }
}

But since commit 6b63c2ab13b10f33a3764b774e39c01580f4a663:

VSS Client> getValue Vehicle.Cabin.Infotainment.Navigation.CurrentLocation
{
    "action": "get", 
    "requestId": "4f889a2a-8944-4361-ab5d-c8481f621110", 
    "timestamp": 1612551487, 
    "value": {
        "Vehicle.Cabin.Infotainment.Navigation.CurrentLocation.Heading": "---", 
        "Vehicle.Cabin.Infotainment.Navigation.CurrentLocation.Speed": 21
    }
}

To reproduce:

VSS Client> getValue Vehicle.Cabin.Infotainment.Navigation.CurrentLocation.Altitude 
{
    "action": "get", 
    "path": "Vehicle.Cabin.Infotainment.Navigation.CurrentLocation.Altitude", 
    "requestId": "8e238f1b-7d2f-4c34-b106-34bbe6b24da1", 
    "timestamp": 1612551687, 
    "value": "---"
}

VSS Client> setValue Vehicle.Cabin.Infotainment.Navigation.CurrentLocation.Altitude  0.0
{
    "action": "set", 
    "requestId": "4ca74f98-236a-45cc-afa8-333b1b4fde2d", 
    "timestamp": 1612551702
}

VSS Client> getValue Vehicle.Cabin.Infotainment.Navigation.CurrentLocation.Altitude 
{
    "action": "get", 
    "error": {
        "message": "I can not find Vehicle.Cabin.Infotainment.Navigation.CurrentLocation.Altitude in my db", 
        "number": 404, 
        "reason": "Path not found"
    }, 
    "requestId": "107e31d6-47c8-475e-b1d0-4272f789dc49", 
    "timestamp": 1612551704
}

Upgrade Jenkins build to buildx

We should use "buildx" to build https://docs.docker.com/buildx/working-with-buildx/ instead of custom scripts Advantages

  • no need to use the qemu heavy-lifting yourself: It is nice and hidden
  • possibility to use native arm64 build node

However, buildx complicates docker-in-docker setup fiurther I suggest we drop it

  • main idea was to build "inside docker", so the build node has no dependencies/special setup
    • makes sense, if we have commands such as "cmake... make..." that depend on external libararies, so you are not dependant on the specific setup and versions of the node
  • the setup to use docker inside another docker is not that trivial (and means the builder can not eb that generic anyway)
  • everything we do is already in docker, so whether we do docker build on a docker enabled host or in a docker on a docker enabled host doesn't matter

@wenwenchenbosch opinions?

I tried playing with buildx setup the #67 PR, but I will probably revert that to just provide a docker file (maybe using with out old methods), and tackle the Jenkins build renovation separately

Authentication of dbcfeeder fails due to expired token.

Call of
python3 dbcfeeder.py -d vcan0 -j ../../../certificates/jwt/super-admin.json.token --dbc dias_simple.dbc --mapping dias_mapping.yml

leads to output of dbcfeeder.py:

Open CAN device vcan0
Starting thread
Connect Done
Handle response for <websockets.client.WebSocketClientProtocol object at 0x7fa19d00e438>
Authorize
send
Authorize done
Received {
"action": "authorize",
"error": {
"message": "Check the JWT token passed",
"number": 401,
"reason": "Invalid Token"
},
"requestId": "1",
"timestamp": 1606336052
}

and output of kuksa-val-server:

ERROR: Authenticator::validate: token verification failed: token expired Exception occurred while authentication. Token is not valid!

Unable to write or read using webclient or postman

I am trying to read from w3c using webclient and postman and I can authorize but when I try to read, write,etc a value:

Example with postman
GET http://localhost:8090/vss/api/v1/
{
"action": "get",
"requestId": "1234",
"path": "Vehicle.OBD.EngineSpeed"
}

It says:

ERROR: HTML status = 404
{
"action": "get",
"error": {
"message": "I can not find Requested resource do not exist in my db",
"number": 404,
"reason": "Path not found"
},
"requestId": "1079400840",
"timestamp": 1587719333
}

The vss_rel_2.0.json is correct and testclient works.

This problem was an issue closed here https://github.com/eclipse/kuksa.invehicle/pull/113
but it was not resolve.

Message timestamps are in seconds instead of milliseconds

Vehicle Service Specification states that message timestamps should be in milliseconds:

timestamp | integer | The Coordinated Universal Time (UTC) time that the server returned the response (expressed as number of milliseconds).

while what is actually received from Kuksa Val is in seconds, e.g.:

{
  "action": "subscribe",
  "subscriptionId": 1169547907,
  "timestamp": 1610712309,
  "value": 8204,
  "path": "Vehicle.Drivetrain.FuelSystem.TimeSinceStart"
}

So, when there is a big flow of events some of them get overlapping timestamps and cause issues in their proper ordering.

Extend data model during runtime

Currently the server loads a JSON file describing the VSS tree structure at startup time. It would be nice, to add the feature to load additonal JSONs of the same format during runtime using another websocket request or REST call

  • the new file should extend the existing tree (adding branches/leafs)
  • potentially be able to overwrite -> We need to decide what is useful here
  • protected by a new entry/claim in the JWT token

"Unloading" of of elements I would consider optional

Segmentation fault on authorization processing via REST in Alpine

Alpine builds crash, when sending a valid authorize via REST.

Backtrace

#0  0x000055eea0c51d59 in std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_M_dfs(std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_Match_mode, long) ()
#1  0x000055eea0c52048 in std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_M_dfs(std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_Match_mode, long) ()
[...]
#1317 0x000055eea0c52128 in std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_M_dfs(std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_Match_mode, long) ()
#1318 0x000055eea0c52048 in std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_M_dfs(std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_Match_mode, long) ()
#1319 0x000055eea0c51f9c in std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_M_dfs(std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_Match_mode, long) ()
#1320 0x000055eea0c5362d in bool std::__detail::__regex_algo_impl<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, char, std::__cxx11::regex_traits<char>, (std::__detail::_RegexExecutorPolicy)0, false>(__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, __gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::__cxx11::match_results<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > >&, std::__cxx11::basic_regex<char, std::__cxx11::regex_traits<char> > const&, std::regex_constants::match_flag_type) ()
#1321 0x000055eea0c96c25 in RestV1ApiHandler::GetJson(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&) ()
#1322 0x000055eea0e0284a in HttpSession<PlainHttpSession>::onRead(boost::system::error_code) ()
#1323 0x000055eea0dfb320 in void boost::beast::http::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::execution::any_executor<boost::asio::execution::context_as_t<boost::asio::execution_context&>, boost::asio::execution::detail::blocking::never_t<0>, boost::asio::execution::prefer_only<boost::asio::execution::detail::blocking::possibly_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::tracked_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::untracked_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::fork_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::continuation_t<0> > > >, boost::beast::basic_flat_buffer<std::allocator<char> >, true, boost::beast::http::detail::parser_is_done>::operator()<boost::asio::detail::composed_op<boost::beast::http::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::execution::any_executor<boost::asio::execution::context_as_t<boost::asio::execution_context&>, boost::asio::execution::detail::blocking::never_t<0>, boost::asio::execution::prefer_only<boost::asio::execution::detail::blocking::possibly_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::tracked_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::untracked_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::fork_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::continuation_t<0> > > >, boost::beast::basic_flat_buffer<std::allocator<char> >, true, boost::beast::http::detail::parser_is_done>, boost::asio::detail::composed_work<void (boost::asio::execution::any_executor<boost::asio::execution::context_as_t<boost::asio::execution_context&>, boost::asio::execution::detail::blocking::never_t<0>, boost::asio::execution::prefer_only<boost::asio::execution::detail::blocking::possibly_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::tracked_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::untracked_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::fork_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::continuation_t<0> > >)>, boost::beast::http::detail::read_msg_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::execution::any_executor<boost::asio::execution::context_as_t<boost::asio::execution_context&>, boost::asio::execution::detail::blocking::never_t<0>, boost::asio::execution::prefer_only<boost::asio::execution::detail::blocking::possibly_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::tracked_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::untracked_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::fork_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::continuation_t<0> > > >, boost::beast::basic_flat_buffer<std::allocator<char> >, true, boost::beast::http::basic_string_body<char, std::char_traits<char>, std::allocator<char> >, std::allocator<char>, boost::asio::executor_binder<std::_Bind<void (HttpSession<PlainHttpSession>::*(std::shared_ptr<PlainHttpSession>, std::_Placeholder<1>))(boost::system::error_code)>, boost::asio::strand<boost::asio::io_context::basic_executor_type<std::allocator<void>, 0u> > > >, void (boost::system::error_code, unsigned long)> >(boost::asio::detail::composed_op<boost::beast::http::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::execution::any_executor<boost::asio::execution::context_as_t<boost::asio::execution_context&>, boost::asio::execution::detail::blocking::never_t<0>, boost::asio::execution::prefer_only<boost::asio::execution::detail::blocking::possibly_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::tracked_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::untracked_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::fork_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::continuation_t<0> > > >, boost::beast::basic_flat_buffer<std::allocator<char> >, true, boost::beast::http::detail::parser_is_done>, boost::asio::detail::composed_work<void (boost::asio::execution::any_executor<boost::asio::execution::context_as_t<boost::asio::execution_context&>, boost::asio::execution::detail::blocking::never_t<0>, boost::asio::execution::prefer_only<boost::asio::execution::detail::blocking::possibly_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::tracked_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::untracked_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::fork_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::continuation_t<0> > >)>, boost::beast::http::detail::read_msg_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::execution::any_executor<boost::asio::execution::context_as_t<boost::asio::execution_context&>, boost::asio::execution::detail::blocking::never_t<0>, boost::asio::execution::prefer_only<boost::asio::execution::detail::blocking::possibly_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::tracked_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::untracked_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::fork_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::continuation_t<0> > > >, boost::beast::basic_flat_buffer<std::allocator<char> >, true, boost::beast::http::basic_string_body<char, std::char_traits<char>, std::allocator<char> >, std::allocator<char>, boost::asio::executor_binder<std::_Bind<void (HttpSession<PlainHttpSession>::*(std::shared_ptr<PlainHttpSession>, std::_Placeholder<1>))(boost::system::error_code)>, boost::asio::strand<boost::asio::io_context::basic_executor_type<std::allocator<void>, 0u> > > >, void (boost::system::error_code, unsigned long)>&, boost::system::error_code, unsigned long) ()
#1324 0x000055eea0dfa486 in void boost::beast::http::detail::read_some_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::execution::any_executor<boost::asio::execution::context_as_t<boost::asio::execution_context&>, boost::asio::execution::detail::blocking::never_t<0>, boost::asio::execution::prefer_only<boost::asio::execution::detail::blocking::possibly_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::tracked_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::untracked_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::fork_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::continuation_t<0> > > >, boost::beast::basic_flat_buffer<std::allocator<char> >, true>::operator()<boost::asio::detail::composed_op<boost::beast::http::detail::read_some_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::execution::any_executor<boost::asio::execution::context_as_t<boost::asio::execution_context&>, boost::asio::execution::detail::blocking::never_t<0>, boost::asio::execution::prefer_only<boost::asio::execution::detail::blocking::possibly_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::tracked_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::untracked_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::fork_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::continuation_t<0> > > >, boost::beast::basic_flat_buffer<std::allocator<char> >, true>, boost::asio::detail::composed_work<void (boost::asio::execution::any_executor<boost::asio::execution::context_as_t<boost::asio::execution_context&>, boost::asio::execution::detail::blocking::never_t<0>, boost::asio::execution::prefer_only<boost::asio::execution::detail::blocking::possibly_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::tracked_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::untracked_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::fork_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::continuation_t<0> > >)>, boost::asio::detail::composed_op<boost::beast::http::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::execution::any_executor<boost::asio::execution::context_as_t<boost::asio::execution_context&>, boost::asio::execution::detail::blocking::never_t<0>, boost::asio::execution::prefer_only<boost::asio::execution::detail::blocking::possibly_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::tracked_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::untracked_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::fork_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::continuation_t<0> > > >, boost::beast::basic_flat_buffer<std::allocator<char> >, true, boost::beast::http::detail::parser_is_done>, boost::asio::detail::composed_work<void (boost::asio::execution::any_executor<boost::asio::execution::context_as_t<boost::asio::execution_context&>, boost::asio::execution::detail::blocking::never_t<0>, boost::asio::execution::prefer_only<boost::asio::execution::detail::blocking::possibly_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::tracked_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::untracked_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::fork_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::continuation_t<0> > >)>, boost::beast::http::detail::read_msg_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::execution::any_executor<boost::asio::execution::context_as_t<boost::asio::execution_context&>, boost::asio::execution::detail::blocking::never_t<0>, boost::asio::execution::prefer_only<boost::asio::execution::detail::blocking::possibly_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::tracked_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::untracked_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::fork_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::continuation_t<0> > > >, boost::beast::basic_flat_buffer<std::allocator<char> >, true, boost::beast::http::basic_string_body<char, std::char_traits<char>, std::allocator<char> >, std::allocator<char>, boost::asio::executor_binder<std::_Bind<void (HttpSession<PlainHttpSession>::*(std::shared_ptr<PlainHttpSession>, std::_Placeholder<1>))(boost::system::error_code)>, boost::asio::strand<boost::asio::io_context::basic_executor_type<std::allocator<void>, 0u> > > >, void (boost::system::error_code, unsigned long)>, void (boost::system::error_code, unsigned long)> >(boost::asio::detail::composed_op<boost::beast::http::detail::read_some_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::execution::any_executor<boost::asio::execution::context_as_t<boost::asio::execution_context&>, boost::asio::execution::detail::blocking::never_t<0>, boost::asio::execution::prefer_only<boost::asio::execution::detail::blocking::possibly_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::tracked_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::untracked_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::fork_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::continuation_t<0> > > >, boost::beast::basic_flat_buffer<std::allocator<char> >, true>, boost::asio::detail::composed_work<void (boost::asio::execution::any_executor<boost::asio::execution::context_as_t<boost::asio::execution_context&>, boost::asio::execution::detail::blocking::never_t<0>, boost::asio::execution::prefer_only<boost::asio::execution::detail::blocking::possibly_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::tracked_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::untracked_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::fork_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::continuation_t<0> > >)>, boost::asio::detail::composed_op<boost::beast::http::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::execution::any_executor<boost::asio::execution::context_as_t<boost::asio::execution_context&>, boost::asio::execution::detail::blocking::never_t<0>, boost::asio::execution::prefer_only<boost::asio::execution::detail::blocking::possibly_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::tracked_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::untracked_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::fork_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::continuation_t<0> > > >, boost::beast::basic_flat_buffer<std::allocator<char> >, true, boost::beast::http::detail::parser_is_done>, boost::asio::detail::composed_work<void (boost::asio::execution::any_executor<boost::asio::execution::context_as_t<boost::asio::execution_context&>, boost::asio::execution::detail::blocking::never_t<0>, boost::asio::execution::prefer_only<boost::asio::execution::detail::blocking::possibly_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::tracked_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::untracked_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::fork_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::continuation_t<0> > >)>, boost::beast::http::detail::read_msg_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::execution::any_executor<boost::asio::execution::context_as_t<boost::asio::execution_context&>, boost::asio::execution::detail::blocking::never_t<0>, boost::asio::execution::prefer_only<boost::asio::execution::detail::blocking::possibly_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::tracked_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::untracked_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::fork_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::continuation_t<0> > > >, boost::beast::basic_flat_buffer<std::allocator<char> >, true, boost::beast::http::basic_string_body<char, std::char_traits<char>, std::allocator<char> >, std::allocator<char>, boost::asio::executor_binder<std::_Bind<void (HttpSession<PlainHttpSession>::*(std::shared_ptr<PlainHttpSession>, std::_Placeholder<1>))(boost::system::error_code)>, boost::asio::strand<boost::asio::io_context::basic_executor_type<std::allocator<void>, 0u> > > >, void (boost::system::error_code, unsigned long)>, void (boost::system::error_code, unsigned long)>&, boost::system::error_code, unsigned long) ()
#1325 0x000055eea0dfdb60 in boost::asio::detail::executor_op<boost::asio::detail::binder2<boost::asio::detail::composed_op<boost::beast::http::detail::read_some_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::execution::any_executor<boost::asio::execution::context_as_t<boost::asio::execution_context&>, boost::asio::execution::detail::blocking::never_t<0>, boost::asio::execution::prefer_only<boost::asio::execution::detail::blocking::possibly_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::tracked_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::untracked_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::fork_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::continuation_t<0> > > >, boost::beast::basic_flat_buffer<std::allocator<char> >, true>, boost::asio::detail::composed_work<void (boost::asio::execution::any_executor<boost::asio::execution::context_as_t<boost::asio::execution_context&>, boost::asio::execution::detail::blocking::never_t<0>, boost::asio::execution::prefer_only<boost::asio::execution::detail::blocking::possibly_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::tracked_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::untracked_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::fork_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::continuation_t<0> > >)>, boost::asio::detail::composed_op<boost::beast::http::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::execution::any_executor<boost::asio::execution::context_as_t<boost::asio::execution_context&>, boost::asio::execution::detail::blocking::never_t<0>, boost::asio::execution::prefer_only<boost::asio::execution::detail::blocking::possibly_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::tracked_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::untracked_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::fork_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::continuation_t<0> > > >, boost::beast::basic_flat_buffer<std::allocator<char> >, true, boost::beast::http::detail::parser_is_done>, boost::asio::detail::composed_work<void (boost::asio::execution::any_executor<boost::asio::execution::context_as_t<boost::asio::execution_context&>, boost::asio::execution::detail::blocking::never_t<0>, boost::asio::execution::prefer_only<boost::asio::execution::detail::blocking::possibly_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::tracked_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::untracked_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::fork_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::continuation_t<0> > >)>, boost::beast::http::detail::read_msg_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::execution::any_executor<boost::asio::execution::context_as_t<boost::asio::execution_context&>, boost::asio::execution::detail::blocking::never_t<0>, boost::asio::execution::prefer_only<boost::asio::execution::detail::blocking::possibly_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::tracked_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::untracked_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::fork_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::continuation_t<0> > > >, boost::beast::basic_flat_buffer<std::allocator<char> >, true, boost::beast::http::basic_string_body<char, std::char_traits<char>, std::allocator<char> >, std::allocator<char>, boost::asio::executor_binder<std::_Bind<void (HttpSession<PlainHttpSession>::*(std::shared_ptr<PlainHttpSession>, std::_Placeholder<1>))(boost::system::error_code)>, boost::asio::strand<boost::asio::io_context::basic_executor_type<std::allocator<void>, 0u> > > >, void (boost::system::error_code, unsigned long)>, void (boost::system::error_code, unsigned long)>, boost::system::error_code, unsigned long>, std::allocator<void>, boost::asio::detail::scheduler_operation>::do_complete(void*, boost::asio::detail::scheduler_operation*, boost::system::error_code const&, unsigned long) ()
#1326 0x000055eea0d7b7fa in boost::asio::detail::strand_executor_service::invoker<boost::asio::io_context::basic_executor_type<std::allocator<void>, 4u> const, void>::operator()() ()
#1327 0x000055eea0d7b92f in void boost::asio::io_context::basic_executor_type<std::allocator<void>, 4u>::execute<boost::asio::detail::strand_executor_service::invoker<boost::asio::io_context::basic_executor_type<std::allocator<void>, 4u> const, void> >(boost::asio::detail::strand_executor_service::invoker<boost::asio::io_context::basic_executor_type<std::allocator<void>, 4u> const, void>&&) const ()
#1328 0x000055eea0dfd6f4 in void boost::asio::detail::strand_executor_service::do_execute<boost::asio::io_context::basic_executor_type<std::allocator<void>, 4u> const, boost::asio::detail::binder2<boost::asio::detail::composed_op<boost::beast::http::detail::read_some_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::execution::any_executor<boost::asio::execution::context_as_t<boost::asio::execution_context&>, boost::asio::execution::detail::blocking::never_t<0>, boost::asio::execution::prefer_only<boost::asio::execution::detail::blocking::possibly_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::tracked_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::untracked_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::fork_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::continuation_t<0> > > >, boost::beast::basic_flat_buffer<std::allocator<char> >, true>, boost::asio::detail::composed_work<void (boost::asio::execution::any_executor<boost::asio::execution::context_as_t<boost::asio::execution_context&>, boost::asio::execution::detail::blocking::never_t<0>, boost::asio::execution::prefer_only<boost::asio::execution::detail::blocking::possibly_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::tracked_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::untracked_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::fork_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::continuation_t<0> > >)>, boost::asio::detail::composed_op<boost::beast::http::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::execution::any_executor<boost::asio::execution::context_as_t<boost::asio::execution_context&>, boost::asio::execution::detail::blocking::never_t<0>, boost::asio::execution::prefer_only<boost::asio::execution::detail::blocking::possibly_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::tracked_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::untracked_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::fork_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::continuation_t<0> > > >, boost::beast::basic_flat_buffer<std::allocator<char> >, true, boost::beast::http::detail::parser_is_done>, boost::asio::detail::composed_work<void (boost::asio::execution::any_executor<boost::asio::execution::context_as_t<boost::asio::execution_context&>, boost::asio::execution::detail::blocking::never_t<0>, boost::asio::execution::prefer_only<boost::asio::execution::detail::blocking::possibly_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::tracked_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::untracked_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::fork_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::continuation_t<0> > >)>, boost::beast::http::detail::read_msg_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::execution::any_executor<boost::asio::execution::context_as_t<boost::asio::execution_context&>, boost::asio::execution::detail::blocking::never_t<0>, boost::asio::execution::prefer_only<boost::asio::execution::detail::blocking::possibly_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::tracked_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::untracked_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::fork_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::continuation_t<0> > > >, boost::beast::basic_flat_buffer<std::allocator<char> >, true, boost::beast::http::basic_string_body<char, std::char_traits<char>, std::allocator<char> >, std::allocator<char>, boost::asio::executor_binder<std::_Bind<void (HttpSession<PlainHttpSession>::*(std::shared_ptr<PlainHttpSession>, std::_Placeholder<1>))(boost::system::error_code)>, boost::asio::strand<boost::asio::io_context::basic_executor_type<std::allocator<void>, 0u> > > >, void (boost::system::error_code, unsigned long)>, void (boost::system::error_code, unsigned long)>, boost::system::error_code, unsigned long>, std::allocator<void> >(std::shared_ptr<boost::asio::detail::strand_executor_service::strand_impl> const&, boost::asio::io_context::basic_executor_type<std::allocator<void>, 4u> const&, boost::asio::detail::binder2<boost::asio::detail::composed_op<boost::beast::http::detail::read_some_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::execution::any_executor<boost::asio::execution::context_as_t<boost::asio::execution_context&>, boost::asio::execution::detail::blocking::never_t<0>, boost::asio::execution::prefer_only<boost::asio::execution::detail::blocking::possibly_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::tracked_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::untracked_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::fork_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::continuation_t<0> > > >, boost::beast::basic_flat_buffer<std::allocator<char> >, true>, boost::asio::detail::composed_work<void (boost::asio::execution::any_executor<boost::asio::execution::context_as_t<boost::asio::execution_context&>, boost::asio::execution::detail::blocking::never_t<0>, boost::asio::execution::prefer_only<boost::asio::execution::detail::blocking::possibly_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::tracked_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::untracked_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::fork_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::continuation_t<0> > >)>, boost::asio::detail::composed_op<boost::beast::http::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::execution::any_executor<boost::asio::execution::context_as_t<boost::asio::execution_context&>, boost::asio::execution::detail::blocking::never_t<0>, boost::asio::execution::prefer_only<boost::asio::execution::detail::blocking::possibly_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::tracked_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::untracked_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::fork_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::continuation_t<0> > > >, boost::beast::basic_flat_buffer<std::allocator<char> >, true, boost::beast::http::detail::parser_is_done>, boost::asio::detail::composed_work<void (boost::asio::execution::any_executor<boost::asio::execution::context_as_t<boost::asio::execution_context&>, boost::asio::execution::detail::blocking::never_t<0>, boost::asio::execution::prefer_only<boost::asio::execution::detail::blocking::possibly_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::tracked_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::untracked_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::fork_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::continuation_t<0> > >)>, boost::beast::http::detail::read_msg_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::execution::any_executor<boost::asio::execution::context_as_t<boost::asio::execution_context&>, boost::asio::execution::detail::blocking::never_t<0>, boost::asio::execution::prefer_only<boost::asio::execution::detail::blocking::possibly_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::tracked_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::untracked_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::fork_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::continuation_t<0> > > >, boost::beast::basic_flat_buffer<std::allocator<char> >, true, boost::beast::http::basic_string_body<char, std::char_traits<char>, std::allocator<char> >, std::allocator<char>, boost::asio::executor_binder<std::_Bind<void (HttpSession<PlainHttpSession>::*(std::shared_ptr<PlainHttpSession>, std::_Placeholder<1>))(boost::system::error_code)>, boost::asio::strand<boost::asio::io_context::basic_executor_type<std::allocator<void>, 0u> > > >, void (boost::system::error_code, unsigned long)>, void (boost::system::error_code, unsigned long)>, boost::system::error_code, unsigned long>&&, std::allocator<void> const&) ()
#1329 0x000055eea0dfd963 in boost::asio::detail::reactive_socket_recv_op<boost::asio::mutable_buffer, boost::asio::detail::composed_op<boost::beast::http::detail::read_some_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::execution::any_executor<boost::asio::execution::context_as_t<boost::asio::execution_context&>, boost::asio::execution::detail::blocking::never_t<0>, boost::asio::execution::prefer_only<boost::asio::execution::detail::blocking::possibly_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::tracked_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::untracked_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::fork_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::continuation_t<0> > > >, boost::beast::basic_flat_buffer<std::allocator<char> >, true>, boost::asio::detail::composed_work<void (boost::asio::execution::any_executor<boost::asio::execution::context_as_t<boost::asio::execution_context&>, boost::asio::execution::detail::blocking::never_t<0>, boost::asio::execution::prefer_only<boost::asio::execution::detail::blocking::possibly_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::tracked_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::untracked_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::fork_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::continuation_t<0> > >)>, boost::asio::detail::composed_op<boost::beast::http::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::execution::any_executor<boost::asio::execution::context_as_t<boost::asio::execution_context&>, boost::asio::execution::detail::blocking::never_t<0>, boost::asio::execution::prefer_only<boost::asio::execution::detail::blocking::possibly_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::tracked_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::untracked_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::fork_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::continuation_t<0> > > >, boost::beast::basic_flat_buffer<std::allocator<char> >, true, boost::beast::http::detail::parser_is_done>, boost::asio::detail::composed_work<void (boost::asio::execution::any_executor<boost::asio::execution::context_as_t<boost::asio::execution_context&>, boost::asio::execution::detail::blocking::never_t<0>, boost::asio::execution::prefer_only<boost::asio::execution::detail::blocking::possibly_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::tracked_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::untracked_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::fork_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::continuation_t<0> > >)>, boost::beast::http::detail::read_msg_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::execution::any_executor<boost::asio::execution::context_as_t<boost::asio::execution_context&>, boost::asio::execution::detail::blocking::never_t<0>, boost::asio::execution::prefer_only<boost::asio::execution::detail::blocking::possibly_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::tracked_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::untracked_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::fork_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::continuation_t<0> > > >, boost::beast::basic_flat_buffer<std::allocator<char> >, true, boost::beast::http::basic_string_body<char, std::char_traits<char>, std::allocator<char> >, std::allocator<char>, boost::asio::executor_binder<std::_Bind<void (HttpSession<PlainHttpSession>::*(std::shared_ptr<PlainHttpSession>, std::_Placeholder<1>))(boost::system::error_code)>, boost::asio::strand<boost::asio::io_context::basic_executor_type<std::allocator<void>, 0u> > > >, void (boost::system::error_code, unsigned long)>, void (boost::system::error_code, unsigned long)>, boost::asio::execution::any_executor<boost::asio::execution::context_as_t<boost::asio::execution_context&>, boost::asio::execution::detail::blocking::never_t<0>, boost::asio::execution::prefer_only<boost::asio::execution::detail::blocking::possibly_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::tracked_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::untracked_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::fork_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::continuation_t<0> > > >::do_complete(void*, boost::asio::detail::scheduler_operation*, boost::system::error_code const&, unsigned long) ()
#1330 0x000055eea0d41a74 in boost::asio::detail::scheduler::run(boost::system::error_code&) ()
#1331 0x000055eea0d1aecf in std::thread::_State_impl<std::thread::_Invoker<std::tuple<WebSockHttpFlexServer::Start()::{lambda()#1}> > >::_M_run() ()
#1332 0x00007fa6d77d2163 in ?? ()
#1333 0x00007fa6d7f1171d in ?? ()
#1334 0x0000000000000000 in ?? ()

Might be a general problem, only triggered when using MUSL?

Support VISS2 REST protocol

The kuksa.val tree of in-vehicle data is provided via the W3C VISS (Vehicle Information Service Specification) protocol.

Currently version 1 of this protocol based in websockets is supported https://www.w3.org/TR/vehicle-information-service/#message-structure

Additionally kuksa.val includes an experimental bare bone REST API. REST has the advantage that for many users it is more accessible compared to a custom websocket protocol.

The current barebone REST implementation predates any standard. However, the upcoming VISS2 standard includes some pointers how a REST implementation should look like. Find the standard here:
https://github.com/w3c/automotive/tree/gh-pages/spec

(easier reading:
Core https://rawcdn.githack.com/w3c/automotive/64f3a1cfdd53ccb8411ccabb52e1cc39a7148d32/spec/VISSv2_Core.html

Transport: https://rawcdn.githack.com/w3c/automotive/64f3a1cfdd53ccb8411ccabb52e1cc39a7148d32/spec/VISSv2_Transport.html
)

This task includes updating the code and add support (a significant chunk) of the VISS2 REST protocol. It would be preferable, instead of "hand-crafting" the boilerplate to use some tooling such as Swagger/OpenAPI.

The task does not necessarily include the more generic architecture suggestions around security deployment also given in the VISS spec.

Error after testclient quit

After using testclient connect the kuksa client like this:

> python -m pipenv run python testclient.py
VSS Client> connect 
Websocket connected!!
VSS Client> quit

Kuksa client report the following errors:

> ./kuksa-val-server
kuksa.val server
Commit 517fad4-dirty from 2020-09-03T09:09:49+02:00
Update vss path to /home/wenwen/tools/kuksa.val/build/src/vss_rel_2.0.json
Update cert-path to /home/wenwen/tools/kuksa.val/build/src/.
Log START
VERBOSE: Try reading JWT pub key from /home/wenwen/tools/kuksa.val/build/src/./jwt.key.pub
VERBOSE: SubscribeThread: Started Subscription Thread!
VERBOSE: VssDatabase::VssDatabase : VSS tree initialized using JSON file = /home/wenwen/tools/kuksa.val/build/src/vss_rel_2.0.json
INFO: Initializing Boost.Beast web-socket and http server on port 8090
INFO: Starting Boost.Beast web-socket and http server
VERBOSE: Receive action: getMetadata
INFO: VssCommandProcessor::processQuery: Unknown action getMetadata
ERROR: read: stream truncated
ERROR: JSON parse error

S3 Parquet Uploader

We need a configurable uploader that batches a number of datapoints over a time window into https://parquet.apache.org/ and is able to upload them to an S3 bucket.

This should be an external program using the websocket (or REST) IF to talk to KUKSA and not integrated into the server directly

Can you tag the latest version?

Because the repo keeps being updated, I thought it would be nice to have a tag for the latest version so that the documentation I am writing won't be outdated.
Please let me know :)

Minor fix request

cfg['vss.server'] = args.mapping

Could you please change this line as below?
cfg['vss.server'] = args.mapping => cfg['vss.mapping'] = args.mapping

Otherwise it will throw the following exception:

Task exception was never retrieved
future: <Task finished coro=<vssclient.connect() done, defined at /home/pi/kuksa.val/examples/dbc2val/websocketconnector.py:24> exception=InvalidURI("mapping_1.yml isn't a valid URI")>
Traceback (most recent call last):
  File "/home/pi/.local/lib/python3.7/site-packages/websockets/uri.py", line 61, in parse_uri
    assert parsed.scheme in ["ws", "wss"]
AssertionError

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/home/pi/kuksa.val/examples/dbc2val/websocketconnector.py", line 26, in connect
    self.ws=await websockets.connect(uri)
  File "/home/pi/.local/lib/python3.7/site-packages/websockets/client.py", line 415, in __init__
    wsuri = parse_uri(uri)
  File "/home/pi/.local/lib/python3.7/site-packages/websockets/uri.py", line 66, in parse_uri
    raise InvalidURI(uri) from exc
websockets.exceptions.InvalidURI: mapping_1.yml isn't a valid URI

Thanks!

record and reply vehicle data

It would be very nice to find/implement a tool, which kuksa.val can use to record internal database changes. After restarting kuksa.val, it should be possible to replay recorded data.

It would be nice to evaluate rosbag. If the dataformat, libraries of rosbag can be used.

The reply part should not use extra interface to feed data. The existing interface like websocket should be used.

Update Websocket Protocol to VISS 2

The kuksa.val tree of in-vehicle data is provided via the W3C VISS (Vehicle Information Service Specification) protocol based on websockets

Currently version 1 of this protocol is supported https://www.w3.org/TR/vehicle-information-service/#message-structure

We should upgrade the code support the upcoming VISS2 websocket standard that can be found here
https://github.com/w3c/automotive/tree/gh-pages/spec

(easier reading:
Core https://rawcdn.githack.com/w3c/automotive/64f3a1cfdd53ccb8411ccabb52e1cc39a7148d32/spec/VISSv2_Core.html

Transport: https://rawcdn.githack.com/w3c/automotive/64f3a1cfdd53ccb8411ccabb52e1cc39a7148d32/spec/VISSv2_Transport.html
)

This task includes updating the code and add missing features to support (a significant chunk) of the VISS2 messaging protocol.
It does not necessarily include the more generic architecture suggestions around security deployment also given in the VISS spec

Update JSONCons

We use jsonscons to deal with... JSON

We use a pretty old version (0.105.0) and should update it.

We already had an update for 0.130.0 with CQ20506 here eclipse/kuksa.apps#24

Current version is 0.156.0 https://github.com/danielaparker/jsoncons/releases

@rohoet How hard is it to clear a new version? As it is just bugfixe with same license, would you be able to merge such a change and CQ later? If not is there alreay a newer version for piggy back? If not can you make a CQ for 0.156.0? (should have written this in pseudocode 😄 )

@wenwenchenbosch Any opinion whether we should switch to submodule (or repo tool), instead of mirroring here, in case we update?

uint64 not supported in set

We can not set uint64 values

11:15:02 [WARN] Error processing request for Vehicle.Private.Systemstats.Uptime: {
    "action": "set", 
    "error": {
        "message": "The type uint64 is not supported ", 
        "number": 401, 
        "reason": "Unknown error"
    }, 
    "requestId": "1971465630", 
    "timestamp": 1612610102206
} 

when specified in vspec as

- Vehicle.Private.Systemstats.Uptime:
  type: sensor
  datatype: uint64
  description: "Uptime of the system"

Probably problem here

void checkTypeAndBound(std::shared_ptr<ILogger> logger, string value_type, jsoncons::json val) {

Incorrect information display regarding insecure mode.

By default kuksa.val server is supposed to start in secure mode, i.e., SSL enabled.
While the server does start in secure mode, the output on the console is contradicting.

This line in the console output must be removed for secure mode or default execution:
INFO: Attention! Insecure connection are allowed! Do not use this in production!

setValue does not check min/max

Currently, I have the following observation:

VSS Client> getMetaData Vehicle.Speed
{
    "action": "getMetaData",
    "metadata": {
        "Vehicle": {
            "children": {
                "Speed": {
                    "datatype": "int32",
                    "description": "Vehicle speed, as sensed by the gearbox.",
                    "max": 250,
                    "min": -250,
                    "type": "sensor",
                    "unit": "km/h",
                    "uuid": "1efc9a11943b5a15ac159786051c5836"
                }
            },
            "description": "High-level vehicle data.",
            "type": "branch",
            "uuid": "1c72453e738511e9b29ad46a6a4b77e9"
        }
    },
    "requestId": "1236",
    "timestamp": 1599086861
}
VSS Client> setValue Vehicle.Speed 366
{
    "action": "set",
    "requestId": "1235",
    "timestamp": 1599087046
}
VSS Client> getValue Vehicle.Speed 
{
    "action": "get",
    "path": "Vehicle.Speed",
    "requestId": "1234",
    "timestamp": 1599087196,
    "value": "366"
}

But I do not expect the setValue Vehicle.Speed 366 can be successful, because the defined max value is 250.

MQTT Publisher

We should be able to deliver VSS data to a MQTT broker for further processing by northbound apps.

I.e. a path such as `Vehicle.OBD.Speed' shall be published to /prefix/Vehicle/OBD/Speed

To do so we need to get config parameters for MQTT Server, Port, unsername, PW. We also need a config file specifying which paths to push (an alternative mode should allow pushing ALL data, but this may not be always feasible if there are many high-
datarate signals). Pushing ALL data is useful for feeding a local MQTT, pushing only a select view signals is useful for driectly connecting kuksa.val to a cloud MQTT broker without any intermediate processing app.

MQTT library should be some Eclipse Paho derivative for license reasons. this should be part of the kuksa.val server and not an external program

image

Optional

  • Add a command&control channel, so during runtime you configure which data points are sent or net (publish/unpublish)
  • Also allow kuksa.val to subscribe MQTT (enabling a MQTT feeder)

Jenkins Slave disk full

The ubunut-dev docker images accumulate in the slaves local docke repository.

After building and exporting the image (toe be downloadable via Jenkins Master) we should delete the image.

Needs Jeninskfile modification

Build failure

Hello :)
I am trying to build the latest version.
I made sure the following things:

  1. I've cloned the repository recursively
    $ git clone --recursive https://github.com/eclipse/kuksa.val.git

  2. I've installed dependencies
    $ sudo apt-get update
    $ sudo apt-get install libblkid-dev e2fslibs-dev libboost-all-dev libaudit-dev libssl-dev mosquitto libmosquitto-dev

And I've received the following error:

junh-ki@junhki-VirtualBox:~/kuksa.val/build$ make
[  5%] Checking the git repository for changes...
[  5%] Built target check_git
[ 68%] Built target kuksa-val-server-object
[ 73%] Built target kuksa-val-server-core
[ 78%] Built target kuksa-val-server-core-static
[ 84%] Building CXX object src/CMakeFiles/kuksa-val-server.dir/main.cpp.o
In file included from /home/junh-ki/kuksa.val/src/main.cpp:39:0:
/home/junh-ki/kuksa.val/src/../buildinfo.h:31:40: error: stray ‘@’ in program
 Signed-off-by: Phong Tran <[email protected]>

Is there anything I am missing here?

MQTT prefix

Currently MQTT topics follow the VSS semantic, e.g. a topic is Vehicle/Speed, can we have a configurable prefix, i.e.

<myprefix>/Vehicle/Speed

@wenwenchenbosch

getMetadata Response for non existing branches

using getMetadata on a non-existing branch gives a result like

VSS Client> getMetaData Vehicle.notexist
{
    "action": "getMetaData",
    "metadata": 0,
    "requestId": "1236",
    "timestamp": 1599037307
}

I would expect sth. along the lines of

{
    "action": "getMetaData",
    "error": {
        "message": "I can not find Vehicle.notexist in my db",
        "number": 404,
        "reason": "Path not found"
    },
    "requestId": "1236",
    "timestamp": 1599037767
}

segmentation fault again using nodered secure examples

Error logs:

INFO: kuksa-vss = object
ERROR: Authenticator::validate: token verification failed: token expired Exception occurred while authentication. Token is not valid!
VERBOSE: Receive action: getMetaData
VERBOSE: VssCommandProcessor::processQuery: get MetaData query  for * with request id 1236
VERBOSE: VssDatabase::getMetaData: VSS specific path =$['Vehicle']
VERBOSE: Receive action: get
terminate called after throwing an instance of 'jsoncons::jsonschema::schema_error'
  what():  VSS get malformed: #/requestId: Expected string, found uint64

fish: “./kuksa-val-server” terminated by signal SIGABRT (Abort)

Build on Ubuntu 20.04 not working

In file included from /home/sebastian/kuksa.val/build/_deps/boost-build/include/boost/beast/core/multi_buffer.hpp:320,
                 from /home/sebastian/kuksa.val/build/_deps/boost-build/include/boost/beast/http/dynamic_body.hpp:13,
                 from /home/sebastian/kuksa.val/build/_deps/boost-build/include/boost/beast/http.hpp:19,
                 from /home/sebastian/kuksa.val/src/WebSockHttpFlexServer.cpp:20:
/home/sebastian/kuksa.val/build/_deps/boost-build/include/boost/beast/core/impl/multi_buffer.ipp: In instantiation of ‘boost::beast::basic_multi_buffer<Allocator>::mutable_buffers_type boost::beast::basic_multi_buffer<Allocator>::prepare(boost::beast::basic_multi_buffer<Allocator>::size_type) [with Allocator = std::allocator<char>; boost::beast::basic_multi_buffer<Allocator>::size_type = long unsigned int]’:
/home/sebastian/kuksa.val/src/WebSockHttpFlexServer.cpp:443:54:   required from ‘void {anonymous}::WebSocketSession<Derived>::write(const string&) [with Derived = {anonymous}::PlainWebsocketSession; std::string = std::__cxx11::basic_string<char>]’
/home/sebastian/kuksa.val/src/WebSockHttpFlexServer.cpp:1473:29:   required from here
/home/sebastian/kuksa.val/build/_deps/boost-build/include/boost/beast/core/impl/multi_buffer.ipp:716:22: error: implicitly-declared ‘constexpr boost::intrusive::list_iterator<boost::intrusive::bhtraits<boost::beast::basic_multi_buffer<std::allocator<char> >::element, boost::intrusive::list_node_traits<void*>, boost::intrusive::normal_link, boost::intrusive::dft_tag, 1>, false>& boost::intrusive::list_iterator<boost::intrusive::bhtraits<boost::beast::basic_multi_buffer<std::allocator<char> >::element, boost::intrusive::list_node_traits<void*>, boost::intrusive::normal_link, boost::intrusive::dft_tag, 1>, false>::operator=(const boost::intrusive::list_iterator<boost::intrusive::bhtraits<boost::beast::basic_multi_buffer<std::allocator<char> >::element, boost::intrusive::list_node_traits<void*>, boost::intrusive::normal_link, boost::intrusive::dft_tag, 1>, false>&)’ is deprecated [-Werror=deprecated-copy]
  716 |                 out_ = list_.iterator_to(e);
compilation terminated due to -Wfatal-errors.
cc1plus: all warnings being treated as errors
make[2]: *** [src/CMakeFiles/kuksa-val-server-object.dir/build.make:193: src/CMakeFiles/kuksa-val-server-object.dir/WebSockHttpFlexServer.cpp.o] Error 1
make[1]: *** [CMakeFiles/Makefile2:1036: src/CMakeFiles/kuksa-val-server-object.dir/all] Error 2
make: *** [Makefile:163: all] Error 2
sebastian@sebastian-HP-ZBook-15-G2:~/kuksa.

Testclient rewrite

Our current testclients suck. Should be rewritten to support command history/completion and generally provide a nicer user interface.

Also currently uses websocket only, optionally might be xtended to check rest IF also...

Better error messages

We need better error logging. E.g. when not finding the server certificate it does ot give a hint which file it tried to read

Log START VERBOSE: SubscribeThread: Started Subscription Thread! VERBOSE: VssDatabase::VssDatabase : VSS tree initialized using JSON file = /config/vss.json Could not load server certificate

Endless loop/bad behavior when port is bound

When starting a second instance of kuksa.val on the same port the console is spammed with

ERROR: accept: Invalid argument
ERROR: accept: Invalid argument
ERROR: accept: Invalid argument
ERROR: accept: Invalid argument
ERROR: accept: Invalid argument
ERROR: accept: Invalid argument
ERROR: accept: Invalid argument
ERROR: accept: Invalid argument
ERROR: accept: Invalid argument
ERROR: accept: Invalid argument
ERROR: accept: Invalid argument

Expected beahvior: Terminate with a (helpful) error message

System health metrics

Add a VSS sub-model to model performance metrics such as CPU laod, memory pressure of the host device and write a feeder

May be good issue for learning

another error when building kuksa-val-server

I am trying to build the latest kuksa-val-server in my VM again. The error pops up at the end of the building process as follow:

[ 80%] Building CXX object src/CMakeFiles/kuksa-val-server-object.dir/MQTTClient.cpp.o
[ 80%] Built target kuksa-val-server-object
Scanning dependencies of target kuksa-val-server-core
[ 85%] Linking CXX shared library libkuksa-val-server-core.so
[ 85%] Built target kuksa-val-server-core
Scanning dependencies of target kuksa-val-server-core-static
[ 90%] Linking CXX static library libkuksa-val-server-core-static.a
[ 90%] Built target kuksa-val-server-core-static
Scanning dependencies of target kuksa-val-server
[ 95%] Building CXX object src/CMakeFiles/kuksa-val-server.dir/main.cpp.o
[100%] Linking CXX executable kuksa-val-server
CMakeFiles/kuksa-val-server.dir/main.cpp.o: In function `print_usage(char const*, boost::program_options::options_description&)':
main.cpp:(.text+0x8d): undefined reference to `boost::program_options::operator<<(std::ostream&, boost::program_options::options_description const&)'
CMakeFiles/kuksa-val-server.dir/main.cpp.o: In function `boost::program_options::validation_error::validation_error(boost::program_options::validation_error::kind_t, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int)':
...

what am I missing here?

Server hang when trying to "setValue" a branch

Found this when testing #82 , but I think it is unrelated.

After trying to "setvalue" on a branch, the websocket in the server becomes unrepsonsive, it doesn't answer the current connection, and new ones can not be establisehd

$ pipenv run python testclient.py
connect to wss://127.0.0.1:8090
Websocket connected!!
VSS Client> authorize ../../certificates/jwt/super-admin.json.token 
{
    "TTL": 1767225599, 
    "action": "authorize", 
    "requestId": "232064744457485026050349937870403232405", 
    "timestamp": 1607347402
}

VSS Client> setValue Vehicle. 200
{
    "action": "set", 
    "error": {
        "message": "Path = Vehicle. with values \"200\" points to a branch. Needs to point to a signal", 
        "number": 401, 
        "reason": "Unknown error"
    }, 
    "requestId": "167827698325626256010256293378769017320", 
    "timestamp": 1607347415
}

VSS Client> getValue Vehicle.Speed
{
  "action": "get",
  "path": "Vehicle.Speed",
  "requestId": 71984042528783426127344641067100746563,
  "error": "timeout"
}

VSS Client> 

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.