B4X:
Private Sub BroadcastTimer_Tick
Try
' Log(address)
If address <> "" Then
If autodiscover.IsInitialized=False Then autodiscover.Initialize("autodiscover",discoverPort , 8192)
Private up As UDPPacket
up.Initialize("Domotica".GetBytes("UTF8"), address, discoverPort)
autodiscover.Send(up)
autodiscover.close
End If
Catch
Log("catch in Broadcasttimer_tick")
End Try
End Sub
I'm running 2 domotica systems. Since i implemented MQTT i got the problem that the broadcasttimer crashes. Mostly exactly on midnight. 1 system never had this issue. The other it can happen every week. Both running the same code. The broadcasttimer fires every 4 seconds. When the broadcasttimer crashes, all timers are blocked thus the system isnt operational anymore.
the crash pointed at the broadcasttimer - see log below.
Translation "adres is al in gebruik" means this address is in use already. This message comes from java, not b4j code.
main.main (java line: 28)
java.lang.RuntimeException: java.lang.RuntimeException: java.net.BindException: Adres is al in gebruik (Bind failed)
at anywheresoftware.b4a.BA.raiseEvent2(BA.java:138)
at anywheresoftware.b4a.BA.raiseEvent(BA.java:96)
at b4j.example.main.main(main.java:28)
Caused by: java.lang.RuntimeException: java.net.BindException: Adres is al in gebruik (Bind failed)
at anywheresoftware.b4a.BA.raiseEvent2(BA.java:138)
at anywheresoftware.b4a.objects.Timer$TickTack$1.run(Timer.java:135)
at anywheresoftware.b4a.keywords.SimpleMessageLoop.runMessageLoop(SimpleMessageLoop.java:47)
at anywheresoftware.b4a.StandardBA.startMessageLoop(StandardBA.java:43)
at anywheresoftware.b4a.keywords.Common.StartMessageLoop(Common.java:175)
at b4j.example.main._appstart(main.java:929)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at anywheresoftware.b4a.BA.raiseEvent2(BA.java:109)
... 2 more
Caused by: java.net.BindException: Adres is al in gebruik (Bind failed)
at java.net.PlainDatagramSocketImpl.bind0(Native Method)
at java.net.AbstractPlainDatagramSocketImpl.bind(AbstractPlainDatagramSocketImpl.java:93)
at java.net.DatagramSocket.bind(DatagramSocket.java:392)
at java.net.DatagramSocket.<init>(DatagramSocket.java:242)
at java.net.DatagramSocket.<init>(DatagramSocket.java:299)
at java.net.DatagramSocket.<init>(DatagramSocket.java:271)
at anywheresoftware.b4a.objects.SocketWrapper$UDPSocket.Initialize(SocketWrapper.java:352)
at b4j.example.main._broadcasttimer_tick(main.java:947)
at sun.reflect.GeneratedMethodAccessor7.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at anywheresoftware.b4a.BA.raiseEvent2(BA.java:109)
... 12 more
with adding a catch block the issue is caught, and the system works on.
On midnight the systems writes some data which was collected during the day, this writing takes time.
So it seems that the broadcasttimer was fired again when the previous udp transmission wasnt completed?
But how to check the UDPsocket isnt closed before the new message will be prepared and send?