-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.py
92 lines (66 loc) · 2.38 KB
/
main.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
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="<green>{time:HH:mm:ss}</green> | <level>{level: <9}</level> | <level>{message}</level>"
)
addr = server.sockets[0].getsockname()
logger.debug(f"Node Server 开始运行:{addr}")
async with server:
await server.serve_forever()
asyncio.run(main())