dyutils=require("dyutils") bit=require("bit") lpack=require("lua_pack") cjson=require("cjson") base64=require("base64") syslog=require("syslog") sqlite3=require("lsqlite3") function protocol_decode(input_str, len) local err_code=0 --取出入参-- local obj={} local input_obj=cjson.decode(input_str) local bin_str=input_obj.raw_data local id='post' --入参中的raw_data的二进制转换-- local t_str='' for i=1,#bin_str,2 do t_str=t_str .. string.char(tonumber(string.sub(bin_str, i, i+1),16)) end bin_str=t_str --分割位域-- local format=">C3>S1" _,_,_,_,buf_len=bunpack(bin_str,format) --calc-- format=string.format(">C3>S1>C2>A%u>C1",buf_len-1) _,_,_,_,buf_len,_,addr,data_str_a,crc=bunpack(bin_str,format) calc_crc=0 for i=1,buf_len+6,1 do by_a=string.byte(bin_str,i) calc_crc = bit.bxor(calc_crc,by_a) end if calc_crc ~= crc then return -1,"",0 end --出参格式化-- obj.result=data_str_a obj.result8=data_str_a if string.len(obj.result8) == 10 then local num = tonumber(obj.result8,10) obj.result8 = string.format("%03d%05d",bit.band(bit.rshift(num,16),0xff),bit.band(num,0xffff)) end obj.term_addr=string.format("%02X", addr) obj.identifier=id local json_str=cjson.encode(obj) return err_code,json_str,#json_str end -- test_str='{"raw_data":"55AA30000B000130343739373531363334CD","identifier":""}' -- protocol_decode(test_str,#test_str)--