1、对象
项目属性要添加
QT += script
自定义的对象头文件如下,实现正常就好,记得脚本里要调用的方法一定要定义在public slots:下,要不然调用时提示该对象没有*方法
1 #ifndef CMU_H 2 #define CMU_H 3 #include "Communication/Communication.h" 4 #include "stt_basic_moudle.h" 5 #include <iostream> 6 #include <map> 7 using namespace std; 8 9 10 struct CMU_INFO 11 { 12 /// 13 /// rief CMU_Table 14 /// name 15 /// 16 std::map<std::string, CCommunication*> name_commu; 17 /// 18 /// rief anonymous_commu 19 /// 20 CCommunication* anonymous_commu; 21 }; 22 23 /// 24 /// rief CMU_Table 25 /// 26 extern std::map<int,CMU_INFO> CMU_Table; 27 28 class CMU:public QObject 29 { 30 Q_OBJECT 31 32 public slots: 33 34 #define D_CONNECT (" 35 ######################################################### 36 # 函数说明: 37 # 打开并连接通讯 目前支持 telnet、console、系统命令行 38 # 39 # 参数说明: 40 # arg1: 连接模式[telnet;console,cmd] ----------必选参数 41 # arg2: 是否使用配置登陆,0默认登陆,1不登陆 [0;1]---可选 42 # arg3: 匿名通讯会自动关闭,给当前通讯命名[任意名字] 43 # arg4: 无 44 # arg5: 无 45 # arg6: 无 46 # 示例: 47 # connect = telnet , 0 , cpe_telnet 48 # 49 #########################################################") 50 bool connect (int test_id,QString arg1,QString arg2,QString arg3,QString arg4, QString arg5,QString arg6,QString arg7,QString arg8,QString arg9); 51 52 53 #define D_CLOSE (" 54 ######################################################### 55 # 函数说明: 56 # 关闭通讯 目前支持 telnet、console、系统命令行 57 # 58 # 参数说明: 59 # arg1: 连接模式[telnet;console,cmd] ----------必选参数 60 # arg2: 匿名通讯会自动关闭,关闭通讯命名[任意名字] ---可选 61 # 示例: 62 # connect = telnet , cpe_telnet 63 # 64 #########################################################") 65 bool close (int test_id,QString arg1,QString arg2,QString arg3,QString arg4, QString arg5,QString arg6,QString arg7,QString arg8,QString arg9); 66 67 68 #define D_SEND (" 69 ######################################################### 70 # 函数说明: 71 # 发送命令到通讯 目前支持 telnet、console、系统命令行 72 # 73 # 参数说明: 74 # arg1: 发送的命令 ----------必选参数 75 # arg2: 发送目标通讯,无为匿名通讯 通讯命名[任意名字] ---可选 76 # 示例: 77 # send = dir , cpe_telnet 78 # 79 #########################################################") 80 bool send (int test_id,QString arg1,QString arg2,QString arg3,QString arg4, QString arg5,QString arg6,QString arg7,QString arg8,QString arg9); 81 82 83 #define D_RECEIVE (" 84 ######################################################### 85 # 函数说明: 86 # 发送命令到通讯 目前支持 telnet、console、系统命令行 87 # 88 # 参数说明: 89 # arg1: 延时时间 ----------必选参数 90 # arg2: 为正则表达式 ----------必选参数 91 # arg3: 需要查找的值在正则表达式的第几组内 ----------必选参数 92 # arg4: 获取的结果保存到变量,默认RECEIVE ----------可选参数 93 # arg5: 发送目标通讯,无为匿名通讯 通讯命名[任意名字] ---可选 94 # 示例: 95 # receive = 2000,Mac.Address.{2}(.*).,1,para 96 # 97 #########################################################") 98 bool receive(int test_id,QString arg1,QString arg2,QString arg3,QString arg4, QString arg5,QString arg6,QString arg7,QString arg8,QString arg9); 99 100 101 102 #define D_PING (" 103 ######################################################### 104 # 函数说明: 105 # ping 106 # 107 # 参数说明: 108 # arg1: 目标IP ----------必选参数 109 # arg2: 源IP [使用默认路由设置] ----------可选参数 110 # arg3: PING包的次数 默认4 ----------可选参数 111 # arg4: PING通的连续成功次数,默认1 ----------可选参数 112 # arg5: PING包的大小 默认64 ---可选 113 # 示例: 114 # ping = %ip%,,60,3,64 115 # 116 #########################################################") 117 bool ping (int test_id,QString arg1,QString arg2,QString arg3,QString arg4, QString arg5,QString arg6,QString arg7,QString arg8,QString arg9); 118 119 #define D_SLEEP (" 120 ######################################################### 121 # 函数说明: 122 # 示设置延时的时间 123 # 124 # 参数说明: 125 # arg1: 延时时间,时间单位为毫秒 ----------必选参数 126 # 示例: 127 # sleep = 2000 128 # 129 #########################################################") 130 bool sleep (int test_id,QString arg1,QString arg2,QString arg3,QString arg4, QString arg5,QString arg6,QString arg7,QString arg8,QString arg9); 131 132 #define D_FIND (" 133 ######################################################### 134 # 函数说明: 135 # 查找通讯返回信息相应的值 136 # 137 # 参数说明: 138 # arg1: 延时时间,时间单位为毫秒 ----------必选参数 139 # arg2: 要查找得值 ----------必选参数 140 # arg3: 发送目标通讯,无为匿名通讯 通讯命名[任意名字] ---可选 141 # 示例: 142 # find = 3000,succee 143 # 144 #########################################################") 145 bool find (int test_id,QString arg1,QString arg2,QString arg3,QString arg4, QString arg5,QString arg6,QString arg7,QString arg8,QString arg9); 146 147 148 149 #define D_LOOPCHK (" 150 ######################################################### 151 # 函数说明: 152 # 在一定的时间内下一串指令然后通过正则表达式查找是否有返回所需要的值 153 # 154 # 参数说明: 155 # arg1: 发送的指令 ----------必选参数 156 # arg2: 总时间 ----------必选参数 157 # arg3: 正则表达式 ----------必选参数 158 # arg4: 需要查找的值在正则表达式的第几组内 ----------必选参数 159 # arg5: 发送完指令后等待时间 默认0----------可选参数 160 # arg6: 获取的结果保存到变量,默认RECEIVE ----------可选参数 161 # arg7: 目标通讯,无为匿名通讯 通讯命名[任意名字] ---可选 162 # 示例: 163 # loopchk = adsl info,5000,Path.*Dd.*D(d*)DKbps.*Downstream,1,1 164 # 165 #########################################################") 166 bool loopchk(int test_id,QString arg1,QString arg2,QString arg3,QString arg4, QString arg5,QString arg6,QString arg7,QString arg8,QString arg9); 167 168 #define D_CHECK (" 169 ######################################################### 170 # 函数说明: 171 # 如果需要比较相同,则使用一个参数,如果需要比较范围,则需要使用两个参数,用来表示上下限 172 # 173 # 参数说明: 174 # arg1: 比较值1 为数值择是上线 ----------必选参数 175 # arg2: 比较值2 不为空则是数值范围比较下线 ----------可选参数 176 # arg3: 目标变量,默认RECEIVE ----------可选参数 177 # 示例: 178 # check = %up_rate%,%down_rate% 179 # 180 #########################################################") 181 bool check (int test_id,QString arg1,QString arg2,QString arg3,QString arg4, QString arg5,QString arg6,QString arg7,QString arg8,QString arg9); 182 183 184 #define D_SET (" 185 ######################################################### 186 # 函数说明: 187 # 用来将receive指令通过正则表达匹配到的值保存一个变量里 188 # 如果有四个参数:set = 新变量名,变量名,分隔符类型(数字),分隔数量 189 # 分隔符类型有:0->无,1->:,2->-,3->.,4->%3A,5->空格,6->空格 190 # 191 # 参数说明: 192 # arg1: 目标变量名 ----------必选参数 193 # arg2: 源数据 ----------可选参数 194 # arg3: 分隔符类型 0->无,1->:,2->-,3->.,4->%3A,5->空格,6->空格(除了空格,数据会变成十六进制)----------可选参数 195 # arg4: 分隔数量 ----------可选参数 196 # 示例: 197 # set = newmac,%mac%,1,2 198 # 199 #########################################################") 200 bool set (int test_id,QString arg1,QString arg2,QString arg3,QString arg4, QString arg5,QString arg6,QString arg7,QString arg8,QString arg9); 201 202 #define D_STRINGADD (" 203 ######################################################### 204 # 函数说明: 205 # 根据具体截取数值确定累积参数增加 206 # 207 # 参数说明: 208 # arg1: 目的截取后的数值字符串 ----------必选参数 209 # arg2: stringAdd指令所用到参数的个数(包含本身) ----------必选参数 210 # arg3: 前缀字符串 ----------必选参数 211 # arg4: 括号内的第一个参数表示被截取的字符串,第二个参数表示起始位,第三个参数表示位数长度 ----------必选参数 212 # arg..: 同[arg4] 213 # 示例: 214 # stringAdd = %StrNew%,4,Str(WLAN_),Sub(&mac&;9;4) 215 # 216 #########################################################") 217 bool stringAdd (int test_id,QString arg1,QString arg2,QString arg3,QString arg4, QString arg5,QString arg6,QString arg7,QString arg8,QString arg9); 218 219 220 #define D_COMPARE (" 221 ######################################################### 222 # 函数说明: 223 # 表示用于目的字符串的值与源字符串的值进行对比 224 # 225 # 参数说明: 226 # arg1: 目的字符串的值 ----------必选参数 227 # arg2: 是源字符串的值 ----------必选参数 228 # arg3: 第一个参数截取子字符串的索引号 ----------可选参数 229 # arg4: 截取子字符串的长度 ----------可选参数 230 # 示例: 231 # compare = %StrNew%,%ssid%,2,3 232 # 233 #########################################################") 234 bool compare (int test_id,QString arg1,QString arg2,QString arg3,QString arg4, QString arg5,QString arg6,QString arg7,QString arg8,QString arg9); 235 236 237 #define D_ADD (" 238 ######################################################### 239 # 函数说明: 240 # 将源字符串的内容加/减一个数,然后按指定格式保存到目的字符串的变 241 # 量里 242 # 243 # 参数说明: 244 # arg1: 目的字符串的值 ----------必选参数 245 # arg2: 是源字符串的值 ----------必选参数 246 # arg3: 被加/减数[整数]:表示要减或加的参数 ----------必选参数 247 # arg4: 目的字符串格式[整数]:参数表示指定的间隔符(0:无,1: ":",2: "-",3: ".",4: "%3A",5:" ")----------必选参数 248 # arg5: 目的串截取段[整数]:间隔符之间的字符数 ----------必选参数 249 # arg6: 加/减[0/1]:1为递增,0为递减。 ----------必选参数 250 # 示例: 251 # add = %mac1%,%mac%,8,0,2,1 252 # 253 #########################################################") 254 bool add (int test_id,QString arg1,QString arg2,QString arg3,QString arg4, QString arg5,QString arg6,QString arg7,QString arg8,QString arg9); 255 256 257 #define D_LOOPFIND (" 258 ######################################################### 259 # 函数说明: 260 # 在一定的时间内下一串指令然后通过正则表达式查找是否有返回所需要的值 261 # 262 # 参数说明: 263 # arg1: 发送的指令 ----------必选参数 264 # arg2: 总时间 ----------必选参数 265 # arg3: 单步循环时间 ----------必选参数 266 # arg4: 需要查找的值 ----------必选参数 267 # arg5: 目标通讯,无为匿名通讯 通讯命名[任意名字] ---可选 268 # 示例: 269 # loopfind = NULL, 40000,10000,rstBtn_pressed 270 # 271 #########################################################") 272 bool loopfind (int test_id,QString arg1,QString arg2,QString arg3,QString arg4, QString arg5,QString arg6,QString arg7,QString arg8,QString arg9); 273 274 275 276 #define D_CHANGE (" 277 ######################################################### 278 # 函数说明: 279 # 从[源字符串名称]获取的数据,用[正则式]匹配出来的子字符串,根据[改变的方式]对子字符串进行格式上的转换并保存到[目标字符名称] 280 # 281 # 参数说明: 282 # arg1: 目标字符串名 ----------必选参数 283 # arg2: 源字符名称 ----------必选参数 284 # arg3: 正则式 ----------必选参数 285 # arg4: 表达式所在组 ----------必选参数 286 # arg5: 改变的方式 0:无改变;1:变为小写,2,变为大写---必选参数 287 # 示例: 288 # loopfind = NULL, 40000,10000,rstBtn_pressed 289 # 290 #########################################################") 291 bool change (int test_id,QString arg1,QString arg2,QString arg3,QString arg4, QString arg5,QString arg6,QString arg7,QString arg8,QString arg9); 292 293 }; 294 #endif // CMU_H
2、注册对象到JavaScript解释器
注意要是在不同的函数调用需要使用new 创建注册的对象以免函数执行完毕被销毁
CMU * cmu = new CMU(); QScriptValue qcmu = eng->newQObject(cmu); eng->globalObject().setProperty(this->get_moudle_name().c_str(), qcmu);
1 /****************************************************************************************************** 2 * Copyright (C) 2014, All right reserved. 3 4 * file 5 * version 1.0 6 * author NingJian (freegodly@gmail.com) 7 * brief 8 9 * detail 10 11 * TODO 12 * history 2014-9-17 created by NingJian 13 * 14 * note 15 ******************************************************************************************************/ 16 17 #include "stt_basic_moudle.h" 18 #include "cmu.h" 19 20 21 std::map<int,TEST_INFO> *STT_Basic_Moudle::STT_G_Test_Info; 22 23 std::map<std::string,TEST_FUN_INFO> *STT_Basic_Moudle::STT_G_Test_Fun_Info; 24 25 RUN_FUN STT_Basic_Moudle::STT_G_Test_Run_Fun; 26 27 std::map<std::string,std::string> *STT_Basic_Moudle::STT_G_Moudles_Config; 28 29 30 STT_Basic_Moudle::STT_Basic_Moudle() 31 { 32 33 } 34 35 36 bool STT_Basic_Moudle::init(std::map<int, TEST_INFO> &test_info, std::map<string, TEST_FUN_INFO> &test_fun_info, std::map<string, string> &moudles_config, RUN_FUN run_fun) const 37 { 38 39 STT_Basic_Moudle::STT_G_Test_Info = &test_info; 40 STT_Basic_Moudle::STT_G_Test_Fun_Info = &test_fun_info; 41 STT_Basic_Moudle::STT_G_Test_Run_Fun = run_fun; 42 STT_Basic_Moudle::STT_G_Moudles_Config = &moudles_config; 43 return true; 44 } 45 46 bool STT_Basic_Moudle::release() const 47 { 48 return true; 49 } 50 51 bool STT_Basic_Moudle::initiation(int test_id) const 52 { 53 return true; 54 } 55 56 bool STT_Basic_Moudle::finish(int test_id) const 57 { 58 std::string error_str; 59 CMU_INFO ci = CMU_Table[test_id]; 60 if( ci.anonymous_commu != NULL ) 61 { 62 ci.anonymous_commu->fnClose(error_str); 63 } 64 std::map<std::string, CCommunication*>::iterator it = ci.name_commu.begin(); 65 while(it != ci.name_commu.end()) 66 { 67 it->second->fnClose(error_str); 68 it++; 69 } 70 ci.name_commu.clear(); 71 return true; 72 } 73 74 75 76 77 std::string STT_Basic_Moudle::get_moudle_version() const 78 { 79 return std::string("Version: V1.0.0 " ) + STT_BUILD_TIME ; 80 } 81 82 std::string STT_Basic_Moudle::get_moudle_describe() const 83 { 84 return "基本功能模块"; 85 } 86 87 void STT_Basic_Moudle::reg_ui_fun(REG_UI_FUN reg_ui_f) const 88 { 89 90 } 91 92 void STT_Basic_Moudle::reg_fun(int test_id,QScriptEngine *eng) const 93 { 94 CMU * cmu = new CMU(); 95 QScriptValue qcmu = eng->newQObject(cmu); 96 eng->globalObject().setProperty(this->get_moudle_name().c_str(), qcmu); 97 98 99 add_fun(this->get_moudle_name().c_str(), "connect", D_CONNECT ); 100 add_fun(this->get_moudle_name().c_str(), "close", D_CLOSE ); 101 add_fun( this->get_moudle_name().c_str(), "send", D_SEND ); 102 add_fun(this->get_moudle_name().c_str(), "receive", D_RECEIVE ); 103 add_fun(this->get_moudle_name().c_str(), "ping", D_PING ); 104 add_fun(this->get_moudle_name().c_str(), "sleep", D_SLEEP ); 105 add_fun( this->get_moudle_name().c_str(), "find", D_FIND ); 106 add_fun(this->get_moudle_name().c_str(), "loopchk", D_LOOPCHK ); 107 add_fun( this->get_moudle_name().c_str(), "check", D_CHECK ); 108 add_fun( this->get_moudle_name().c_str(), "set", D_SET ); 109 add_fun(this->get_moudle_name().c_str(), "stringAdd", D_STRINGADD ); 110 add_fun( this->get_moudle_name().c_str(), "compare", D_COMPARE ); 111 add_fun( this->get_moudle_name().c_str(), "add", D_ADD ); 112 add_fun(this->get_moudle_name().c_str(), "loopfind", D_LOOPFIND ); 113 add_fun( this->get_moudle_name().c_str(), "change", D_CHANGE ); 114 } 115 116 117 118 119 string STT_Basic_Moudle::get_moudle_name() const 120 { 121 return "STT_Basic_Moudle"; 122 } 123 124 125 126 127 128 string get_stt_variable(int test_id, string key) 129 { 130 return (*STT_Basic_Moudle::STT_G_Test_Info)[test_id].variable_map[key]; 131 } 132 133 134 void set_stt_variable(int test_id, string key, string value) 135 { 136 (*STT_Basic_Moudle::STT_G_Test_Info)[test_id].variable_map.insert(std::pair<std::string,std::string>(key,value)); 137 } 138 139 140 141 142 143 void add_fun(const char *moudle_name, const char *fun_name, const char *fun_describe) 144 { 145 146 if((*STT_Basic_Moudle::STT_G_Test_Fun_Info).find(fun_name)==(*STT_Basic_Moudle::STT_G_Test_Fun_Info).end()) 147 { 148 TEST_FUN_INFO tfi={moudle_name,fun_name,fun_describe}; 149 (*STT_Basic_Moudle::STT_G_Test_Fun_Info).insert(std::pair<std::string,TEST_FUN_INFO>(fun_name,tfi)); 150 } 151 }
3、使用
我的注册时在插件里实现的,调用在主程序里,这样可以n个插件向同一个javascript解释器里注册不同的对象
执行完一次可以判断是否有异常,打印异常信息等
1 /// 2 /// rief G_STT_Interpreter [STT解释器] 3 /// 4 std::map<int,QScriptEngine *> G_STT_Interpreter; 5 6 7 /* ############################################################################################################# */ 8 9 10 bool G_STT_Run_Fun(QString fun_name, int test_id, QString v1, QString v2, QString v3, QString v4, QString v5, QString v6, QString v7, QString v8, QString v9) 11 { 12 bool result = false; 13 TEST_FUN_INFO tfi = G_Test_Fun_Info[fun_name.toStdString()]; 14 15 if(tfi.fun_name == fun_name.toStdString()) 16 { 17 QString script=QString("%1.%2").arg(tfi.modle_name.c_str(),fun_name); 18 19 QScriptValueList args; 20 QScriptEngine * eng = G_STT_Interpreter[test_id]; 21 args << test_id << v1<<v2<<v3<< v4<<v5<<v6<< v7<<v8<<v9; 22 QScriptValue cpp_fun = eng->evaluate(script); 23 qDebug()<<cpp_fun.toString(); 24 QScriptValue value = cpp_fun.call(QScriptValue(), args); 25 26 27 if (G_STT_Interpreter[test_id]->hasUncaughtException()){ 28 emit STT_Global::mw->signal_add_Log(test_id, G_STT_Interpreter[test_id]->uncaughtException().toString()); 29 emit STT_Global::mw->signal_add_Log(test_id,G_STT_Interpreter[test_id]->uncaughtExceptionBacktrace().join("/n")); 30 qDebug()<<G_STT_Interpreter[test_id]->uncaughtException().toString(); 31 qDebug()<<G_STT_Interpreter[test_id]->uncaughtExceptionBacktrace().join("/n"); 32 return false; 33 }else{ 34 result = value.toBool(); 35 } 36 37 } 38 39 return result; 40 }