diff --git a/ReadMe.txt b/ReadMe.txt index a251b73..e55d6d4 100644 --- a/ReadMe.txt +++ b/ReadMe.txt @@ -131,5 +131,7 @@ 2024.1.15 实现方案导入导出,根据选项自动生成文件名 添加任务时添加对应的错误码 +2024.3.20 + 添加自定义传输协议编解码 diff --git a/coder_2ch/prottcp.py b/coder_2ch/prottcp.py index c8f49e3..a3a1bcf 100644 --- a/coder_2ch/prottcp.py +++ b/coder_2ch/prottcp.py @@ -500,7 +500,7 @@ if __name__ == "__main__": # data=bytearray([2,1,2,3,0, 3,5,6,7,0, 9,8,9,10,0]) u.cmd=0x50 - data=bytearray([7]) + data=bytearray([6]) print(u.encode(data).hex(' ')) # with open("file/EX_Coder_Test_2023-07-6.json","rb") as f: @@ -538,7 +538,7 @@ if __name__ == "__main__": # 总线设置20V # 59 6d 06 00 50 00 00 05 c8 00 8b b0 # 关总线 -# 59 6D 43 05 00 50 00 00 00 06 0E 0E +# 59 6d 04 00 50 00 00 06 90 9d # 检总线电流 # 59 6d 04 00 50 00 00 07 51 5d diff --git a/mysql/mysql.py b/mysql/mysql.py index eab10cf..59056e7 100644 --- a/mysql/mysql.py +++ b/mysql/mysql.py @@ -118,6 +118,15 @@ class sql: print(i) return a + # 下载文件数据 + def download_data(self,table_name:str,id:int): + cmd="select name,data from {d1} WHERE id={d2};".format(d1=table_name,d2=id) + self.cur.execute(cmd) + a=self.cur.fetchall()[0] + name=a[0].replace('\\','/').split('/')[-1].split('.') + name='.'.join(name[:-1])+'--'+str(id)+'.'+name[-1] + return (name,a[1]) + # 下载指定文件,返回文件路径 def download(self,id:int): if not os.path.exists(self.download_path): diff --git a/mysql/prot_cmd.py b/mysql/prot_cmd.py new file mode 100644 index 0000000..67542cd --- /dev/null +++ b/mysql/prot_cmd.py @@ -0,0 +1,82 @@ +import json + +import mysql as sql +import prot_codec as pr + + + +SQL=sql.sql() +SQL.init("test_data") + + +_DATA=None + +# 获取文件夹目录,参数:无 +def get_dirs_list(): + r=SQL.show_tables() + j=[] + for item in r: + j.append(item[0]) + js=json.dumps(j) + return js + + +# 获取文件列表,参数:json{文件的目录} +def get_files_list(j:bytearray): + SQL.table_name=json.loads(j)["dir"] + r=SQL.show() + js=json.dumps(r) + print(js) + return js + +# 获取文件,参数:json{文件目录,文件序号} +def get_file_data(j:bytearray): + js=json.loads(j) + name,data=SQL.download_data(js["dir"],js["id"]) + print(name,len(data)) + global _DATA + _DATA=data + js=json.dumps({'name':name,"size":len(data)}) + return js + +# 获取指定长度的数据,参数:json{偏移,长度} +def get_data(j:bytearray): + js=json.loads(j) + off=js["off"] + length=js["len"] + if(off0): + crc=0xffff + for i in range(lenth): + crc=(crc^data[i])&0xffff + for j in range(8): + if(crc&1)!=0: + crc=((crc>>1)^0xa001)&0xffff + else: + crc=(crc>>1)&0xffff + return bytearray([crc&0xff,(crc>>8)&0xff]) + return bytearray([0,0]) + + +# 0xff帧起始,0xfe帧结尾 +# 0xf0转义标识 +# 0xf1命令数据分割 +# 0xf2数据校验分割 + +# 字节数据大于等于0xf0 之后要转义 +def _tran(data:bytearray): + ret=bytearray() + for item in data: + if(item>=0xf0): + ret.append(0xf0) + ret.append(item-0xf0) + else: + ret.append(item) + return ret + +# 去转义 +def _untran(data:bytearray): + ret=bytearray() + i=0 + length=len(data) + while i=0xf0): + ret.append(data[i]+data[i+1]) + i+=1 + else: + ret.append(data[i]) + i+=1 + return ret + + +# 以命令和数据编码 +def encode(cmd:bytearray,data:bytearray): + crc=_crc16(cmd+data) + ret=bytearray() + ret.append(0xff) + ret+=_tran(cmd) + ret.append(0xf1) + ret+=_tran(data) + ret.append(0xf2) + ret+=_tran(crc) + ret.append(0xfe) + return ret + + +# 解码为命令和数据 +def decode(data:bytearray): + while len(data)>0: + if(data[0]!=0xff): + data=data[1:] + else: + break + if(len(data)==0): + return (None,None) + if(data[0]==0xff and data[-1]==0xfe): + data=data[1:-1] + cmd_index=data.find(0xf1) + data_index=data.find(0xf2) + cmd=_untran(data[:cmd_index]) + da=_untran(data[cmd_index+1:data_index]) + crc=_untran(data[data_index+1:]) + if(crc==_crc16(cmd+da)): + return (cmd,da) + return (None,None) + + + + + + + + +if __name__ == "__main__": + data=encode(b"cmd_test",bytearray([0xff,0xfd,0xff,0xde,0xde])) + print(data.hex(' ')) + print(decode(data)) + + + +