TI IPNC Web网页之网页修改教程
web網頁程序修改
打開gStudio之后,點擊菜單欄中Help->Contents。先把這個詭異的編程語言看一遍吧。這里搬一些東西出來。
GoDB簡介
從第一副圖片中,我們可以看出,從源文件到可執行文件的過程。
從第二幅圖我們可以了解到GoDB是如何跨平臺的。
編程語言的話:
GBasic is a variant of the Basic Language included in GoDB platform as the scripting language.
這種編程語言大小寫不區分,真是編程界的一朵奇葩。
GBasic編程語言
GBasic程序通常是有一個frm文件和與之名字相同的bas文件。比如說當HOME.frm被加載時,HOME.bas就會被執行。
- GBasic中的字符串變量名以$結尾。
- 如果沒有$的變量則認為是數值變量
- GBasic有兩種對象(object),一種是Form Field Objects(可理解為Visual Studio中的rc文件),另外一種是數據庫(專業版才能使用)
- 在GBasic中調用From對象方式是用
#對象名 - GBasic中有三種變量范圍,全局,局部和當前頁面。
其中變量名以~開頭的是全局變量,你可以在工程的任何地方訪問這個變量。沒有以~開頭的變量并且聲明在Sub或者Function之外的,則為頁面變量,聲明在Sub或者Function內部的則是局部變量。 - 像其它任何語言一樣,GBasic也可以將針對多行代碼進行封裝。GBasic提供Subroutines和Functions這兩種方式,前者沒有返回值,后者需要返回值。如果要直接調用Subroutines,你需要在其前面家
call,比如說call subname,而Functions的調用則不用。 - Functions返回值的做法是賦值給函數名。
GBasic自帶了很多封裝好的函數,這些函數如何用,請看Help。
GStudio這個IDE像Visual Stduio一樣,支持控件的事件觸發(按鈕按下,編輯框改變etc.)這些事件稱之為控件的事件,還有另外一種事件叫做Global Event。
具體查看Help中的GBasic Reference->Global Event。這里稍微介紹下
form_load當frm文件加載首先執行的是這個Sub。form_notify當收到服務器反饋時自動調用,此時在用GetMessage獲取消息內容..form_timer,定時器觸發時調用此Sub,通常使用settimer(1000)來使能定時觸發。
所以一般閱讀GoDB工程代碼一般先從每個bas文件的
form_load開始看起。
Debug
- 在GUI的下拉菜單中,保證當前選中的是"DEBUG"模式;
- 按F7編譯工程,按F5會編譯和啟動項目;
- 保證你在"Win32_Debug"文件夾中有"ip.txt"文件,這個是用于用戶登錄的。
Release
- 在
Debug/ Release下拉菜單中選中Release - 在View-option在選項卡
Build中在Make Read-Only BDB選中 - 在文件夾
Win32_Release中找到gIPNC-ro.bdb - 使用以下命令生成
gIPNC-ro.gz
gIPNC工程分析
我們做的是在原有基礎上添加東西,修修補補,誰要是有精力就從頭開始弄吧。
bas和frm和inc一一對應,bas為執行文件,inc為頭文件,frm為form文件,相當于Visual Studio中的rc文件。
還是先分析流程吧。
首先當然是登錄界面,那就是對應logon.bas和auth.bas,首次登錄執行的auth.bas文件,而用戶刷新過程中執行的logon.bas文件。
關于logon.bas
readprofile("PAGENAME",pageName$)
...
readprofile("IPNC",loginDet$)
... 首先讀取變量名為IPNC和PAGENAME的profile,如果讀取得到那么就將讀取到的用戶名和密碼填充到用戶名編輯框和登錄編輯框(這就是記住密碼功能),調用dwnldIniFile函數進行Http請求,請求內容是ip地址/ini.htm,這樣如果認證通過,那么此時已經把所有關鍵字及其內容保存到~responseData$全局環境變量上。獲取失敗則彈出用戶或密碼錯誤。讀取profile錯誤,則加載auth.frm。
我們知道,TI IPNC除了用戶驗證登錄之外還有區分用戶權限,所以在成功調用dwnldIniFile調用getUserAuthority獲取當前用戶的權限,獲取失敗彈出錯誤信息,成功并且PAGENAME的值為LOGIN則加載auth.frm,否則直接進入liveVideo.frm
溫馨提示,仔細研究下writeprofile函數,你就知道如何做到真正的記住密碼。
溫馨提示,GetIPAddress()是進行調試的關鍵。
分析auth.bas不難發現,無非就是。先將讀取到的IPNC變量的值進行填充,然后這個文件主要的邏輯就是cmdSubmit_Click這個按鈕按下的事件處理函數了。先進行輸入驗證,然后是登錄驗證,也是調用dwnldIniFile進行認證getUserAuthority。最后成功加載livevideo.frm,并寫PAGENAME的profile。
** 幾個比較關鍵的文件 **
這個工程里面有幾個文件是比較重要(特殊的文件)的那就是leftmenu.bas,functions.inc,defines.inc,common.inc和keywords.inc
- 其中
leftmenu.bas是網頁側邊欄的執行文件,添加,刪除子菜單就修改這個文件。 functions.inc里面定義了眾多函數,大部分是網頁keyword獲取和設置的函數。defines.inc文件定義了一些關鍵數字,比如說側欄菜單(主菜單,子菜單)多少個,比如關鍵字最多有多少個,有時候一些莫名其妙的錯誤就是由于這個文件上的數字沒對上引起的。common.inc定義了一些通用函數,比如編輯框可以輸入哪些字符,不可以輸入哪些字符(CheckKey),產生Request Header(generateauthHeader)。keywords.inc,這個僅在functions.inc中被包括。這個文件其實不太重要,作用僅僅是用于顯示獲取或設置關鍵字時的錯誤信息而已。
logon.bas和auth.bas他們都包括了functions.inc,defines.inc,common.inc。而其它的主頁面除了這個三個文件之外,還包括leftmenu.bas,這樣的效果就是將側邊欄和各個form的網頁疊加起來。
GBasic是從頭到尾順序執行的,所以每個bas文件先執行Sub或者functions之外的語句之后,然后再執行form_load事件,由于先包括了leftmenu.bas,所以會先執行leftmenu.bas里面的內容,而每個frm頁面都包括了leftmenu.frm文件。這樣就加載了側邊欄。
leftmenu負責觸發加載各個頁面。
添加刪除側邊欄菜單
這里只說怎么加,不討論怎么建頁面。
打開leftmenu.bas
dims ~menuArray$(MAXMAINMENU+MAXSUBMENU+3)
dims menuOffImg$(MAXMAINMENU) = ("!camera_Off.bin","!users_Off.bin","!settings_Off.bin","!maintanance_off.bin","!support_off.bin")
dims ~menuOnImg$(MAXMAINMENU) = ("!camera_On.bin","!users_On.bin","!settings_On.bin","!maintanance_on.bin","!support_on.bin")
dims ~urlMainArray$(MAXMAINMENU) = ("!liveVideo.frm", "!addusers.frm","!videoImageSettings.frm","!maintenance.frm","!supportScreen.frm")
dims ~urlSubArray$(MAXSUBMENU) = ("!videoImageSettings.frm","!videoAnalyticsSetting.frm","!DMVAeventMonitor.frm","!display_settings.frm", "!audioSetting.frm","!setDateTime.frm", "!NetworkSettings.frm", "!alarmSettings.frm", "!class.frm","!storageSetting.frm")dimi dmvaEnable#imgselected.hidden = 1
loadMenuCaptions()
.... 上面是我修改過的。其中比較關鍵的是幾個宏定義的定義,如果你要修改,請算好側邊欄的個數,然后修改在defines.inc中的數值。bin文件是主菜單的對應的圖片,關于圖片后面才說,frm就是對應的頁面啦,算好順序...
- 如果要增加頁面,則在leftmenu.frm中增加一個
ReadOnly控件,然后NAME必須為rosubmenu,value為空,背景那些參照已有的..你會發現有好幾個ReadOnly都叫做rosubmenu,然后這個ide就自動就其他們的name改為類似數組的樣子..rosubmenu[0],而程序里面也是如此引用。 - 修改字符串數組~URLsUBaRRAY$,將建立好的FRM的文件名添加到末尾
- 修改子菜單數量maxsubmenu和leftmenuctrls(在DEFINE.INC中定義).各加1
- 修改子菜單名字,修改MENUcAPTIONS.LAN文件,這個文件前面5個是主菜單,后面是子菜單的名字
- BUG.將ARRmOUSEpOS(14, 4)改成ARRmOUSEpOS(maxmainmenu+maxsubmenu, 4),否則會出現數組越界
- 子菜單對應的頁面的BAS文件必須包括兩個函數savepage()和chkValueMismatch(),否則會報錯..
當然leftmenu大部分菜單鼠標點擊時鼠標的觸發事件,也就是加載相應的頁面。當然還有什么圖標排列,音視頻開關等處理...
另外值得注意的是:子菜單中有可能有一兩個頁面是默認隱藏的,某種條件觸發下才顯示。比如Live Video頁面那個Example的下拉框就是一個觸發條件,另外如果用戶權限不同,子菜單顯示的個數也有所不同,這些邏輯都在leftmenu.bas中。
子頁面流程分析
IPNC網頁默認幾個頁面,大部分都是傳統的表單頁面,無非就是些CheckBox,Edit,CommonBox之類的控件,加載頁面的時候,就是獲取服務器上對應的控件的值然后填充進去,保存頁面的時候,則是發送http請求到web服務器進行保存然后重新獲取更新。
一般來說一個控件對應一個關鍵字。
我們先從對應頁面的form_load看起,然后看savepage,然后看各個控件觸發事件..其它全局事件。
我們拿聲音設置頁面為例,對應的文件是audiosetting.bas和audiosetting.frm文件。
Sub Form_Loaddimi retValretVal = loadIniValues()if ~maxPropIndex = 0 then msgbox("無法加載初始配置",0,"錯誤",3)loadurl("!auth.frm")endifcall displayControls(LabelName$,XPos,YPos,Wdh,height)call loadInitialValues() showSubMenu(0,1)setfocus("rosubmenu[4]")selectSubMenu() setfocus("chkenableaudio")call chkenableAudio_Click 'TR-19getimagefile(sliderImage$,"!slider_but.jpg")#lblsuccessmessage$ = "" 'TR-35End Sub retVal = loadIniValues()
這是個關鍵函數,這個函數里面請求http://ip/ini.htm獲取所有關鍵字的值,如果獲取失敗了,就提示錯誤。在loadIniValues函數中,有個字符串數組非常關鍵,每次添加新的關鍵字都必須修改這個字符串在后面添加新的關鍵字。keywords$
網頁在functions.inc中的loadIniValues()中解析得到這些值將這些屬性和對應的值放分別放到字符串數組~iniProperties$和iniPropValues$中.
值得注意的是在放入~iniProperties$之前,在每個屬性名之前加了字母"g".
每個頁面的form_load都會在一開始調用這個函數
call loadInitialValues()
這個函數,也是非常典型,幾乎每個頁面都會做類似的處理(可能函數名字不同或者沒用函數),作用是獲取當前頁面關鍵字的值然后填充到控件里面。
然后這里基本上都用到functions.inc中"get"開頭的一些函數,這些函數參數不同,都是處理流程一致,都是分析~iniPropValues$這個全局變量然后取出對應的關鍵字的值。
retVal = getAudioSetting(enableAudio,audioMode,inputVolume,_encoding,sampleRate,bitRate, _alarmLevel,outputVolume) 'functions.inc中定義
function getAudioSetting(byref dimi enableAudio, byref dimi audioMode, byref dimi inputVolume, _byref dimi encoding, byref dimi sampleRate, byref dimi bitRate, _byref dimi alarmLevel, byref dimi outputVolume)'TR-26 dims varName$(8) = ("enableAudio","audioMode","inputVolume", _"encoding","sampleRate","bitRate", _"alarmLevel","outputVolume") dims propName$(8) = ("gaudioenable","gaudiomode","gaudioinvolume", _"gencoding","gsamplerate","gaudiobitrate", _"galarmlevel","gaudiooutvolume")dims tempVal$(8)dimi i,retValretVal = getiniValues(propName$,tempVal$) if retVal = 0 thenfor i= 0 to ubound(tempVal$) {varName$(i)} = strtoint(tempVal$(i)) nextendifreturn retVal End Function 所以當你添加新的關鍵字時,做法可以是在原有函數基礎增加參數。也可以按照里面的這些函數的形式和邏輯重新定義一個新的函數...
下面介紹另外一個重要函數,那就是savepage函數,記住不管你頁面是否需要保存,都必須存在這個函數。正如前面一小節所說......
savepage函數里面重要是使用functions.inc中"set"開頭的一些函數。這些函數參數不盡相同,但是邏輯相同,都是通過發送http請求設置關鍵字的值。
savepage函數一般還會做控件輸入值有效的檢測,錯誤成功信息顯示等處理...
/*一般實在保存按鈕的事件響應函數中調用savepage函數*/
Sub cmdsave_Click if canReload = 1 thensavePage() end if
End Sub Sub savePage()'Validate user input controls valuesiff validatemodecontrols() = 0 then return dimi retVal,i' TR-26 set values to cameraretVal = setAudioSetting(#chkenableaudio,#drpaudiomode,atol(#sldaudioinput$),_#drpencoding,#drpsamplerate,#drpbitrate,_#sldalarmlevel,atol(#sldaudiooutput$))saveSuccess = retValtempX = #lblsuccessmessage.x'Based on reload flag wait for the camera to restartif getReloadFlag() = 1 then 'TR-45 #lblsuccessmessage.style = 128#lblsuccessmessage.x = #lblsuccessmessage.x + #lblsuccessmessage.w/3canReload = 0animateCount = 1call animateLabel("lblsuccessmessage","參數更新中")else // If Reload animation is not requiredcanReload = 1end ifif canReload = 1 Then //Do the remaining actions after reload animation is donecall displaySaveStatus(saveSuccess) end if
End Sub function setAudioSetting(dimi enableAudio, dimi audioMode, dimi inputVolume, _dimi encoding, dimi sampleRate, dimi bitRate, _dimi alarmLevel, dimi outputVolume) dimi retdims value$dims responseData$' TR-26value$ = "audioenable="+enableAudio+"&audiomode="+audioMode+"&audioinvolume="+inputVolume+_"&encoding="+encoding+"&samplerate="+sampleRate+"&audiobitrate="+bitRate+_"&alarmlevel="+alarmLevel+"&audiooutvolume="+outputVolumepprint value$ ret = setProperties(value$, responseData$) if ret > 0 thendims propName$(8) = ("gaudioenable","gaudiomode","gaudioinvolume", _"gencoding","gsamplerate","gaudiobitrate", _"galarmlevel","gaudiooutvolume")dims propVal$(8)propVal$(0) = enableAudiopropVal$(1) = audioModepropVal$(2) = inputVolumepropVal$(3) = encodingpropVal$(4) = sampleRatepropVal$(5) = bitRatepropVal$(6) = alarmLevelpropVal$(7) = outputVolume~errorKeywords$ = ""~errorKeywords$ = chkRetStatusAndUpdate$(responseData$,propName$,propVal$)if len(~errorKeywords$) > 0 thenreturn -10elsereturn retendif endif return ret End Function 跟蹤到里面去,不難發現,實際上就是發送這樣形式的Http請求:
vb.htm?keyword1=xx&keyword2=xxx
當增加新的關鍵字時,可以仿照這些set開頭函數重新定義一個新的函數,也可以在原有基礎上擴充。
GoDB端添加關鍵字的流程
這里介紹在GoDB端添加關鍵字的流程。我們忽略boa端代碼的修改,所以修改完之后,既不能獲取到這個關鍵字也無法設置成功。
現在舉添加rtmp功能的例子..
頁面如下,在網絡/端口設置頁面添加一個checkbox和一個edit,這就對應了兩個關鍵字,關鍵字名字分別為rtmp_en和rtmp_url(隨意)
還是從from_load開始,還是從加載控件默認值的函數開始...
call ShowDefaultValues()
在這個Sub內:
dimi rtmp_en
Dims rtmp_url$
然后我們選擇擴充已有的函數
retVal=getSNTPRTSPDetails(sntpServer$, multiCast,rtmp_en,rtmp_url$)
/*在functions.inc中定義*/
function getSNTPRTSPDetails(byref dims sntpServer$,byref dimi multiCast,byref dimi rtmp_en,byref dims rtmp_url$)dims varName$(4) = ("sntpServer$","multiCast","rtmp_en","rtmp_url$")dims propName$(4) = ("gsntpip","gmulticast","grtmp_en","grtmp_url")dims tempVal$(4)dimi i,retret=getiniValues(propName$,tempVal$)if ret>=0 thenfor i= 0 to ubound(tempVal$)if i=1 or i=2 then{varName$(i)} = strtoint(tempVal$(i)) else {varName$(i)} = tempVal$(i) endifnextendifreturn ret End Function 你對比下原始函數就知道我修改了哪里..
接著我們修改functions.inc中的loadIniValues函數,將rtmp_en和rtmp_url添加到keywords$字符串后面
/*....*/keywords$ +=",aviformat,aviformatname,aviduration,avidurationname,reloadtime,qpinit1,qpinit2,qpinit3"_",videocodeccombo,videocodeccomboname,streamname1,streamname2,streamname3"_",localdisplayname,sdinsert,reloadflag,dmvaenable,minnamelen,maxnamelen,minpwdlen,maxpwdlen,maxaccount"_",bkupfirmware,display_mode,ppt_sw_en,ppt_sw_sensitivity,ppt_sw_interval_time,channel_id,psname,piname,ch_id_name"_",file_size,video_long,brightness2,contrast2,saturation2,sharpness2,brightness3,contrast3,saturation3,sharpness3,brightness4,contrast4,saturation4,sharpness4"_",language,ftp_upload_option,ftp_upload_time,trackip,cloudip,serverenable,singlecodecres,rtmp_en,rtmp_url" 接著我們修改keywords.inc文件,將這兩個關鍵字添加到cameraKeywords$關鍵字后面。"|"右面是錯誤提示信息,合理填寫即可。
cameraKeywords$ += ",display_mode|Display mode,ppt_sw_en|PPT Switch Enable,ppt_sw_interval_time|PPT Switch interval Time,"_",ppt_sw_sensitivity|PPT Switch sensitivity,channel_id|main display channel,language|language,trackip|track ip,cloudip|cloudip,"_",serverenable|Upload to server,singlecodecres|resolution for single stream,rtmp_en|rtmp enable,rtmp_url|rtmp url" 接著,我們修改savepage函數。
retVal = setSNTPRTSPDetails(#txtsntpserver$, #chkrtspmulticast,#chkrtmp,#txtrtmpurl$)
這里傳入的參數是直接將對象的值傳入..
function setSNTPRTSPDetails(dims sntpServer$,dimi multiCast,dimi rtmp_en,dims rtmp_url$)dimi retdims SNTPRTSPDetails$dims responseData$SNTPRTSPDetails$="sntpip="+sntpServer$+"&multicast="+multiCast+"&rtmp_en="+rtmp_en+"&rtmp_url="+rtmp_url$ ret = setProperties(SNTPRTSPDetails$, responseData$)if ret >= 0 thendims propName$(4) = ("gsntpip","gmulticast","grtmp_en","grtmp_url")dims propVal$(4)propVal$(0) = sntpServer$propVal$(1) = multiCast propVal$(2) = rtmp_enpropVal$(3) = rtmp_url$~errorKeywords$ = ""~errorKeywords$ = chkRetStatusAndUpdate$(responseData$,propName$,propVal$)if len(~errorKeywords$) > 0 thenreturn -10elsereturn retendif endif return ret End Function 這樣著,關鍵字添加完畢了,按照前面文章說的步驟編譯生成吧..
boa端添加關鍵字的流程
只講怎么添加。
請自行用工具定位下面變量,函數的位置。
先從SysInfo結構體開始修改,這個結構體將保存所有網頁表單,關鍵字的值。
我們在末尾添加
typedef struct SysInfo{//....__u8 rtmp_enable; ///< rtmp_enablechar rtmp_url[MAX_RTMP_URL_LEN+1];
}SysInfo; 網頁需要出廠默認值,所以在修改system_default.h文件添加兩個宏定義。
#define RTMP_EANABLE_DEFAULT 0 //RTMP使能,0為不使能...
#define RTMP_URL_DEFAULT "rtmp://192.168.1.120:1935/live/xxoo" 修改file_mng.c
修改全局靜態結構體SysInfoDefault,往末尾添加
static SysInfo SysInfoDefault =
{//....RTMP_EANABLE_DEFAULT,RTMP_URL_DEFAULT
}; 修改HttpOptionTable結構體。
HTTP_OPTION HttpOptionTable [] =
{//....{ "rtmp_en" , set_rtmp_en , AUTHORITY_OPERATOR, FALSE, TRUE, NULL },{ "rtmp_url" , set_rtmp_url , AUTHORITY_OPERATOR, FALSE, TRUE, NULL },//...
} 接著在該表所在文件定義這兩個函數,一個是整數,一個字符串,注意區別。
void set_rtmp_en(request *req, COMMAND_ARGUMENT *argm)
{__u8 value = atoi(argm->value);do {ControlSystemData(SFIELD_SET_RTMP_EN, (void *)&value, sizeof(value));req->buffer_end += sprintf(req_bufptr(req), OPTION_OK "%s\n", argm->name);return;} while (0);req->buffer_end += sprintf(req_bufptr(req), OPTION_NG "%s\n", argm->name);
}void set_rtmp_url(request *req, COMMAND_ARGUMENT *argm)
{do {if(ControlSystemData(SFIELD_SET_RTMP_URL, (void*)argm->value, strlen(argm->value)) < 0)break;req->buffer_end += sprintf(req_bufptr(req), OPTION_OK "%s\n", argm->name);return;} while (0);req->buffer_end += sprintf(req_bufptr(req), OPTION_NG "%s\n", argm->name);
} 在sysctrl.h定義SFIELD_SET_RTMP_EN和SFIELD_SET_RTMP_URL
在ControlSystemData函數中添加
case SFIELD_SET_RTMP_URL:ret = SetSysCommon(data, len,SYS_MSG_SET_RTMP_URL);break;case SFIELD_SET_RTMP_EN:ret = SetSysCommon(data, len, SYS_MSG_SET_RTMP_EN);break; 在Msg_Def.h中定義SYS_MSG_SET_RTMP_URL和SYS_MSG_SET_RTMP_EN
在ProcSysMsg函數添加
case SYS_MSG_SET_RTMP_EN:{unsigned char value;DBG("SYS_MSG_SET_RTMP_EN\n");if(pMsg->length != sizeof(value))break;ShareMemRead(pMsg->offset, &value, pMsg->length);if(SetRtmpEn(value) != 0){printf("\nSystemServer:Fail at SYS_MSG_SET_MULTICAST\n");break;}ret = 1;break;}case SYS_MSG_SET_RTMP_URL:{if(pMsg->length > SYSTEM_SERVER_BUFFER_LENGTH){printf("String length bigger then System Server Buffer\n");break;}ShareMemRead(pMsg->offset, buffer, pMsg->length);if(SetRtmpUrl(buffer, pMsg->length) != 0){printf("Fail at SYS_MSG_SET_RTMP_URL\n");break;}ret = 1;break;} 定義SetRtmpUrl和SetRtmpEn函數(這里在system_control.c中定義)
這兩個函數的內容就非常自由了,不過和其它相同的地方就是就是需要將關鍵字保存到sysenv.cfg文件中。
所以分別各自定義一個函數用于保存關鍵字。
fSetRtmpEn和fSetRtmpUrl(file_msg_drv.c)中定義。
int fSetRtmpEn(unsigned char value)
{SysInfo *pSysInfo = (SysInfo *)pShareMem;if(pSysInfo == NULL)return -1;if (value == pSysInfo->rtmp_enable)return 0;memcpy(&pSysInfo->rtmp_enable, &value, sizeof(value));return SetSysInfo(0);
}
int fSetRtmpUrl(void *buf, int len)
{SysInfo *pSysInfo = (SysInfo *)pShareMem;if(pSysInfo == NULL)return -1;if(sizeof(pSysInfo->rtmp_url) < len + 1)return -1;memcpy(&pSysInfo->rtmp_url, (char*)buf, len);pSysInfo->rtmp_url[len] = '\0';return SetSysInfo(0);
}
int SetRtmpEn(unsigned char value)
{int ret = 0;SysInfo *pSysInfo = GetSysInfo();if(pSysInfo == NULL)return -1;if(value != pSysInfo->rtmp_enable){ret = fSetRtmpEn(value);if ( value == 1 )rtmp_start();elsertmp_stop();}return ret;
}
int SetRtmpUrl(void * buf, int length)
{int ret = 0;signed char* serverip=(signed char*)buf;SysInfo *pSysInfo = GetSysInfo();if(pSysInfo == NULL)return -1;if(strncmp(serverip,pSysInfo->rtmp_url,length) != 0){ret = fSetRtmpUrl(buf,length);rtmp_stop();if ( pSysInfo->rtmp_enable )rtmp_start();}return ret;
} 修改HttpArgument結構體,用于獲取關鍵字的值
HTML_ARGUMENT HttpArgument [] =
{//...{ "rtmp_en" , para_rtmp_en , AUTHORITY_VIEWER , NULL },{ "rtmp_url" , para_rtmp_url , AUTHORITY_VIEWER , NULL },//...
};
int para_rtmp_en(char *data, char *arg)
{SysInfo* pSysInfo = GetSysInfo();if(pSysInfo == NULL)return -1;return sprintf(data, "%d", pSysInfo->rtmp_enable);
}int para_rtmp_url(char *data, char *arg)
{SysInfo* pSysInfo = GetSysInfo();if(pSysInfo == NULL)return -1;return sprintf(data, "%s", pSysInfo->rtmp_url);
} 以上就成功的加入了關鍵字了,在其它線程里面,你只需要調用
SysInfo *pSysInfo = GetSysInfo();//pSysInfo->rtmp_en//pSysInfo->rtmp_url
轉載于:https://www.cnblogs.com/tracyone/p/4431698.html
總結
以上是生活随笔為你收集整理的TI IPNC Web网页之网页修改教程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一部外国电影,只记得一个女生叫(翠斯)加
- 下一篇: 黄山风景区安徽省免门票政策