最近在和智能硬件部门一起,做一个室内定位的服务,该服务根据手机端传过来的beacon设备列表,根据一定的算法计算出具体的商场,并将商场ID和beason设备列表作为参数,调用.so文件中的计算方法,得出位置数据(坐标:x、y、z),返回给手机端。
因为服务对QPS要求比较高,并且都是纯查询操作,于是决定使用Nginx+lua+Redis的架构(该架构在公司内部已成主流,比较成熟)。下面我将对lua调用.so文件的方式,做一下介绍。
lua调用.so文件,主要有两种方式:
1. Lua直接调用动态链接库,具体可参考 技术分享 。
2. 使用C写一个Wrapper。
鉴于第一种方式需要引入第三方工具包,并且效率不高,所以我们采用第二种方式来实现。具体实现过程如下:
1.编写业务代码,其中包括业务方法的封装器。
static int lua_Locate( lua_State* L )
{
long handle = lua_tonumber( L, 1 );
const char* beacon_rssi_json = lua_tostring( L, 2 );
vector<RSSI_INFO> rssi_info_vec;
FingerprintLocationServer* p = (FingerprintLocationServer*)handle;
ConvertJson2CppRSSI( beacon_rssi_json, rssi_info_vec );
double x;
double y;
float floor;
p->UpdateBeaconSignalGetResult( rssi_info_vec, x, y, floor );
lua_pushnumber(L,x);
lua_pushnumber(L,y);
lu