ソースを参照

Работа с Greenstar

Dmitry Telenkov 16 時間 前
コミット
1db63ba461

+ 6 - 0
greenstar_python/bytes.py

@@ -0,0 +1,6 @@
+
+s1 = bytes('123', 'utf-8')
+s2 = bytes('456', 'utf-8') 
+s3 = s1 + s2
+
+print(s3)

+ 232 - 0
greenstar_python/client.py

@@ -0,0 +1,232 @@
+from socket import *
+from utils import *
+from sys import argv
+import time
+import colorama
+from colorama import Fore, Back, Style
+import os
+
+TCP_PORT = 80
+HEAD = 'POST /api.php HTTP/1.1\r\nHost: 192.168.10.10'
+REQ_ID = {'getSpState':'7000000', 'getPpRegs':'3000000', 'getPp':'4000000',
+          'getHv':'8000000', 'getIp': '9000000', 'getPreset': '10000000',
+          'getPwr':'5000000', 'getMonRegs':'2000000', 'getMon':'1000000',
+          'getInfo':'11000000', 'getSp':'7000000', 'setSys':'7000000', 
+          'setSpState': '7000000', 'setUpdate': '99999', 'getUpdate': '99999'}
+
+
+time_request = TimeIt()
+time_connect = TimeIt()
+error_no_answer = 0
+erorr_brackets = 0
+error_connection = 0
+
+class SBS_client:
+
+    def __init__(self, ip='192.168.10.10', port=80, debug=False):
+        self.DEBUG = debug
+        self.ip = ip
+        self.HEAD = 'POST /api.php HTTP/1.1\r\nHost: ' + self.ip + ':' \
+                    + str(port) + '\r\nContent-Length: '
+        self.addr = (ip, int(port))
+
+
+    def send_recv(self, data):
+        data = str.encode(data)
+        try:
+            self.tcp_socket.send(data)
+        except:
+            pass
+        rec = bytes()
+        while True:
+            try:
+                chank = self.tcp_socket.recv(8000)
+                rec += chank
+                if not chank:
+                    break
+            except:
+                break
+        if len(rec) == 0:
+            error_no_answer += 1
+
+        # Проверяем ответ на наличие открывающих и закрывающих скобок
+        result_str = rec.decode()
+        open_brackets = result_str.count('{')
+        close_brackets = result_str.count('}')
+        if (open_brackets != close_brackets) or open_brackets == 0:
+            erorr_brackets += 1
+
+        if self.DEBUG:
+            print(Fore.YELLOW + 'Received answer:')    
+            print(Fore.GREEN + rec.decode())
+
+
+    @timeit(time_request)
+    def http_request(self, method, params):
+        # foo = '{"jsonrpc":"2.0","method":"' + method + '","params":' + \
+        #         params + ',"id":' + REQ_ID[method] + '}'
+        # request = self.HEAD + str(len(foo)) + '\r\n\r\n' + foo
+
+        # if self.DEBUG:
+        #     print(Fore.YELLOW + 'Send HTTP request:')
+        #     print(Fore.BLUE + request)
+
+        if self.connect():
+            # self.send_recv(request)
+            self.close()
+
+
+    @timeit(time_connect)
+    def connect(self):
+        self.tcp_socket = socket(AF_INET, SOCK_STREAM)
+        self.tcp_socket.settimeout(15.0)
+        try:
+            self.tcp_socket.connect(self.addr)
+        except:
+            print("Ошибка соединения")
+            error_connection += 1
+            return False
+        return True
+
+
+    def close(self):
+        self.tcp_socket.close()
+
+    # ---------------------------------------------------------------------
+    # Обновление 
+
+    def set_update(self):
+        params = '{"spID":"0", "update":{"serverIp":"172.16.2.8:9000","fileName":"/dir/fw.bin"}}'
+        # params = '{"spID":"0", "update":{"serverIp":"172.16.2.8:9000","fileName":"E:\Greenstar\nSBS-ethernet-prime\bin\fw.bin"}}'
+        self.http_request('setUpdate', params)
+
+
+    def get_update(self):
+        params = '{"spID":"0"}'
+        self.http_request('getUpdate', params)
+
+    # ---------------------------------------------------------------------
+    # Уставки
+
+    # setPreset
+    def set_preset(self):
+        self.send_recv('POST /api\r\n\r\n{{"id":1,"jsonrpc":2.0,"method":\
+                       "setPreset","params":{"mode":"manual"}}')
+
+    # ---------------------------------------------------------------------
+
+    # Отправка группы команд в начале работы с прибором
+    def startup(self):
+        self.http_request('getSpState', 'null')
+        self.http_request('getPpRegs', 'null')
+        self.http_request('getPp', 'null')
+        self.http_request('getHv', 'null')
+        self.http_request('getIp', 'null')
+        self.http_request('getPreset', 'null')
+        self.http_request('getPwr', 'null')
+        self.http_request('getMonRegs', 'null')
+        self.http_request('getMon', 'null')
+        self.http_request('getInfo', 'null')
+
+    # Периодический опрос прибора 
+    def periodic_request(self, count=0):
+        
+        def procedure():
+            self.http_request('getMon', 'null')
+            time.sleep(1)
+            self.http_request('getSpState', 'null')
+            time.sleep(1)
+            
+        if count == 0:
+            while True:
+                procedure()    
+        else:
+            for _ in range(count):
+                procedure()
+                
+
+    # Включить демо-данные
+    def set_demo_data(self):
+        self.http_request('setSys', '{"demo":true}')
+
+    # Управление набором спектра
+    # start/stop/clear
+    def set_spectrum_state(self, state: str):
+        foo = '{"acqState":"' + state + '"}'
+        self.http_request('setSpState', foo)
+        self.http_request('getPp', 'null')
+
+    # Запрос спектра
+    def get_spectrum_data(self):
+        # while True:
+
+            # if self.connect():
+            #     self.close()
+        for i in range(20):
+            self.http_request('getSp', 'null')
+            time.sleep(0.1)
+            # self.http_request('getMon', 'null')
+            # time.sleep(0.05)
+            self.info()
+
+
+    def info(self):
+        print("\033[H\033[J", end="")    
+        print("Время соединения  :", round(time_connect.cur_time, 5), round(time_connect.max_time, 5))
+        print("Время запроса-ответа:", round(time_request.cur_time, 5), round(time_request.max_time, 5))
+        print("Ошибки. Скобки:", erorr_brackets)
+        print("Ошибки. Пустой ответ:", error_no_answer)
+        print("Ошибки. Таймаут соединения:", error_connection)
+        
+
+
+# Тесты
+def processing(ip, port):
+    colorama.init(autoreset=True)
+    client = SBS_client(ip, port)    
+    client.DEBUG = False
+    # client.startup()
+    # # usb_client.periodic_request(5)
+    # client.set_demo_data()
+    # client.set_spectrum_state('start')
+    client.get_spectrum_data()
+
+
+def update():
+    colorama.init(autoreset=True)
+    dev = SBS_client('172.16.2.101', 80)
+    dev.set_update()
+    # dev.get_update()
+
+
+def test_time():
+    print(time.time())
+    time.sleep(1)
+    print(time.time())
+
+def main():
+    # test_time()
+
+    '''Получение данных спектра'''
+    processing(argv[1], argv[2])
+
+    '''Обновление FW'''
+    # update()
+
+
+    # client.set_update()
+    # client.get_update()
+
+    # print('{"spID":"0", "update":{"serverIp":"192.168.0.25:80","fileNmae":"полный/путь/к/файлу.bin"}}')
+
+    '''
+    if len(argv) == 2:
+        print("Укажите IP-адрес и порт устройства")
+    else:
+        colorama.init(autoreset=True)
+        
+    '''
+
+
+if __name__ == "__main__":
+    main()    

+ 1 - 0
greenstar_python/connector/.python-version

@@ -0,0 +1 @@
+3.14

+ 0 - 0
greenstar_python/connector/README.md


+ 6 - 0
greenstar_python/connector/main.py

@@ -0,0 +1,6 @@
+def main():
+    print("Hello from connector!")
+
+
+if __name__ == "__main__":
+    main()

+ 0 - 0
greenstar_python/connector/misc/raw_pack.py


+ 7 - 0
greenstar_python/connector/pyproject.toml

@@ -0,0 +1,7 @@
+[project]
+name = "connector"
+version = "0.1.0"
+description = "Add your description here"
+readme = "README.md"
+requires-python = ">=3.14"
+dependencies = []

+ 8 - 0
greenstar_python/connector/uv.lock

@@ -0,0 +1,8 @@
+version = 1
+revision = 1
+requires-python = ">=3.14"
+
+[[package]]
+name = "connector"
+version = "0.1.0"
+source = { virtual = "." }

+ 49 - 0
greenstar_python/http_server.py

@@ -0,0 +1,49 @@
+import os
+from http.server import BaseHTTPRequestHandler, HTTPServer
+
+
+html = "<html><body>This is python http server</body></html>"
+
+class ServerHandler(BaseHTTPRequestHandler):
+    
+    FILE_FW = 'fw.bin'
+
+    def do_GET(self):
+        print('Received GET request')
+        if self.path == "/" + self.FILE_FW:
+            with open(self.FILE_FW, 'rb') as file:
+                file_stat = os.stat(self.FILE_FW)
+                self.send_response(200)
+                self.send_header('Content-type', 'text/html')
+                self.send_header('Content-length', file_stat.st_size)
+                self.end_headers()
+                self.wfile.write(file.read())
+        else:
+            self.send_error(404, "Page Not Found {}".format(self.path))
+
+def server_thread(port):
+    server_address = ('localhost', port)
+    httpd = HTTPServer(server_address, ServerHandler)
+    try:
+        httpd.serve_forever()
+    except KeyboardInterrupt:
+        httpd.server_close()
+        print("Server stopped")
+
+def run(server_class=HTTPServer, handler_class=BaseHTTPRequestHandler):
+    server_address = ('127.0.0.1', 9000)
+    httpd = server_class(server_address, handler_class)
+    try:
+        httpd.serve_forever()
+    except KeyboardInterrupt:
+        httpd.server_name()
+
+
+if __name__ == '__main__':
+    run()
+    # port = 8000
+    # print("Starting server at port %d" % port)
+    # server_thread(port)
+
+
+# test()

+ 9 - 0
greenstar_python/request.py

@@ -0,0 +1,9 @@
+import requests
+
+def test():
+    res = requests.get('http://127.0.0.1:80/fw.bin', )
+    # print(res.content)
+    print(res.headers)
+
+
+test()

+ 23 - 0
greenstar_python/request.txt

@@ -0,0 +1,23 @@
+method      id
+
+getSpState  7000000
+getPpRegs   3000000
+getPp       4000000
+getHv       8000000
+getIp       9000000
+getPreset   10000000
+getPwr      5000000
+getMonRegs  2000000
+getMon      1000000
+getInfo     11000000
+
+getMon      1000000
+getSpState  7000000
+getMon      1000000
+getSpState  7000000
+getMon      1000000
+getSpState  7000000
+getMon      1000000
+getSpState  7000000
+
+{"jsonrpc":"2.0","method":"getSpState","params":null,"id":7000000}

+ 39 - 0
greenstar_python/socket_server.py

@@ -0,0 +1,39 @@
+import socket
+
+class SockerServer:
+    
+    HOST = ""
+    PORT = 8000
+
+    def __init__(self):
+        pass
+
+    def serv(self):
+        with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as serv_sock:
+            serv_sock.bind((self.HOST, self.PORT))
+            serv_sock.listen(1)
+            print("Server started")
+            print("Waiting for connection...")
+            sock, addr = serv_sock.accept()
+
+            with sock:
+                print("Connected by", addr)
+                while True:
+                    data = sock.recv(1024)
+                    print(f"Received: {data} from: {addr}")
+                    if not data:
+                        break
+                    if data == b'close':
+                        break
+                    data = data.upper()
+                    print(f"Send: {data} to: {addr}")
+                    sock.sendall(data)
+                print("Disconnected by", addr)
+
+def main():
+    server = SockerServer()
+    while True:
+        server.serv()
+
+if __name__ == "__main__":
+    main()

BIN
greenstar_python/testSBS100.zip


+ 44 - 0
greenstar_python/utils.py

@@ -0,0 +1,44 @@
+from functools import wraps
+import time
+
+
+class TimeIt:
+    def __init__(self):
+        self.cur_time = 0
+        self.max_time = 0
+
+
+
+def timeit(obj):
+    def decorator(func):
+        @wraps(func)
+        def wrapper(*args, **kwargs):
+            time_start = time.time()
+            result = func(*args, **kwargs)
+            time_release = time.time() - time_start 
+            if time_release > obj.max_time:
+                obj.max_time = time_release
+            obj.cur_time = time_release
+            return result
+        return wrapper
+    return decorator
+
+
+
+delta = TimeIt()
+
+@timeit(delta)
+def test_func():
+    time.sleep(1.5)
+
+
+def main():
+
+    test_func()
+    print(delta.time)
+
+
+
+
+if __name__ == '__main__':
+    main()

+ 17 - 0
python_net/packer/misc/testing.py

@@ -0,0 +1,17 @@
+import socket
+
+
+def tcp_connect():
+    host = "77.88.55.242"
+    port = 80
+    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+    s.connect((host, port))
+    s.close()
+
+
+def main():
+    tcp_connect()
+
+
+if __name__ == "__main__":
+    main()

+ 3 - 3
python_net/packer/tcp/tcp_packet.py

@@ -32,9 +32,9 @@ class TCPPacket:
 
     SRC = 0 # номер порта источника
     DST = 0
-    SEQ = 0 # позиционный номер
+    SEQ = 1 # позиционный номер
     ACK = 0 # квитанция
-    LEN = 0 # длина заголовка
+    LEN = 5 # длина заголовка
 
     # flags
     f_URG = 0 
@@ -46,7 +46,7 @@ class TCPPacket:
 
     WND = 0 # размер окна приема
     CHK = 0 # контрольная сумма
-    URG = 0 # указатель границы срочный данных
+    URG = 0 # указатель границы срочных данных
     OPT = ''    # опции
     DATA = ""   # данные
 

+ 4 - 1
python_net/packer/tcp/tcp_socket.py

@@ -84,7 +84,10 @@ class TCPSocket:
 def main():
     ip_layer = IPLayer()
     sock = TCPSocket(ip_layer)
-    sock.connect("8.8.8.8", 80)   
+    # sock.connect("77.88.55.242", 80)   
+    for i in range(2000):
+        sock.connect("172.16.2.100", 80) 
+        time.sleep(0.1)
     # lock_net = LocalNetwork()
     # print(lock_net.get_ip()) # type: ignore