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())