1 Star 0 Fork 200

watertreestar/edge

forked from iBUILDING-X/driver-box 
加入 Gitee
与超过 1400万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
script.go 2.66 KB
一键复制 编辑 原始数据 按行查看 历史
watertreestar 提交于 2023-08-02 14:38 +08:00 . chore: rename package
package helper
import (
"encoding/json"
"fmt"
"gitee.com/watertreestar/edge/driverbox/common"
"gitee.com/watertreestar/edge/driverbox/plugin"
"github.com/cjoudrey/gluahttp"
lua "github.com/yuin/gopher-lua"
luajson "layeh.com/gopher-json"
"net/http"
"os"
"path/filepath"
"sync"
)
var runLock = &sync.Mutex{}
// InitLuaVM 编译 lua 脚本
func InitLuaVM(scriptDir string) (*lua.LState, error) {
ls := lua.NewState(lua.Options{
RegistryMaxSize: 128,
})
// 预加载模块(json、http、storage)
ls.PreloadModule("http", gluahttp.NewHttpModule(&http.Client{}).Loader)
luajson.Preload(ls)
ls.PreloadModule("driverbox", LuaModuleInstance.Loader)
// 文件路径
filePath := filepath.Join(common.CoreConfigPath, scriptDir, common.LuaScriptName)
if FileExists(filePath) {
// 脚本解析
err := ls.DoFile(filePath)
if err != nil {
return nil, err
}
return ls, nil
} else {
Logger.Warn("lua script not found, aborting initializing lua vm")
return nil, nil
}
}
// FileExists 判断文件存在
func FileExists(path string) bool {
_, err := os.Stat(path)
return err == nil
}
// CallLuaConverter 调用 Lua 脚本转换器
func CallLuaConverter(L *lua.LState, method string, raw interface{}) ([]plugin.DeviceData, error) {
data, ok := raw.(string)
if !ok {
return nil, common.ProtocolDataFormatErr
}
// 调用脚本函数
err := L.CallByParam(lua.P{
Fn: L.GetGlobal(method),
NRet: 1,
Protect: true,
Handler: nil,
}, lua.LString(data))
defer L.Remove(1)
if err != nil {
return nil, fmt.Errorf("call lua script %s function error: %s", method, err)
}
// 获取解析结果
result := L.Get(-1).String()
res := make([]plugin.DeviceData, 0)
err = json.Unmarshal([]byte(result), &res)
return res, err
}
// CallLuaEncodeConverter 调用 Lua 脚本编码转换器
func CallLuaEncodeConverter(L *lua.LState, deviceName string, raw interface{}) (string, error) {
data, ok := raw.(string)
if !ok {
return "", common.ProtocolDataFormatErr
}
// 调用脚本函数
err := L.CallByParam(lua.P{
Fn: L.GetGlobal("encode"),
NRet: 1,
Protect: true,
Handler: nil,
}, lua.LString(deviceName), lua.LString(data))
defer L.Remove(1)
if err != nil {
return "", fmt.Errorf("call lua script encode function error: %s", err)
}
// 获取解析结果
result := L.Get(-1).String()
return result, err
}
// SafeCallLuaFunc 安全调用 lua 函数,通过锁机制独占时间片
func SafeCallLuaFunc(L *lua.LState, method string) error {
runLock.Lock()
defer runLock.Unlock()
L.Push(L.GetGlobal(method))
if err := L.PCall(0, 0, nil); err != nil {
return fmt.Errorf("call lua script %s function error: %s", method, err)
}
return nil
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Go
1
https://gitee.com/watertreestar/edge.git
git@gitee.com:watertreestar/edge.git
watertreestar
edge
edge
v1.0.0

搜索帮助