随着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")