From ca1d19e730dbecc623535341d57f90684493cb7c Mon Sep 17 00:00:00 2001 From: "lxbpxylps@126.com" Date: Sun, 17 Oct 2021 21:22:02 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=20TCP=20=E6=9C=8D=E5=8A=A1?= =?UTF-8?q?=E7=AB=AF=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data.json | 23 ++++++++++++++ main.py | 92 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 115 insertions(+) create mode 100644 data.json create mode 100644 main.py diff --git a/data.json b/data.json new file mode 100644 index 0000000..af42cad --- /dev/null +++ b/data.json @@ -0,0 +1,23 @@ +{ + "time": "2021-10-17 15:56:31", + "node2": { + "humi": 43.0, + "temp": 24.7, + "light": 1493.3 + }, + "node3": { + "humi": 44.5, + "temp": 24.6, + "light": 70.0 + }, + "node4": { + "humi": 45.1, + "temp": 24.4, + "light": 73.3 + }, + "node5": { + "humi": 43.0, + "temp": 24.5, + "light": 75.0 + } +} \ No newline at end of file diff --git a/main.py b/main.py new file mode 100644 index 0000000..fad5b90 --- /dev/null +++ b/main.py @@ -0,0 +1,92 @@ +import sys +import time +import json +import asyncio + +from loguru import logger + + +# 记录上次收到的字符串 +last_str: str = '' + + +async def handler(reader: asyncio.StreamReader, writer: asyncio.StreamWriter): + global last_str + + data: bytes = await reader.read(100) + + # 尝试解码 + try: + req_str: str = data.decode('utf-8') + except UnicodeDecodeError: # 捕获解码错误异常 + writer.close() + return + + addr: tuple = writer.get_extra_info('peername') + logger.debug(f"从 {addr!r} 接收:{req_str!r}") + + str_list = req_str.split('&') # 分割字符串 + + if len(str_list) != 5: # 数据缺失 + print('数据缺失!') + writer.close() + return + + if (req_str != last_str): # 检测数据是否重复 + last_str = req_str + + try: # 转换数据 + seq: int = int(str_list[0]) + humi: float = round(float(str_list[1]), 1) + temp: float = round(float(str_list[2]), 1) + light: float = round(float(str_list[3]), 1) + + except Exception: + print('数据错误!') + writer.close() # 数据错误,等待重传 + return + + print(f"节点:{seq} 湿度:{humi}% 温度:{temp}°C 光照度:{light}lx") + + # 写入 json 文件 + data = json.loads(open('./data.json', 'r', encoding='utf-8').read()) + + data['node' + str(seq)]['humi'] = humi + data['node' + str(seq)]['temp'] = temp + data['node' + str(seq)]['light'] = light + data['time'] = time.strftime( + '%Y-%m-%d %H:%M:%S', time.localtime(time.time())) + + with open('./data.json', 'w') as fp: + fp.write(json.dumps(data)) + fp.close() + + else: + print('数据重复!') + + logger.debug(f"发送:OK") + writer.write(('OK').encode('utf-8')) + await writer.drain() + + logger.debug("关闭连接") + writer.close() + + +async def main(): + server = await asyncio.start_server(handler, '0.0.0.0', 2333) + + # 在此处更改日志等级 + logger.remove() + logger.add( + sys.stdout, + level="DEBUG", + format="{time:HH:mm:ss} | {level: <9} | {message}" + ) + + addr = server.sockets[0].getsockname() + logger.debug(f"Node Server 开始运行:{addr}") + + async with server: + await server.serve_forever() + +asyncio.run(main())