全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1523
推到 Plurk!
推到 Facebook!

wap!delphi能做到!——應用於移動電話的WML(Wireless Markup Langua

 
jackkcg
站務副站長


發表:891
回覆:1050
積分:848
註冊:2002-03-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-09-26 21:54:49 IP:61.64.xxx.xxx 未訂閱
wap!delphi能做到!——應用於移動電話的WML(Wireless Markup Language)開發 本文作者:Jani J vinen 翻譯整理:崔凱 ---- 衆所周知,delphi有創建HTML文件的能力。然而,你知道嗎?delphi也能用來創建一些新的WAP(Wireless Application Protocol) 設備所需要的WML文件。 ---- 這篇文章中,你將學習到如何創建一個快速的,使用一個wap電話或者是一個類比系統的定制查詢系統。現在來讓我們來超越一下我們自己,來,讓我們從頭開始。 ---- WAP是最新的可支援WAP的第三代移動電話所使用的協定。很多人都認爲:WAP將把internet帶入移動電話中去,這不完全正確;畢竟,現在我們還不能使用WAP來實現網上衝浪。WAP所能做到的無非是讓你檢索到和顯示爲WAP電話而專門開發的特殊文件。這些文件是使用WML語言來編制的。 ---- WML語言和html語言類似,儘管還有很多格式化操作例如:嵌套表,層,顔色,還有不一樣的列印字體等,這些還不能應用到WML中。但WML確實允許開發人員定義簡單的文本格式,如:圖像,鏈結,和文本輸入的欄位。它之所以只有這麽簡單應用,關鍵原因在硬體上。因爲現在的移動電話還不能先是如此豐富的格式化操作。現在的移動電話只是使用很少的圖元顯示(大約是200*200),並且剛開始只能使大約4種灰色調,現在可以顯示彩色了。這時,就需要一個新的標記語言來做這種電話的軟體應用,因爲,當前的HTML文件不能適合這樣的螢幕了。這就是WML.協定。 ---- WAP設備是通過標準的URL( Uniform Resource Locator ,在Internet的WWW服務程式上用於指定資訊位置的表示方法)來訪問的。當WAP設備的使用者在他的WAP移動電話或者是其他設備上輸入URL的時候,這台設備開始跟一個爲它服務的WAP閘道通過無線電波聯繫。 ---- 一個這樣的閘道通常會是由移動通訊設備操作人員的一台主機來代替,例如:MCIWorldCom或者是Sprint(截稿時,這兩家公司的合併正懸而未決,但股東們已經基本同意了)。這台閘道電腦除了接收移動電話的請求,並通過HTTP協定把它轉到通常的INTERNET上去。在這裏,那些設備提供WEB服務,它回應這些請求,並且把相關的WML資料返回到這台閘道電腦上。這時,這個閘道電腦在把相應的WML文件返回到發出請求的移動電話,最終在WAP移動電話的使用者面前顯示這些文件。這就是整個通訊的全過程。 ---- 注:MCIWorldCom和Sprint都是美國著名的通訊公司,而在中國,是由中國移動通訊公司扮演該角色。 ---- 由於在INTERNET上使用HTTP協定來訪問WML文件,所以WAP技術不需要設備提供商提供特殊的軟體和硬體設備。一般的WEB服務,例如Apache和IIS(Microsoft Internet Information Server),都可以配置成適當的WML文件。而且,一個單一的WEB服務可以同時服務HTML和WML頁面,正如WEB服務可以服務於各種不同類型的文件,例如:gif,jpeg,zip等。然而,應當制定一個單獨的(虛擬的)WEB服務來爲WAP服務,因爲這樣能使的用戶更容易的記著那些URL.語言 ---- WML是一種使用XML語法的語言。這意味著WML可以使用任何文本編輯器來寫,甚至可以使用Notepad。而且,WML類似於HTML,許多WML識別字,例如:< b >, < i >, < big >, 和< a >都和在HTML中有著幾乎完全相同的意義。以下代碼是一個WML的例子: < ?xml version="1.0"? > < !DOCTYPE wml PUBLIC "-// WAPFORUM// DTD WML 1.1 // EN" "http://www.wapforum.org/DTD/wml_1.1.xml" > < wml > < card id="welcome" title="Welcome to" newcontext="true" ="#login" > < timer value="30"/ > < p align="center" > < big >MA's On-line< /big >< br/ > < em >Order Query System< /em > < /p > < /card > < card id="login" title="Login" newcontext="true" > < p > < em >Enter your ID:< /em >< br/ > < input name="custid" value="1221" maxlength="4" format="*N" emptyok="false"/ > < em >Enter your password:< /em >< br/ > < input name="password" value="HI" maxlength="10" format="*M" emptyok="true"/ > < br/ > < do type="accept" label="Login" > < go method="post" href="/scripts/ma_ooqs.dll/login" > < postfield name="custid" value="$(custid)"/ > < postfield name="password" value="$(password)"/ > < /go > < /do > < /p > < /card > ---- 登錄螢幕包括兩個輸入欄位,一個是用戶的ID ,另外一個是密碼。這兩個欄位是使用WML的< INPUT >識別字來創建的,用戶輸入的各種各樣的名字是由NAME屬性定義的。 ---- < DO >識別字定義了一個< go >的作用,它指向常式的ISAPI 的DLLS(確省的路徑是/scripts/ma_ooqs.dll)。< go >使用標準的http 的post命令來發送用戶輸入的資料到這個dll中。注意< postfield >識別字自動的指示瀏覽器通過http協定來翻譯用戶輸入的$(custid)和$(password) 變數。 ---- 當用戶點擊登錄命令的時候,這個wap手機連接到這個dll,這樣使得這個dll執行如圖所示的登錄動作。首先,代碼從Request.ContentFields 屬性中提取出custid 和password欄位。當被確認之後,(又專門的資料庫來保存這些資訊,通過遍曆資料庫的方法來確認它,這個遍曆的函數是IsValidCustID,如下代碼說示 function TMAWebModule.IsValidCustID (CustID, Password: string): Boolean; begin DebugMessage('IsValidCustID:'#13'CustID="' CustID #13'Password="' Password ' "'); Result := False; with Customer do begin try Open; if Locate('custno',CustID,[]) then if (LowerCase(CustomerState.AsString) = LowerCase(Password)) then Result := True; finally Close; end; end; end; procedure TMAWebModule.MAWebModuleLoginAction( Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); var CustID, Password : string; begin CustID := Request.ContentFields.Values['custid']; Password := Request.ContentFields.Values['password']; { Check validity of custid/password. } with Response do begin if IsValidCustID(CustID,Password) then begin DebugMessage('CustID/Password is valid.'); MAWebModuleMainMenuAction(Sender, Request, Response, Handled); end else begin DebugMessage('Invalid CustID/Password pair.'); ContentType := MIMETypeWML; Content := InvalidIDPageWML; end; end; Handled := True; end; ---- 由於DBDEMOS資料庫不包含真實的用戶ID和相應的密碼,常式使用客戶表Customer 中的的CustNo欄位來做ID,使用State欄位來作相應的密碼。爲測試這個意圖,你可以使用如下的ID 和PASSWORD:"1221" and "HI"; "1560" and "FL"; and "1680" and "GA." 返回到瀏覽器上的WML代碼 ---- 一般的,WebBroker應用通過對在OnAction事件控制碼中的Response物件的控制返回一些簡單的HTML代碼到瀏覽器中,。TWebResponse類通過Response 參數的一個Content 屬性來表示,它可以接收被這個事件控制碼創建的HTML代碼。 ---- 當用戶的瀏覽器接收資料的時候,它根據它的MIME類型(Multipurpose Internet Mail Extensions)來處理它。TWebResponse 類的MIME類型缺省類型是"text/html",它指定Content 屬性的資料類型,確實的是,HTML代碼。 ---- 但是,WAP應用需要WML(version1.1)的資料的MIME類型"text/vnd.wap.wml." 因此,Response 物件的ContentType屬性需要被改變。注意,ContentType 屬性可以被改變成任何有效的MIME類型。例如:改變該屬性爲"image/gif" 就會允許改動作返回一個點陣圖的圖像資料(binary.gif)。 ---- 當定義好正確的MIME類型後,該動作事件的控制碼就會清楚的設置Content 屬性可包含有效的WML代碼。由於每一個由application産生的WML頁都需要一個公共的題頭,這個常式定義了一個名字是WMLHeader 的常量來包含這個資訊。 ---- 存儲返回到資料庫中的資料當用戶成功登錄之後,用戶重新回到海上探險的主功能表。通過這個功能表,用戶可以選擇查看客戶的資訊或者是訂單的狀態。如果客戶選擇用戶資訊的超鏈結,將執行MAWebModule Web 模組的 CustInfoAction方法的這個定義過的方法。 ---- 首先,代碼返回到隨著post http命令的CustNo參數,當登錄的用戶的資訊在客戶表中被查找到以後,代碼創建包括三個輸入欄位的WML代碼。最初,三個輸入欄位包括客戶的zip號碼,城市,和state,(記著,這個state是口令). 用戶可以調整這三個欄位,他可以通過選擇"Modify Info"命令,用戶可以保存新的值返回到資料庫。當用戶選中這條命令的時候,將執行ModifyCustAction 方法。(見下圖) ---- 在Delphi IDE 中的 MAWeb模組 procedure TMAWebModule.MAWebModuleModifyCustAction( Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); var CustID, State, City, Zip : string; begin CustID := Request.ContentFields.Values['custid']; State := Request.ContentFields.Values['State']; City := Request.ContentFields.Values['City']; Zip := Request.ContentFields.Values['Zip']; with Response do begin ContentType := MIMETypeWML; try if LocateCustomer(CustID) then begin DebugMessage('Saving customer data:'#13 'CustID="' CustID '"'#13 'State="' State '"'#13 'City="' City '"'#13 'Zip="' Zip '"'#13); Customer.Edit; CustomerState.AsString := State; CustomerCity.AsString := City; CustomerZip.AsString := Zip; Customer.Post; Content := WMLHeader '< card id="modifyok" title="Info ' 'Modified" newcontext="true" >' CRLF ' < onevent type="ontimer" >' CRLF ' < go method="post" ' 'href="/scripts/ma_ooqs.dll/mainmenu" >' CRLF ' < postfield name="custid" ' 'value="' HTTPEncode(CustID) '"/ >' CRLF ' < /go >' CRLF ' < /onevent >' CRLF ' < timer value="30"/ >' CRLF ' < p >' CRLF ' < b >Customer info succesfully ' 'modified.< /b >< br/ >' CRLF ' < /p >' CRLF '< /card >' CRLF CRLF '< /wml >' CRLF; end else Content := InvalidIDPageWML; finally Customer.Close; end; end; Handled := True; end; ---- figure6:存儲用戶輸入的資料到customer表中。 ---- 這段代碼從Request.ContentFields 屬性中提取新的客戶資訊,然後在Customer 表中查找正確的客戶記錄,然後調用Edit方法把這個表轉入dsEdit狀態,設置欄位值(fields),最後調用Post方法提交記錄。 ---- 測試海上冒險程式爲測試這個程式,你需要有一個Web伺服器,它上面能運行ISAPI系統。這個常式已經在Microsoft IIS4.0下測試通過,但她應該也能夠在其他的相容産品上或者是IIS的其他版本的系統上運行。除了這台Web伺服器之外,你還需要下在並安裝Nokia WAP Toolkit version 1 。(截稿時,Nokia WAP Toolkit 1.3 的測試版本提供下載)。這個産品可以從Nokia的WAP站點免費下載 (Http://www.delphizine.com/include/Click_Redir.asp?Url=http://www.forum.nokia.com/. ) 這個開發工具不需要安裝在和WEB伺服器的同一台電腦上,因爲說有它需要的僅僅是能通過IP網路連接到WEB伺服器。當這個WAP開發工具打開時,他會顯示一個歡迎專案(參見圖2)。這個開發系統能類比兩個移動電話模組。爲實現MAOOQS,使用這個開發工具參數功能表命令選擇Nokia 6110型的電話。 ---- 爲定位這個程式的登錄螢幕,從Go功能表的中選中Load Location command ,鍵入登錄的login.wml文件的URL:http://localhost/login.wml.注意在做這些操作之前,這個login.wml文件需要被拷貝到web伺服器的publish目錄的根目錄下面,不用說這時這台web伺服器比喻已經成功的運行MAOOQS。 ---- 下圖顯示的是我們的測試的海上探險應用程式的相關的螢幕。當這個login.wml文件被成功的登錄之後,你將很快看到步驟1中的"Welcome to" 螢幕,幾秒鐘後,螢幕自動切換到step 2,爲在輸入欄位中輸入文本,點擊wap電話鍵盤區的左上角的藍色的"/"符號。點中之後,wap電話螢幕的左下角寫的是"Edit",如果它寫的是"Login",你需要點擊上、下箭頭按鈕,因爲這時不是編輯狀態。 ---- 當成功點中Edit 命令時,螢幕顯示如step3所示的完整的文本輸入編輯器。customer ID 欄位只能輸入數位,所以點擊數位鍵一一輸入相應的數位,如果你輸入出錯的話,右邊的"/" 可以擦去最後一個字元。password 欄位中可以輸入字母和數位,所以你就輸入相應的的password,有時你可能需要重復點擊數位鍵以輸入字母,例如:如果你需要輸入字母"B",你需要快速點擊按鈕"1"兩次慘能夠輸入這個字母。如果你使用移動電話輸入文本的話,你就必須知道這種輸入文本的方法。 ---- 上圖是Nokia 6110手機擴大的螢幕,這些step簡介在MAOOQS程式中出現的次序從dll來的請求資料 ---- 當the customer ID 和password 成功輸入後,你將發現螢幕又出現了step 2中的畫面。 稍稍等待"Login" 命令被啟動,然後點擊"/"按鈕來選中命令,這將處理這個登錄過程選中Login 命令來使得這台wap移動電話連接到web伺服器的/scripts/ 目錄中的 MA_OOQS ISAPI應用程式,當然了,這時ISAPI DLL 已經被放置到web伺服器的/scripts/ 目錄中,並且這台web伺服器有足夠的許可權正常執行這些dll,如果每一步都很正常的話,這台wap移動電話就會接受到從dll返回回來的正常的wml資料。如果輸入了不正確的customer ID 或者 password兩者中任一項的話,就會顯示如 setp 4中所示的螢幕,顯示出不正確的ID螢幕;正常的話,顯示如step 5中所示的主功能表。 ---- wap移動電話上的箭頭鍵是的你可以選擇功能表命令中的項。點擊"/"按鈕,螢幕會顯示如step 6所使得用戶資訊的螢幕,或者是訂單細節的如step 9中的螢幕。再次按下"/"允許你在這三個頁面之間相互切換。如果你使用如step 7中的螢幕中的Modify Info 命令來改變客戶的資訊的話,你將看到如setp 8所示的調整窗口。值得注意的是,wap設備通常沒有"log out" 命令,因爲這個命令是沒有必要的。爲定位到不同的wap設備,你僅僅需要輸入URL,正如你在Web瀏覽器中的輸入一樣。 ---- 總結 ---- 現在,wap是當今移動電話和無線internet領域發生的最火熱的事情。儘管它需要不斷的研究新的科技,我們現在對互動式wap解決方案的技術只有一些基礎瞭解。 ---- 而且,現有的HTML 和 HTTP技術可以提供很多幫助,由於wml和wmlscirpt事實上並不是和html和javascript不同的。此外,Delphi爲wap解決方案體統了很多有效的工具,因爲現在的Delphi中的WebBroker 技術可被擴展用來支援wap. ---- 這篇文章簡介了怎麽用Delphi來構建wap 的解決方案。儘管這裏不能討論所有的細節,你應該可以理解這些設備是怎麽工作的了。有了這些經驗,你應當能夠構建你自己的wap解決方案來支援不斷發展的移動電話用戶的需要。 ---- 如果你想得到這種科技的更多些資訊的話,請訪問: wap論壇:(http://www.delphizine.com/include/ Click_Redir.asp?Url=http://www.wapforum.org/), Nokia公司:(http://www.delphizine.com/include/ Click_Redir.asp?Url=http://www.nokia.com/), Ericsson公司(http://www.delphizine.com/include /Click_Redir.asp?Url=http://www.erics son.com/), Siemens公司(http://www.delphizine.com/ include/Click_Redir.asp?Url=http:// www.siemens.com/).Jani vinen ---- 作爲一個Borland 開發工具的支持者,他也開發同類的internet産品。 ---- 調試ISAPI DLLs: ---- 在調試ISAPI DLLs時,它經常在螢幕上顯示一些簡潔的有益的提示資訊。當然了,IIS 只是一個服務程式,所以不能顯示正常的模組表單,但是,你可是調用Windows MessageBox API 的消息提示框來在螢幕上顯示一些簡單的文本。你所需要做的就是在你的U類型的參數中加入MB_TOPMOST 和MB_SERVICE_NOTIFICATION 識別字,如下所是的代碼: procedure DebugMessage(S: string); begin MessageBox(0,PChar(S),'My ISAPI DLL', mb_OK mb_Topmost mb_Service_Notification); end; ********************************************************* 哈哈&兵燹 最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好 Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知 K.表Knowlege 知識,就是本站的標語:Open our mind to make knowledge together! 希望能大家敞開心胸,將知識寶庫結合一起
------
**********************************************************
哈哈&兵燹
最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好

Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知
K.表Knowlege 知識,就是本站的標語:Open our mind
系統時間:2024-05-06 17:31:49
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!