HELP luasocket changed in build 31 - rocfusion - 10.09.2019
Hi,
Please help. I have the LM5 running RC1 firmware. Luasocket is upgraded to luasocket_2.0.2-31_imx6.ipk it was working in the 29 build. This particular LM5 is running resident scripts for a websocket client which is working. I really don't want to break that.
The UDP server does not receive when I have the TCP client active. I can comment out the TCP client then it works. The event script can send to the resident script fine. I have tried changing the timeout value for both TCP client and the UDP server. Makes no difference. I need to use copas because I have delay commands sent out to the TCP device.
Does anyone have an idea.
Resident script on 0 seconds
Code: if not ready then
copas = require("copas")
socket = require("socket")
server = socket.udp()
server:setsockname("127.0.0.1",51034)
function handler(uskt)
uskt = copas.wrap(uskt)
log("UDP connection handler")
while true do
local s, err
log("receiving...")
s, err = uskt:receive(1024)
if not s then
log("Receive error: ")
log(err)
return
end
log("Received data, bytes:")
log(s)
end
end
copas.addserver(server, handler, 0)
function parse(data)
log(data)
end
function sendtcp(command)
skt:send(command)
sleep(0.5)
end
function init()
log('in init')
sendtcp('#COSMSGS=false\r')
sendtcp('#MODEL?\r')
end
ready=true
end
if not skt then
--add receive thread
copas.addthread(function()
local reconnect = function()
skt, err = socket.connect('192.168.0.175', 4999)
skt:settimeout(1)
if(not err) then
init()
else
log('[tcp-client] error connecting ')
return
end
end
if not skt or skt==nil or skt.state=='CLOSED' then
reconnect()
end
if(skt)then
while true do
local resp,err = skt:receive('*r')
-- if theres no connection start a new connection
if(skt.state=='CLOSED')then
if not resp then
log("[tcp-client] Receive error: ")
copas.removethread(skt)
skt = nil
break
end
else
if(resp~=nil) then
local fd,prtd = pcall(parse,resp)
if(fd==false)then
log("Error with parsemsg")
end
end
end
end
end
end)
end
copas.loop()
Event script
Code: if event.type=='groupwrite' then
local socket = require('socket')
local client = socket.udp()
local evt = event.dst..','..tostring(grp.getvalue(event.dst))
log(evt)
if client then
client:sendto(evt, '127.0.0.1', 51034)
client:close()
end
elseif event.type =='groupread' then
grp.response(event.dst,grp.getvalue(event.dst))
end
RE: HELP luasocket changed in build 31 - admin - 10.09.2019
I'll check this more thoroughly but there are some issues with your script:
1. Do not use socket.connect() because it is blocking, use copas.connect()
2. There's no need to pass any length to UDP receive. Without any length it will return one datagram (or error on timeout) per call
3. Your reconnect procedure seems wrong, you don't have to call removethread and sockets do not have state field
4. sendtcp does not check if socket is connected/available
RE: HELP luasocket changed in build 31 - rocfusion - 10.09.2019
Hi,
copas.connect is blocking also. is there a working example with copas?
Thanks
Roger
RE: HELP luasocket changed in build 31 - admin - 10.09.2019
From docs:
copas.connect(skt, address, port)
Connects and transforms a master socket to a client just like LuaSocket socket:connect(). The Copas version does not block and allows the multitasking of the other handlers and threads.
RE: HELP luasocket changed in build 31 - rocfusion - 10.09.2019
That's what I did and removed the bad stuff. Still blocks out. tried with or without timeout and timeout of 0 and 1.
Code: if not skt then
--add receive thread
copas.addthread(function()
skt = socket.tcp()
err = copas.connect(skt,'192.168.0.175', 4999)
skt:settimeout(1)
log(skt)
log(err)
if(skt)then
init()
while true do
local resp,err = skt:receive('*r')
if(resp~=nil) then
local fd,prtd = pcall(parse,resp)
if(fd==false)then
log("Error with parsemsg")
end
end
end
end
end)
end
RE: HELP luasocket changed in build 31 - admin - 11.09.2019
Working example:
Code: if not ready then
copas = require('copas')
socket = require('socket')
udpserver = socket.udp()
udpserver:setsockname('127.0.0.1', 51034)
function udphandler(udpsock)
udpsock = copas.wrap(udpsock)
log('udp connection handler')
while true do
local data, err = udpsock:receive()
if data then
log('received data', data)
end
end
end
function parse(data)
log(data)
end
function sendtcp(command)
if connected then
tcpsock:send(command)
copas.sleep(0.5)
end
end
ready = true
function tcpconnect()
local sock = socket.tcp()
tcpsock = copas.wrap(sock)
tcpsock:settimeout(1)
connected, err = tcpsock:connect('192.168.0.175', 4999)
if connected then
log('connect ok')
sendtcp('#COSMSGS=false\r')
sendtcp('#MODEL?\r')
else
log('connect failed', err)
copas.sleep(1)
end
end
function tcphandler()
while true do
if connected then
local resp, err = tcpsock:receive('*r')
if resp then
local status, data = pcall(parse, resp)
if not status then
log('parse failed', data)
end
elseif err == 'closed' then
log('disconnected')
connected = false
tcpsock:close()
tcpsock = nil
collectgarbage('step')
copas.sleep(1)
end
end
if not connected then
tcpconnect()
end
end
end
copas.addserver(udpserver, udphandler, 0)
copas.addthread(tcphandler)
end
copas.loop()
RE: HELP luasocket changed in build 31 - rocfusion - 11.09.2019
Hi,
Yes it works, BIG thank you. Perfect. Have a great day.
Thanks,
Roger
|