|
@@ -12,6 +12,9 @@ from Crypto.Cipher import AES
|
|
|
from Crypto.Util.Padding import pad, unpad
|
|
from Crypto.Util.Padding import pad, unpad
|
|
|
import copy
|
|
import copy
|
|
|
|
|
|
|
|
|
|
+from message_base import MessageBase
|
|
|
|
|
+from websocket_server import WebServer
|
|
|
|
|
+
|
|
|
import sys
|
|
import sys
|
|
|
import atexit
|
|
import atexit
|
|
|
import signal
|
|
import signal
|
|
@@ -50,6 +53,9 @@ g_ble_mtu = 20
|
|
|
g_ble_client = None
|
|
g_ble_client = None
|
|
|
g_download_cfg = {"Key":"", "Total":0, "Number":0, "DataCrc16":0}
|
|
g_download_cfg = {"Key":"", "Total":0, "Number":0, "DataCrc16":0}
|
|
|
|
|
|
|
|
|
|
+mb = None
|
|
|
|
|
+ws = None
|
|
|
|
|
+
|
|
|
def calculate_time(func):
|
|
def calculate_time(func):
|
|
|
def wrapper(*args, **kwargs):
|
|
def wrapper(*args, **kwargs):
|
|
|
start_time = time.time()
|
|
start_time = time.time()
|
|
@@ -194,9 +200,17 @@ def ev_packing(data):
|
|
|
lenght = len(data)
|
|
lenght = len(data)
|
|
|
# crc16 = crc16_func(data) ## 计算数据的CRC-16校验码
|
|
# crc16 = crc16_func(data) ## 计算数据的CRC-16校验码
|
|
|
# checknum = crc16(data, 0, len(data))
|
|
# checknum = crc16(data, 0, len(data))
|
|
|
- checknum = checknum_16(data)
|
|
|
|
|
- HEAD_SEND = str(g_config["def_cfg"]["head_send"]).encode()
|
|
|
|
|
- out = list(HEAD_SEND) + [ (lenght>>8)&0xFF, (lenght>>0)&0xFF, (checknum>>8)&0xFF, (checknum>>0)&0xFF]
|
|
|
|
|
|
|
+ out = []
|
|
|
|
|
+ # 头
|
|
|
|
|
+ if g_config["def_cfg"]["head_send"] != "":
|
|
|
|
|
+ HEAD_SEND = str(g_config["def_cfg"]["head_send"]).encode()
|
|
|
|
|
+ out = list(HEAD_SEND)
|
|
|
|
|
+ # 长度
|
|
|
|
|
+ out = out + [ (lenght>>8)&0xFF, (lenght>>0)&0xFF]
|
|
|
|
|
+ # 校验码
|
|
|
|
|
+ if g_config["def_cfg"]["checknum_type"] != "":
|
|
|
|
|
+ checknum = checknum_16(data)
|
|
|
|
|
+ out = out + [ (checknum>>8)&0xFF, (checknum>>0)&0xFF]
|
|
|
|
|
|
|
|
for d in bytes(data):
|
|
for d in bytes(data):
|
|
|
out.append(d)
|
|
out.append(d)
|
|
@@ -207,6 +221,12 @@ def ev_packing(data):
|
|
|
recv_data = []
|
|
recv_data = []
|
|
|
recv_start_time = 0
|
|
recv_start_time = 0
|
|
|
GetConfiguration = []
|
|
GetConfiguration = []
|
|
|
|
|
+def PACK_LEN():
|
|
|
|
|
+ H = len(g_config["def_cfg"]["head_send"])
|
|
|
|
|
+ L = 2
|
|
|
|
|
+ C = 2 if g_config["def_cfg"]["checknum_type"]!="" else 0
|
|
|
|
|
+ return H+L+C
|
|
|
|
|
+
|
|
|
@calculate_time
|
|
@calculate_time
|
|
|
def recv_handler(data: bytearray, reve=False):
|
|
def recv_handler(data: bytearray, reve=False):
|
|
|
global recv_start_time
|
|
global recv_start_time
|
|
@@ -221,19 +241,21 @@ def recv_handler(data: bytearray, reve=False):
|
|
|
recv_data.clear()
|
|
recv_data.clear()
|
|
|
return
|
|
return
|
|
|
|
|
|
|
|
- if len(recv_data)<7:
|
|
|
|
|
|
|
+ if len(recv_data)<PACK_LEN():
|
|
|
return
|
|
return
|
|
|
|
|
|
|
|
recv_data_str = str(bytes(recv_data))
|
|
recv_data_str = str(bytes(recv_data))
|
|
|
HEAD_SEND = str(g_config["def_cfg"]["head_send"])
|
|
HEAD_SEND = str(g_config["def_cfg"]["head_send"])
|
|
|
HEAD_RECV = str(g_config["def_cfg"]["head_recv"])
|
|
HEAD_RECV = str(g_config["def_cfg"]["head_recv"])
|
|
|
find_head = HEAD_SEND if not reve else HEAD_RECV
|
|
find_head = HEAD_SEND if not reve else HEAD_RECV
|
|
|
- index = recv_data_str.find(find_head)#'EV>'
|
|
|
|
|
- if index < 2:
|
|
|
|
|
- return
|
|
|
|
|
|
|
+ index = -1
|
|
|
|
|
+ if find_head != "":
|
|
|
|
|
+ index = recv_data_str.find(find_head)#'EV>'
|
|
|
|
|
+ if index < 2:
|
|
|
|
|
+ return
|
|
|
index -= 2
|
|
index -= 2
|
|
|
data_len = (recv_data[index+4]&0xff) | (recv_data[index+3]&0xff)<<8
|
|
data_len = (recv_data[index+4]&0xff) | (recv_data[index+3]&0xff)<<8
|
|
|
- if index+7+data_len > len(recv_data):
|
|
|
|
|
|
|
+ if index+PACK_LEN()+data_len > len(recv_data):
|
|
|
return
|
|
return
|
|
|
|
|
|
|
|
if g_config["def_cfg"]["recv_soc_data_print"]:
|
|
if g_config["def_cfg"]["recv_soc_data_print"]:
|
|
@@ -244,12 +266,15 @@ def recv_handler(data: bytearray, reve=False):
|
|
|
logger.info('接收耗时:%.3fs', recv_end_time - recv_start_time)
|
|
logger.info('接收耗时:%.3fs', recv_end_time - recv_start_time)
|
|
|
recv_start_time = 0
|
|
recv_start_time = 0
|
|
|
|
|
|
|
|
- soc_data = recv_data[index+7:index+7+data_len]
|
|
|
|
|
- get_crc = (recv_data[index+6]&0xff)| (recv_data[index+5]&0xff)<<8
|
|
|
|
|
- check_num = checknum_16(soc_data)
|
|
|
|
|
- if get_crc != check_num:
|
|
|
|
|
- logger.info("校验失败(%d):0x%04X 0x%04X", len(recv_data), get_crc, check_num)
|
|
|
|
|
- return
|
|
|
|
|
|
|
+ soc_data = recv_data[index+PACK_LEN():index+PACK_LEN()+data_len]
|
|
|
|
|
+ if g_config["def_cfg"]["checknum_type"]!="":
|
|
|
|
|
+ H = len(g_config["def_cfg"]["head_send"])
|
|
|
|
|
+ L = 2
|
|
|
|
|
+ get_crc = (recv_data[index+(H+L+1)]&0xff)| (recv_data[index+(H+L)]&0xff)<<8
|
|
|
|
|
+ check_num = checknum_16(soc_data)
|
|
|
|
|
+ if get_crc != check_num:
|
|
|
|
|
+ logger.info("校验失败(%d):0x%04X 0x%04X", len(recv_data), get_crc, check_num)
|
|
|
|
|
+ return
|
|
|
|
|
|
|
|
logger.info("校验成功")
|
|
logger.info("校验成功")
|
|
|
|
|
|
|
@@ -265,7 +290,9 @@ def recv_handler(data: bytearray, reve=False):
|
|
|
recv_data.clear()
|
|
recv_data.clear()
|
|
|
|
|
|
|
|
def notification_handler(characteristic: BleakGATTCharacteristic, data: bytearray):
|
|
def notification_handler(characteristic: BleakGATTCharacteristic, data: bytearray):
|
|
|
|
|
+ global mq
|
|
|
recv_handler(data)
|
|
recv_handler(data)
|
|
|
|
|
+ mq.add("ws_send", data)
|
|
|
|
|
|
|
|
async def ble_send(client, data):
|
|
async def ble_send(client, data):
|
|
|
global recv_start_time
|
|
global recv_start_time
|
|
@@ -427,6 +454,7 @@ async def main():
|
|
|
global g_ble_client
|
|
global g_ble_client
|
|
|
global g_config
|
|
global g_config
|
|
|
global g_ble_mtu
|
|
global g_ble_mtu
|
|
|
|
|
+ global mq
|
|
|
|
|
|
|
|
logger.info("读取配置...")
|
|
logger.info("读取配置...")
|
|
|
with open(config_file, "r", encoding="utf-8") as f:
|
|
with open(config_file, "r", encoding="utf-8") as f:
|
|
@@ -486,6 +514,14 @@ async def main():
|
|
|
input_wait_time = time.time()
|
|
input_wait_time = time.time()
|
|
|
await input_call(client)
|
|
await input_call(client)
|
|
|
|
|
|
|
|
|
|
+ try:
|
|
|
|
|
+ # 开始根据设备即功能处理消息
|
|
|
|
|
+ ws_data = mq.get(device)
|
|
|
|
|
+ if ws_data:
|
|
|
|
|
+ ble_send(client, ws_data)
|
|
|
|
|
+ except Exception as err:
|
|
|
|
|
+ pass
|
|
|
|
|
+
|
|
|
time.sleep(0.1)
|
|
time.sleep(0.1)
|
|
|
|
|
|
|
|
def test_aes():
|
|
def test_aes():
|
|
@@ -516,16 +552,14 @@ def test_recv():
|
|
|
recv_handler(bytes.fromhex(str_b), True)
|
|
recv_handler(bytes.fromhex(str_b), True)
|
|
|
|
|
|
|
|
|
|
|
|
|
-def run():
|
|
|
|
|
- tasks = []
|
|
|
|
|
- tasks.append(main())
|
|
|
|
|
|
|
+def run(tasks = []):
|
|
|
# tasks.append(task())
|
|
# tasks.append(task())
|
|
|
loop = asyncio.get_event_loop()
|
|
loop = asyncio.get_event_loop()
|
|
|
loop.run_until_complete(asyncio.wait(tasks))
|
|
loop.run_until_complete(asyncio.wait(tasks))
|
|
|
loop.close()
|
|
loop.close()
|
|
|
|
|
|
|
|
|
|
|
|
|
-
|
|
|
|
|
|
|
+#---------------------------------------------------------
|
|
|
if __name__ == "__main__":
|
|
if __name__ == "__main__":
|
|
|
signal.signal(signal.SIGTERM, sig_handler) # kill pid
|
|
signal.signal(signal.SIGTERM, sig_handler) # kill pid
|
|
|
signal.signal(signal.SIGINT, sig_handler) # ctrl -c
|
|
signal.signal(signal.SIGINT, sig_handler) # ctrl -c
|
|
@@ -533,8 +567,10 @@ if __name__ == "__main__":
|
|
|
# test_aes()
|
|
# test_aes()
|
|
|
# test_base64()
|
|
# test_base64()
|
|
|
# test_recv()
|
|
# test_recv()
|
|
|
|
|
+ mq = MessageBase()
|
|
|
|
|
+ ws = WebServer("0.0.0.0", 11100, mq)
|
|
|
|
|
+ ws.run()
|
|
|
|
|
+ run([main(),])
|
|
|
|
|
|
|
|
- run()
|
|
|
|
|
- # asyncio.run(main())
|
|
|
|
|
sys.exit(0)
|
|
sys.exit(0)
|
|
|
|
|
|