设备管理
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

251 lines
7.5 KiB

-- local cjson = require("cjson")
function parseRecord(t)
local result = {}
local start = 1
local type = hex_to_bytes(t, start, 1)
--print("type:", type)
start = start + 2
local version = hex_to_bytes(t, start, 1)
--print("version:", version)
start = start + 2
local time = hex_to_bytes(t, start, 8)
--print("time:", time)
start = start + 16
local pair = hex_to_bytes(t, start, 1)
--print("pair:", pair)
start = start + 2
local values = {}
for i = 1, tonumber(pair, 16) do
local address = hex_to_bytes(t, start, 2)
-- print("startAdd:", address)
start = start + 4
local size = hex_to_bytes(t, start, 2)
--print("size:", size)
start = start + 4
for j = 1, tonumber(size, 16) / 2 do
--print(address, hex_to_bytes(t, start, 2))
values[address] = hex_to_bytes(t, start, 2)
address = string.gsub(string.format("%#x", tonumber(address, 16) + 1), "0x", "")
if string.len(address) < 4
then
address = string.rep("0", 4 - string.len(address)) .. address
end
start = start + 4
end
end
result["type"] = type
result["version"] = version
result["time"] = tonumber(time, 16)
result["pair"] = pair
result["values"] = values
-- print(result["type"], result["version"], result["time"], result["pair"])
for k,v in pairsByKeys(result["values"]) do
-- print(k,v)
end
-- print(table2string(result))
return table2string(result)
end
function table2string(tablevalue)
local stringtable = serialize(tablevalue)
-- print(stringtable)
return stringtable
end
function serialize(obj)
local lua = ""
local t = type(obj)
if t == "number" then
lua = lua .. obj
elseif t == "boolean" then
lua = lua .. tostring(obj)
elseif t == "string" then
lua = lua .. string.format("%q", obj)
elseif t == "table" then
lua = lua .. "{"
for k, v in pairs(obj) do
lua = lua .. serialize(k) .. ":" .. serialize(v) .. ","
end
local metatable = getmetatable(obj)
if metatable ~= nil and type(metatable.__index) == "table" then
for k, v in pairs(metatable.__index) do
lua = lua .. "[" .. serialize(k) .. "]=" .. serialize(v) .. ","
end
end
lua = string.sub(lua, 1, -2)
lua = lua .. "}"
elseif t == "nil" then
return nil
else
error("can not serialize a " .. t .. " type.")
end
return lua
end
function pairsByKeys(t)
local a = {}
for n in pairs(t) do
a[#a + 1] = n
end
table.sort(a)
local i = 0
local iter = function()
i = i + 1
if a[i] == nil
then
return nil
else
return a[i], t[a[i]]
end
end
return iter
end
function length(t)
local res=0
for k,v in pairs(t) do
res=res+1
end
return res
end
function hex_to_bytes(hex, start, len)
-- print(hex)
local value = hex:sub(start, start + len * 2 - 1)
if len > 1
then
value = toBigEndian(value)
end
return value
end
function toBigEndian(value)
--print(string.len(value))
local hexResult = ""
for i = string.len(value), 1, -2 do
local hex = value:sub(i - 1, i)
hexResult = hexResult .. hex
end
return hexResult
end
-- 将16进制字符串转换为小端格式
local function hexToLittleEndian(hexString)
local littleEndian = ""
for i = #hexString, 1, -2 do
local byte = hexString:sub(i - 1, i)
littleEndian = littleEndian .. byte
end
return littleEndian
end
function issueOrder(luaTable)
-- print("start")
-- print("luaTable",luaTable)
local result = ""
local timestamp = os.time()
-- print("timestamp",timestamp)
-- print("time",hexToLittleEndian(string.format("%016X",timestamp)))
-- print("version",luaTable["version"])
-- print("type",luaTable["type"])
result = result .. luaTable["type"] .. luaTable["version"] .. hexToLittleEndian(string.format("%016X",timestamp))
-- print(type(luaTable["values"]))
local values = luaTable["values"]
local keys = {}
for key in pairs(values) do
table.insert(keys, key)
end
table.sort(keys)
local lastDecimalism = -2
local totalPairs = 0
-- 打印排序后的键值对
local valueResult = {}
local valueSize = {}
local startPoint = -2
for _, key in ipairs(keys) do
-- print(key, values[key])
-- print(key)
local decimalism = key
-- print(tonumber(decimalism) ~= lastDecimalism + 1)
if tonumber(decimalism) ~= lastDecimalism + 1 then
-- print("last + 1",lastDecimalism + 1)
-- print("current",decimalism)
-- print(decimalism)
startPoint = decimalism
totalPairs = totalPairs + 1
-- print(hexToLittleEndian(string.format("%04X",values[key])))
valueResult[startPoint] = hexToLittleEndian(string.format("%04X",values[key]))
valueSize[startPoint] = 2
-- print(valueSize[startPoint])
else
-- print(decimalism)
-- print(valueResult[startPoint])
valueResult[startPoint] = valueResult[startPoint] .. hexToLittleEndian(string.format("%04X",values[key]))
-- print(valueSize[startPoint])
valueSize[startPoint] = valueSize[startPoint] + 2
end
lastDecimalism = decimalism
end
-- print(valueSize)
result = result .. string.format("%02X",totalPairs)
for ke,_ in pairsByKeys(valueSize) do
-- print("jade")
-- print(ke,vl)
result = result .. hexToLittleEndian(string.format("%04X",ke)) .. hexToLittleEndian(string.format("%04X",valueSize[ke])) .. valueResult[ke]
end
local byteArray = {}
-- for i = 1, #result, 2 do
-- local hexByte = string.sub(result, i, i + 1)
-- local decimalValue = tonumber(hexByte, 16)
-- table.insert(byteArray, decimalValue)
-- end
-- for _, byte in ipairs(byteArray) do
-- print(byte)
-- end
-- print("result",byteArray)
return result
end
-- parseRecord("0001A90AE4650000000001020002000100")
-- local valuess = {}
-- valuess["0002"] = "0001"
-- print (valuess["0002"])
-- valuess = {[0002]="0001"}
-- myTable = {type = "00", version = "01",time = 1709294663000,values = valuess}
-- issueOrder(myTable)
-- 示例
-- local json_str = '{"name": "John", "age": 30, "city": "New York"}'
-- local result_table = parse_json(json_str)
-- -- 输出解析结果
-- for key, value in pairs(result_table) do
-- print(key, value)
-- end
-- function
-- issueOrder('{"version":"01","type":"00","time":"1709284976000","values":{"2":"1","31000":"31000","32003":"32003","31002":"31002","32002":"32002","30002":"30002","1":"1","30003":"30003","32000":"32000","32004":"32004","32001":"32001","0":"1","30004":"30004","31001":"31001"}}')
-- print("result","0001801a860f0000000004000006000100010001003275060032753375347518790600187919791a79007d0a00007d017d027d037d047d")
-- 0001801a860f00000000043000010001000133000275327533753433100079187919791a5320007d007d017d027d037d04
-- 0001801a860f0000000004000006000100010001003275060032753375347518790600187919791a79007d0a00007d017d027d037d047d
-- local result = parseRecord("000177EEE3650000000001020002000100")
-- print(result)