01.11.2017, 13:46
How to make a handler that interacts with KODI.
Data can be send to kodi on port 9090 (or another port you configured) using a raw connection with putty.
My goal:
- send command to kodi, for example i can send this command: { "jsonrpc": "2.0", "id": 1, "method": "Application.SetVolume", "params": { "volume": 53 } }
- receive executed events from kodi, for example i receive this command: {"jsonrpc":"2.0","method":"GUI.OnScreensaverDeactivated","params":{"data":{"shuttingdown":false},"sender":"xbmc"}}
- receive commands from my lm/hl over udp and send them to kodi
I like to have this all in one handler. I have already a piece of code that works, but its to slow. It waits on udp command and that interrups my receiving events.
Maybe using copas or something solved the issue, but how?
kodiHandler("192.168.x.x","9090","12007")
Data can be send to kodi on port 9090 (or another port you configured) using a raw connection with putty.
My goal:
- send command to kodi, for example i can send this command: { "jsonrpc": "2.0", "id": 1, "method": "Application.SetVolume", "params": { "volume": 53 } }
- receive executed events from kodi, for example i receive this command: {"jsonrpc":"2.0","method":"GUI.OnScreensaverDeactivated","params":{"data":{"shuttingdown":false},"sender":"xbmc"}}
- receive commands from my lm/hl over udp and send them to kodi
I like to have this all in one handler. I have already a piece of code that works, but its to slow. It waits on udp command and that interrups my receiving events.
Maybe using copas or something solved the issue, but how?
kodiHandler("192.168.x.x","9090","12007")
Code:
-- library
function kodiHandler(iServer,iPort,sendPort)
-- first call
if not ready then
require('socket')
require('json')
lastdatareceived = nil
ready = true
end
-- client connected
if connected then
while true do
char, err = client:receive(1)
-- error while receiving, closed socket
if err == 'closed' then
connected = false
sleep(1)
break
end
if char ~= nil then
lastdatareceived = os.time()
warningclosed = true
warningfailed = true
warningerrors = true
warningtimeou = true
table.insert(buffer, char)
tmpbuf = table.concat(buffer)
if ( json.pdecode(tmpbuf) ) then
data = tmpbuf
parse(data)
buffer = {}
end
else
now = os.time()
deltatime = now - lastdatareceived
end
-- receive incoming send requests
msg, ip, port = sendServer:receivefrom()
if msg then
-- send command
--log("send: "..msg)
client:send(msg)
end
--[[ clear not complete buffer
if deltatime > 10 and #buffer > 0 then
log( #buffer )
buffer = {}
lastdatareceived = os.time()
end
-]]
end
-- first call or previously disconnected
else
-- close previous connection when disconnected
if client then
client:close()
client = nil
end
if sendServer then
sendServer:close()
sendServer = nil
end
-- create tcp client
client = socket.tcp()
client:settimeout(5)
connected, err = client:connect(iServer, iPort)
-- connect ok, reset buffer
if connected then
lastdatareceived = os.time()
warningclosed = true
warningfailed = true
warningerrors = true
warningtimeou = true
--log('[KODI-client] connection ok: '..iServer)
buffer = {}
-- create udp server to receive incoming send requests
if not sendServer then
sendServer = socket.udp()
sendServer:setsockname('*', sendPort)
sendServer:settimeout(0.1)
end
sleep(5)
-- send initial command
--client:send( '{"jsonrpc": "2.0", "method": "Player.PlayPause", "params": { "playerid": 0 }, "id": 1}' )
-- error while connecting,
else
--log(err)
if warningfailed then log('[KODI-client] connection failed (conn): '.. err) end
warningfailed = false
sleep(5)
end
end
-- incoming command parser
function parse(data)
-- log other info, not mapped, if useful
--log("data received: "..data)
--log(json.pdecode(data))
end
end