Files
BR_YKC/4G/code/core/cmd.lua

115 lines
3.2 KiB
Lua
Raw Normal View History

2026-04-30 17:16:01 +08:00
-- cmd.lua
-- 功能:解析串口帧,调用 linksocket 接口,执行系统命令
2026-03-31 15:46:04 +08:00
2026-04-30 17:16:01 +08:00
local log = require "log"
local sys = require "sys"
local uart = require "uart"
local linksocket = require "linksocket"
local uartID = 1
-- 辅助函数:字节转十六进制(调试用)
local function toHexcode(str)
if not str then return "" end
local hex = ""
for i = 1, #str do
hex = hex .. string.format("%02X", str:byte(i))
end
return hex
end
-- 发送通用响应帧55 AA 83 subCmd socketId status AA 55
local function sendResponse(subCmd, socketId, status)
local frame = string.char(0x55, 0xAA, 0x83, subCmd, socketId, status, 0xAA, 0x55)
uart.write(uartID, frame)
log.debug("Response: subCmd=", subCmd, "socketId=", socketId, "status=", status)
2026-03-31 15:46:04 +08:00
end
2026-04-30 17:16:01 +08:00
-- 命令处理函数
local function handleCmd01(subCmd, payload)
local socketId = subCmd
if socketId < 1 or socketId > 6 then
log.error("Invalid socket id in cmd 0x01:", socketId)
sendResponse(0x01, socketId, 1)
return
end
local success = linksocket.sendToSocket(socketId, payload)
if not success then
log.warn("Send failed, socket", socketId, "not connected")
sendResponse(0x01, socketId, 1)
else
log.info("Data sent to socket", socketId, "len=", #payload)
end
end
local function handleCmd02()
log.info("System restart command received")
2026-03-31 15:46:04 +08:00
sys.restart()
2026-04-30 17:16:01 +08:00
end
local function handleCmd03(subCmd, payload)
if #payload < 1 then
log.error("Cmd 0x03 missing socket id")
return
end
local socketId = payload:byte(1)
if socketId < 1 or socketId > 6 then
log.error("Invalid socket id in cmd 0x03:", socketId)
sendResponse(subCmd, socketId, 1)
return
end
if subCmd == 0x01 then
local ok = linksocket.setKeepConnecting(socketId, true)
if ok then
sendResponse(subCmd, socketId, 3)
else
sendResponse(subCmd, socketId, 1)
end
elseif subCmd == 0x02 then
local ok = linksocket.setKeepConnecting(socketId, false)
if ok then
sendResponse(subCmd, socketId, 0)
else
sendResponse(subCmd, socketId, 1)
end
else
log.error("Unknown subCmd for 0x03:", subCmd)
sendResponse(subCmd, socketId, 1)
end
end
-- 对外接口:处理串口接收到的原始数据
local function process(rawData)
if not rawData or #rawData < 5 then
log.warn("Short data received, ignore")
return
end
log.info("CMD raw data:", toHexcode(rawData))
if rawData:byte(1) == 0x55 and rawData:byte(2) == 0xAA
and rawData:byte(-2) == 0xAA and rawData:byte(-1) == 0x55 then
local mainCmd = rawData:byte(3)
local subCmd = rawData:byte(4)
local payload = rawData:sub(5, -3)
if mainCmd == 0x01 then
handleCmd01(subCmd, payload)
elseif mainCmd == 0x02 then
handleCmd02()
elseif mainCmd == 0x03 then
handleCmd03(subCmd, payload)
else
log.warn("Unknown main command:", mainCmd)
end
else
log.warn("Invalid frame header/footer")
end
end
-- 模块接口
local M = {
process = process,
}
return M