|
|
(One intermediate revision by one other user not shown) |
Line 1: |
Line 1: |
− | A common question that comes up is "How can I communicate with olad using something other than C++, Python or Java?".
| |
| | | |
− | == Intro ==
| |
| | | |
− | OLA is a client / server architecture. The clients and the server (olad) communicate over a TCP socket. By default olad listens on localhost:9010. Data passed between the client and the server is serialized using [https://developers.google.com/protocol-buffers/ Protocol Buffers]. The [https://developers.google.com/protocol-buffers/docs/overview overview] and [https://developers.google.com/protocol-buffers/docs/encoding data encoding] pages describe the specifics of the serialization process.
| + | This page has moved to [[doc:rpc_system|here]]. |
− | | |
− | To write a new client at the very least you need an implementation of protocol buffers for your language. Luckily there is widespread support for protocol buffers in [https://code.google.com/p/protobuf/wiki/ThirdPartyAddOns many languages].
| |
− | | |
− | == OLA Messages ==
| |
− | | |
− | The protocol buffers that describe the messages sent and received by olad are in [https://github.com/OpenLightingProject/ola/blob/master/common/protocol/Ola.proto common/protocol/Ola.proto]. At the end of the file the 'OlaServerService' section lists the remote methods that can be called on olad, along with the request and response message types.
| |
− | | |
− | == Outer Message ==
| |
− | | |
− | When a call to olad is made, the appropriate request message is constructed (say PluginListRequest ) and then the message is serialized to an array of bytes. The byte array is then wrapped in a second protocol, which contains information about the RPC itself. This outer layer is defined in [https://github.com/OpenLightingProject/ola/blob/master/common/rpc/Rpc.proto common/rpc/Rpc.proto].
| |
− | | |
− | The outer layer is not OLA specific, it can be used for any type of RPC message, in fact it's also used by the SLP server that comes with OLA.
| |
− | | |
− | <pre>
| |
− | message RpcMessage {
| |
− | required Type type = 1;
| |
− | optional uint32 id = 2;
| |
− | optional string name = 3;
| |
− | optional bytes buffer = 4;
| |
− | }
| |
− | </pre>
| |
− | | |
− | ;type
| |
− | : The type of this RPC message, usually REQUEST or RESPONSE
| |
− | ; id
| |
− | : the sequence number of the message. The sequence number of response messages must match the number used in the request.
| |
− | ; name
| |
− | : the name of the remote method to call
| |
− | ; buffer
| |
− | : the serialized inner protocol buffer.
| |
− | | |
− | == Simple Example ==
| |
− | | |
− | A quick example in Python style pseudo code
| |
− | <pre>
| |
− | // connect to socket
| |
− | server = socket.connect("127.0.0.1", 9010)
| |
− | | |
− | // Build the request
| |
− | DmxData dmx_data
| |
− | dmx_data.universe = 1
| |
− | dmx_data.data = .....
| |
− | | |
− | // Wrap in the outer layer
| |
− | RpcMessage rpc_message
| |
− | rpc_message.type = RpcMessage::REQUEST
| |
− | rpc_message.id = 1
| |
− | rpc_message.name = 'UpdateDmxData'
| |
− | rpc_message.buffer = dmx_data.Serialize()
| |
− | | |
− | server.write(rpc_message.Serialize())
| |
− | | |
− | // wait for response on socket
| |