From 291ecb6622cabc1b2e43f9cf7fd8739037135dc1 Mon Sep 17 00:00:00 2001 From: damp11113 Date: Fri, 19 Jan 2024 16:07:01 +0700 Subject: [PATCH] ZMQ update --- Client/client.py | 47 +++-- Server/RDS.py | 129 ++++++++++++ Server/__pycache__/RDS.cpython-310.pyc | Bin 0 -> 2415 bytes Server/server.py | 259 +++++++++---------------- 4 files changed, 252 insertions(+), 183 deletions(-) create mode 100644 Server/RDS.py create mode 100644 Server/__pycache__/RDS.cpython-310.pyc diff --git a/Client/client.py b/Client/client.py index 23949bd..64941ca 100644 --- a/Client/client.py +++ b/Client/client.py @@ -7,6 +7,7 @@ import socket import numpy as np import pickle import pyaudio +import zmq from pyogg import OpusDecoder from Crypto.Cipher import AES from Crypto.Protocol.KDF import scrypt @@ -92,18 +93,27 @@ class App: self.ccisdecrypt = None self.ccisdecryptpassword = None self.paudio = pyaudio.PyAudio() + self.cprotocol = None def connecttoserver(self, sender, data): dpg.configure_item("connectservergroup", show=False) - #protocol = dpg.get_value("serverprotocol") + protocol = dpg.get_value("serverprotocol") + self.cprotocol = protocol dpg.configure_item("serverstatus", default_value='connecting...', color=(255, 255, 0)) ip = dpg.get_value("serverip") port = dpg.get_value("serverport") - s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - try: - s.connect((ip, port)) - except: - dpg.configure_item("connectbutton", show=True) + if protocol == "TCP": + s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + try: + s.connect((ip, port)) + except: + dpg.configure_item("connectbutton", show=True) + elif protocol == "ZeroMQ": + context = zmq.Context() + s = context.socket(zmq.SUB) + s.connect(f"tcp://{ip}:{port}") + s.setsockopt_string(zmq.SUBSCRIBE, "") + self.working = True self.device_index_output = 0 @@ -196,14 +206,19 @@ class App: while True: try: if self.working: - data = b'' - #data = socket.recv(1580152) - while True: - part = socket.recv(1024) - data += part - if len(part) < 1024: - # either 0 or end of data - break + if self.cprotocol == "TCP": + data = b'' + #data = socket.recv(1580152) + while True: + part = socket.recv(1024) + data += part + if len(part) < 1024: + # either 0 or end of data + break + elif self.cprotocol == "ZeroMQ": + data = socket.recv() + else: + data = b"" bytesconunt += len(data) @@ -363,11 +378,11 @@ class App: dpg.add_spacer() dpg.add_image("station_logo", show=False, tag="station_logo_config") dpg.add_text("", tag="RDSinfo", show=False) - with dpg.child_window(tag="connectservergroup", label="Server", use_internal_label=True, height=105): + with dpg.child_window(tag="connectservergroup", label="Server", use_internal_label=True, height=130): dpg.add_button(label="select server", tag="selectserverbutton") dpg.add_input_text(label="server ip", tag="serverip", default_value="localhost") dpg.add_input_int(label="port", tag="serverport", max_value=65535, default_value=6980) - #dpg.add_combo(["TCP", "Websocket"], label="protocol", tag="serverprotocol", default_value="TCP") + dpg.add_combo(["TCP", "ZeroMQ"], label="protocol", tag="serverprotocol", default_value="TCP") dpg.add_button(label="connect", callback=self.connecttoserver, tag="connectbutton") dpg.add_spacer() dpg.add_button(label="More RDS info", callback=lambda: dpg.configure_item("RDSwindow", show=True), tag="morerdsbutton", show=False) diff --git a/Server/RDS.py b/Server/RDS.py new file mode 100644 index 0000000..083f51d --- /dev/null +++ b/Server/RDS.py @@ -0,0 +1,129 @@ +import time +from datetime import datetime + +import cv2 +import numpy as np + +from damp11113 import scrollTextBySteps + + +def encodelogoimage(path, quality=50): + image = cv2.resize(cv2.imread(path), (128, 128)) + # Encode the image as JPEG with higher compression (lower quality) + encode_param = [int(cv2.IMWRITE_JPEG_QUALITY), quality] # Adjust quality (50 is just an example) + result, encoded_image = cv2.imencode('.jpg', image, encode_param) + encoded_bytes = np.array(encoded_image).tobytes() + return encoded_bytes + +RDS = { + "PS": "DPRadio", + "RT": "Testing internet radio", + "PI": 0x27C8, # static + "PTY": 0, + "PTY+": "Testing", + "Country": "TH", + "Coverage": "All", + "CT": { + "Local": None, + "UTC": None, + }, + "PIN": 12345, + "TMC": { + "TP": False, + "TA": False, + "Messages": None + }, + "ECC": None, + "LIC": None, + "AudioMode": "Stereo", # mono, stereo, surround 5.1/7.1, HRTF + "ArtificialHead": False, + "Compressed": False, + "DyPTY": False, + "EPG": None, + "AS": [ # AS = Alternative Server + # can add more server here + ], + "EON": [ + # can add more here + ], + "ContentInfo": { + "Codec": "opus", + "bitrate": 64000, + "channel": 2, + "samplerates": 48000 + }, + "images": { + "logo": encodelogoimage(r"C:\Users\sansw\3D Objects\dpstream iptv logo.png") + } +} + +RDS2 = { + "PS": "DPTest", + "RT": "Testing internet radio", + "PI": 0x27C6, + "PTY": 0, + "PTY+": "Testing", + "Country": "TH", + "Coverage": "All", + "CT": { + "Local": None, + "UTC": None, + }, + "PIN": 12345, + "TMC": { + "TP": False, + "TA": False, + "Messages": None + }, + "ECC": None, + "LIC": None, + "AudioMode": "Stereo", # mono, stereo, surround 5.1/7.1, HRTF + "ArtificialHead": False, + "Compressed": False, + "DyPTY": False, + "EPG": None, + "AS": [ # AS = Alternative Server + # can add more server here + ], + "EON": [ + # can add more server here + ], + "ContentInfo": { + "Codec": "Opus", + "bitrate": 8000, + "channel": 2, + "samplerates": 48000 + }, + "images": { + "logo": None + } +} + + +def update_RDS(): + global RDS + while True: + pstext = "DPRadio Testing Broadcasting " + for i in range(0, len(pstext)): + RDS["PS"] = scrollTextBySteps(pstext, i) + time.sleep(1) + +def update_RDS_time(): + global RDS + while True: + RDS["CT"]["Local"] = datetime.now().timestamp() + RDS["CT"]["UTC"] = datetime.utcnow().timestamp() + RDS2["CT"]["Local"] = datetime.now().timestamp() + RDS2["CT"]["UTC"] = datetime.utcnow().timestamp() + time.sleep(1) + +def update_RDS_images(): + global RDS + while True: + RDS["images"]["logo"] = encodelogoimage(r"C:\Users\sansw\3D Objects\dpstream iptv logo.png", 25) + time.sleep(10) + RDS["images"]["logo"] = encodelogoimage(r"C:\Users\sansw\3D Objects\140702_hi-res-logo.jpg", 25) + time.sleep(10) + RDS["images"]["logo"] = encodelogoimage(r"IDRBfavicon.jpg", 25) + time.sleep(10) + diff --git a/Server/__pycache__/RDS.cpython-310.pyc b/Server/__pycache__/RDS.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c204398ce46c206cb0d02e49e0557b8194455122 GIT binary patch literal 2415 zcmcgtTXPge6z)FLbJ@)%At7AijYSj~kPrfDVNn)g7hx?D)?_JVYB4oz51XN8XNI2H zz@|1;l;Iy(zVVPe_~38w-SRiIZ~EeTd(j6CH&4$7h+5#2_EdkxPj(S5tThyVnzXlFudz!=Wtp$3^a17jglk42L zLmks6+~n4$l;?OJaex;P2RT6;;=_pB_z2=C-;OxODLy;y0*-g`U5LB+I6joWa96|G zi<~09l;O+#6&&y3g zQfn+tNke#vzw9}N-x8k7rRImJGgg`TaIR82yYPPX?74*xE=^yk)Gj*~+7UJ)?nww^ zsk=hB9ciY~)lTXqwkcWcri;?N(RKqr?KryMa+{u0=zp^iyTWZ{*R_Mx8SJm}g-l33 znPz8wLBuvxbmL^{o%*H36G=UB!{lbY95vdgLYma$PP!O{RS{kH8fm>!o;y>Y_r#JX z>T~7!iMS(&`{xHyGsnC0r6%l*iKx!Us1nwO-0*eoIu zo(R3PDEfQVivRTiLL9AHyS&U04m;+itTaneJ4{7KLhZa`l_JyxZI{|~5J)K1Y>@he zsNn`uyHqRT36)v@zl@-`;_=7Zzq;>D|q^`y?@B*mC%75z9} zDk|xTIBeR?f$4d?|KhAOP>PVmFs+2wB8d^EER#mLn$h-^B9mQI8lK*Rd4LK&X-Zp$ zJW7}g@G3e4VR>bp(UA0W~nEE=fyTS22z0e zEUBMGY#&CHbiN&{++Vmm!3_; zN4Tqq;J`I>Gvy4;)6o=I)3~8rjeF*E_N-^^VSwajYodr3^fK%B;z(d5lAbCQ%g>4Y zV<#rxo}5}(^p9ZD9mygeOX~8lDn!@ZCBG4cS&d~`jmfC{7qUjSkk!wVTc|^#cm=Fi zd5oKWhYg|r8a5RwKkUK&xyob0K#+RaZp9su!!iD)&~eAG9nT_oi!u{RUPWNWes2Qx3u)$3D11z9G z*+cl972r1*R5P4EfM3}t{KB@w&uk2SVmshRwiA9}yP(H*!}l-_8n8{-`<4lhtZ(4Z Qe|-