C++分析研究 |
|
|||
C++ |
日歷
統(tǒng)計
導航常用鏈接留言簿隨筆檔案
文章檔案搜索最新評論
閱讀排行榜評論排行榜 |
C 語言表驅(qū)動動態(tài)加載應用實例
目前手機終端功能越來越強大,客戶需求也是各種各樣,而且對于同一話機可能在不同的時間地點,要求的話機功能也不一樣,如何能夠通過一種遠程的方式 調(diào)制話機功能,也成為各廠商的一個難題,介于此,產(chǎn)生了一種通過 命令+數(shù)據(jù) 修改終端參數(shù)的一種方式出現(xiàn)了。如何設置,設計公司機密,此處不便透露, 本文的重點在于描述,實現(xiàn)這個功能的一個重點技術應用,C 中的表驅(qū)動應用及鏈表應用。托福答案 廢話少說,先做準備工作。 要處理的數(shù)據(jù)為 命令+ 數(shù)據(jù) 那么定義函數(shù)如下: typedef NMCMD_RETURN (* COMMAND_FUNCTION)(C_UINT16 cmd_id, const C_CHAR * p_cmd_data, C_UINT8 data_len); 其中 cmd_id 為命令p_cmd_data 為數(shù)據(jù)data_len 為數(shù)據(jù)長度。托福改分 定義結構體 用來擴展不同功能模塊的處理,可根據(jù)應用來增加功能模塊 如:加密卡處理,鎖機鎖卡處理,安防處理,計費處理等。托福答案 /*----------------------------------------------------------------------------- * 文件_數(shù)據(jù)類型定義 *-----------------------------------------------------------------------------*/ typedef struct stnmcmd { struct stnmcmd *pNext; /* 鏈表*/ COMMAND_FUNCTION fProc; /* 指向下一個*/ }XNNM_CMDPROC; 定義全局 變量 指向鏈表頭 static XNNM_CMDPROC *m_nmcmdproc = C_PNULL; 定義不同命令對應的處理函數(shù) //命令與命令處理函數(shù)映射結構 typedef struct { C_UINT16 cmd_id; //命令 COMMAND_FUNCTION cmd_fun; //命令處理函數(shù) }NMCMD_FUNCTION; 下面是基本框架函數(shù)實現(xiàn) 往鏈表中添加模塊命令處理函數(shù) /*--------------------------------------------------------------------------- * 函數(shù)名稱: xnnm_loadproc * 功能描述: 加載處理器 * * 輸入?yún)?shù): COMMAND_FUNCTION fProc // 處理器 * 輸出參數(shù): 無 * 返 回 值: * * 歷史紀錄: * 修改人 日期 日志 * 2010-7-9 *---------------------------------------------------------------------------*/ C_UINT16 xnnm_LoadProc( COMMAND_FUNCTION fProc ) { XNNM_CMDPROC *pNew = C_PNULL; if( fProc == C_PNULL ) { return C_FALSE; } pNew = NM_MALLOC( sizeof(*pNew) ); if( pNew == C_PNULL ) { return C_FALSE; } memset( pNew, 0x00, sizeof(*pNew) ); pNew->fProc = fProc; pNew->pNext = m_nmcmdproc; m_nmcmdproc = pNew; return C_TRUE; } 將命令及數(shù)據(jù)傳入進行處理 /*--------------------------------------------------------------------------- * 函數(shù)名稱: xnnm_ExecProc * 功能描述: 執(zhí)行處理器 * * 輸入?yún)?shù): * 輸出參數(shù): * 返 回 值: * * 歷史紀錄: * 修改人 日期 日志 * 2010-7-9 *---------------------------------------------------------------------------*/ C_UINT16 xnnm_ExecProc( C_UINT16 cmd_id, const C_CHAR * p_cmd_data, C_UINT8 data_len ) { XNNM_CMDPROC *pList = m_nmcmdproc; while( pList ) { if( pList->fProc( cmd_id, p_cmd_data, data_len ) == RET_NMCMD_SUCCESS ) { break; } pList = pList->pNext; } return C_TRUE; } 下面以鎖機鎖卡部分功能來實現(xiàn)鎖機鎖卡模塊命令處理函數(shù)應用,加深對此框架的理解。 鎖pin碼命令處理函數(shù) static NMCMD_RETURN nmcmd_lock_pin(C_UINT16 cmd_id, const C_CHAR * p_cmd_data, C_UINT8 data_len) { if ((data_len < 1) || (data_len > 2) || (XINO_IsNumStr(p_cmd_data, data_len) == C_FALSE)) { return RET_NMCMD_INVALID_DATA; } // 根據(jù)數(shù)據(jù)內(nèi)容做相應的處理begin if(XINO_STR2INT((const C_CHAR *)p_cmd_data, data_len) == 0) { locknv_enable_pin( 0 ); } else { locknv_enable_pin( 1 ); } // 根據(jù)數(shù)據(jù)內(nèi)容做相應的處理end return RET_NMCMD_SUCCESS; } /*-----------------------------------------------------------------------------*/ //鎖機鎖卡功能模塊 命令 與命令處理函數(shù)對應表 static const NMCMD_FUNCTION m_acstcmd[] = { {ID_NMCMD_LOCK_PIN, nmcmd_lock_pin }, //修改開機自動鎖Pin碼 {ID_NMCMD_ENABLE_RAND_PIN, nmcmd_enable_rand_pin }, //修改是否啟用隨機PIN碼 {ID_NMCMD_SET_FIXED_PIN , nmcmd_fix_pin }, /* 設置固定PIN碼*/ {ID_NMCMD_INIT_PIN, nmcmd_init_pin }, //修改初始PIN碼 {ID_NMCMD_LOCK_IMSI, nmcmd_lock_imsi }, //修改開機自動綁定IMSI號 {ID_NMCMD_CELL_LOCKED, nmcmd_cell_locked }, //修改是否鎖定CELL {ID_NMCMD_CELL_AUTOINC, nmcmd_cell_autoinc }, //修改CELL是否自動增長 {ID_NMCMD_CELL_LOCK_MAX, nmcmd_cell_lock_max }, //修改CELL最大鎖定個數(shù) {ID_NMCMD_CLEAN_CELL_LIST, nmcmd_clean_cell_list }, //清除CELL鎖定列表 {ID_NMCMD_CELL_LIST_TYPE, nmcmd_cell_list_type }, //鎖定CELL類型- 黑白名單 {ID_NMCMD_LOCK_CELL_APPEND, nmcmd_lock_cell_append }, //添加鎖定的CELL {ID_NMCMD_LAC_LOCKED, nmcmd_lac_locked }, //修改是否鎖定lAC {ID_NMCMD_LAC_LIST_TYPE, nmcmd_lac_list_type }, //鎖定lac類型- 黑白名單 {ID_NMCMD_LAC_AUTOINC, nmcmd_lac_autoinc }, //修改lac是否自動增長 {ID_NMCMD_LAC_LOCK_MAX, nmcmd_lac_lock_max }, //修改lac最大鎖定個數(shù) {ID_NMCMD_CLEAN_LAC_LIST, nmcmd_clean_lac_list }, //清除lac鎖定列表 {ID_NMCMD_LOCK_LAC_APPEND, nmcmd_lock_lac_append }, //添加鎖定的lac /* 鎖運營商*/ {ID_NMCMD_LOCK_SP_CLEAN, nmcmd_lock_sp_clean }, //鎖定運營商表-清除 {ID_NMCMD_LOCK_SP_APPEND_MODIFY, nmcmd_lock_sp_append_modify }, //鎖定運營商表-添加/修改 //{ID_NMCMD_LOCK_SP_DELETE, nmcmd_lock_sp_delete }, //鎖定運營商表-刪除 {C_PNULL, C_PNULL }, }; 其中ID_NMCMD_LOCK_PIN ID_NMCMD_CLEAN_LAC_LIST 等 為定義的命令 nmcmd_lock_pin nmcmd_enable_rand_pin 等為 命令對應的處理函數(shù)。 /*----------------------------------------------------------------------------- * 全局_函數(shù)實現(xiàn) *-----------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------- * 函數(shù)名稱: locknm_handlercmd * 功能描述: 處理器 處理鎖機鎖卡根據(jù)命令查找對應樹立函數(shù) * * 輸入?yún)?shù): * 輸出參數(shù): * 返 回 值: * * 歷史紀錄: * 修改人 日期 日志 * 2010-7-9 *---------------------------------------------------------------------------*/ NMCMD_RETURN locknm_handlercmd(C_UINT16 cmd_id, const char * p_cmd_data, C_UINT8 data_len) { NMCMD_RETURN bRet = RET_NMCMD_FAIL; C_UINT16 nTableSize = sizeof( m_acstcmd ) /sizeof(m_acstcmd[0]); NMCMD_FUNCTION *pTable = m_acstcmd; C_UINT16 i = 0; XINO_TRACE_LOW("[xjp] locknm_handlercmd enter"); for( i = 0; i < nTableSize; i++ ) { if( ( pTable[i].cmd_id == cmd_id ) && ( pTable[i].cmd_fun != C_PNULL ) ) { /* 處理成功*/ pTable[i].cmd_fun( cmd_id, p_cmd_data, data_len ); bRet = RET_NMCMD_SUCCESS; break; } } XINO_TRACE_LOW("[xjp] locknm_handlercmd leave"); return bRet; } 開機初始化時 調(diào)用lock_init_proc 加載鎖機鎖卡命令處理函數(shù)locknm_handlercmd 到鏈表中。 C_VOID lock_init_proc( C_VOID ) { /* 加載命令處理*/ xnnm_LoadProc(locknm_handlercmd); /* 加載開機處理器*/ } 命令接收處調(diào)用 xnnm_ExecProc( C_UINT16 cmd_id, const C_CHAR * p_cmd_data, C_UINT8 data_len ) 進行處理。 如果有新增一個模塊 需要完成的工作就是 1.新增 命令與函數(shù)對應關系表 本例為 static const NMCMD_FUNCTION m_acstcmd[] = 2.新增 根據(jù)命令查找處理函數(shù) 本例為 NMCMD_RETURN locknm_handlercmd(C_UINT16 cmd_id, const char * p_cmd_data, C_UINT8 data_len) 3. 新增相應命令處理函數(shù), 本例為 static NMCMD_RETURN nmcmd_lock_pin(C_UINT16 cmd_id, const C_CHAR * p_cmd_data, C_UINT8 data_len) 4. 在終端初始化部分加載根據(jù)命令查找對應處理函數(shù) 本例為C_VOID lock_init_proc( C_VOID )
|
![]() |
|
Copyright © HAOSOLA | Powered by: 博客園 模板提供:滬江博客 |