FDBus
is a middleware development framework targeting the following objectives:
- Inter-Process Communication (
IPC
) within single host and cross the network - System abstraction (
Windows
,Linux
,QNX
) - Components based on which middleware is built (job, worker, timer, watch...)
It is something like DBus
or SOME/IP
, but with its own characteristic:
- Distributed : unlike
DBus
, it has no central hub - High performance : endpoints talk to each other directly
- Addressing by name : service is addressable through logic name
- Address allocation : service address is allocated dynamically
- Networking : communication inside host and cross hosts
- IDL and code generation : google protocol buffer is recommended
- Language binding : C++ Java
- Total slution : it is more than an
IPC
machanism. it is a middleware development framework
Its usage can be found in the following fields:
- Infotainment; instrument cluster, TBox and other ECU with posix-compatible OS running
- Inter VM communication between guest OSes in hypervisor
- SOHO Gateway
- Instrument for distributed industry control
Linux
Windows
QNX
- cmake - 3.1.3 or above for non-jni build
- cmake - 3.11.1 or above for jni build
- protocol buffer
- compiler supporting C++11 (gcc 4.7+ for Linux; Visual Studio for Windows)
https://github.com/jeremyczhen/fdbus.git
https://blog.csdn.net/jeremy_cz/article/details/89060291
[1] |
Dependence:
- cmake, gcc are installed
cd ~/workspace
git clone https://github.com/jeremyczhen/fdbus.git #get fdbus source code
cd fdbus;mkdir -p build/install;cd build #create directory for out-of-source build
cmake -DCMAKE_INSTALL_PREFIX=install ../cmake
make install
Dependence:
- cmake and cross-compiling toolchain are installed
cd ~/workspace
git clone https://github.com/jeremyczhen/fdbus.git
cd fdbus;mkdir -p build/install;cd build
#update ../cmake/toolchain.cmake (see below example)
cmake -DCMAKE_INSTALL_PREFIX=install -DCMAKE_TOOLCHAIN_FILE=../cmake/toolchain.cmake ../cmake
make install
The same as cross compiling, but the following option should be added to cmake due to minor difference in QNX SDP:
-Dfdbus_SOCKET_ENABLE_PEERCRED=OFF -Dfdbus_PIPE_AS_EVENTFD=true -Dfdbus_LINK_SOCKET_LIB=true
[2] | (1, 2) |
Dependence:
- cmake, msvc are installed
- cd c:\workspace
- suppose source code of fdbus is already downloaded and placed at c:\workspace\fdbus
- create directory c:\workspace\fdbus\build\install and enter c:\workspace\fdbus\build
- cmake -DCMAKE_INSTALL_PREFIX=install ..\cmake
- open fdbus.sln in c:\workspace\fdbus\build and build project INSTALL
- you should have cross-compiling toolchain installed (such as linaro ARM complier)
- you should have 'make.exe' installed
- run 'cmake' as [2], adding "-DCMAKE_TOOLCHAIN_FILE=../cmake/toolchain.cmake -G "Unix Makefiles"". Makefiles will be generated.
- Build protocol buffer
cd ~/workspace
git clone https://github.com/protocolbuffers/protobuf.git #get protobuf source code
cd protobuf;git submodule update --init --recursive
mkdir -p build/install;cd build #create directory for out-of-source build
cmake -DCMAKE_INSTALL_PREFIX=install -DBUILD_SHARED_LIBS=1 ../cmake
make -j4 install #build and install to build/install directory
- Build fdbus [1]
- Supposing it is available at ~/workspace/fdbus, build fdbus example
cd ~/workspace/fdbus;mkdir -p build-example/install;cd build-example #create directory for out-of-source build
cmake -DSYSTEM_ROOT=~/workspace/protobuf/build/install;~/workspace/fdbus/build/install -DCMAKE_INSTALL_PREFIX=install ../cmake
PATH=~/workspace/protobuf/build/install/bin:$PATH make install #set PATH to the directory where protoc can be found
Dependence:
- cmake, msvc are installed
1 build protocol buffer
- cd c:\workspace
- suppose source code of protocol buffer is already downloaded and placed at c:\workspace\protobuf
- create directory c:\workspace\protobuf\cbuild\install and enter c:\protobuf\fdbus\cbuild
- cmake -DCMAKE_INSTALL_PREFIX=install -Dprotobuf_WITH_ZLIB=OFF ..cmake
- open protobuf.sln in c:workspaceprotobufcbuild and build project INSTALL
- Build fdbus [2]
- Supposing it is available at c:\workspace\fdbus, build example for fdbus
- create directory c:\workspace\fdbus\build-example\install and enter c:\workspace\fdbus\build-example
- cmake -DSYSTEM_ROOT=c:\workspace\protobuf\build\install;c:\workspace\fdbus\build\install -DCMAKE_INSTALL_PREFIX=install ../cmake/pb-example
- copy c:\workspace\protobuf\cbuild\install\bin\protoc.exe to the directory in PATH environment variable
- open fdbus.sln in c:\workspace\fdbus\build-example and build project INSTALL
- start name server:
> name_server
- start clients/servers
- using lssvc, logsvc, logviewer to look into details
- start name server at host1:
host1> name_server
- start host server at host1:
host1> host_server
- start name server at host2:
host2> name_server -u tcp://ip_of_host1:60000
- start clients/servers at host1 or host2
- using lssvc, logsvc, logviewer to look into details
> cat toolchain.cmake SET(CMAKE_SYSTEM_NAME Linux) SET(CMAKE_CXX_COMPILER $ENV{QNX_HOST}/usr/bin/q++) SET(CMAKE_C_COMPILER $ENV{QNX_HOST}/usr/bin/qcc)
- The following options can be specified with
-Dfdbus_XXX=ON/OFF
when runningcmake
. - The status with
*
is set as default. fdbus_BUILD_TESTS
- *``ON`` : build examples
OFF
: don't build examples fdbus_ENABLE_LOG
- *``ON`` : enable log output of fdbus lib
OFF
: disable log output of fdbus lib fdbus_LOG_TO_STDOUT
ON
: send fdbus log to stdout (terminal)*``OFF``: fdbus log is sent to log serverfdbus_ENABLE_MESSAGE_METADATA
- *``ON`` : time stamp is included in fdbus message to track delay of message during request-reply interaction
OFF
: time stamp is disabled fdbus_SOCKET_BLOCKING_CONNECT
ON
: socket method connect() will be blocked forever if server is not ready to accept*``OFF``: connect() will be blocked with timer to avoid permanent blockingfdbus_SOCKET_ENABLE_PEERCRED
- *``ON`` : peercred of UDS (Unix Domain Socket) is enabled
OFF
: peercred of UDS is disabled fdbus_ALLOC_PORT_BY_SYSTEM
ON
: socket number of servers are allocated by the system*``OFF``: socket number of servers are allocated by name serverfdbus_SECURITY
ON
: enable security*``OFF``: disable securityfdbus_BUILD_JNI
ON
: build JNI shared library and jar package*``OFF``: don't build JNI artifacts- The following options can be specified with
-DMACRO_DEF='VARIABLE=value;VARIABLE=value'
FDB_CFG_SOCKET_PATH
- specify directory of UDS filedefault: /tmp
CONFIG_SOCKET_CONNECT_TIMEOUT
- specify timeout of connect() when connect to socket server in ms. "
0
" means block forever.default: 2000
1. server registers its name toname server
;2.name server
reply with URL and token;3. server binds to the URL and holds the token;4. client requests name resolution fromname server
;5.name server
authenticate client by checking peercred (SO_PEERCRED
option of socket), includingUID
,GID
of the client6. if success,name server
gives URL and token of requested server to the client7. client connects to the server with URL followed by sending the token to the server8. server verify the token and grant the connection if pass; for unauthorized client, since it does not have a valid token, server will drop the connection9.name server
can assign multiple tokens to server but only send one of them to the client according to security level of the client
TBD
1. Issue: sem_timedwait() is used as notifier and blocker of event loop, leading to timer failure when TOD is changed since sem_wait() take CLOCK_REALTIME clock for timeout control.Solution: When creating worker thread, pass FDB_WORKER_ENABLE_FD_LOOP as parameter, forcing poll() instead of sem_timedwait() as loop notifier and blocker