Detailed:
As base used jsonrpccxx implementation paired with TCP socket
TCP socket updated to handle dynamic sized buffers
TCP communication protocol changed to serialized packet size after
which json string is presented
120 lines
3.2 KiB
Markdown
120 lines
3.2 KiB
Markdown
# Cloud Point RPC
|
|
|
|
Communication JSON RPC protocol and implementation with Unity Scene.
|
|
|
|
## API Documentation
|
|
|
|
See [API.md](API.md) for detailed request/response formats.
|
|
|
|
## Comm model
|
|
|
|
```plantuml
|
|
@startuml
|
|
box ClientProcess #LightBlue
|
|
Participant Caller
|
|
Participant CloudPointClient
|
|
Participant TCPClient
|
|
end box
|
|
box UnityProcess #LightGreen
|
|
Participant TCPServer
|
|
Participant CloudPointServer
|
|
Participant UnityWorld
|
|
end box
|
|
UnityWorld -> CloudPointServer : init thread
|
|
activate CloudPointServer
|
|
CloudPointServer -> TCPServer : await for connection
|
|
activate TCPServer
|
|
->CloudPointClient : init thread
|
|
activate CloudPointClient
|
|
CloudPointClient -> TCPClient : createConnection
|
|
TCPClient -> TCPServer : establish connection
|
|
TCPServer -> CloudPointServer : established
|
|
deactivate TCPServer
|
|
CloudPointServer -> TCPServer : await for calls
|
|
|
|
TCPServer -> TCPServer : await for packet
|
|
Caller -> CloudPointClient : I want something
|
|
activate CloudPointClient
|
|
CloudPointClient -> CloudPointClient : CallMethod<Something>
|
|
CloudPointClient -> TCPClient : send(message)
|
|
activate TCPClient
|
|
TCPClient -> TCPServer : packet send
|
|
TCPServer -> TCPServer : await for packet
|
|
activate TCPServer
|
|
TCPServer -> TCPServer : read packet
|
|
TCPServer -> TCPClient : packet read
|
|
TCPClient -> CloudPointClient : done
|
|
deactivate TCPClient
|
|
CloudPointClient -> TCPClient : await for response
|
|
activate TCPClient
|
|
TCPClient -> TCPClient : await for packet
|
|
TCPServer -> CloudPointServer : callMethod
|
|
activate CloudPointServer
|
|
CloudPointServer -> UnityWorld : addToStaticQueue
|
|
|
|
UnityWorld -> UnityWorld : read from queue
|
|
activate UnityWorld
|
|
UnityWorld -> UnityWorld : callMethod
|
|
UnityWorld -> CloudPointServer: set task return value
|
|
deactivate UnityWorld
|
|
CloudPointServer -> TCPServer : return task
|
|
deactivate CloudPointServer
|
|
TCPServer -> TCPClient : send response
|
|
TCPClient -> TCPServer : response read
|
|
TCPClient -> CloudPointClient : response received
|
|
TCPServer -> CloudPointServer : done
|
|
deactivate TCPServer
|
|
CloudPointClient -> Caller : here what you wanted
|
|
deactivate CloudPointClient
|
|
|
|
Caller -> CloudPointClient : destruct
|
|
CloudPointClient -> TCPClient : finish waiting
|
|
deactivate TCPClient
|
|
deactivate CloudPointClient
|
|
UnityWorld -> CloudPointServer : destruct
|
|
deactivate CloudPointServer
|
|
|
|
@enduml
|
|
```
|
|
|
|
## Development
|
|
|
|
The project uses **Meson** build system and **C++20**.
|
|
|
|
### Dependencies
|
|
- Meson, Ninja
|
|
- GCC/Clang (C++20 support)
|
|
- Git (for subprojects)
|
|
|
|
### Build & Run
|
|
```bash
|
|
meson setup build
|
|
meson compile -C build
|
|
./build/src/cloud_point_rpc_server config.yaml
|
|
```
|
|
|
|
### Testing
|
|
```bash
|
|
meson test -C build -v
|
|
```
|
|
|
|
## Docker
|
|
|
|
You can build and run the cli using Docker.
|
|
|
|
### 1. Build Image
|
|
```bash
|
|
docker build -t cloud-point-rpc .
|
|
```
|
|
|
|
### 2. Run Container
|
|
The cli will try to connect to a **running server** on ip and port defined in config.yml file. (defined in `config.yaml` inside the image).
|
|
For simplicity, it's better to use a host network, so you will not have any headache with accessability.
|
|
|
|
> *Server is not configured to run through container, if you need, contact me*
|
|
|
|
You also can mount your own `config.yaml` to override the default settings:
|
|
```bash
|
|
docker run --network=host -it -v $(pwd)/my_config.yaml:/app/config.yaml cloud-point-rpc
|
|
```
|