|
USE_STATIC_MCM_LIB (mint_cm/Makefile) |
|
| YES | 使用靜態鏈結 |
| NO | 使用動態鏈結 |
|
[socket_path] 伺服器的位址路徑. [詳細] |
||||||||||||||||||||||||||||||||
|
[session_permission] 表示資料存取的模式.
|
||||||||||||||||||||||||||||||||
|
[session_stack_size] 伺服器端負責此連線的執行緒的堆疊大小. [詳細] |
||||||||||||||||||||||||||||||||
|
[request_command] 要傳送的指令串. |
||||||||||||||||||||||||||||||||
|
[data_format] 回傳的資料的格式, 指定資料要用 整數/浮點數/字串 格式輸出, 或是用字串格式輸出. 可指定的格式 :
JavaScript 使用 IEEE-754 (雙精度) 來記錄數字資料, 小數的精確值是 52 位元 (紀錄整數部分), isll 和 iull 的原型是 long long 類型, 在一般系統是 64 位元, 超過 JavaScript 能記錄的上限, 如果有使用 isll 或 iull 類型的資料而且數值大小會超過 52 位元的話, 必須改用字串格式輸出 |
||||||||||||||||||||||||||||||||
|
[after_complete] CGI 端處理完後預設要如何回應 (回傳訊息).
|
||||||||||||||||||||||||||||||||
|
[other_query] 額外的查詢參數, 不需要使用的話填入空字串. |
||||||||||||||||||||||||||||||||
| 01. | 取得資料筆數上限, 也就是資料模型中的 $(max) 值. |
| 02. | 讀出資料. (get) |
| 01. | 刪除資料. (delall) |
| 01. | 寫入資料. (set) |
| 02. | 增加資料. (add) |
| 03. | 刪除資料. (del) |
| 01. | 增加資料時指定要插入到哪個 entry 之前. (add) |
|
mcm_jslib_convert_html_str 要將字串資料使用動態產生網頁元素的方式顯示時 (document.write, innerHTML, ...), 需要注意特殊字元 ["] [&] [<] [>] [ ], 透過此函式將特殊字元做轉換.
|
|
mcm_jslib_convert_submit_str 要將字串資料寫入資料庫時, 需要將特殊字元轉換成 %$(HEX) 格式, 透過此函式做轉換.
|
|
mcm_jslib_run_script 執行指令後, 回應的訊息可以是 JavaScript 格式, 使用此函式執行.
|
|
mcm_jslib_obtain_max_count 要求取得最大資料筆數限制.
|
|||||||||||||||||||||
|
mcm_jslib_obtain_config 要求取得資料.
|
|||||||||||||||||||||
|
mcm_jslib_submit_config 要求設定資料.
|
||||||||||||||||||
|
取得資料筆數上限, 也就是資料模型中的 $(max) 值
格式 :
"&get.$(mask_path)"
注意事項 :
建立指令. 範例 : var req_cmd = ""; // 取得 device.system 的資料筆數上限. req_cmd += "&get.device.system"; // 取得 device.vap.* 的資料筆數上限. req_cmd += "&get.device.vap.*"; // 取得 device.vap.*.station.* 的資料筆數上限. req_cmd += "&get.device.vap.*.station.*"; 之後使用 mcm_jslib_obtain_max_count() 送出請求. 範例 : var self_jslib, rep_ret; self_jslib = new mcm_jslib_lib_t(); self_jslib.socket_path = "@mintcm"; self_jslib.session_permission = mcm_session_permission.ro; self_jslib.session_stack_size = 0; self_jslib.request_command = req_cmd; self_jslib.other_query = ""; rep_ret = mcm_jslib_obtain_max_count(self_jslib); 之後檢查返回的結果, 返回成功的話, 使用 JSON.parse() 將回傳的資料轉為 JSON 格式才可使用. 範例 :
var mcm_dv;
if(rep_ret.rep_code < mcm_return_code.pass)
{
alert("call mcm_jslib_obtain_max_count() fail" +
"[" + rep_ret.rep_code + "]");
mcm_jslib_run_script(rep_ret.rep_data);
return;
}
mcm_dv = JSON.parse(rep_ret.rep_data);
紀錄最大資料數目限制的變數名稱是 $max_count 範例 :
// device.system 的資料筆數上限.
console.log("[max-count] device.system = ",
mcm_dv.device.system.$max_count);
// device.vap.* 的資料筆數上限.
console.log("[max-count] device.vap.* = ",
mcm_dv.device.vap.$max_count);
// device.vap.*.station.* 的資料筆數上限.
console.log("[max-count] device.vap.*.station.* = ",
mcm_dv.device.vap.station.$max_count);
完整程式 :
<html>
<head>
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<script type="text/javascript" src="jquery_main.js"></script>
<script type="text/javascript" src="json3.js"></script>
<script type="text/javascript" src="mcm_jslib_api.js"></script>
<script type="text/javascript" src="mcm_jslib_data_info_auto.js"></script>
<script type="text/javascript">
function main_init()
{
var self_jslib, req_cmd, rep_ret, mcm_dv;
req_cmd = "&get.device.system" +
"&get.device.vap.*" +
"&get.device.vap.*.station.*";
self_jslib = new mcm_jslib_lib_t();
self_jslib.socket_path = "@mintcm";
self_jslib.session_permission = mcm_session_permission.ro;
self_jslib.session_stack_size = 0;
self_jslib.request_command = req_cmd;
self_jslib.other_query = "";
rep_ret = mcm_jslib_obtain_max_count(self_jslib);
if(rep_ret.rep_code < mcm_return_code.pass)
{
alert("call mcm_jslib_obtain_max_count() fail" +
"[" + rep_ret.rep_code + "]");
mcm_jslib_run_script(rep_ret.rep_data);
return;
}
mcm_dv = JSON.parse(rep_ret.rep_data);
console.log("[max-count] device.system = ",
mcm_dv.device.system.$max_count);
console.log("[max-count] device.vap.* = ",
mcm_dv.device.vap.$max_count);
console.log("[max-count] device.vap.*.station.* = ",
mcm_dv.device.vap.station.$max_count);
}
</script>
</head>
<body>
<button type="button" onclick="main_init()">test</button>
</body>
</html>
除了上述方式外, 可以使用另一種方式取得 group 的資料筆數限制. 必須先寫好資料模型檔並編譯完成, mint_cm/mcm_lib/mcm_jslib/mcm_jslib_data_info_auto.js 會產生對應的資料變數. 以 #02-02# 的資料模型為例, 會產生 :
// device
var mcm_mcount_device_max_count = 1; // device.system var mcm_mcount_device_system_max_count = 1; // device.vap.* var mcm_mcount_device_vap_max_count = 16; // device.vap.*.extra var mcm_mcount_device_vap_extra_max_count = 1; // device.vap.*.station.* var mcm_mcount_device_vap_station_max_count = 32; // device.limit.* var mcm_mcount_device_limit_max_count = 64; // device.client.* var mcm_mcount_device_client_max_count = 128; 變數內的值就是實際的 $(max) 值. 範例 :
<html>
<head>
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<script type="text/javascript" src="jquery_main.js"></script>
<script type="text/javascript" src="json3.js"></script>
<script type="text/javascript" src="mcm_jslib_api.js"></script>
<script type="text/javascript" src="mcm_jslib_data_info_auto.js"></script>
<script type="text/javascript">
function main_init()
{
// device.system 的資料筆數上限.
console.log("[max-count] device.system = ",
mcm_mcount_device_system_max_count);
// device.vap.* 的資料筆數上限.
console.log("[max-count] device.vap.* = ",
mcm_mcount_device_vap_max_count);
// device.vap.*.station.* 的資料筆數上限.
console.log("[max-count] device.vap.*.station.* = ",
mcm_mcount_device_vap_station_max_count);
}
</script>
</head>
<body>
<button type="button" onclick="main_init()">test</button>
</body>
</html>
|
|
讀出資料 (get)
格式 :
"&get.$(mask_path)"
注意事項 :
建立指令. 範例 : var req_cmd = ""; // 讀出 device req_cmd += "&get.device"; // 讀出 device.system req_cmd += "&get.device.system"; // 讀出 device.vap.* req_cmd += "&get.device.vap.*"; // 讀出 device.vap.*.extra req_cmd += "&get.device.vap.*.extra"; // 讀出 device.vap.*.station.* req_cmd += "&get.device.vap.*.station.*"; // 讀出 device.limit.* req_cmd += "&get.device.limit.*"; 之後使用 mcm_jslib_obtain_config() 送出請求. 範例 : var self_jslib, rep_ret; self_jslib = new mcm_jslib_lib_t(); self_jslib.socket_path = "@mintcm"; self_jslib.session_permission = mcm_session_permission.ro; self_jslib.session_stack_size = 0; self_jslib.request_command = req_cmd; self_jslib.data_format = mcm_data_format.all_default; self_jslib.other_query = ""; rep_ret = mcm_jslib_obtain_config(self_jslib); 之後檢查返回的結果, 返回成功的話, 使用 JSON.parse() 將回傳的資料轉為 JSON 格式才可使用. 範例 :
var mcm_dv;
if(rep_ret.rep_code < mcm_return_code.pass)
{
alert("call mcm_jslib_obtain_config() fail" +
"[" + rep_ret.rep_code + "]");
mcm_jslib_run_script(rep_ret.rep_data);
return;
}
mcm_dv = JSON.parse(rep_ret.rep_data);
如果要取得目前的資料筆數, 可以使用 length 此方法. 範例 :
// device.vap.* 的資料筆數.
console.log("[count] device.vap.* = ",
mcm_dv.device.vap.length);
// device.vap.@2 的 station 的資料筆數.
console.log("[count] device.vap.@2.station = ",
mcm_dv.device.vap[1].station.length);
// device.limit.* 的資料筆數.
console.log("[count] device.limit.* = ",
mcm_dv.device.vap.length);
實際的資料使用階層方式取得. 範例 :
// device 的資料.
console.log("[get] device.descript = ",
mcm_dv.device.descript);
console.log("[get] device.serial_number = ",
mcm_dv.device.serial_number);
// device.system 的資料.
console.log("[get] device.system.date = ",
mcm_dv.device.system.date);
console.log("[get] device.system.ip_addr = ",
mcm_dv.device.system.ip_addr);
console.log("[get] device.system.uptime = ",
mcm_dv.device.system.uptime);
console.log("[get] device.system.loading = ",
mcm_dv.device.system.loading);
// device.vap.@3 的資料.
console.log("[get] device.vap.@3.ekey = ",
mcm_dv.device.vap[2].ekey);
console.log("[get] device.vap.@3.ssid = ",
mcm_dv.device.vap[2].ssid);
console.log("[get] device.vap.@3.channel = ",
mcm_dv.device.vap[2].channel);
// device.vap.@1.extra 的資料.
console.log("[get] device.vap.@1.extra.hidden = ",
mcm_dv.device.vap[0].extra.hidden);
console.log("[get] device.vap.@1.extra.tx_power = ",
mcm_dv.device.vap[0].extra.tx_power);
// device.vap.@2.station.@1 的資料.
console.log("[get] device.vap.@2.station.@1.ekey = ",
mcm_dv.device.vap[1].station[0].ekey);
console.log("[get] device.vap.@2.station.@1.mac_addr = ",
mcm_dv.device.vap[1].station[0].mac_addr);
console.log("[get] device.vap.@2.station.@1.rule = ",
mcm_dv.device.vap[1].station[0].rule);
// device.limit.@1 的資料.
console.log("[get] device.limit.@1.ekey = ",
mcm_dv.device.limit[0].ekey);
console.log("[get] device.limit.@1.name = ",
mcm_dv.device.limit[0].name);
console.log("[get] device.limit.@1.priority = ",
mcm_dv.device.limit[0].priority);
完整程式 :
<html>
<head>
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<script type="text/javascript" src="jquery_main.js"></script>
<script type="text/javascript" src="json3.js"></script>
<script type="text/javascript" src="mcm_jslib_api.js"></script>
<script type="text/javascript" src="mcm_jslib_data_info_auto.js"></script>
<script type="text/javascript">
function main_init()
{
var self_jslib, req_cmd, mcm_dv;
req_cmd = "&get.device" +
"&get.device.system" +
"&get.device.vap.*" +
"&get.device.vap.*.extra" +
"&get.device.vap.*.station.*" +
"&get.device.limit.*";
self_jslib = new mcm_jslib_lib_t();
self_jslib.socket_path = "@mintcm";
self_jslib.session_permission = mcm_session_permission.ro;
self_jslib.session_stack_size = 0;
self_jslib.request_command = req_cmd;
self_jslib.data_format = mcm_data_format.all_default;
self_jslib.other_query = "";
rep_ret = mcm_jslib_obtain_config(self_jslib);
if(rep_ret.rep_code < mcm_return_code.pass)
{
alert("call mcm_jslib_obtain_config() fail" +
"[" + rep_ret.rep_code + "]");
mcm_jslib_run_script(rep_ret.rep_data);
return;
}
mcm_dv = JSON.parse(rep_ret.rep_data);
console.log("[count] device.vap.* = ",
mcm_dv.device.vap.length);
console.log("[count] device.vap.@2.station.* = ",
mcm_dv.device.vap[1].station.length);
console.log("[count] device.limit.* = ",
mcm_dv.device.limit.length);
console.log("[get] device.descript = ",
mcm_dv.device.descript);
console.log("[get] device.serial_number = ",
mcm_dv.device.serial_number);
console.log("[get] device.system.date = ",
mcm_dv.device.system.date);
console.log("[get] device.system.ip_addr = ",
mcm_dv.device.system.ip_addr);
console.log("[get] device.system.uptime = ",
mcm_dv.device.system.uptime);
console.log("[get] device.system.loading = ",
mcm_dv.device.system.loading);
console.log("[get] device.vap.@3.ekey = ",
mcm_dv.device.vap[2].ekey);
console.log("[get] device.vap.@3.ssid = ",
mcm_dv.device.vap[2].ssid);
console.log("[get] device.vap.@3.channel = ",
mcm_dv.device.vap[2].channel);
console.log("[get] device.vap.@2.station.@1.ekey = ",
mcm_dv.device.vap[1].station[0].ekey);
console.log("[get] device.vap.@2.station.@1.mac_addr = ",
mcm_dv.device.vap[1].station[0].mac_addr);
console.log("[get] device.vap.@2.station.@1.rule = ",
mcm_dv.device.vap[1].station[0].rule);
console.log("[get] device.limit.@1.ekey = ",
mcm_dv.device.limit[0].ekey);
console.log("[get] device.limit.@1.name = ",
mcm_dv.device.limit[0].name);
console.log("[get] device.limit.@1.priority = ",
mcm_dv.device.limit[0].priority);
}
</script>
</head>
<body>
<button type="button" onclick="main_init()">test</button>
</body>
</html>
範例 : 所有類型資料都使用字串格式輸出
<html>
<head>
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<script type="text/javascript" src="jquery_main.js"></script>
<script type="text/javascript" src="json3.js"></script>
<script type="text/javascript" src="mcm_jslib_api.js"></script>
<script type="text/javascript" src="mcm_jslib_data_info_auto.js"></script>
<script type="text/javascript">
function main_init()
{
var self_jslib, req_cmd, mcm_dv;
req_cmd = "&get.device" +
"&get.device.system";
self_jslib = new mcm_jslib_lib_t();
self_jslib.socket_path = "@mintcm";
self_jslib.session_permission = mcm_session_permission.ro;
self_jslib.session_stack_size = 0;
self_jslib.request_command = req_cmd;
// 所有類型資料都使用字串格式輸出.
self_jslib.data_format = mcm_data_format.all_string;
self_jslib.other_query = "";
rep_ret = mcm_jslib_obtain_config(self_jslib);
if(rep_ret.rep_code < mcm_return_code.pass)
{
alert("call mcm_jslib_obtain_config() fail" +
"[" + rep_ret.rep_code + "]");
mcm_jslib_run_script(rep_ret.rep_data);
return;
}
mcm_dv = JSON.parse(rep_ret.rep_data);
console.log("[get] device.descript = ",
mcm_dv.device.descript);
console.log("[get] device.serial_number = ",
mcm_dv.device.serial_number);
console.log("[get] device.system.date = ",
mcm_dv.device.system.date);
console.log("[get] device.system.ip_addr = ",
mcm_dv.device.system.ip_addr);
console.log("[get] device.system.uptime = ",
mcm_dv.device.system.uptime);
console.log("[get] device.system.loading = ",
mcm_dv.device.system.loading);
}
</script>
</head>
<body>
<button type="button" onclick="main_init()">test</button>
</body>
</html>
範例 : isll 和 iull 類型的資料使用字串格式輸出
<html>
<head>
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<script type="text/javascript" src="jquery_main.js"></script>
<script type="text/javascript" src="json3.js"></script>
<script type="text/javascript" src="mcm_jslib_api.js"></script>
<script type="text/javascript" src="mcm_jslib_data_info_auto.js"></script>
<script type="text/javascript">
function main_init()
{
var self_jslib, req_cmd, mcm_dv;
req_cmd = "&get.device" +
"&get.device.system";
self_jslib = new mcm_jslib_lib_t();
self_jslib.socket_path = "@mintcm";
self_jslib.session_permission = mcm_session_permission.ro;
self_jslib.session_stack_size = 0;
self_jslib.request_command = req_cmd;
// isll 和 iull 類型的資料使用字串格式輸出.
self_jslib.data_format = mcm_data_format.all_default |
mcm_data_format.isll_string | mcm_data_format.iull_string;
self_jslib.other_query = "";
rep_ret = mcm_jslib_obtain_config(self_jslib);
if(rep_ret.rep_code < mcm_return_code.pass)
{
alert("call mcm_jslib_obtain_config() fail" +
"[" + rep_ret.rep_code + "]");
mcm_jslib_run_script(rep_ret.rep_data);
return;
}
mcm_dv = JSON.parse(rep_ret.rep_data);
console.log("[get] device.descript = ",
mcm_dv.device.descript);
console.log("[get] device.serial_number = ",
mcm_dv.device.serial_number);
console.log("[get] device.system.date = ",
mcm_dv.device.system.date);
console.log("[get] device.system.ip_addr = ",
mcm_dv.device.system.ip_addr);
console.log("[get] device.system.uptime = ",
mcm_dv.device.system.uptime);
console.log("[get] device.system.loading = ",
mcm_dv.device.system.loading);
}
</script>
</head>
<body>
<button type="button" onclick="main_init()">test</button>
</body>
</html>
|
|
寫入資料到 member (set)
格式 :
"&set.$(full_path)=$(value)"
注意事項 :
建立指令. 範例 :
var req_cmd = "", tmp_data;
// 設定 device
tmp_data = "網路設備-" + Math.floor(Math.random() * 10);
req_cmd += "&set.device.descript=" +
mcm_jslib_convert_submit_str(tmp_data);
req_cmd += "&set.device.serial_number=" + "0120A6B70099";
// 設定 device.system.uptime
tmp_data = Math.floor(Math.random() * 1000000000);
req_cmd += "&set.device.system.uptime=" + tmp_data;
// 設定 device.system.loading
tmp_data = Math.random() * 500;
req_cmd += "&set.device.system.loading=" + tmp_data;
// 設定 device.vap.#23
tmp_data = "ssid " + Math.floor(Math.random() * 20);
req_cmd += "&set.device.vap.#23.ssid=" +
mcm_jslib_convert_submit_str(tmp_data);
tmp_data = Math.floor(Math.random() * 200);
req_cmd += "&set.device.vap.#23.channel=" + tmp_data;
// 設定 device.vap.#8.extra.tx_power
tmp_data = Math.floor(Math.random() * 120);
req_cmd += "&set.device.vap.#8.extra.tx_power=" + tmp_data;
// 設定 device.vap.#15.station.#30
tmp_data = "00:11:aa:22:bb:" + Math.floor(Math.random() * 100);
req_cmd += "&set.device.vap.#15.station.#30.mac_addr=" +
mcm_jslib_convert_submit_str(tmp_data);
tmp_data = Math.floor(Math.random() * 10);
req_cmd += "&set.device.vap.#15.station.#30.rule=" + tmp_data;
// 設定 device.limit.#6.name
req_cmd += "&set.device.limit.#6.name=" +
mcm_jslib_convert_submit_str("")
指令建立後, 使用 mcm_jslib_submit_config() 送出請求, 之後檢查返回的結果是否成功. 範例 :
var self_jslib, rep_ret;
self_jslib = new mcm_jslib_lib_t();
self_jslib.socket_path = "@mintcm";
self_jslib.session_permission = mcm_session_permission.rw;
self_jslib.session_stack_size = 0;
self_jslib.request_command = req_cmd;
self_jslib.after_complete = mcm_after_complete.reload;
self_jslib.other_query = "";
rep_ret = mcm_jslib_submit_config(self_jslib);
if(rep_ret.rep_code < mcm_return_code.pass)
{
alert("call mcm_jslib_submit_config() fail" +
"[" + rep_ret.rep_code + "]");
mcm_jslib_run_script(rep_ret.rep_data);
return;
}
mcm_jslib_run_script(rep_ret.rep_data);
完整程式 :
<html>
<head>
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<script type="text/javascript" src="jquery_main.js"></script>
<script type="text/javascript" src="json3.js"></script>
<script type="text/javascript" src="mcm_jslib_api.js"></script>
<script type="text/javascript" src="mcm_jslib_data_info_auto.js"></script>
<script type="text/javascript">
var req_cmd = "";
function main_command()
{
var tmp_data, tmp_cmd;
req_cmd = "";
console.clear();
tmp_data = "網路設備-" + Math.floor(Math.random() * 10);
tmp_cmd = "&set.device.descript=" +
mcm_jslib_convert_submit_str(tmp_data);
req_cmd += tmp_cmd;
console.log("[set] ", tmp_cmd);
tmp_data = "120A0BF" + Math.floor(Math.random() * 10);
tmp_cmd = "&set.device.serial_number=" + tmp_data;
req_cmd += tmp_cmd;
console.log("[set] ", tmp_cmd);
tmp_data = Math.floor(Math.random() * 1000000000);
tmp_cmd = "&set.device.system.uptime=" + tmp_data;
req_cmd += tmp_cmd;
console.log("[set] ", tmp_cmd);
tmp_data = Math.random() * 500;
tmp_cmd = "&set.device.system.loading=" + tmp_data;
req_cmd += tmp_cmd;
console.log("[set] ", tmp_cmd);
tmp_data = "ssid " + Math.floor(Math.random() * 20);
tmp_cmd = "&set.device.vap.#23.ssid=" +
mcm_jslib_convert_submit_str(tmp_data);
req_cmd += tmp_cmd;
console.log("[set] ", tmp_cmd);
tmp_data = Math.floor(Math.random() * 200);
tmp_cmd = "&set.device.vap.#23.channel=" + tmp_data;
req_cmd += tmp_cmd;
console.log("[set] ", tmp_cmd);
tmp_data = Math.floor(Math.random() * 120);
tmp_cmd = "&set.device.vap.#8.extra.tx_power=" + tmp_data;
req_cmd += tmp_cmd;
console.log("[set] ", tmp_cmd);
tmp_data = "00:11:aa:22:bb:" + Math.floor(Math.random() * 100);
tmp_cmd = "&set.device.vap.#15.station.#30.mac_addr=" +
mcm_jslib_convert_submit_str(tmp_data);
req_cmd += tmp_cmd;
console.log("[set] ", tmp_cmd);
tmp_data = Math.floor(Math.random() * 10);
tmp_cmd = "&set.device.vap.#15.station.#30.rule=" + tmp_data;
req_cmd += tmp_cmd;
console.log("[set] ", tmp_cmd);
tmp_cmd = "&set.device.limit.#6.name=" +
mcm_jslib_convert_submit_str("");
req_cmd += tmp_cmd;
console.log("[set] ", tmp_cmd);
}
function main_submit()
{
var self_jslib, rep_ret;
if(req_cmd == "")
return;
self_jslib = new mcm_jslib_lib_t();
self_jslib.socket_path = "@mintcm";
self_jslib.session_permission = mcm_session_permission.rw;
self_jslib.session_stack_size = 0;
self_jslib.request_command = req_cmd;
self_jslib.after_complete = mcm_after_complete.reload;
self_jslib.other_query = "";
rep_ret = mcm_jslib_submit_config(self_jslib);
if(rep_ret.rep_code < mcm_return_code.pass)
{
alert("call mcm_jslib_submit_config() fail" +
"[" + rep_ret.rep_code + "]");
mcm_jslib_run_script(rep_ret.rep_data);
return;
}
mcm_jslib_run_script(rep_ret.rep_data);
}
</script>
</head>
<body>
<button type="button" onclick="main_command()">01. command</button>
<button type="button" onclick="main_submit()">02. submit</button>
</body>
</html>
範例 : 設定 CGI 端處理完後預設不回傳訊息
<html>
<head>
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<script type="text/javascript" src="jquery_main.js"></script>
<script type="text/javascript" src="json3.js"></script>
<script type="text/javascript" src="mcm_jslib_api.js"></script>
<script type="text/javascript" src="mcm_jslib_data_info_auto.js"></script>
<script type="text/javascript">
var req_cmd = "";
function main_command()
{
var tmp_data, tmp_cmd;
req_cmd = "";
console.clear();
tmp_data = "網路設備-" + Math.floor(Math.random() * 10);
tmp_cmd = "&set.device.descript=" +
mcm_jslib_convert_submit_str(tmp_data);
req_cmd += tmp_cmd;
console.log("[set] ", tmp_cmd);
}
function main_submit()
{
var self_jslib, rep_ret;
if(req_cmd == "")
return;
self_jslib = new mcm_jslib_lib_t();
self_jslib.socket_path = "@mintcm";
self_jslib.session_permission = mcm_session_permission.rw;
self_jslib.session_stack_size = 0;
self_jslib.request_command = req_cmd;
// 設定 CGI 端處理完後預設不回傳訊息.
self_jslib.after_complete = mcm_after_complete.none;
self_jslib.other_query = "";
rep_ret = mcm_jslib_submit_config(self_jslib);
if(rep_ret.rep_code < mcm_return_code.pass)
{
alert("call mcm_jslib_submit_config() fail" +
"[" + rep_ret.rep_code + "]");
mcm_jslib_run_script(rep_ret.rep_data);
return;
}
// 預設不回傳訊息, 不需要執行.
//mcm_jslib_run_script(rep_ret.rep_data);
}
</script>
</head>
<body>
<button type="button" onclick="main_command()">01. command</button>
<button type="button" onclick="main_submit()">02. submit</button>
</body>
</html>
|
|
增加一筆 entry (add)
格式 :
"&add.$(full_path)=$(insert_path)"
注意事項 :
建立指令. 範例 :
var req_cmd = "", tmp_data;
// 增加 device.vap.#123, 放在串列尾端 ("").
req_cmd += "&add.device.vap.#123=";
tmp_data = "public-" + Math.floor(Math.random() * 20);
req_cmd += "&set.device.vap.#123.ssid=" +
mcm_jslib_convert_submit_str(tmp_data);
tmp_data = Math.floor(Math.random() * 200);
req_cmd += "&set.device.vap.#123.channel=" + tmp_data;
// device.vap.*.extra 是 device.vap.* 的 child-group 而且又是 gs 類型,
// 所以增加 device.vap.#123 後, 資料庫會自動增加 device.vap.#123.extra,
// 替 device.vap.#123.extra 加上值. (不設的話就是使用資料模型中設定的初始值)
tmp_data = Math.floor(Math.random() * 10) % 2;
req_cmd += "&set.device.vap.#123.extra.hidden=" + tmp_data;
tmp_data = Math.floor(Math.random() * 20);
req_cmd += "&set.device.vap.#123.extra.txpower=" + tmp_data;
// 增加 device.vap.#234.station.#1, 插入到第 1 筆 entry 之前 (假設第 1 筆資料的 key 是 8 (#8)).
// 一開始 device.vap.#234 並不存在, 所以要逐層增加.
// 增加 device.vap.#234
// 不設值使用初始值.
req_cmd += "&add.device.vap.#234=";
// 增加 device.vap.#234.station.#1
req_cmd += "&add.device.vap.#234.station.#1=#8";
tmp_data = "00:AA:22:BB:33:" + Math.floor(Math.random() * 100);
req_cmd += "&set.device.vap.#234.station.#1.mac_addr=" +
mcm_jslib_convert_submit_str(tmp_data);
tmp_data = Math.floor(Math.random() * 20);
req_cmd += "&set.device.vap.#234.station.#1.rule=" + tmp_data;
// 增加 device.limit.#51, 插入到 key 為 60 的 entry 之前 (#60).
// 不設值使用初始值.
req_cmd += "&add.device.limit.#51=#60";
指令建立後, 使用 mcm_jslib_submit_config() 送出請求, 之後檢查返回的結果是否成功. 範例 :
var self_jslib, rep_ret;
self_jslib = new mcm_jslib_lib_t();
self_jslib.socket_path = "@mintcm";
self_jslib.session_permission = mcm_session_permission.rw;
self_jslib.session_stack_size = 0;
self_jslib.request_command = req_cmd;
self_jslib.after_complete = mcm_after_complete.reload;
self_jslib.other_query = "";
rep_ret = mcm_jslib_submit_config(self_jslib);
if(rep_ret.rep_code < mcm_return_code.pass)
{
alert("call mcm_jslib_submit_config() fail" +
"[" + rep_ret.rep_code + "]");
mcm_jslib_run_script(rep_ret.rep_data);
return;
}
mcm_jslib_run_script(rep_ret.rep_data);
完整程式 :
<html>
<head>
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<script type="text/javascript" src="jquery_main.js"></script>
<script type="text/javascript" src="json3.js"></script>
<script type="text/javascript" src="mcm_jslib_api.js"></script>
<script type="text/javascript" src="mcm_jslib_data_info_auto.js"></script>
<script type="text/javascript">
var req_cmd = "";
function main_command()
{
var tmp_data, tmp_cmd;
req_cmd = "";
console.clear();
tmp_cmd = "&add.device.vap.#123=";
req_cmd += tmp_cmd;
console.log("[add] ", tmp_cmd);
tmp_data = "public-" + Math.floor(Math.random() * 20);
tmp_cmd = "&set.device.vap.#123.ssid=" +
mcm_jslib_convert_submit_str(tmp_data);
req_cmd += tmp_cmd;
console.log("[set] ", tmp_cmd);
tmp_data = Math.floor(Math.random() * 200);
tmp_cmd = "&set.device.vap.#123.channel=" + tmp_data;
req_cmd += tmp_cmd;
console.log("[set] ", tmp_cmd);
tmp_data = Math.floor(Math.random() * 10) % 2;
tmp_cmd = "&set.device.vap.#123.extra.hidden=" + tmp_data;
req_cmd += tmp_cmd;
console.log("[set] ", tmp_cmd);
tmp_data = Math.floor(Math.random() * 20);
tmp_cmd = "&set.device.vap.#123.extra.tx_power=" + tmp_data;
req_cmd += tmp_cmd;
console.log("[set] ", tmp_cmd);
tmp_cmd = "&add.device.vap.#234=";
req_cmd += tmp_cmd;
console.log("[add] ", tmp_cmd);
tmp_cmd = "&add.device.vap.#234.station.#1=#8";
req_cmd += tmp_cmd;
console.log("[add] ", tmp_cmd);
tmp_data = "00:AA:22:BB:33:" + Math.floor(Math.random() * 100);
tmp_cmd = "&set.device.vap.#234.station.#1.mac_addr=" +
mcm_jslib_convert_submit_str(tmp_data);
req_cmd += tmp_cmd;
console.log("[set] ", tmp_cmd);
tmp_data = Math.floor(Math.random() * 20);
tmp_cmd = "&set.device.vap.#234.station.#1.rule=" + tmp_data;
req_cmd += tmp_cmd;
console.log("[set] ", tmp_cmd);
tmp_cmd = "&add.device.limit.#51=#60";
req_cmd += tmp_cmd;
console.log("[add] ", tmp_cmd);
}
function main_submit()
{
var self_jslib, rep_ret;
if(req_cmd == "")
return;
self_jslib = new mcm_jslib_lib_t();
self_jslib.socket_path = "@mintcm";
self_jslib.session_permission = mcm_session_permission.rw;
self_jslib.session_stack_size = 0;
self_jslib.request_command = req_cmd;
self_jslib.after_complete = mcm_after_complete.reload;
self_jslib.other_query = "";
rep_ret = mcm_jslib_submit_config(self_jslib);
if(rep_ret.rep_code < mcm_return_code.pass)
{
alert("call mcm_jslib_submit_config() fail" +
"[" + rep_ret.rep_code + "]");
mcm_jslib_run_script(rep_ret.rep_data);
return;
}
mcm_jslib_run_script(rep_ret.rep_data);
}
</script>
</head>
<body>
<button type="button" onclick="main_command()">01. command</button>
<button type="button" onclick="main_submit()">02. submit</button>
</body>
</html>
|
|
刪除一筆 entry (del)
格式 :
"&del.$(full_path)"
注意事項 :
建立指令. 範例 : var req_cmd = ""; // 刪除 device.vap.#8 req_cmd += "&del.device.vap.#8"; // 刪除 device.vap.#15.station.#30 req_cmd += "&del.device.vap.#15.station.#30"; 指令建立後, 使用 mcm_jslib_submit_config() 送出請求, 之後檢查返回的結果是否成功. 範例 :
var self_jslib, rep_ret;
self_jslib = new mcm_jslib_lib_t();
self_jslib.socket_path = "@mintcm";
self_jslib.session_permission = mcm_session_permission.rw;
self_jslib.session_stack_size = 0;
self_jslib.request_command = req_cmd;
self_jslib.after_complete = mcm_after_complete.reload;
self_jslib.other_query = "";
rep_ret = mcm_jslib_submit_config(self_jslib);
if(rep_ret.rep_code < mcm_return_code.pass)
{
alert("call mcm_jslib_submit_config() fail" +
"[" + rep_ret.rep_code + "]");
mcm_jslib_run_script(rep_ret.rep_data);
return;
}
mcm_jslib_run_script(rep_ret.rep_data);
完整程式 :
<html>
<head>
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<script type="text/javascript" src="jquery_main.js"></script>
<script type="text/javascript" src="json3.js"></script>
<script type="text/javascript" src="mcm_jslib_api.js"></script>
<script type="text/javascript" src="mcm_jslib_data_info_auto.js"></script>
<script type="text/javascript">
var req_cmd = "";
function main_command()
{
var tmp_data, tmp_cmd;
req_cmd = "";
console.clear();
tmp_cmd = "&del.device.vap.#8";
req_cmd += tmp_cmd;
console.log("[del] ", tmp_cmd);
tmp_cmd = "&del.device.vap.#15.station.#30";
req_cmd += tmp_cmd;
console.log("[del] ", tmp_cmd);
}
function main_submit()
{
var self_jslib, rep_ret;
if(req_cmd == "")
return;
self_jslib = new mcm_jslib_lib_t();
self_jslib.socket_path = "@mintcm";
self_jslib.session_permission = mcm_session_permission.rw;
self_jslib.session_stack_size = 0;
self_jslib.request_command = req_cmd;
self_jslib.after_complete = mcm_after_complete.reload;
self_jslib.other_query = "";
rep_ret = mcm_jslib_submit_config(self_jslib);
if(rep_ret.rep_code < mcm_return_code.pass)
{
alert("call mcm_jslib_submit_config() fail" +
"[" + rep_ret.rep_code + "]");
mcm_jslib_run_script(rep_ret.rep_data);
return;
}
mcm_jslib_run_script(rep_ret.rep_data);
}
</script>
</head>
<body>
<button type="button" onclick="main_command()">01. command</button>
<button type="button" onclick="main_submit()">02. submit</button>
</body>
</html>
|
|
刪除所有 entry (delall)
格式 :
"&delall.$(mix_path)"
注意事項 :
建立指令. 範例 : var req_cmd = ""; // 刪除 device.vap.#15.station.* req_cmd += "&delall.device.vap.#15.station.*"; // 刪除 device.limit.* req_cmd += "&delall.device.limit.*"; 指令建立後, 使用 mcm_jslib_submit_config() 送出請求, 之後檢查返回的結果是否成功. 範例 :
var self_jslib, rep_ret;
self_jslib = new mcm_jslib_lib_t();
self_jslib.socket_path = "@mintcm";
self_jslib.session_permission = mcm_session_permission.rw;
self_jslib.session_stack_size = 0;
self_jslib.request_command = req_cmd;
self_jslib.after_complete = mcm_after_complete.reload;
self_jslib.other_query = "";
rep_ret = mcm_jslib_submit_config(self_jslib);
if(rep_ret.rep_code < mcm_return_code.pass)
{
alert("call mcm_jslib_submit_config() fail" +
"[" + rep_ret.rep_code + "]");
mcm_jslib_run_script(rep_ret.rep_data);
return;
}
mcm_jslib_run_script(rep_ret.rep_data);
完整程式 :
<html>
<head>
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<script type="text/javascript" src="jquery_main.js"></script>
<script type="text/javascript" src="json3.js"></script>
<script type="text/javascript" src="mcm_jslib_api.js"></script>
<script type="text/javascript" src="mcm_jslib_data_info_auto.js"></script>
<script type="text/javascript">
var req_cmd = "";
function main_command()
{
var tmp_data, tmp_cmd;
req_cmd = "";
console.clear();
tmp_cmd = "&delall.device.vap.#15.station.*";
req_cmd += tmp_cmd;
console.log("[delall] ", tmp_cmd);
tmp_cmd = "&delall.device.limit.*";
req_cmd += tmp_cmd;
console.log("[delall] ", tmp_cmd);
}
function main_submit()
{
var self_jslib, rep_ret;
if(req_cmd == "")
return;
self_jslib = new mcm_jslib_lib_t();
self_jslib.socket_path = "@mintcm";
self_jslib.session_permission = mcm_session_permission.rw;
self_jslib.session_stack_size = 0;
self_jslib.request_command = req_cmd;
self_jslib.after_complete = mcm_after_complete.reload;
self_jslib.other_query = "";
rep_ret = mcm_jslib_submit_config(self_jslib);
if(rep_ret.rep_code < mcm_return_code.pass)
{
alert("call mcm_jslib_submit_config() fail" +
"[" + rep_ret.rep_code + "]");
mcm_jslib_run_script(rep_ret.rep_data);
return;
}
mcm_jslib_run_script(rep_ret.rep_data);
}
</script>
</head>
<body>
<button type="button" onclick="main_command()">01. command</button>
<button type="button" onclick="main_submit()">02. submit</button>
</body>
</html>
|
|
執行 mint_cm/mcm_daemon/mcm_module 內的模組函式 (run)
格式 :
"&run.$(module_function)"
注意事項 :
建立指令. 範例 : var req_cmd = ""; // 執行 mcm_module_web_test_01 req_cmd += "&run.mcm_module_web_test_01"; 指令建立後, 使用 mcm_jslib_submit_config() 送出請求, 之後檢查返回的結果是否成功. 範例 :
var self_jslib, rep_ret;
self_jslib = new mcm_jslib_lib_t();
self_jslib.socket_path = "@mintcm";
self_jslib.session_permission = mcm_session_permission.ro;
self_jslib.session_stack_size = 1048576;
self_jslib.request_command = req_cmd;
self_jslib.after_complete = mcm_after_complete.reload;
self_jslib.other_query = "";
rep_ret = mcm_jslib_submit_config(self_jslib);
if(rep_ret.rep_code < mcm_return_code.pass)
{
alert("call mcm_jslib_submit_config() fail" +
"[" + rep_ret.rep_code + "]");
mcm_jslib_run_script(rep_ret.rep_data);
return;
}
mcm_jslib_run_script(rep_ret.rep_data);
完整程式 :
<html>
<head>
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<script type="text/javascript" src="jquery_main.js"></script>
<script type="text/javascript" src="json3.js"></script>
<script type="text/javascript" src="mcm_jslib_api.js"></script>
<script type="text/javascript" src="mcm_jslib_data_info_auto.js"></script>
<script type="text/javascript">
var req_cmd = "";
function main_command()
{
var tmp_data, tmp_cmd;
req_cmd = "";
console.clear();
tmp_cmd = "&run.mcm_module_web_test_01";
req_cmd += tmp_cmd;
console.log("[run] ", tmp_cmd);
}
function main_submit()
{
var self_jslib, rep_ret;
if(req_cmd == "")
return;
self_jslib = new mcm_jslib_lib_t();
self_jslib.socket_path = "@mintcm";
self_jslib.session_permission = mcm_session_permission.ro;
self_jslib.session_stack_size = 1048576;
self_jslib.request_command = req_cmd;
self_jslib.after_complete = mcm_after_complete.reload;
self_jslib.other_query = "";
rep_ret = mcm_jslib_submit_config(self_jslib);
if(rep_ret.rep_code < mcm_return_code.pass)
{
alert("call mcm_jslib_submit_config() fail" +
"[" + rep_ret.rep_code + "]");
mcm_jslib_run_script(rep_ret.rep_data);
return;
}
mcm_jslib_run_script(rep_ret.rep_data);
}
</script>
</head>
<body>
<button type="button" onclick="main_command()">01. command</button>
<button type="button" onclick="main_submit()">02. submit</button>
</body>
</html>
模組部分 :
這部分程式要放在 mint_cm/mcm_daemon/mcm_module 之下, 檔案名稱隨意 (*.c),
之後在 mint_cm 使用 make all 重新編譯.
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include "mcm_lib/mcm_lheader/mcm_type.h"
#include "mcm_lib/mcm_lheader/mcm_size.h"
#include "mcm_lib/mcm_lheader/mcm_control.h"
#include "mcm_lib/mcm_lheader/mcm_connect.h"
#include "mcm_lib/mcm_lheader/mcm_return.h"
#include "mcm_lib/mcm_lheader/mcm_debug.h"
#include "mcm_lib/mcm_lheader/mcm_data_exinfo_auto.h"
#include "../mcm_service_handle_define.h"
#include "../mcm_config_handle_extern.h"
#define DMSG(msg_fmt, msgs...) printf("%s(%04u): " msg_fmt "\n", __FILE__, __LINE__, ##msgs)
int mcm_module_web_test_01(
struct mcm_service_session_t *this_session)
{
srand(time(NULL));
DMSG("module-%u", rand());
return MCM_RCODE_PASS;
}
|
|
在取值 (使用 mcm_jslib_obtain_config()) 的情況
可以混用的指令有 [get] [set] [add] [del] [delall] [run] 使用的時機 : 要取得的資料必須先從系統中取出, 再放到資料庫中供讀取. [詳細] 使用方式 :
範例 :
var self_jslib, req_cmd, rep_ret;
// 執行 mcm_module_get_uptime(), 取得 device.system.loading
req_cmd += "&run.module_get_loading" +
"&get.device.system";
// 執行 mcm_module_get_client(), 取得 device.client.*
req_cmd += "&run.module_get_client" +
"&get.device.client.*";
self_jslib = new mcm_jslib_lib_t();
self_jslib.socket_path = "@mintcm";
self_jslib.session_permission = mcm_session_permission.rw;
self_jslib.session_stack_size = 0;
self_jslib.request_command = req_cmd;
self_jslib.data_format = mcm_data_format.all_default;
self_jslib.other_query = "";
rep_ret = mcm_jslib_obtain_config(self_jslib);
...
注意事項 :
|
|
在設值 (使用 mcm_jslib_submit_config()) 的情況
可以混用的指令有, [set] [add] [del] [delall] [run] 使用的時機 : 資料送入資料庫後, 需要用這些資料對系統做實際的設定. [詳細] 使用方式 :
範例程式 :
var self_jslib, req_cmd, rep_ret;
// 設定 device.system.ip_addr
req_cmd += "&set.device.system.ip_addr=" +
mcm_jslib_convert_submit_str("192.168.100.1");
req_cmd += "&run.module_config_sytem";
// 設定 device.vap.#8
req_cmd += "&set.device.vap.#8.ssid=" +
mcm_jslib_convert_submit_str("private-networ");
req_cmd += "&set.device.vap.#8.channel=11";
// 刪除 device.vap.#15
req_cmd += "&del.device.vap.#15";
// 增加 device.vap.#55
req_cmd += "&add.device.vap.#55=";
req_cmd += "&set.device.vap.#55.ssid=" +
mcm_jslib_convert_submit_str("public-networ");
req_cmd += "&set.device.vap.#55.channel=44";
// 處理 device.vap.*
req_cmd += "&run.module_config_vap";
self_jslib = new mcm_jslib_lib_t();
self_jslib.socket_path = "@mintcm";
self_jslib.session_permission = mcm_session_permission.rw;
self_jslib.session_stack_size = 0;
self_jslib.request_command = req_cmd;
self_jslib.after_complete = mcm_after_complete.reload;
self_jslib.other_query = "";
rep_ret = mcm_jslib_submit_config(self_jslib);
...
注意事項 :
|
| 初始值檔案 mcm_store_profile_default.txt |
因為 mcm_daemon 會先讀取現在值檔案, 不存在才讀取初始值檔,
所以每次改好後執行 mcm_daemon 之前要先將現在值檔案刪除. 檔案內容格式 [詳細] |
| 現在值檔案 mcm_store_profile_current.txt |
檔案內容格式和初始值檔案相同 [詳細] |
| 01. | 範例程式目錄在 mint_cm/usage/example/0304. |
| 02. | 下面關於 make 的操作沒有特別註明的話都是在 mint_cm 目錄. |
| 03. |
先修改 mini_httpd 讀取網頁的路徑. 修改 mint_cm/http_server/mini_httpd/last/mini_httpd.conf, 裡面的 dir=/mint_cm/run 必須改成 mint_cm/run 資料夾實際的路徑. |
| 04. | 第一次使用, 使用 make example_add KEY=0304 載入範例並編譯. |
| 05. |
web_app 是範例程式. 範例項目 :
|
| 06. |
mini_httpd 執行方法, 進入 mint_cm/run 目錄,
指令 : ./mini_httpd -C mini_httpd.conf |
| 07. | 先執行 mcm_daemon 和 mini_httpd 才可測試. |
| 08. | 瀏覽器連至 http://<server-address>/web_app_0304_index.html 就可以看到範例頁面. |
| 09. | 測試完畢不使用後, 使用 make example_del KEY=0304 將範例移除. |
| 10. |
範例程式目錄下的檔案在做完 make example_add
後會複製到真正使用的位置, 要修改做測試的話要改在複製後的.
|