lua语法
学习教程来自菜鸟,当然网上也有很多其他的教程。这里只是记录一些我觉得比较重要的点
安装(linux)
下载源码包,终端解压编译
sudo apt update
sudo apt install lua5.3
注释
– (单行注释:两个连字符,也就是两个减号)
–[[ ]]-- (多行注释)
标识符
字母、数字和下划线(不支持数字开头,下划线和大写字母也最好不用),区分大小写
变量
不需要声明,直接使用。非nil即存在,赋nil即删除。
type函数查看类型
变量只要没有local就是全局,local还可以标识局部函数
基本类型:nil、boolean、number、string、userdata、function、thread 和 table
- nil:条件表达式中等同于false
- boolean:false、true
- number:双精度实浮点
- function:c或者lua编写函数
- userdata:储存在变量中的c数据结构
- string:单双引号都可以。[]可以表示多行。#加字符串计算长度,两点表示连接字符串。也可以使用string.len\utf8.len(中文)
- table:关联数组,索引可以是数字、字符串或表结构。初始索引从1开始,长度自动增长,可以使用[]或者.访问
- function:支持匿名函数
循环
while,for,repeat-until
break
goto
- label的格式为 :: label ::(后面可以直接接语句)
条件
if then,else,end
0也为真,只有false或者nil为假
函数
没有local就是全局
可变参数 …,函数内使用select(‘#’,…)可获取可变参数的数量、select(n,…)返回n开始的参数
运算符
算数:+ - * / % ^ //(整除)
关系:== ~=(不等于) > < >= <=
逻辑:and or not
优先级
- ^
- not - (unary)
- *(乘) / %
- +(加) -
- …
- < > <= >= ~= ==
- and
- or
字符串操作
string.upper , string.lower, string.gsub(替换), string.find, string.reverse, string.format, string.char, string.byte, string.len, string.rep(n个拷贝), string.gmatch(查找符合pattern的子串,返回迭代器), string.match, string.sub
table操作
table.contact, table.insert, table.maxn, table.remove, table.sort
模块
模块就是一个table。把需要到处的常量和函数都放进去table就行。文件最后返回这个table
加载使用require (require()/require “”)。
lua语言还是很全面,还有元表、协同程序、调试等。通过table+元表还能实现面向对象
kamailio+lua
kamailio支持嵌入其他语言(按照官方的说法,嵌入其他语言就是使用别的语言去写路由块处理的那些函数)。
如果要使用lua语言来编写路由逻辑模块,需要加载app_lua模块。目前支持lua版本:5.1、5.2、5.3、5.4
下面的介绍都是来自官方文档
使用方法
采用cfg+lua的方式。cfg文件中定义全局参数、导入运行需要的模块、模块的参数设置等,通过下面的配置,加载lua文件中定义的路由逻辑
# 导入kamailio模块
loadmodule "app_lua.so"
# 设置lua文件
modparam("app_lua", "load", "/path/to/script.lua")
# 执行lua文件
cfgengine "lua"
- 在lua文件中KSR标识导出kamailio功能的对象。只要是在cfg文件中导入的模块,在lua文件中使用KSR.模块名.函数名来调用,使用方法都和cfg文件中的相同。
- kamailio的core中的函数也能使用KSR.函数
kamailio路由和lua函数对应关系
- request_route -> ksr_request_route
- reply_route -> ksr_reply_route
- onsend_route -> ksr_onsend_route
- exit -> KSR.x.exit
- drop -> KSR.x.drop
core函数
- core函数:官方文档