前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Go或者C中调用Lua业务脚本,实现终端应用的热更新机制

Go或者C中调用Lua业务脚本,实现终端应用的热更新机制

作者头像
杨永贞
发布2020-09-14 14:24:37
7040
发布2020-09-14 14:24:37
举报

随着5G网络的普及,大胆预测下未来终端架构发展的两个方向,终端设备功能将会更加的强大和智能。

一是随着5G的普及,联机类的业务,终端设备上的业务会轻量化,即瘦客户端的思想。业务在后台实现,终端仅成为操作实体的媒介,这样维护量将大大降低,业务都在后台,更利于升级迭代和维护。

二是脱机类,空闲联机的业务,终端可实现轻量化,热更新应用。把业务模块化,组件化,脚本化。每次升级不用整个都升级,可能仅需要写好业务脚本把轻量的几K的脚本下发下去实现应用的热更新,用户无感知。

借用docker的图标来说下,它的图标很形象,一个大船拖动了很多的集装箱。以此类比现实世界,那么嵌入式应用的其他功能相当于大船,提供基础服务,业务则相当于集装箱。所有地方的终端,对维护好一个大船就行了,这样利于迭代做好做稳定,而业务脚本化更利于复用和实现热更新,轻量化升级,用户无感知,快速迭代业务。这将大幅度的提高用户体验和降低运维成本并提高开发效率,这些在未来会成为可能。

当然一切技术的使用都不是银弹,都是用来解决痛点和某一实际问题。不是为了哗众取宠,舍近求远,为了技术而技术。

在做选择时,要权衡一下利弊。是利大于弊,还是弊大于利。比如,假如终端功能很简单,业务很简单,也不常变动,不常迭代,也不涉及需要复用的地方,就没必要这么做,怎样简单怎样来。

而这样做,也并不是很难,涉及的学习成本想对高点,Golang,Lua,C都有涉及。前期的基础和轮子打造需要下点功夫,而后续的业务实现可能很简单,就是在大的容器环境下写业务脚本,类似搭积木的方式灵活的实现业务和快速更新迭代。

以下是Go应用中调用Lua业务脚本的一个尝试:(注,同时在电脑上和ARM板子上已验证都是可行的)

以下是我的一个验证:

package main

import (
	"fmt"
	"github.com/sryanyuan/luago"
	"strconv"
	"sync"
)

func export(L luago.Lua_Handle) int {
	//	get args from lua
	num := int(luago.Lua_tonumber(L, -2))
	str := luago.Lua_tostring(L, -1)

	fmt.Printf("this is a luago func\n")
	//	push value to lua
	val := str + strconv.Itoa(num)
	luago.Lua_pushstring(L, val)
	return 1
}

func main() {
	var wg sync.WaitGroup
	wg.Add(1) //

	L := luago.LuaGo_newState()
	fmt.Printf("lua ver:%#v\n", luago.Lua_version(L.GetHandle()))
	L.OpenStdLibs()

	L.LuaGo_PushGoFunction("export", export)

	luago.LuaGo_stackDump(L.GetHandle())
	ret := luago.LuaL_dofile(L.GetHandle(), "test1.lua")

	fmt.Printf("ret:%d\n", ret)
	//	invoke
	ret = luago.LuaL_dostring(L.GetHandle(), ` 
		local val = export(1, "hello luago")
		print(val)
		shanghu = string.format("%012u",123456789011) 
		print(shanghu)
	`)

	fmt.Printf("ret:%d\n", ret)

	luago.LuaGo_stackDump(L.GetHandle())

	ret = luago.LuaL_dofile(L.GetHandle(), "test.lua")

	luago.LuaGo_stackDump(L.GetHandle())
	//wg.Wait() // 等待
}

附测试的test1.lua脚本:

--this is a demo:
----------------------------------------------------

print("this is a lua script,begin:")
--通信服务地址
ip= "127.0.0.1"
--通信服务端口
port = 5050

function CONNECT( ip,port )
	-- body
	print("this is CONNECT,"..ip..port)
end

function TxData( tx )
	-- body
	print("this is TxData,"..tx)
end

function DISCONNECT( ... )
	-- body
	print("this is DISCONNECT")
end

--连接到通信前置服务
ret = CONNECT(ip,port)           --建立连接
-------------------------------------------  
--通讯报文规范是基于TCP/IP 通讯协议而设计,支持二进制字节流。采用统一的消息类型标识识别方式进行处理
--通信协议格式: MTI+STI+DBL+DATA
--签到报文 ,
MTI = 'B001'    --消息类型标识
STI = '52'      --请求类型标识
DBL = '0000001C'      --报文体长度
DATA = ''       --数据域

shanghu = string.format("%012d",3456789012) 
poscode = string.format("%016d",34567890112233)
samcode = '313233343536'
optcode = '3132333435363738'

DATA = shanghu..poscode..samcode..optcode
DBL = string.format("%08x",string.len(DATA)/2)
TX = MTI .. STI .. DBL .. DATA

ret,rcv = TxData(TX)      --调用接口TxData(str),实际会以二进制的字节流发送报文
--print(rcv)

--黑名单下载
MTI = 'B004'
blackver = '00000000'
DATA = blackver .. poscode
DBL = string.format("%02x",string.len(DATA)/2)
TX = MTI .. STI .. DBL .. DATA

ret,rcv = TxData(TX)           
print(rcv)

----lua test go function 
print("this is go function test by lua")

--LtestGofunc0(7,8,9)

--LtestGofunc1()


DISCONNECT()                          --断开连接

print("lua script over")
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-09-09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档