用户语言起源于基础逻辑语句,是为了缩短开发周期,快速实现业务功能,在电力系统维护环境中应运而生。用户语言特有的接近于口语化的逻辑语句,能让不懂开发技术的用户实现自己对业务需求的配置。
用户语言3.0版本具备了云执行能力,并引入了状态机执行机制。
本版本4.0版本,产品将着重细化语言能力与边界。在语言语法方面,产品划分领域语言层和标准语言层2部分。在软件方面,编译器软件对应划分领域语言编译器及标准编译器2大子系统;虚拟机软件则在原有能力上,为适应不同使用场景下的业务差异,框架整体重构为插件式架构、屏蔽底层标准虚拟机并对外提供更简易的使用接口。
软件的架构由领域语言层及标准语言层2部分组成,如下图所示:
其中,标准语言层包括:标准编译器、商用虚拟机、标准虚拟机、及微虚拟机。
名词 | 说明 |
标准语言 | 标准语言是用户语言标准语句的组成规则。该规则屏蔽了各行业、领域间的业务特性。详细内容见《1-用户语言4.0语言内核定义与设计_标准语言》。 |
领域语言 | 领域语言是在标准语言的基础上进行衍生扩展,形成的行业、领域里特有的方言(规则)。(如电子菜谱语言、智能照明语言等) |
标准源程序 | 标准源程序是标准编译器输入数据的数据格式。详细内容见《1-用户语言4.0语言内核定义与设计_标准语言》。 |
标准编译器 | 标准编译器负责对标准源程序进行编译,结合标准源程序中的变量表、函数表等输入数据,将标准语言语句翻译为虚拟机字节码。 |
领域编译器 | 领域编译器负责对领域语言编写的文本进行翻译,输出标准源程序。 |
ULC字节码 | ULC字节码是标准编译器输出数据的数据格式,是虚拟机字节码的一种。 |
标准虚拟机 | 标准虚拟机是一个通过解析ULC字节码来执行逻辑指令的软件程序。详细内容见《4-用户语言4.0语言内核定义与设计_标准虚拟机》。 |
微虚拟机 | 微虚拟机是通过对标准虚拟机能力进行裁剪,得到的微型化标准虚拟机。主要提供给有硬件资源限制的设备使用。详细内容见《5-用户语言4.0语言内核定义与设计_微虚拟机》。 |
商用虚拟机 | 商用虚拟机是通过对标准虚拟机及原菜谱收费系统的新鉴权模块进行封装,得到的可用于商业计费的虚拟机。后续标准虚拟机与微虚拟机不再直接对外暴露,改为提供商用虚拟机。 |
截止当前版本,语言内核已提供C/C++语言及Java语言的SDK,并支持在大部分版本的Windows系统及特定版本的Linux系统下运行。
具体支持的操作系统版本与CPU架构组合见下表。
注:Android系统的JNI框架暂不支持异常传递,任何该异常在JNI框架执行过程中无法被暂存。故在Android系统对JavaSDK的抽象接口进行实现时,不允许抛出异常。
商用虚拟机底层集成了标准虚拟机模块。
1.
商用虚拟机
- 标准虚拟机负责解析并执行ULC字节码中的逻辑指令,并通过商用虚拟机获取回调来调用真正的函数及变量。
注:ULC字节码中只存储了标准编译器生成的,变量和函数的ID。变量和函数都需由商用虚拟机映射到真实变量及函数实现上。
- 商用虚拟机对虚拟机主要流程进行抽象,并提供部分抽象功能给外部插件;商用虚拟机通过外部插件注册进来的功能完成具体的虚拟机流程。
2.
插件(外部能力)
- 虚拟机管理插件,负责为商用虚拟机完成多个虚拟机下,多个事件与多个虚拟机之间的关系;
- 驱动管理插件,负责为商用虚拟机对不同格式的事件、变量、函数进行驱动;
- 鉴权插件,负责为商用虚拟机提供鉴权功能。
商用虚拟机SDK包含一个命令行工具CLI、一个二次开发使用的商用虚拟机库、及一套插件(外部能力)规范。
主要面向领域语言执行引擎的开发者,和用户语言IDE(集成开发环境)工具的开发者使用。
商用虚拟机SDK是商用虚拟机的一个软件开发套件(Software Development Kit),使用者可基于SDK提供的商用虚拟机库(详细内容见
小节1“商用虚拟机库”及)进行软件二次开发。目前提供了C-SDK,暂仅支持使用C作为开发语言。
如上图所示,蓝色方块内容整体称为商用虚拟机库。
其中,开发者主要利用“虚拟机框架API”及优特云提供的“虚拟机框架插件集”即可完成大部分二次开发;如需要高度的业务定制化,则可选地通过“虚拟机框架插件协议层”及“虚拟机框架接入层”,进行定制化插件的开发。
头文件名称 | 说明 |
./include/ubiz-error.h | 商用虚拟机错误码头文件 |
./include/ubiz-macros.h | 商用虚拟机基础宏头文件 |
./include/umacros.h | 通用基础宏头文件 |
./include/ubiz-vm.h | 商用虚拟机提供的接口头文件 |
./include/uobject.h | 商用虚拟机提供的数据转换接口头文件 |
./include/usysdep-def.h | 系统依赖头文件 |
l 函数
名称 | 描述 |
u_biz_vm_ability_ex_set_base | 设置基础外部能力 |
u_biz_vm_ability_ex_set_vm_mgr | 设置虚拟机管理外部能力 |
u_biz_vm_ability_ex_set_driver_mgr | 设置驱动管理外部能力 |
u_biz_vm_ability_ex_set_auth | 设置鉴权外部能力 |
u_biz_vm_ability_init | 商用虚拟机能力初始化 |
u_biz_vm_ability_deinit | 商用虚拟机能力反初始化 |
商用虚拟机接口u_biz_vm_ability_ex_set_base用于设置基础外部能力。
外部能力的具体实现可被称为插件。当前版本(V1.01.00)的商用虚拟机未提供“基础”插件。
l 接口定义
void u_biz_vm_ability_ex_set_base(const UAbilityExBase* pAbility);
l 输入参数
上述入参为基础外部能力需要设置的回调函数的结构体(struct _UAbilityExBase),结构体具体位置对应的函数内容位于“./include/ability-ex/ability-ex-auth.h”头文件中,对应的函数均为回调函数,由应用自行实现。如何实现外部能力的详细内容见小节
1.3.3“使用商用虚拟机库需实现的接口”。
l 示例
…
u_biz_vm_ability_ex_set_base(base_ability);
…
注:设置基础外部能力是商用虚拟机能实现对应回调函数的第一步,应在初始化虚拟机能力前设置,该类回调函数由应用自行实现。
商用虚拟机接口u_biz_vm_ability_ex_set_vm_mgr用于设置虚拟机管理外部能力。
外部能力的具体实现可被称为插件。当前版本(V1.01.00)的商用虚拟机提供了一个名为“本地多虚拟机管理”的插件,插件详细内容见
小节5“本地多虚拟机管理插件”。
l 接口定义
void u_biz_vm_ability_ex_set_vm_mgr(const UAbilityExVmMgr* pAbility);
l 输入参数
参数名称 | 参数说明 | 备注 |
pAbility | 虚拟机管理能力 | |
上述入参为虚拟机管理外部能力需要设置的回调函数的结构体(struct _UAbilityExVmMgr),结构体具体位置对应的函数内容位于“./include/ability-ex/ability-ex-vm-mgr.h”头文件中,对应的函数均为回调函数,由应用自行实现。如何实现外部能力的详细内容见小节
1.3.3“使用商用虚拟机库需实现的接口”。
l 示例
…
u_biz_vm_ability_ex_set_vm_mgr(vm_mgr_ability);
…
注:设置虚拟机管理外部能力是商用虚拟机能实现对应回调函数的第一步,应在初始化虚拟机能力前设置,该类回调函数由应用自行实现。
商用虚拟机接口u_biz_vm_ability_ex_set_driver_mgr用于设置驱动管理外部能力。
外部能力的具体实现可被称为插件。当前版本(V1.01.00)的商用虚拟机提供了一个名为“本地基础驱动管理”的插件,插件详细内容见
小节4“本地基础驱动管理”。
l 接口定义
void u_biz_vm_ability_ex_set_driver_mgr(const UAbilityExDriverMgr* pAbility);
l 输入参数
参数名称 | 参数说明 | 备注 |
pAbility | 驱动管理外部能力 | |
上述入参为驱动管理外部能力需要设置的回调函数的结构体(struct _UAbilityExDriverMgr),结构体具体位置对应的函数内容位于“./include/ability-ex/ability-ex-driver-mgr.h”头文件中,对应的函数均为回调函数,由应用自行实现。如何实现外部能力的详细内容见小节
1.3.3“使用商用虚拟机库需实现的接口”。
l 示例
…
u_biz_vm_ability_ex_set_driver_mgr(driver_mgr_ability);
…
注:设置驱动管理外部能力是商用虚拟机能实现对应回调函数的第一步,应在初始化虚拟机能力前设置,该类回调函数由应用自行实现。
商用虚拟机接口u_biz_vm_ability_ex_set_auth用于设置鉴权外部能力。
外部能力的具体实现可被称为插件。当前版本(V1.01.00)的商用虚拟机提供了一个名为“本地鉴权”的插件,插件详细内容见
小节3“本地鉴权”。
l 接口定义
void u_biz_vm_ability_ex_set_auth(const UAbilityExAuth* pAbility);
l 输出参数
上述入参为驱动管理外部能力需要设置的回调函数的结构体(struct _UAbilityExAuth),结构体具体位置对应的函数内容位于“./include/ability-ex/ability-ex-auth.h”头文件中,对应的函数均为回调函数,由应用自行实现。如何实现外部能力的详细内容见小节
1.3.3“使用商用虚拟机库需实现的接口”。
l 示例
u_biz_vm_ability_ex_set_auth(auth_ability);
注:设置鉴权外部能力是商用虚拟机能实现对应回调函数的第一步,应在初始化虚拟机能力前设置,该类回调函数由应用自行实现。
商用虚拟机接口u_biz_vm_ability_init用于初始化虚拟机的各种能力,其中包含上述4种能力。
l 接口定义
bool_t u_biz_vm_ability_init(int* pErrCode);
l 输出参数
参数名称 | 参数说明 | 备注 |
pErrCode | 初始化失败时商用虚拟机返回的错误码 | |
pErrCode返回的是商用虚拟机SDK在头文件中定义的错误码,包含商用虚拟机自带的错误码及插件包含的错误码。所有错误码的详细内容见
附录A“商用虚拟机SDK错误码”l 返回值
成功返回true,失败返回false
…
int pErrCode = -1;
ok = u_biz_vm_ability_init(&pErrCode);
if (!ok || pErrCode != U_BIZ_ERR_SUCCESS) { printf("虚拟机能力初始化失败"); }
…
商用虚拟机接口u_biz_vm_ability_init用于虚拟机能力反初始化。
l 接口定义
void_u_biz_vm_ability_deinit(void);
l 返回值
反初始化成功返回true,否则返回false。
l 示例
…
bool ok = u_biz_vm_ability_deinit();
if(!ok) printf("虚拟机反初始化失败")
…
l 函数(签名)
名称 | 描述 |
u_object_new_int8 | int8数据类型转换成通用数据类型UObject |
u_object_new_int16 | int16数据类型转换成通用数据类型UObject |
u_object_new_int32 | int32数据类型转换成通用数据类型UObject |
u_object_new_int64 | int64数据类型转换成通用数据类型UObject |
u_object_new_float | float数据类型转换成通用数据类型UObject |
u_object_new_double | double数据类型转换成通用数据类型UObject |
u_object_new_bool | bool数据类型转换成通用数据类型UObject |
u_object_new_string | string数据类型转换成通用数据类型UObject |
u_object_new_null | 构造数据类型为type的null值UObject |
u_object_get_type | 获取通用数据类型 |
u_object_to_int8 | 通用数据类型UObject转换成int8数据类型 |
u_object_to_int16 | 通用数据类型UObject转换成int16数据类型 |
u_object_to_int32 | 通用数据类型UObject转换成int32数据类型 |
u_object_to_int64 | 通用数据类型UObject转换成int64数据类型 |
u_object_to_float | 通用数据类型UObject转换成float数据类型 |
u_object_to_double | 通用数据类型UObject转换成double数据类型 |
u_object_to_bool | 通用数据类型UObject转换成bool数据类型 |
u_object_to_string | 通用数据类型UObject转换成string数据类型 |
u_object_is_null | 判断UObject是否为null值 |
u_object_clone | 通用数据类型克隆 |
u_object_free | 数据的内存释放 |
l 涉及到的枚举类型
typedef enum _UDataType{
U_DATA_TYPE_VOID = 0x20, //void
U_DATA_TYPE_INT8 = 0x21, //int8
U_DATA_TYPE_INT16 = 0x22, //int16
U_DATA_TYPE_INT32 = 0x23, //int32
U_DATA_TYPE_INT64 = 0x24, //int64
U_DATA_TYPE_FLOAT = 0x25, //float
U_DATA_TYPE_DOUBLE = 0x26, //double
U_DATA_TYPE_BOOL = 0x27, //bool
U_DATA_TYPE_STRING = 0x28, //string
U_DATA_TYPE_NIL = 0xFF //无效类型
}UDataType;//数据类型
数据转换接口1.1.7.10u_object_new_int8用于将int8数据类型转换成通用数据类型UObject
l 接口定义
UObject* u_object_new_int8 (int8_t data);
l 输入参数
l 返回值
执行结果;转换的数据结果
l 示例
…
int8_t a = 10;
UObject* object = u_object_new_int8(a);
if(object != NULL) printf("转换成功")
…
数据转换接口u_object_new_int16用于将int16数据类型转换成通用数据类型UObject
l 接口定义
UObject* u_object_new_int16 (int16_t data);
l 输入参数
l 返回值
执行结果;转换的数据结果
l 示例
…
int16_t a = 10;
UObject* object = u_object_new_int16(a);
if(object != NULL) printf("转换成功")
…
数据转换接口u_object_new_int32用于将int32数据类型转换成通用数据类型UObject
l 接口定义
UObject* u_object_new_int32 (int32_t data);
l 输入参数
l 返回值
执行结果;转换的数据结果
l 示例
…
int32_t a = 10;
UObject* object = u_object_new_int32(a);
if(object != NULL) printf("转换成功")
…
数据转换接口u_object_new_int64用于将int64数据类型转换成通用数据类型UObject
l 接口定义
UObject* u_object_new_int64(int64_t data);
l 输入参数
l 返回值
执行结果;转换的数据结果
l 示例
…
int64_t a = 10;
UObject* object = u_object_new_int64(a);
if(object != NULL) printf("转换成功")
…
数据转换接口u_object_new_float用于将float数据类型转换成通用数据类型UObject
l 接口定义
UObject* u_object_new_float (float data);
l 输入参数
l 返回值
执行结果;转换的数据结果
l 示例
…
float a = 6.66;
UObject* object = u_object_new_float(a);
if(object != NULL) printf("转换成功")
…
数据转换接口u_object_new_float用于将float数据类型转换成通用数据类型UObject
l 接口定义
UObject* u_object_new_double (double data);
l 输入参数
l 返回值
执行结果;转换的数据结果
l 示例
…
double a = 8.888888;
UObject* object = u_object_new_double(a);
if(object != NULL) printf("转换成功")
…
数据转换接口u_object_new_bool用于将bool数据类型转换成通用数据类型UObject
l 接口定义
UObject* u_object_new_bool(bool data);
l 输入参数
l 返回值
执行结果;转换的数据结果
l 示例
…
bool a = true;
UObject* object = u_object_new_bool(a);
if(object != NULL) printf("转换成功")
…
数据转换接口u_object_new_string用于将string数据类型转换成通用数据类型UObject
l 接口定义
UObject* u_object_new_string (const char* data);
l 输入参数
l 返回值
执行结果;转换的数据结果
l 示例
…
char a[16] = "helloworld"
UObject* object = u_object_new_bool(a);
if(object != NULL) printf("转换成功")
…
数据转换接口u_object_new_null用于构造数据类型为type的null值UObject
l 接口定义
UObject* u_object_new_null (UDataType type);
l 输入参数
l 示例
…
UObject* object = u_object_new_null(U_DATA_TYPE_INT8);
if(object != NULL) printf("转换成功")
…
数据转换接口u_object_get_type用于获取通用数据类型
l 接口定义
UDataType u_object_get_type(const UObject* data);
l 输入参数
l 返回值
对应的UDataType数据类型,详见1.3.1枚举类型表格。
l 示例
…
int8_t a =10
UObject* object = u_object_new_int8(a);
UDataType type = u_object_get_type(object)
…
数据转换接口u_object_to_int8用于将通用数据类型UObject转换成int8数据类型
l 接口定义
int8_t u_object_to_int8(const UObject* data, bool* ok);
l 输入参数
l 输出参数
l 返回值
执行结果;转换的数据结果
l 示例
…
int8_t a =10
bool ok = false;
UObject* object = u_object_new_int8(a);
int8_t ret= u_object_to_int8(object, &ok);
if(ok) printf("转换成功");
…
数据转换接口u_object_to_int16用于将通用数据类型UObject转换成int16数据类型
l 接口定义
int16_t u_object_to_int16(const UObject* data, bool* ok);
l 输入参数
l 输出参数
l 返回值
执行结果;转换的数据结果
l 示例
…
int16_t a =10
bool ok = false;
UObject* object = u_object_new_int16(a);
int16_t ret= u_object_to_int16(object, &ok);
if(ok) printf("转换成功");
…
数据转换接口u_object_to_int32用于将通用数据类型UObject转换成int32数据类型
l 接口定义
int32_t u_object_to_int32(const UObject* data, bool* ok);
l 输入参数
l 输出参数
l 返回值
执行结果;转换的数据结果
l 示例
…
int32_t a =10
bool ok = false;
UObject* object = u_object_new_int32(a);
int32_t ret= u_object_to_int32(object, &ok);
if(ok) printf("转换成功");
…
数据转换接口u_object_to_int64用于将通用数据类型UObject转换成int64数据类型
l 接口定义
int64_t u_object_to_int64(const UObject* data, bool* ok);
l 输入参数
l 输出参数
l 返回值
执行结果;转换的数据结果
l 示例
…
int64_t a =10
bool ok = false;
UObject* object = u_object_new_int64(a);
int64_t ret= u_object_to_int64(object, &ok);
if(ok) printf("转换成功");
…
数据转换接口u_object_to_float用于将通用数据类型UObject转换成float数据类型
l 接口定义
float u_object_to_float(const UObject* data, bool* ok);
l 输入参数
l 输出参数
l 返回值
执行结果;转换的数据结果
l 示例
…
float a =6.66
bool ok = false;
UObject* object = u_object_new_float(a);
float ret= u_object_to_float(object, &ok);
if(ok) printf("转换成功");
…
数据转换接口u_object_to_double用于将通用数据类型UObject转换成double数据类型
l 接口定义
double u_object_to_double(const UObject* data, bool* ok);
l 输入参数
l 输出参数
l 返回值
执行结果;转换的数据结果
l 示例
…
double a =8.888888
bool ok = false;
UObject* object = u_object_new_double(a);
double ret= u_object_to_double(object, &ok);
if(ok) printf("转换成功");
…
数据转换接口u_object_to_bool用于将通用数据类型UObject转换成bool数据类型
l 接口定义
bool u_object_to_bool(const UObject* data, bool* ok);
l 输入参数
l 输出参数
l 返回值
执行结果;转换的数据结果
l 示例
…
bool a = true
bool ok = false;
UObject* object = u_object_new_bool(a);
bool ret= u_object_to_bool(object, &ok);
if(ok) printf("转换成功");
…
数据转换接口u_object_to_string用于将通用数据类型UObject转换成string数据类型
l 接口定义
const char* u_object_to_string(const UObject* data, bool* ok);
l 输入参数
l 输出参数
l 返回值
执行结果;转换的数据结果
l 示例
…
char* a[16] = "helloworld"
bool ok = false;
UObject* object = u_object_new_string(a);
char* ret= u_object_to_bool(object, &ok);
if(ok) printf("转换成功");
…
数据转换接口u_object_is_null用于判断UObject是否为null值
l 接口定义
bool u_object_is_null (UObject* data);
l 输入参数
l 返回值
UObject数据是null值返回1,否则返回0
l 示例
…
UObject* object = u_object_new_null(U_DATA_TYPE_INT8);
if(u_object_is_null(object)) printf("该UObject数据为null")
…
数据转换接口u_object_is_null用于通用数据类型克隆
l 接口定义
UObject* u_object_clone (const UObject * data);
l 输入参数
l 返回值
执行结果;克隆的数据结果
l 示例
…
UObject* object = u_object_new_null(U_DATA_TYPE_INT8);
UObject* new_object = u_object_clone (object);
…
数据转换接口u_object_is_null用于数据的内存释放
l 接口定义
void u_object_free (UObject** ppObj);
l 输入参数
l 返回值
无
l 示例
…
UObject* object = u_object_new_null(U_DATA_TYPE_INT8);
u_object_free (object);
…
l 函数
名称 | 描述 |
UAbilityExBaseLogout | 日志输出 |
UAbilityExBaseReadULC | 读取ulc文件 |
UAbilityExBaseLineNumberChange | 通知改变语句行号 |
USysdepMalloc | 动态内存申请 |
USysdepFree | 动态内存释放 |
USysdepMutexInit | 创建互斥锁 |
USysdepMutexLock | 加锁互斥锁 |
USysdepMutexUnlock | 解锁互斥锁 |
USysdepMutexDeinit | 释放互斥锁 |
USysdepSleep | 睡眠指定的毫秒数 |
UAbilityExBaseInit | 接入层规定的基础外部能力初始化接口 |
UAbilityExBaseDeinit | 接入层规定的基础外部能力反初始化接口 |
l 回调函数结构体
typedef struct _UAbilityExBase {
UAbilityExBaseLogout logout; // 日志
UAbilityExBaseReadULC read_ulc; // ulc文件读取
UAbilityExBaseLineNumberChange line_number_change; // 通知语句行号变化
/***************** 所有内部模块都需要的回调 *****************/
/***************** 并提供给所有外部能力共用 *****************/
USysdepMalloc malloc; // 动态申请内存
USysdepFree free; // 释放内存
USysdepMutexInit mutex_new; //创建互斥锁
USysdepMutexLock mutex_lock; //加锁互斥锁
USysdepMutexUnlock mutex_unlock; //解锁互斥锁
USysdepMutexDeinit mutex_free; //释放互斥锁
// 睡眠指定的毫秒数
USysdepSleep sleep;
UAbilityExBaseInit init; // 基本外部能力初始化
UAbilityExBaseDeinit deinit; // 基本外部能力反初始化
}UAbilityExBase;
该函数结构体用于存储上述所有回调函数接口实现的容器,该结构体作为商用虚拟机提供的设置鉴权外部能力接口u_biz_vm_ability_ex_set_base的参数被设置。(详见1.3.1)
l 函数
名称 | 描述 |
UAbilityExAuthAuthorize | 鉴权 |
UAbilityExAuthCallbackSetCoreEx | 接入层规定的将自身-核心扩展相关能力注册给外部能力的接口 |
UAbilityExAuthInit | 接入层规定的鉴权外部能力初始化接口 |
UAbilityExAuthDeinit | 接入层规定的鉴权外部能力反初始化接口 |
l 回调函数结构体
typedef struct _UAbilityExAuth {
UAbilityExAuthAuthorize authorize; //鉴权
UAbilityExAuthCallbackSetCoreEx set_access_core_ex_cb; // 设置接入层扩展功能回调
UAbilityExAuthInit init; // 虚拟机管理外部能力初始化
UAbilityExAuthDeinit deinit; // 虚拟机管理外部能力反初始化
} UAbilityExAuth;
该函数结构体用于存储上述所有回调函数接口实现的容器,该结构体作为商用虚拟机提供的设置鉴权外部能力接口u_biz_vm_ability_ex_set_auth的参数被设置。(详见1.3.1)
l 函数
名称 | 描述 |
UAbilityExDriverMgrAppFun | 应用函数入口 |
UAbilityExDriverMgrGetVar | 向应用获取变量值 |
UAbilityExDriverMgrSetVar | 向应用设置变量值 |
UAbilityExDriverMgrVarGetKey | 依据变量id从配置表中获取变量key |
UAbilityExDriverMgrVarGetId | 依据变量key从配置表中获取变量id |
UAbilityExDriverMgrFunGetKey | 依据函数id从配置表中获取函数key |
UAbilityExDriverMgrFunGetId | 依据函数key从配置表中获取函数id |
UAbilityExDriverMgrCallbackSetCoreEx | 接入层规定的将自身-核心扩展相关能力注册给外部能力的接口 |
UAbilityExDriverMgrInit | 接入层规定的驱动管理器外部能力初始化接口 |
UAbilityExDriverMgrDeinit | 接入层规定的驱动管理器外部能力反初始化接口 |
l 相关回调函数的结构体
typedef struct _UAbilityExDriverMgr {
UAbilityExDriverMgrAppFun appfun; // 应用函数入口
UAbilityExDriverMgrGetVar getvar; // 获取变量值
UAbilityExDriverMgrSetVar setvar; // 设置变量值
UAbilityExDriverMgrVarGetKey var_get_key; // 依据变量id获取变量key
UAbilityExDriverMgrVarGetId var_get_id; // 依据变量key获取变量id
UAbilityExDriverMgrFunGetKey fun_get_key; // 依据函数id获取函数key
UAbilityExDriverMgrFunGetId fun_get_id; // 依据函数key获取函数id
UAbilityExDriverMgrCallbackSetCoreEx set_access_core_ex_cb;// 设置接入层核心扩展功能回调
UAbilityExDriverMgrInit init; // 驱动管理器外部能力初始化
UAbilityExDriverMgrDeinit deinit; // 驱动管理器外部能力反初始化
}UAbilityExDriverMgr;
上面的函数结构体用于存储上述所有回调函数接口实现的容器,该结构体作为商用虚拟机提供的设置鉴权外部能力接口u_biz_vm_ability_ex_set_driver_mgr的参数被设置。(详见1.3.1)
l 函数
名称 | 描述 |
UAbilityExVmMgrPostEvent | 发送事件 |
UAbilityExVmMgrGetVmId | 获取虚拟机id |
UAbilityExVmMgrCallbackSetCore | 接入层规定的将自身-核心能力注册给外部能力的接口 |
UAbilityExVmMgrCallbackSetCoreEx | 接入层规定的将自身-核心扩展相关能力注册给外部能力的接口 |
UAbilityExVmMgrInit | 接入层规定的虚拟机管理外部能力初始化接口 |
UAbilityExVmMgrDeinit | 接入层规定的虚拟机管理外部能力反初始化接口 |
l 函数相关的结构体
typedef struct _UAbilityExVmMgr {
UAbilityExVmMgrPostEvent post_event; //发送事件
UAbilityExVmMgrGetVmId get_vm_id; //获取虚拟机id
UAbilityExVmMgrCallbackSetCore set_access_core_cb; // 设置接入层核心功能回调
UAbilityExVmMgrCallbackSetCoreEx set_access_core_ex_cb; // 设置接入层扩展功能回调
UAbilityExVmMgrInit init; // 虚拟机管理外部能力初始化
UAbilityExVmMgrDeinit deinit; // 虚拟机管理外部能力反初始化
} UAbilityExVmMgr;
上面的函数结构体用于存储上述所有回调函数接口实现的容器,该结构体作为商用虚拟机提供的设置鉴权外部能力接口u_biz_vm_ability_ex_set_vm_mgr的参数被设置。(详见1.3.1)
目前local-multi-vm-mgr插件中的回调函数优特云均提供了默认实现,用户无需自己实现。若想更进一步的了解该部分内容,可见
商用虚拟机C-SDK插件开发手册。
头文件名称 | 说明 |
./include/ability-ex/ability-ex-base.h | 基础外部能力插件中应用需要实现的回调函数接口头文件 |
./include/usysdep-def.h | 系统依赖头文件 |
无。
l 函数
名称 | 描述 |
UAbilityExBaseLogout | 日志输出 |
UAbilityExBaseReadULC | 读取ulc文件 |
UAbilityExBaseLineNumberChange | 通知改变语句行号 |
USysdepMalloc | 动态内存申请 |
USysdepFree | 动态内存释放 |
USysdepMutexInit | 创建互斥锁 |
USysdepMutexLock | 加锁互斥锁 |
USysdepMutexUnlock | 解锁互斥锁 |
USysdepMutexDeinit | 释放互斥锁 |
USysdepSleep | 睡眠指定的毫秒数 |
UAbilityExBaseInit | 接入层规定的基础外部能力初始化接口 |
UAbilityExBaseDeinit | 接入层规定的基础外部能力反初始化接口 |
l 回调函数结构体
typedef struct _UAbilityExBase {
UAbilityExBaseLogout logout; // 日志
UAbilityExBaseReadULC read_ulc; // ulc文件读取
UAbilityExBaseLineNumberChange line_number_change; // 通知语句行号变化
/***************** 所有内部模块都需要的回调 *****************/
/***************** 并提供给所有外部能力共用 *****************/
USysdepMalloc malloc; // 动态申请内存
USysdepFree free; // 释放内存
USysdepMutexInit mutex_new; //创建互斥锁
USysdepMutexLock mutex_lock; //加锁互斥锁
USysdepMutexUnlock mutex_unlock; //解锁互斥锁
USysdepMutexDeinit mutex_free; //释放互斥锁
// 睡眠指定的毫秒数
USysdepSleep sleep;
UAbilityExBaseInit init; // 基本外部能力初始化
UAbilityExBaseDeinit deinit; // 基本外部能力反初始化
}UAbilityExBase;
该函数结构体用于存储上述所有回调函数接口实现的容器,该结构体作为商用虚拟机提供的设置基础外部能力接口u_biz_vm_ability_ex_set_base的参数进行设置。(详见1.3.1)
日志输出回调函数UAbilityExBaseLogout是指令计算器的整个生命周期中都会使用的回调函数
l 接口定义
typedef void(*UAbilityExBaseLogout)(const char* pTag, const char* pStr, ULogLevel iLevel);
l 输入参数
参数名称 | 参数说明 | 备注 |
pTag | 组件标签 | |
pStr | 日志内容 | |
iLevel | 日志优先级 | |
ULogLevel是商用虚拟机提供的上述日志等级的枚举值
typedef enum _ULogLevel
{
U_LOG_LEVEL_DEBUG = 0, // 自动测试的等级
U_LOG_LEVEL_INFO = 1, //
U_LOG_LEVEL_WARN = 2, // 警告的优先级
U_LOG_LEVEL_ERROR = 3 // 错误的优先级
}ULogLevel;
l 返回值
操作成功/失败
l 示例
///日志代理
void UAbilityExBaseLogout_impl(const char* pTag, const char* pStr, ULogLevel iLevel)
{
printf("[%d][%s]:%s\n", iLevel, pTag, pStr);
}
读取ulc文件回调函数
l 接口定义
typedef bool(*UAbilityExBaseReadULC)(const char* pCtxId, uint32_t iOffset, uint32_t iLen, char* pRetStr);
l 输入参数
参数名称 | 参数说明 | 备注 |
pCtxId | 虚拟机上下文 | 查阅u_biz_vm_create |
iOffset | 偏移量 | |
iLen | 读取长度 | |
l 输出参数
l 返回值
操作成功/失败
l 示例
bool UAbilityExBaseReadULC_impl(const char* pCtxId, uint32_t iOffset, uint32_t iLen, char* pRetStr)
{
//TODO
return true
}
通知改变语句行号回调函数
l 接口定义
typedef void(*UAbilityExBaseLineNumberChange)(uint32_t iVmId, uint32_t iLineNO);
l 输入参数
参数名称 | 参数说明 | 备注 |
iVmId | 虚拟机id | |
iLineNO | 执行到的行号 | |
l 返回值
无
l 示例
void UAbilityExBaseLineNumberChange_impl(uint32_t iVmId, uint32_t iLineNO);
{
printf("%d,%d", iVmld, iLineNo);
return;
}
动态内存申请回调函数
l 接口定义
typedef void*(*USysdepMalloc)(size_t iSize);
l 输入参数
l 返回值
内存地址
l 示例
void* USysdepMalloc_impl(size_t iSize)
{
return malloc(iSize);
}
动态内存释放回调函数
l 接口定义
typedef void(*USysdepFree)(void* pMemory);
l 输入参数
l 返回值
无
l 示例
void USysdepFree_impl(void* pMemory)
{
if(pMemory == NULL)
return;
free(pMemory);
}
创建互斥锁回调函数
l 接口定义
typedef bool(*USysdepMutexInit)(void** ppMutex);
l 输出参数
注意:该函数为回调函数,应用在实现回调函数时,对于应用而言ppMutex为输入参数,但ppMutex的生命周期是由引擎内部管理的,因此实际上对于使用该回调的引擎/程序而言为输出参数。
l 返回值
成功/失败
l 示例
//Demo
bool USysdepMutexInit_impl(void** ppMutex)
{
pthread_mutex_t* pMutex = (pthread_mutex_t*)calloc(1, sizeof(pthread_mutex_t));//申请内存
int ret = pthread_mutex_init(pMutex , NULL);
if(ret != 0)
{
free(pMutex); //释放内存
return false;
}
*ppMutext = pMutex;
return true;
}
加锁互斥锁回调函数
l 接口定义
typedef bool(*USysdepMutexLock)(void* pMutex);
l 输入参数
l 返回值
成功/失败
l 示例
bool USysdepMutexLock_impl(void* pMutex)
{
if(pMutex == NULL)
return false;
pthread_mutex_t* mutex = (pthread_mutex_t*)pMutex;
return 0 == pthread_mutex_lock(mutex);
}
解锁互斥锁回调函数
l 接口定义
typedef bool(*USysdepMutexUnlock)(void* pMutex);
l 输入参数
l 返回值
成功/失败
l 示例
bool USysdepMutexUnlock_impl(void* pMutex)
{
if(!pMutex)
return false;
pthread_mutex_t* mutex = (pthread_mutex_t*)pMutex;
return 0 == pthread_mutex_unlock(mutex);
}
释放互斥锁回调函数
l 接口定义
typedef bool(*USysdepMutexDeinit)(void** ppMutex);
l 输出参数
注意:该函数为回调函数,应用在实现回调函数时,对于应用而言ppMutex为输入参数,但ppMutex的生命周期是由引擎内部管理的,因此实际上对于使用该回调的引擎/程序而言为输出参数。
l 返回值
成功/失败
l 示例
bool USysdepMutexDeinit_impl(void** ppMutex)
{
if(!ppMutex || !*ppMutex)
return false;
pMutex = (pthread_mutex_t*)*ppMutex;
if(0 == pthread_mutex_destroy(pMutex))
{
free(pMutex)
*ppMutex = NULL
return true;
}
return false;
}
定时睡眠回调函数
l 接口定义
typedef void (*USysdepSleep)(uint64_t iMillSecond);
l 输入参数
参数名称 | 参数说明 | 备注 |
iMillSecond | 需要休眠的毫秒数 | |
l 返回值
无
l 示例
void USysdepSleep_impl(uint64_t iMillSecond)
{
Sleep(iMillSecond);
}
接入层规定的基础外部能力初始化回调函数,在商用虚拟机初始化时调用该回调
l 接口定义
typedef bool(*UAbilityExBaseInit)(int* pErrCode);
l 输出参数
注意:该函数中产生的错误码会返回给引擎中调用该回调的上一级函数,然后传递到调用链最外层的函数。
l 返回值
成功/失败
l 示例
bool UAbilityExBaseInit_impl(int* pErrCode)
{
//TODO INIT
return true;
}
接入层规定的基础外部能力反初始化回调函数,在商用虚拟机反初始化时调用该回调
l 接口定义
typedef void(*UAbilityExBaseDeinit)(void);
l 返回值
无
l 示例
void UAbilityExBaseDeinit_impl()
{
//TODO
}
优特云提供的外部能力实现之一:本地鉴权插件。
./include/ability-ex/ability-ex-auth.h | -鉴权外部能力插件中应用需要实现的回调函数接口头文件 |
./include/local-auth/uability-auth-impl.h | 鉴权外部能力插件提供的接口头文件 |
./include/local-auth/uability-auth-error.h | 鉴权外部能力插件错误码头文件 |
./include/local-auth/uability-auth-macros | 鉴权外部能力插件基础宏头文件 |
3.2.1.local-auth提供的接口(uability-auth-impl.h)
l 函数
名称 | 描述 |
u_auth_get_ability | 获取鉴权的能力 |
获取鉴权的能力
l 接口定义
const UAbilityExAuth* u_auth_get_ability(void);
l 返回值
鉴权的能力,一个函数结构体。
该结构体包含了鉴权外部模块所有回调函数,具体结构体定义如下:
typedef struct _UAbilityExAuth {
UAbilityExAuthAuthorize authorize; //鉴权
UAbilityExAuthCallbackSetCoreEx set_access_core_ex_cb; // 设置接入层扩展功能回调
UAbilityExAuthInit init; // 虚拟机管理外部能力初始化
UAbilityExAuthDeinit deinit; // 虚拟机管理外部能力反初始化
} UAbilityExAuth;
l 示例
...
const UAbilityExAuth* pAbilityExAuth = u_auth_get_ability();
u_biz_vm_ability_ex_set_auth(pAbilityExAuth);//商用虚拟机提供的接口,设置鉴权外部能力
...
l 函数
名称 | 描述 |
UAbilityExAuthAuthorize | 鉴权 |
UAbilityExAuthCallbackSetCoreEx | 接入层规定的将自身-核心扩展相关能力注册给外部能力的接口 |
UAbilityExAuthInit | 接入层规定的鉴权外部能力初始化接口 |
UAbilityExAuthDeinit | 接入层规定的鉴权外部能力反初始化接口 |
l 回调函数结构体
该函数结构体用于存储上述所有回调函数接口实现的容器,该结构体作为商用虚拟机提供的设置鉴权外部能力接口u_biz_vm_ability_ex_set_auth的参数被设置。(详见1.3.1)
鉴权回调函数
l 接口定义
typedef bool(*UAbilityExAuthAuthorize)(const char* pSecret,
const char* pRandomKey, char** ppExecuteCode, size_t* pCodeSize, int* pErrCode);
l 输入参数
参数名称 | 参数说明 | 备注 |
pSecret | 密钥 | |
pRandomKey | 随机码 | |
l 输出参数
参数名称 | 参数说明 | 备注 |
ppExecuteCode | 执行码 | |
pCodeSize | 执行码长度 | |
pErrCode | 错误码 | |
l 返回值
成功/失败
l 示例
用户无需实现
接入层规定的将自身-核心扩展相关能力注册给外部能力的回调接口
l 接口定义
typedef void(*UAbilityExAuthCallbackSetCoreEx)(const UVmAccessCoreEx * pAccessCoreEx);
l 输入参数
参数名称 | 参数说明 | 备注 |
pAccessCoreEx | 接入层核心扩展能力 | |
UVmAccessCoreEx定义如下,为存储接入层-核心扩展相关能力的容器
typedef struct _UVmAccessCoreEx {
/************ 由基础外部能力注入 ************/
UAbilityExLogout logout; // 日志
USysdepMalloc malloc; // 动态申请内存
USysdepFree free; // 释放内存
USysdepMutexInit mutex_new; //创建互斥锁
USysdepMutexLock mutex_lock; //加锁互斥锁
USysdepMutexUnlock mutex_unlock; //解锁互斥锁
USysdepMutexDeinit mutex_free; //释放互斥锁
USysdepSleep sleep; // 休眠(毫秒)
/************* 由虚拟机管理外部能力注入 *************/
UAbilityExPostEvent post_event_ex;
/************* 由驱动管理外部能力注入(如果为NULL(允许),说明应用没有实现该功能) *************/
UAbilityExVarGetKey var_get_key_ex; // 依据变量id获取变量key
UAbilityExVarGetId var_get_id_ex; // 依据变量key获取变量id
UAbilityExFunGetKey fun_get_key_ex; // 依据函数id获取函数key
UAbilityExFunGetId fun_get_id_ex; // 依据函数key获取函数id
}UVmAccessCoreEx;
l 返回值
无
l 示例
用户无需实现
接入层规定的鉴权外部能力初始化回调函数
l 接口定义
typedef bool(*UAbilityExAuthInit)(int* pErrCode);
l 输出参数
l 返回值
成功/失败
l 示例
无
接入层规定的鉴权外部能力反初始化回调函数
l 接口定义
typedef void(*UAbilityExAuthDeinit)(void);
l 返回值
无
l 示例
用户无需实现
优特云提供的外部能力实现之一:本地基础驱动管理插件。
./include/ability-ex/ability-ex-driver-mgr.h | 驱动管理外部能力插件中应用需要实现的回调函数接口头文件 |
./include/local-basic-driver-mgr/uability-driver-mgr-impl.h | 驱动管理外部能力插件提供的接口头文件 |
./include/local-basic-driver-mgr/uability-driver-mgr-error.h | 驱动管理外部能力插件错误码头文件 |
./include/local-basic-driver-mgr/uability-driver-mgr-macros.h | 驱动管理外部能力插件基础宏头文件 |
优特云已经实现驱动管理外部能力的所有功能。可通过接口u_driver_mgr_get_ability()获取。
l 函数
名称 | 描述 |
u_driver_mgr_set_ability_executor | 应用注入的执行回调实现 |
u_driver_mgr_set_ability_idkey | 应用注入的id与key转换回调实现 |
u_driver_mgr_get_ability | 获取驱动管理器的能力 |
u_driver_mgr_post_event | 发送事件 |
应用注入的执行回调实现接口,相应参数类型的回调函数会在4.2.2详细说明。
l 接口定义
bool u_driver_mgr_set_ability_executor(UAbilityExDriverMgrAppFun appfun,
UAbilityExDriverMgrGetVar getvar, UAbilityExDriverMgrSetVar setvar);
``
l 输入参数
参数名称 | 参数说明 | 备注 |
appfun | 应用函数入口回调函数(函数指针) | 协议X(此时刚好是协议1) |
getvar | 向应用获取变量值回调函数(函数指针) | 协议X(此时刚好是协议1) |
setvar | 向应用设置变量值回调函数(函数指针) | 协议X(此时刚好是协议1) |
l 返回值
成功/失败
注意:该函数必须要在u_driver_mgr_get_ability前调用,否则不生效(u_driver_mgr_get_ability将在4.2.1.3详细介绍)
l 示例
bool UAbilityExDriverMgrAppFun_impl(uint32_t iVmId, const char* pFunKey, const UObject** ppParams, int32_t iParamsNum, UObject** ppRetData)
{
//函数实现见4.2.2.1
}
bool UAbilityExDriverMgrGetVar_impl(uint32_t iVmId, const char* pVarKey, UObject** ppVal)
{
//函数实现见4.2.2.2
}
bool UAbilityExDriverMgrSetVar_impl(uint32_t iVmId, const char* pVarKey, const UObject* pVal)
{
//函数实现见4.2.2.3
}
{
...
u_driver_mgr_set_ability_executor(UAbilityExDriverMgrAppFun_impl, UAbilityExDriverMgrGetVar_impl, UAbilityExDriverMgrSetVar_impl);
const UAbilityExDriverMgr* pAbilityExDriverMgr = u_driver_mgr_get_ability();
u_biz_vm_ability_ex_set_driver_mgr(pAbilityExDriverMgr);
...
}
应用注入的id与key转换回调实现接口,相应参数类型的回调函数会在4.2.2详细说明。
l 接口定义
bool u_driver_mgr_set_ability_idkey(
UAbilityExDriverMgrVarGetKey var_get_key, UAbilityExDriverMgrVarGetId var_get_id,
UAbilityExDriverMgrFunGetKey fun_get_key, UAbilityExDriverMgrFunGetId fun_get_id);
l 输入参数
参数名称 | 参数说明 | 备注 |
var_get_key | 依据变量id获取变量key回调函数(函数指针) | |
var_get_id | 依据变量key获取变量id回调函数(函数指针) | |
fun_get_key | 依据函数id获取函数key回调函数(函数指针) | |
fun_get_id | 依据函数key获取函数id回调函数(函数指针) | |
l 返回值
成功/失败
注意:该函数必须要在u_driver_mgr_get_ability前调用,否则不生效(u_driver_mgr_get_ability将在4.2.1.3详细介绍)。
l 示例
const char* UAbilityExDriverMgrVarGetKey_impl(uint32_t iVmId, int32_t id)
{
//具体实现见4.2.2.4
}
int32_t UAbilityExDriverMgrVarGetId_impl(uint32_t iVmId, const char* key)
{
//具体实现见4.2.2.5
}
const char* UAbilityExDriverMgrFunGetKey_impl(uint32_t iVmId, int32_t id)
{
//具体实现见4.2.2.6
}
int32_t UAbilityExDriverMgrFunGetId_impl(uint32_t iVmId, const char* key)
{
//具体实现见4.2.2.7
}
{
...
u_driver_mgr_set_ability_idkey(UAbilityExDriverMgrVarGetKey_impl, UAbilityExDriverMgrVarGetId_impl, UAbilityExDriverMgrFunGetKey_impl, UAbilityExDriverMgrFunGetId_impl);
//获取驱动管理外部能力
const UAbilityExDriverMgr* pAbilityExDriverMgr = u_driver_mgr_get_ability();
//设置驱动管理外部能力
u_biz_vm_ability_ex_set_driver_mgr(pAbilityExDriverMgr);
...
}
获取驱动管理器的能力接口
l 接口定义
const UAbilityExDriverMgr* u_driver_mgr_get_ability(void);
l 返回值
驱动管理能力结构体
该结构体包含了驱动管理外部模块所有回调函数,具体结构体定义如下:
typedef struct _UAbilityExDriverMgr {
UAbilityExDriverMgrAppFun appfun; // 应用函数入口
UAbilityExDriverMgrGetVar getvar; // 获取变量值
UAbilityExDriverMgrSetVar setvar; // 设置变量值
UAbilityExDriverMgrVarGetKey var_get_key; // 依据变量id获取变量key
UAbilityExDriverMgrVarGetId var_get_id; // 依据变量key获取变量id
UAbilityExDriverMgrFunGetKey fun_get_key; // 依据函数id获取函数key
UAbilityExDriverMgrFunGetId fun_get_id; // 依据函数key获取函数id
UAbilityExDriverMgrCallbackSetCoreEx set_access_core_ex_cb;// 设置接入层核心扩展功能回调
UAbilityExDriverMgrInit init; // 驱动管理器外部能力初始化
UAbilityExDriverMgrDeinit deinit; // 驱动管理器外部能力反初始化
}UAbilityExDriverMgr;
l 示例
...
//获取驱动管理外部能力
const UAbilityExDriverMgr* pAbilityExDriverMgr = u_driver_mgr_get_ability();
//设置驱动管理外部能力
u_biz_vm_ability_ex_set_driver_mgr(pAbilityExDriverMgr);
...
发送事件接口
l 接口定义
bool u_driver_mgr_post_event(uint32_t iVmId, const char** ppVarKeys,
const UObject** ppVarValues, size_t iVarSize, int* pErrCode);
l 输入参数
参数名称 | 参数说明 | 备注 |
iVmId | 虚拟机id | |
ppVarKeys | 变量key列表 | |
ppVarValues | 变量值列表 | |
iVarSize | 变量个数 | |
l 输出参数
l 返回值
成功/失败
l 示例
...
int iErrCode = 0;
bool bRet = false;
// 构造事件数据
char** ppVarKeys = calloc(2, sizeof(void*));
UObject** ppVarValues = calloc(2, sizeof(void*));
ppVarKeys[0] = "varInt8Key";
ppVarValues[0] = u_object_new_int8(1);
ppVarKeys[1] = "varStringKey";
ppVarValues[1] = u_object_new_string("1");
// 发送事件
bRet = u_driver_mgr_post_event(iVmId, ppVarKeys, ppVarValues, 2, false, &iErrCode);
assert_true(bRet == bExpectRet);
...
l 函数
名称 | 描述 |
UAbilityExDriverMgrAppFun | 应用函数入口 |
UAbilityExDriverMgrGetVar | 向应用获取变量值 |
UAbilityExDriverMgrSetVar | 向应用设置变量值 |
UAbilityExDriverMgrVarGetKey | 依据变量id从配置表中获取变量key |
UAbilityExDriverMgrVarGetId | 依据变量key从配置表中获取变量id |
UAbilityExDriverMgrFunGetKey | 依据函数id从配置表中获取函数key |
UAbilityExDriverMgrFunGetId | 依据函数key从配置表中获取函数id |
UAbilityExDriverMgrCallbackSetCoreEx | 接入层规定的将自身-核心扩展相关能力注册给外部能力的接口 |
UAbilityExDriverMgrInit | 接入层规定的驱动管理器外部能力初始化接口 |
UAbilityExDriverMgrDeinit | 接入层规定的驱动管理器外部能力反初始化接口 |
l 相关回调函数的结构体
typedef struct _UAbilityExDriverMgr {
UAbilityExDriverMgrAppFun appfun; // 应用函数入口
UAbilityExDriverMgrGetVar getvar; // 获取变量值
UAbilityExDriverMgrSetVar setvar; // 设置变量值
UAbilityExDriverMgrVarGetKey var_get_key; // 依据变量id获取变量key
UAbilityExDriverMgrVarGetId var_get_id; // 依据变量key获取变量id
UAbilityExDriverMgrFunGetKey fun_get_key; // 依据函数id获取函数key
UAbilityExDriverMgrFunGetId fun_get_id; // 依据函数key获取函数id
UAbilityExDriverMgrCallbackSetCoreEx set_access_core_ex_cb;// 设置接入层核心扩展功能回调
UAbilityExDriverMgrInit init; // 驱动管理器外部能力初始化
UAbilityExDriverMgrDeinit deinit; // 驱动管理器外部能力反初始化
}UAbilityExDriverMgr;
上面的函数结构体用于存储上述所有回调函数接口实现的容器,该结构体作为商用虚拟机提供的设置鉴权外部能力接口u_biz_vm_ability_ex_set_driver_mgr的参数被设置。(详见1.3.1)
作为应用函数入口的回调函数,当商用虚拟机执行到对应函数时,会调用此回调,告诉应用现在正在执行的函数的相关信息 。
l 接口定义
typedef bool(*UAbilityExDriverMgrAppFun)(uint32_t iVmId, const char* pFunKey,
const UObject** ppParams, int32_t iParamsNum, UObject** ppRetData);
l 输入参数
参数名称 | 参数说明 | 备注 |
iVmId | 虚拟机id | |
pFunKey | 函数key,用户语言中函数的唯一标识 | |
ppParams | 函数参数 | |
iParamsNum | 函数参数个数 | |
l 输出参数
参数名称 | 参数说明 | 备注 |
ppRetData | 函数返回值,用户语言中定义的函数的返回值 | |
l 返回值
成功/失败
l 示例
/**
以下面的函数表为例
<<函数表>>
函数名称 | 参数列表 | 返回值类型 | 唯一标识 | 参数值描述
funInt8 | int8 | int8 | funInt8Key |
funString | string | string | funStringKey |
**/
int g_iVarInt8
bool UAbilityExDriverMgrAppFun_impl(uint32_t iVmId, const char* pFunKey, const UObject** ppParams, int32_t iParamsNum, UObject** ppRetData)
{
//根据函数唯一标识,返回对应的值
if (0 == strcmp(pFunKey, "funInt8Key"))
{
*ppRetData = u_object_new_int8(1);;//生成对应类型数据
}
else if (0 == strcmp(pFunKey, "funStringKey"))
{
*ppRetData = u_object_new_string("1");
}
else
{
return false;
}
return true;
}
该回调函数的目的在于告诉应用现在在执行哪个函数,pFunKey就代表了执行函数的唯一标识,ppParams代表了参数,iParamsNum就代表了参数个数,应用可以在此函数中作出所需的操作,此处只是示例。
向应用获取变量值
l 接口定义
typedef bool(*UAbilityExDriverMgrGetVar)(uint32_t iVmId, const char* pVarKey, UObject** ppVal);
l 输入参数
参数名称 | 参数说明 | 备注 |
iVmId | 虚拟机id | |
pFunKey | 变量key | |
l 输出参数
l 返回值
成功/失败
l 示例
/**
以下面的变量表为例
<<变量表>>
变量名称 | 数据类型 | 唯一标识 | 值描述
varInt8 | int8 | varInt8Key |
varString | string | varStringKey |
varInt8_2 | int8 | varInt8Key_2 |
**/
bool UAbilityExDriverMgrGetVar_impl(uint32_t iVmId, const char* pVarKey, UObject** ppVal)
{
//根据不同的唯一标识,设置不同的值,
if (0 == strcmp(pVarKey, "varInt8Key"))
{
*ppVal = u_object_new_int8(1);
}
else if (0 == strcmp(pVarKey, "varStringKey"))
{
*ppVal = u_object_new_string("1");
}
else if (0 == strcmp(pVarKey, "varInt8Key_2"))
{
*ppVal = u_object_new_int8(1);
}
else
{
*ppVal = 0;
return false;
}
return true;
}
向应用获取设置值
l 接口定义
typedef bool(*UAbilityExDriverMgrSetVar)(uint32_t iVmId, const char* pVarKey, const UObject* pVal);
l 输入参数
参数名称 | 参数说明 | 备注 |
iVmId | 虚拟机id | |
pFunKey | 变量key | |
pVal | 变量值 | |
l 返回值
成功/失败
l 示例
/**
以下面的函数表为例
<<函数表>>
函数名称 | 参数列表 | 返回值类型 | 唯一标识 | 参数值描述
funInt8 | int8 | int8 | funInt8Key |
funString | string | string | funStringKey |
**/
int g_iVarInt8SetVarCount = 0;
int g_iVarStringSetVarCount = 0;
bool UAbilityExDriverMgrSetVar_impl(uint32_t iVmId, const char* pVarKey, const UObject* pVal)
{
//根据唯一标识判断对应类型变量被执行(回调)的次数
if (0 == strcmp(pVarKey, "varInt8Key"))
{
++g_iVarInt8SetVarCount;
}
else if (0 == strcmp(pVarKey, "varStringKey"))
{
++g_iVarStringSetVarCount;
}
return true;
}
依据变量id从配置表中获取变量key
l 接口定义
typedef const char*(*UAbilityExDriverMgrVarGetKey)(uint32_t iVmId, int32_t id);
l 输入参数
参数名称 | 参数说明 | 备注 |
iVmId | 虚拟机id | |
id | 变量id,变量表的位置值。 | |
l 返回值
变量key
l 示例
/**
以下面的变量表为例
<<变量表>>
变量名称 | 数据类型 | 唯一标识 | 值描述
varInt8 | int8 | varInt8Key |
varString | string | varStringKey |
varInt8_2 | int8 | varInt8Key_2 |
**/
const char* UAbilityExDriverMgrVarGetKey_impl(uint32_t iVmId, int32_t id)
{
if (id == 0)
{
return "varInt8Key";
}
else if (id == 1)
{
return "varStringKey";
}
else if (id == 2)
{
return "varInt8Key_2";
}
else
{
return NULL;
}
}
依据变量key从配置表中获取变量id
l 接口定义
typedef int32_t(*UAbilityExDriverMgrVarGetId)(uint32_t iVmId, const char* key);
l 输入参数
参数名称 | 参数说明 | 备注 |
iVmId | 虚拟机id | |
key | 变量key | |
l 返回值
变量id,若小于0则代表失败
l 示例
/**
以下面的变量表为例
<<变量表>>
变量名称 | 数据类型 | 唯一标识 | 值描述
varInt8 | int8 | varInt8Key |
varString | string | varStringKey |
varInt8_2 | int8 | varInt8Key_2 |
**/
int32_t UAbilityExDriverMgrVarGetId_impl(uint32_t iVmId, const char* key)
{
if (0 == strcmp(key, "varInt8Key"))
{
return 0;
}
else if (0 == strcmp(key, "varStringKey"))
{
return 1;
}
else if (0 == strcmp(key, "varInt8Key_2"))
{
return 2;
}
else
{
return -1;
}
}
依据函数id从配置表中获取函数key
l 接口定义
typedef const char*(*UAbilityExDriverMgrFunGetKey)(uint32_t iVmId, int32_t id);
l 输入参数
参数名称 | 参数说明 | 备注 |
iVmId | 虚拟机id | |
id | 函数id | |
l 返回值
函数key
l 示例
const char* UAbilityExDriverMgrFunGetKey_impl(uint32_t iVmId, int32_t id)
{
if (id == 0)
{
return "funInt8Key";
}
else if (id == 1)
{
return "funStringKey";
}
else
{
return NULL;
}
}
依据函数key从配置表中获取函数id
l 接口定义
typedef int32_t(*UAbilityExDriverMgrFunGetId)(uint32_t iVmId, const char* key);
l 输入参数
参数名称 | 参数说明 | 备注 |
iVmId | 虚拟机id | |
key | 函数key | |
l 返回值
函数id,小于0:失败
l 示例
/**
以下面的函数表为例:
<<函数表>>
函数名称 | 参数列表 | 返回值类型 | 唯一标识 | 参数值描述
funInt8 | int8 | int8 | funInt8Key |
funString | string | string | funStringKey |
**/
int32_t UAbilityExDriverMgrFunGetId_impl(uint32_t iVmId, const char* key)
{
if (0 == strcmp(key, "funInt8Key"))
{
return 0;
}
else if (0 == strcmp(key, "funStringKey"))
{
return 1;
}
else
{
return -1;
}
}
接入层规定的将自身-核心扩展相关能力注册给外部能力的接口
l 接口定义
typedef void(*UAbilityExDriverMgrCallbackSetCoreEx)(const UVmAccessCoreEx * pAccessCoreEx);
l 输入参数
参数名称 | 参数说明 | 备注 |
pAccessCoreEx | 接入层核心扩展能力 | UVmAccessCoreEx定义 |
UVmAccessCoreEx定义如下,为存储接入层-核心扩展相关能力的容器
typedef struct _UVmAccessCoreEx {
/************ 由基础外部能力注入 ************/
UAbilityExLogout logout; // 日志
USysdepMalloc malloc; // 动态申请内存
USysdepFree free; // 释放内存
USysdepMutexInit mutex_new; //创建互斥锁
USysdepMutexLock mutex_lock; //加锁互斥锁
USysdepMutexUnlock mutex_unlock; //解锁互斥锁
USysdepMutexDeinit mutex_free; //释放互斥锁
USysdepSleep sleep; // 休眠(毫秒)
/************* 由虚拟机管理外部能力注入 *************/
UAbilityExPostEvent post_event_ex;
/************* 由驱动管理外部能力注入(如果为NULL(允许),说明应用没有实现该功能) *************/
UAbilityExVarGetKey var_get_key_ex; // 依据变量id获取变量key
UAbilityExVarGetId var_get_id_ex; // 依据变量key获取变量id
UAbilityExFunGetKey fun_get_key_ex; // 依据函数id获取函数key
UAbilityExFunGetId fun_get_id_ex; // 依据函数key获取函数id
}UVmAccessCoreEx;
l 返回值
无
l 示例
用户无需自己实现
接入层规定的驱动管理器外部能力初始化接口
l 接口定义
typedef bool(*UAbilityExDriverMgrInit)( int* pErrCode);
l 输出参数
l 返回值
成功/失败
UAbilityExDriverMgrDeinit
l 接口定义
typedef void(*UAbilityExDriverMgrDeinit)(void);
l 返回值
无
l 示例
用户无需自己实现
优特云提供的外部能力实现之一:本地多虚拟机管理插件。
./include/ability-ex/ability-ex-vm-mgr.h | 商用虚拟机插件-虚拟机管理外部能力插件中应用需要实现的回调函数接口头文件 |
./include/local-multi-vm-mgr/uability-vm-mgr-impl.h | 虚拟机管理外部能力插件提供的接口头文件 |
./include/local-multi-vm-mgr/uability-vm-mgr-error.h | 虚拟机管理外部能力插件错误码头文件
|
./include/local-multi-vm-mgr/uability-vm-mgr-macros.h | 虚拟机管理外部能力插件基础宏的头文件 |
l 函数
名称 | 描述 |
u_vm_mgr_get_ability | 获取虚拟机管理的能力 |
u_vm_mgr_create_vm | 创建虚拟机 |
u_vm_mgr_free_vm | 销毁虚拟机 |
u_vm_mgr_pause_vm | 暂停虚拟机 |
u_vm_mgr_resume_vm | 恢复虚拟机 |
获取虚拟机管理的能力
l 接口定义
const UAbilityExVmMgr* u_vm_mgr_get_ability(void);
l 返回值
虚拟机管理的能力
l 示例
const UAbilityExVmMgr* pAbilityExVmMgr = u_vm_mgr_get_ability();
创建虚拟机
l 接口定义
uint32_t u_vm_mgr_create_vm(const char* pCtxId, const char* pSecret, int32_t pErrCode);
l 输入参数
参数名称 | 参数说明 | 备注 |
pCtxId | 虚拟机上下文,用于区分ulc文件 | |
pSecret | 密钥 | |
l 输出参数
l 返回值
无
l 示例
#define SECRET "abcafwefaffeweyu"
int iErrCode = 0;
uint32_t iVmId1 = u_vm_mgr_create_vm("1", SECRET, &iErrCode)
销毁虚拟机
l 接口定义
void u_vm_mgr_free_vm(uint32_t iVmId, int* pErrCode);
l 输入参数
l 输出参数
l 返回值
无
l 示例
int errCode = 0;
void u_vm_mgr_free_vm(vmId, &errCode);
暂停虚拟机
l 接口定义
bool u_vm_mgr_pause_vm(uint32_t iVmId, int* pErrCode);
l 输入参数
l 输出参数
l 返回值
成功/失败
l 示例
int errCode = 0;
u_vm_mgr_pause_vm(vmmId, errCode);
恢复虚拟机
l 接口定义
bool u_vm_mgr_resume_vm(uint32_t iVmId, int* pErrCode);
l 输入参数
l 输出参数
l 返回值
成功/失败
l 示例
int errCode = 0;
u_vm_mgr_resume_vm(vmId, &errCode);
l 函数
名称 | 描述 |
UAbilityExVmMgrPostEvent | 发送事件 |
UAbilityExVmMgrGetVmId | 获取虚拟机id |
UAbilityExVmMgrCallbackSetCore | 接入层规定的将自身-核心能力注册给外部能力的接口 |
UAbilityExVmMgrCallbackSetCoreEx | 接入层规定的将自身-核心扩展相关能力注册给外部能力的接口 |
UAbilityExVmMgrInit | 接入层规定的虚拟机管理外部能力初始化接口 |
UAbilityExVmMgrDeinit | 接入层规定的虚拟机管理外部能力反初始化接口 |
l 函数相关的结构体
typedef struct _UAbilityExVmMgr {
UAbilityExVmMgrPostEvent post_event; //发送事件
UAbilityExVmMgrGetVmId get_vm_id; //获取虚拟机id
UAbilityExVmMgrCallbackSetCore set_access_core_cb; // 设置接入层核心功能回调
UAbilityExVmMgrCallbackSetCoreEx set_access_core_ex_cb; // 设置接入层扩展功能回调
UAbilityExVmMgrInit init; // 虚拟机管理外部能力初始化
UAbilityExVmMgrDeinit deinit; // 虚拟机管理外部能力反初始化
} UAbilityExVmMgr;
上面的函数结构体用于存储上述所有回调函数接口实现的容器,该结构体作为商用虚拟机提供的设置鉴权外部能力接口u_biz_vm_ability_ex_set_vm_mgr的参数被设置。(详见1.3.1)
发送事件
l 接口定义
typedef bool(*UAbilityExVmMgrPostEvent)(uint32_t iVmId, const char** ppVarKeys, const UObject** ppVarValues, size_t iVarSize,bool bTriggerInnerEvent, int* pErrCode);
l 输入参数
参数名称 | 参数说明 | 备注 |
iVmId | 上下文id | |
ppVarKeys | 变量key列表 | |
ppVarValues | 变量值列表 | |
iVarSize | 变量个数 | |
bTriggerInnerEvent | 是否触发内部事件 | |
l 输出参数
l 返回值
成功/失败
l 示例
用户无需实现
获取虚拟机id
l 接口定义
typedef uint32_t (*UAbilityExVmMgrGetVmId)(const UVM* pVM, int* pErrCode);
l 输入参数
l 输出参数
l 返回值
虚拟机id
l 示例
用户无需实现
接入层规定的将自身-核心能力注册给外部能力的接口
l 接口定义
typedef void(*UAbilityExVmMgrCallbackSetCore)(const UVmAccessCore* pAccessCore);
l 输入参数
参数名称 | 参数说明 | 备注 |
pAccessCore | 接入层核心能力 | UVmAccessCore定义 |
UVmAccessCore定义如下:
/******************* 存储接入层-核心相关能力的容器(商用虚拟机本身的能力) *******************/
typedef struct _UVmAccessCore {
/******************* 虚拟机相关的能力 **************************/
UVmAccessCoreVmCreate vm_create; //创建虚拟机
UVmAccessCoreVmGetUserdata vm_get_userdata; //获取用户数据
UVmAccessCoreVmPause vm_pause; //暂停虚拟机
UVmAccessCoreVmResume vm_resume; //恢复虚拟机
UVmAccessCoreVmFree vm_free; //释放虚拟机
UVmAccessCoreVmCtxNew vm_ctx_new; // 创建虚拟机执行上下文
UVmAccessCoreVmCtxFree vm_ctx_free; // 销毁虚拟机执行上下文
UVmAccessCoreVarCacheNew vm_var_cache_new; // 创建变量缓存,用于调用UVmAccessCoreVmEventPrepare后缓存的varKey、varId、var值、vm的关联关系,发送事件时使用。
UVmAccessCoreVarCacheFree vm_var_cache_free;// 释放变量缓存
UVmAccessCoreVmEventPrepare vm_event_prepare; //事件预处理,获取执行上下文
UVmAccessCoreVmEventPost vm_event_post; //向虚拟机发送事件
UVmAccessCoreVmVarlistUpdate vm_varlist_update; //向应用更新变量
/*********************** IKC相关的能力 ***********************/
UVmAccessCoreVarGetKey vm_var_get_key; // 依据变量id获取变量key
UVmAccessCoreVarGetId vm_var_get_id; // 依据变量key获取变量id
UVmAccessCoreFunGetKey vm_fun_get_key; // 依据函数id获取函数key
UVmAccessCoreFunGetId vm_fun_get_id; // 依据函数key获取函数id
/*************** 虚拟机工具方法相关的能力 **********************/
UVmAccessCoreVarlistNew varlist_new; //创建变量列表
UVmAccessCoreVarNew var_new; //创建变量信息
UVmAccessCoreVarlistAdd varlist_add; //追加变量到变量列表, 变量内存由变量列表管理
UVmAccessCoreVarlistFree varlist_free; //释放变量列表
UVmAccessCoreVmEventInfoListNew vm_event_info_list_new; //创建一个事件信息列表
UVmAccessCoreVmGetEventInfoList vm_get_event_info_list; //获取事件信息列表
UVmAccessCoreVmEventInfoListSize vm_event_info_list_size; //获取事件信息列表长度
UVmAccessCoreVmEventInfoListGetVarId vm_event_info_list_get_var_id; //获取事件信息列表中指定下表的变量id
UVmAccessCoreVmEventInfoListFree vm_event_info_list_free; //释放事件信息列表
}UVmAccessCore;
l 返回值
无
l 示例
用户无需实现
接入层规定的将自身-核心扩展相关能力注册给外部能力的接口
l 接口定义
UAbilityExVmMgrCallbackSetCoreEx
l 输入参数
参数名称 | 参数说明 | 备注 |
pAccessCoreEx | 接入层核心扩展能力 | UVmAccessCoreEx定义 |
UVmAccessCoreEx定义如下:
/******************* 存储接入层-核心扩展相关能力的容器 *******************/
typedef struct _UVmAccessCoreEx {
/************ 由基础外部能力注入 ************/
UAbilityExLogout logout; // 日志
USysdepMalloc malloc; // 动态申请内存
USysdepFree free; // 释放内存
USysdepMutexInit mutex_new; //创建互斥锁
USysdepMutexLock mutex_lock; //加锁互斥锁
USysdepMutexUnlock mutex_unlock; //解锁互斥锁
USysdepMutexDeinit mutex_free; //释放互斥锁
USysdepSleep sleep; // 休眠(毫秒)
/************* 由虚拟机管理外部能力注入 *************/
UAbilityExPostEvent post_event_ex;
/************* 由驱动管理外部能力注入(如果为NULL(允许),说明应用没有实现该功能) *************/
UAbilityExVarGetKey var_get_key_ex; // 依据变量id获取变量key
UAbilityExVarGetId var_get_id_ex; // 依据变量key获取变量id
UAbilityExFunGetKey fun_get_key_ex; // 依据函数id获取函数key
UAbilityExFunGetId fun_get_id_ex; // 依据函数key获取函数id
}UVmAccessCoreEx;
l 返回值
无
l 示例
用户无需实现
接入层规定的虚拟机管理外部能力初始化接口
l 接口定义
typedef bool(*UAbilityExVmMgrInit)(int* pErrCode);
l 输出参数
l 返回值
成功/失败
l 示例
用户无需实现
接入层规定的虚拟机管理外部能力反初始化接口
l 接口定义
typedef void(*UAbilityExVmMgrDeinit)(void);
l 返回值
无
l 示例
用户无需实现
以下我们通过1个简单的实例在linux系统展示CLI的使用。
将输入数据(见
商用虚拟机C-SDK使用示例相关内容)编译生成的ULC文件
down.ulc
保存到CLI所在路径下名为
ulc
的文件夹内,并将一并生成的CLI运行配置文件
cfg.json
保存到CLI所在路径。随后再CLI所在路径新增名为setting.ini的配置文件:
[SETTING]
#*****************************************************************
# 虚拟机运行配置
#*****************************************************************
# log 虚拟机日志文件(可选)。若不指定,默认使用当前路径下的log-default.txt文件。
log=log-default.txt
#*****************************************************************
# 本地基础驱动管理运行配置
#*****************************************************************
# driver-config 本地基础驱动配置文件(必选)。
driver-config=cfg.json
#*****************************************************************
# 本地鉴权(暨新鉴权模块-裁剪版)需要的配置
#*****************************************************************
# secret 密钥(必选)。申请使用本地鉴权时被分配的密钥。
secret=请向优特云申请鉴权密钥
然后我们开始使用CLI来运行这个上面的ULC文件,输出结果如下:
$ vm-biz
…
[cli][output]请输入要执行的命令!
CreateVm down1.ulc
[cli][info] 开始创建虚拟机实例!
[cli][info] 创建虚拟机实例, ulc:down1.ulc
[cli][info] 创建虚拟机实例成功!
[cli][info] 请输入要执行的命令!
SendEvent key1=1
[cli][info] 开始发送事件!
…
Hello World!
…
商用虚拟机CLI是一个命令行工具,可将软件位置注册到环境变量中,即可在任意路径下使用。命令格式如下:
其中options
是CLI支持的运行选项。
CLI启动运行后将进入命令行交互界面,交互指令格式如下:
其中cmd
是CLI交互界面支持的交互指令,args
为相应的交互参数。
分类 | 选项 | 缩写 | 选项说明 |
程序信息 | --help | -h | 显示工具的使用说明。 |
程序信息 | --version | -v | 显示工具的版本号,及所使用的商用虚拟机SDK的版本号。 |
虚拟机输入 | --secret=SECRET | -s | 鉴权使用的密钥。 |
虚拟机输入 | --driver-config=<FILE> | -c <FILE> | 指定本地驱动配置文件。 |
虚拟机输出 | --log=<FILE> | -o <FILE> | 指定虚拟机日志文件(若不指定,默认为log-default.txt)。 |
通过vm-biz
启动CLI后将进入CLI交互界面。交互界面可用的交互指令如下:
分类 | 命令 | 命令参数 | 参数说明 |
获取所有虚拟机 | ShowVm | 无 | |
创建虚拟机 | CreateVm | ulc文件名1,ulc文件名2,... | ulc文件需保存在当前路径下名为ulc的文件夹中,文件名之间用逗号分隔 |
销毁虚拟机 | DeleteVm | ulc文件名1,ulc文件名2,... | 通过ShowVm查询可销毁的虚拟机 |
事件触发 | SendEvent | 变量唯一标识=值,… | 每组需要使用逗号分隔 |
设置变量 | SetVar | 变量唯一标识=值,… | 每组需要使用逗号分隔 |
获取变量 | GetVar | 变量唯一标识 | |
获取语句行号 | GetLineNO | 无 | |
退出 | Quit | 无 | |
帮助 | Help | 无 | |
$ vm-biz --help
vm-biz [选项]...
选项:
程序信息:
-h, --help 显示工具的使用说明。
-v, --version 显示工具的版本号,及所使用的SDK的版本号。
虚拟机输入:
-S SECRECT, --secrect= SECRECT 鉴权使用的密钥。
-c FILE, --driver-config=FILE 指定本地驱动配置文件。
虚拟机输出:
-o <FILE>, --log=<FILE> 指定虚拟机日志文件(若不指定,默认为log-default.txt)。
$ vm-biz
[cli][output]请输入要执行的命令!
Help
相关命令:
获取所有虚拟机: ShowVm
创建虚拟机: CreateVm ulc文件名1,ulc文件名2,…
销毁虚拟机: DeleteVm ulc文件名1,ulc文件名2,…
事件触发: SendEvent 变量唯一标识1=值1,变量唯一标识2=值2,…
设置变量: SetVar 变量唯一标识1=值1,变量唯一标识2=值2,…
获取变量: GetVar 变量唯一标识
退出: Quit
帮助: Help
[cli][output]请输入要执行的命令!
SendEvent key1=1
[cli][output]开始发送事件!
…
[cli][output]请输入要执行的命令!
Quit
$ vm-biz -v
biz-vm cli [版本 1.01.00.01 ]
biz-vm sdk [版本 1.01.00.01 ]
local-auth sdk [版本 1.00.00.00 ]
local-basic-driver-mgr sdk [版本 1.00.00.00 ]
local-multi-vm-mgr sdk [版本 1.00.00.01 ]
Copyright @ 2022 All Rights Reserved 广东优特云科技有限公司版权所有
为了保证虚拟机的跨平台性及适用性,商用虚拟机的设计具有以下约束:
l 采用C99标准,仅链接标准C库(glibc),支持跨平台
l 系统接口适配,不直接依赖系统接口
商用虚拟机C-SDK已提供linux、windows、stm32f4xx等多个平台支持,并计划支持android、iOS、macOS、linux-cortex等平台。
#define U_BIZ_ERR_SUCCESS 0x0000 // 无错误
/**** 指令计算器(core)错误码段 0x1000-0x1FFF *****/
#define U_BIZ_ERR_CORE_INIT_GLOBAL 0x1000 // 全局回调注册出错
#define U_BIZ_ERR_CORE_INVALID_PARAM 0x1001 // 无效的入参
#define U_BIZ_ERR_CORE_PARSE_LOGIC 0x1002 // 解析逻辑数据出错
#define U_BIZ_ERR_CORE_EXECUTE_LOGIC 0x1003 // 逻辑数据执行出错
#define U_BIZ_ERR_CORE_GET_VAR 0x1100 // 获取变量出错
#define U_BIZ_ERR_CORE_SET_VAR 0x1101 // 设置变量出错
#define U_BIZ_ERR_CORE_CALL_FUN 0x1102 // 调用函数出错
#define U_BIZ_ERR_CORE_OTHER 0x1FFF // 其他错误
/**** 本地引擎(common)错误码段 0x2000-0x2FFF *****/
#define U_BIZ_ERR_STD_ERR_INIT_GLOBAL 0x2000 // 全局回调注册出错
#define U_BIZ_ERR_STD_ERR_INVALID_PARAM 0x2001 // 无效参数
#define U_BIZ_ERR_STD_ERR_READ_ULC 0x2002 // 读取ULC文件出错
#define U_BIZ_ERR_STD_ERR_INVALID_ULC 0x2003 // ULC文件内容无效
#define U_BIZ_ERR_STD_ERR_GET_LOGIC_DATA 0x2004 // 获取逻辑数据出错
#define U_BIZ_ERR_STD_ERR_VM_STATUS 0x2100 // 虚拟机处于暂停态,操作失败
#define U_BIZ_ERR_STD_GET_VAR 0x2200 // 获取变量出错
#define U_BIZ_ERR_STD_SET_VAR 0x2201 // 设置变量出错
#define U_BIZ_ERR_STD_CALL_FUN 0x2202 // 调用函数出错
#define U_BIZ_ERR_STD_ERR_NOT_INIT 0x2300 // 虚拟机全局资源未初始化
#define U_BIZ_ERR_STD_ERR_CB_HAL 0x2301 // 未设置HAL层回调
#define U_BIZ_ERR_STD_ERR_CB_EXEC 0x2302 // 未设置执行回调
#define U_BIZ_ERR_STD_ERR_CB_READULC 0x2303 // 未设置ulc读取回调
#define U_BIZ_ERR_STD_ERR_OTHER 0x2FFF // 其他错误
/**** 商业虚拟机 错误码段 0x3000-0x4FFF *****/
#define U_BIZ_ERR_ABILITY_NOT_INIT 0x3000 // 能力未初始化
#define U_BIZ_ERR_ABILITY_INIT_ERR 0x3001 // 能力初始化失败
#define U_BIZ_ERR_BASE_ABILITY_INVALD 0x3002 // 基础外部能力不完备
#define U_BIZ_ERR_VM_MGR_ABILITY_INVALD 0x3003 // 虚拟机管理外部能力不完备
#define U_BIZ_ERR_DRIVER_MGR_ABILITY_INVALD 0x3004 // 驱动管理外部能力不完备
#define U_BIZ_ERR_AUTH_ABILITY_INVALD 0x3005 // 鉴权外部能力不完备
#define U_BIZ_ERR_VM_INVALID_PARAM 0x3010 // 无效参数
#define U_BIZ_ERR_EXECUTE_CODE_ERR 0x3020 // 执行码错误
#define U_BIZ_ERR_OTHER_ERR 0x4FFF // 其他错误
/**** 驱动管理外部能力 错误码段 0x5000-0x5FFF *****/
#define U_DRIVER_MGR_ERR_NOT_INIT 0x5000 // 能力未初始化 0x6000
#define U_DRIVER_MGR_ERR_INIT 0x5001 // 能力初始化失败
//#define U_DRIVER_MGR_ERR_ACCESS_CORE_INVALD 0x5002 // 接入层核心功能不完备
#define U_DRIVER_MGR_ERR_ACCESS_EX_INVALD 0x5003 // 接入层扩展功能不完备
#define U_DRIVER_MGR_ERR_EXECUTE_CB 0x5010 // 执行回调无效
/**** 虚拟机管理外部能力 错误码段 0x6000-0x7FFF *****/
#define U_VM_MGR_ERR_NOT_INIT 0x6000 // 能力未初始化 0x6000
#define U_VM_MGR_ERR_INIT 0x6001 // 能力初始化失败
#define U_VM_MGR_ERR_ACCESS_CORE_INVALD 0x6002 // 接入层核心功能不完备
#define U_VM_MGR_ERR_ACCESS_EX_INVALD 0x6003 // 接入层扩展功能不完备
#define U_VM_MGR_ERR_INVALID_PARAM 0x6010 // 无效参数
#define U_VM_MGR_ERR_VM_NO_EXIST 0x6011 // 虚拟机不存在
#define U_VM_MGR_ERR_GET_VAR_KEY_ERR 0x6020 // 获取变量key失败
#define U_VM_MGR_ERR_GET_VAR_ID_ERR 0x6021 // 获取变量id失败
#define U_VM_MGR_ERR_GET_FUN_KEY_ERR 0x6022 // 获取函数key失败
#define U_VM_MGR_ERR_GET_FUN_ID_ERR 0x6023 // 获取函数id失败
#define U_VM_MGR_ERR_CREATE_VM_ERR 0x6100 // 创建虚拟机失败
/**** 鉴权外部能力 错误码段 0x8000-0x8FFF *****/
#define U_ABILITY_AUTH_ERR_NOT_INIT 0x8000 // 能力未初始化 0x6000
#define U_ABILITY_AUTH_ERR_INIT 0x8001 // 能力初始化失败
//#define U_ABILITY_AUTH_ERR_ACCESS_CORE_INVALD 0x8002 // 接入层核心功能不完备
#define U_ABILITY_AUTH_ERR_ACCESS_EX_INVALD 0x8003 // 接入层扩展功能不完备
/**** 鉴权模块 错误码段 0x9000-0x9FFF *****/
#define U_ABILITY_AUTH_ERR_BASE 0x9000
#define U_ABILITY_AUTH_ERR_PARAM_INVALID 0x9000 // 参数无效
#define U_ABILITY_AUTH_ERR_GLOBAL_INIT 0x9001 // 全局资源初始化失败
#define U_ABILITY_AUTH_ERR_GLOBAL_NOT_INIT 0x9002 // 全局资源未初始化
#define U_ABILITY_AUTH_ERR_ENCRYPT_RANDOMKEY 0x9003 // randomKey encrypt error
#define U_ABILITY_AUTH_ERR_CB_MEMORY 0x9010 // 未设置内存管理回调
#define U_ABILITY_AUTH_ERR_MALLOC 0x9401 // 动态内存申请失败
#define U_ABILITY_AUTH_OTHER_ERR 0x9FFF // 其它错误
虚拟机支持的数据类型与标准语言的数据类型及ULC字节码中的数据类型一致。
数据类型 | C语言数据类型映射 | 枚举值 |
void | void | 32 (0x20) |
int8 | char | 33 (0x21) |
int16 | unsigned char,short | 34 (0x22) |
int32 | unsigned short,int | 35 (0x23) |
int64 | unsigned int,long,long long | 36 (0x24) |
float | float | 37 (0x25) |
double | double | 38 (0x26) |
bool | bool,char | 39 (0x27) |
string | char* | 40 (0x28) |