--provide CRC16, base64 encode/decode-- local dyutils=require("dyutils") --provide bitwise-- local bit=require("bit") --provide bpack/bunpack-- local lpack=require("lua_pack") --provide json encode/decode-- local cjson=require("cjson") --[[ -- from json to bin -- input: -- json_str: '{ -- "term_addr":1 -- }' -- len: -- output: -- bin_str: 0 -- len: --]] function protocol_encode(json_str, len) local err_code=0 --parse-- local obj=cjson.decode(json_str) --encode-- local format=">C6" local data_str=bpack(format, obj.term_addr, 3, 0, 0, 0, 8) local crc=dyutils.CRC16(data_str, #data_str) format=">A>S" local bin_str=bpack(format, data_str, crc) local t_str='' for i=1, #bin_str do t_str= t_str .. (string.format("%02x", string.byte(string.sub(bin_str, i, i)))) end bin_str=t_str print(err_code, bin_str, #bin_str) return err_code, bin_str, #bin_str end --[[ --input: --bin_str:'010310012A021B002F022B000D0011FFFFFFFF59B7' --len:21 --]] function protocol_decode(bin_str, len) local err_code=0 local format=">C3>S9" local obj={} --convert-- 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 --parse-- _,_,_,_,wendu,shidu,guangzhao,zaosheng,PM2,PM10,daqiya,TVOC,crc=bunpack(bin_str,format) --calc-- obj.wendu_DLg7l=bit.band(wendu,0x7F00)/10.0 obj.shifushidu_tNmsf=shidu/10.0 obj.zhaodu_OiTQg=guangzhao*4 obj.zaoyin_hqSLz=zaosheng/10 obj.PM25_NOhQr=PM2 obj.PM10_2unGk=PM10 --obj.daqiya=daqiya/100.0 --obj.TVOC=TVOC/10.0 --encode-- local json_str=cjson.encode(obj) print(err_code, json_str, #json_str) return err_code,json_str,#json_str end --protocol_encode('{"term_addr":1}',15) --protocol_decode('010310012A021B002F022B000D0011FFFFFFFF59B7',42)