====== Esp32UdpClientServer 02V03 =====
[[http://www.openhardsoftware.de/ | Open Hard- & Software]]
[
[[http://www.openhardsoftware.de/dokuwiki | DokuWiki]]
[[http://www.openhardsoftware.de/websites | WebSites]]
[[http://www.openhardsoftware.de/mediawiki | MediaWiki]]
[[http://www.openhardsoftware.de/nextcloud | NextCloud]]
]
===== Übersicht =====
Esp32-MicroPython-Software: \\
{{:module:python:UdpClientServer:2112132048_Esp32UdpClientServerTerminal.png?500|2112132048_Esp32UdpClientServerTerminal.png}}
===== Benutzung =====
**Esp32UdpClientServer.py**
#
# Syntax-Arguments:
#
# WindowsPC[192.168.178.33] <-> # WindowsPC[192.168.178.33]:
# WinPC: python CheckUdpClientServer.py Windows 4321 192.168.178.33 4321
# WindowsPC[192.168.178.33] <-> UbuntuPC[192.168.178.48]
# WinPC: python CheckUdpClientServer.py Windows 5001 192.168.178.48 5000
# LinPC: python CheckUdpClientServer.py Ubuntu 5000 192.168.178.33 5001
#
import sys
import time
import socket as SKT
#
import Thread as THR
import UdpClientServer as UCS
#
WLAN_SSID = 'FritzBoxSA7'
WLAN_PW = '01234567890123456789'
#
UDP_HEADERID = 'UDPHID'
#-----------------------------------------------------------
# UDP - TxD - TransmitData
#-----------------------------------------------------------
# UDP_IPADDRESS_TX = '192.168.178.255' NO broadcasting to local
UDP_IPADDRESS_TX = '192.168.178.255'
UDP_IPPORT_TX = 5000
#
#-----------------------------------------------------------
# UDP - RxD - ReceiveData
#-----------------------------------------------------------
UDP_IPADDRESS_LOCAL = '192.168.178.71' # dummy
UDP_IPPORT_RX = 5001
#
#-----------------------------------------------------------
# Callback - UdpClient
#-----------------------------------------------------------
def CBOnTxData(udpclientserver, txdata):
Line = 'CBOnTxData[{}]<{}>'.format(udpclientserver.GetHeaderID(), txdata)
print(Line)
return
#
def CBOnRxData(udpclientserver, rxdata):
Line = 'CBOnRxData[{}]<{}>'.format(udpclientserver.GetHeaderID(), rxdata)
print(Line)
return
#
#-----------------------------------------------------------
# Main
#-----------------------------------------------------------
if ('__main__' == __name__):
#
print('*** CheckUdpClientServer: begin')
#
MillisPreset = time.ticks_ms() - 100000
#
UdpCS = UCS.CUdpClientServer(WLAN_SSID, WLAN_PW,
UDP_HEADERID, UDP_IPPORT_RX,
UDP_IPADDRESS_TX, UDP_IPPORT_TX,
CBOnTxData, CBOnRxData)
UdpCS.Open()
#
print('{}: TxIP-Address[{}]-Port[{}]'.format(UdpCS.GetHeaderID(),
UdpCS.GetIPAddressTX(),
UdpCS.GetIPPortTX()))
print('{}: RxIP-Address[{}]-Port[{}](local)'.format(UdpCS.GetHeaderID(),
UdpCS.GetIPAddressRXLocal(),
UdpCS.GetIPPortRX()))
while UdpCS.IsBusy():
UdpCS.Execute()
if 10000 <= (time.ticks_ms() - MillisPreset):
MillisPreset = time.ticks_ms()
UdpCS.Transmit('! Millis[{}]ms'.format(MillisPreset))
UdpCS.Close()
#
print('*** CheckUdpClientServer: end')
#
#
**UdpClientServer.py**
#
import time
import socket as SKT
import network as NTW
import Thread as THR
#
class CUdpClientServer():
#
def __init__(self, wlanssid, wlanpw,
headerid, ipportrx, \
ipaddresstx, ipporttx, \
ontxdata, onrxdata):
self.WlanSSID = wlanssid
self.WlanPW = wlanpw
self.HeaderID = headerid
self.IPAddressRXLocal = ''
self.IPPortRX = ipportrx
self.IPAddressTX = ipaddresstx
self.IPPortTX = ipporttx
self.OnTxData = ontxdata
self.OnRxData = onrxdata
self.Thread = THR.CThread(self.CBOnStart, self.CBOnBusy, \
self.CBOnAbort, self.CBOnEnd)
self.Wlan = None
self.RxSocket = None
self.TxSocket = None
#
self.DEBUG = False
#
return
#
def GetHeaderID(self):
return self.HeaderID
def GetIPAddressTX(self):
return self.IPAddressTX
def GetIPPortTX(self):
return self.IPPortTX
def GetIPAddressRXLocal(self):
return self.IPAddressRXLocal
def GetIPPortRX(self):
return self.IPPortRX
#
def IsBusy(self):
return THR.stBusy == self.Thread.State
#
def CBOnStart(self, thread):
if self.DEBUG:
print('UdpClientServer.CBOnStart')
return
#
def CBOnBusy(self, thread):
if self.DEBUG:
print('UdpClientServer.CBOnBusy')
while self.IsBusy():
RxData = ''
try:
Data, Address = self.RxSocket.recvfrom(1024)
RxData = Data.decode('utf-8')
except:
pass
else:
if self.DEBUG:
print('!!!!!!!!RxData[{}]'.format(Data.decode('utf-8')))
if (None != self.OnRxData):
self.OnRxData(self, RxData)
finally:
time.sleep(0.1)
self.RxSocket.close()
return
#
def CBOnAbort(self, thread):
if self.DEBUG:
print('UdpClientServer.CBOnAbort')
self.RxSocket.close()
return
#
def CBOnEnd(self, thread):
if self.DEBUG:
print('UdpClientServer.CBOnEnd')
self.RxSocket.close()
return
#
def Open(self):
self.Wlan = NTW.WLAN(NTW.STA_IF)
self.Wlan.active(False)
self.Wlan.active(True)
self.Wlan.connect(self.WlanSSID, self.WlanPW)
while not(self.Wlan.isconnected()):
pass
self.IPAddressRXLocal = self.Wlan.ifconfig()[0]
if self.DEBUG:
print('Wlan-IDs[{}]'.format(self.Wlan.ifconfig()))
print('Wlan-LocalIPAddress[{}]'.format(self.IPAddressRXLocal))
# Rx
if (THR.stBusy == self.Thread.State):
self.Thread.Abort()
self.RxSocket = SKT.socket(SKT.AF_INET, SKT.SOCK_DGRAM)
# FORWARD Socket.bind !!!
self.RxSocket.setsockopt(SKT.SOL_SOCKET, SKT.SO_REUSEADDR, 1)
self.RxSocket.bind((self.IPAddressRXLocal, self.IPPortRX))
self.RxSocket.setblocking(0)
self.Thread.Start()
# Tx
self.TxSocket = SKT.socket(SKT.AF_INET, SKT.SOCK_DGRAM)
self.TxSocket.connect((self.IPAddressTX, self.IPPortTX))
return
#
def Close(self):
if self.DEBUG:
print('UdpClientServer.Close')
self.Thread.Abort()
self.RxSocket.close()
self.TxSocket.close()
#
def Abort(self):
if self.DEBUG:
print('UdpClientServer.Abort')
self.Thread.Abort()
return
#
def Transmit(self, text):
if self.DEBUG:
print('UdpClientServer.Transmit')
if (None != self.OnTxData):
self.OnTxData(self, text)
self.TxSocket.sendto(text.encode('utf-8'), \
(self.IPAddressTX, self.IPPortTX))
#
def Execute(self):
return
#
#
#-----------------------------------------------------------
# Check UdpClientServer
#-----------------------------------------------------------
WLAN_SSID = 'FritzBoxSA7'
WLAN_PW = '01234567890123456789'
#
UDP_HEADERID = 'UDPHID'
#-----------------------------------------------------------
# UDP - TxD - TransmitData
#-----------------------------------------------------------
# UDP_IPADDRESS_TX = '192.168.178.255' NO broadcasting to local
UDP_IPADDRESS_TX = '192.168.178.71'
UDP_IPPORT_TX = 5000
#
#-----------------------------------------------------------
# UDP - RxD - ReceiveData
#-----------------------------------------------------------
UDP_IPADDRESS_LOCAL = '192.168.178.71' # dummy
UDP_IPPORT_RX = 5000
#
#-----------------------------------------------------------
# Callback - UdpClient
#-----------------------------------------------------------
def CBOnTxData(udpclientserver, txdata):
Line = 'UdpClientServer.CBOnTxData[{}]<{}>'.format(udpclientserver.GetHeaderID(), txdata)
print(Line)
return
#
def CBOnRxData(udpclientserver, rxdata):
Line = 'UdpClientServer.CBOnRxData[{}]<{}>'.format(udpclientserver.GetHeaderID(), rxdata)
print(Line)
return
#
if ('__main__' == __name__):
#
print('*** Check UdpClientServer: begin')
#
UdpCS = CUdpClientServer(WLAN_SSID, WLAN_PW,
UDP_HEADERID, UDP_IPPORT_RX,
UDP_IPADDRESS_TX, UDP_IPPORT_TX,
CBOnTxData, CBOnRxData)
UdpCS.Open()
#
print('{}: TxIP-Address[{}]-Port[{}]'.format(UdpCS.GetHeaderID(),
UdpCS.GetIPAddressTX(),
UdpCS.GetIPPortTX()))
print('{}: RxIP-Address[{}]-Port[{}](local)'.format(UdpCS.GetHeaderID(),
UdpCS.GetIPAddressRXLocal(),
UdpCS.GetIPPortRX()))
#
UdpCS.Transmit('HalloA')
time.sleep(1.0)
UdpCS.Transmit('HalloB')
time.sleep(1.0)
UdpCS.Transmit('HalloC')
time.sleep(1.0)
#
UdpCS.Close()
#
print('*** Check UdpClientServer: end')
#
#
**Thread.py**
import time
import _thread as THR
# States
stIdle = 0
stBusy = 1
stEnd = 2
#
class CThread():
#
def __init__(self, onstart, onbusy, onabort, onend):
self.State = stIdle
self.Thread = None
self.OnStart = onstart
self.OnBusy = onbusy
self.OnAbort = onabort
self.OnEnd = onend
return
#
def Start(self):
self.State = stBusy
if (None != self.OnStart):
self.OnStart(self)
self.ThreadID = THR.start_new_thread(self.CBOnExecute, [self])
return
#
def Abort(self):
self.State = stEnd
if (None != self.OnAbort):
self.OnAbort(self)
return
#
def CBOnExecute(self, thread):
if (None != self.OnBusy):
self.OnBusy(self)
if (None != self.OnEnd):
self.OnEnd(self)
return
#
#
#
#-----------------------------------------------------------
# Check Thread
#-----------------------------------------------------------
def CBOnStart(thread):
print('CBOnStart')
return
def CBOnBusy(thread):
print('CBOnBusy')
Counter = 0
while (stBusy == thread.State):
Counter += 1
print(Counter)
if (3 <= Counter):
thread.Abort()
else:
time.sleep(1.0)
return
def CBOnAbort(thread):
print('CBOnAbort')
return
def CBOnEnd(thread):
print('CBOnEnd')
return
#
if ('__main__' == __name__):
#
print('*** Check Thread: begin')
#
Thread = CThread(CBOnStart, CBOnBusy, CBOnAbort, CBOnEnd)
Thread.Start()
time.sleep(5.0)
Thread.Abort()
#
print('*** Check Thread: end')
#
#
===== Version =====
{{:module:micropython:2112121950_Esp32UdpClientServer_02V01.zip|2112121950_Esp32UdpClientServer_02V01.zip}}
-----
[[http://www.openhardsoftware.de/ | Open Hard- & Software]]
[
[[http://www.openhardsoftware.de/dokuwiki | DokuWiki]]
[[http://www.openhardsoftware.de/websites | WebSites]]
[[http://www.openhardsoftware.de/mediawiki | MediaWiki]]
[[http://www.openhardsoftware.de/nextcloud | NextCloud]]
]