移动设备Telnet至主机,如何实现附图中的效果 |
尚未結案
|
viery
一般會員 發表:19 回覆:11 積分:6 註冊:2002-09-16 發送簡訊給我 |
现准备开发仓储管理系统的RF(无线射频)应用。采用telnet的方式,即系统实际运行在windows的server上,RF设备通过telnet方式登录到主机,运行主机上的程序。 我参考了oracle的仓库管理系统的文档,发现其mobile device的界面很不错,如附图1,附图2。 而我实现的效果只是象dos界面一样,每输入一行后回车,自动跳转到下一个命令行,无法实现向oracle那样的操作界面,其光标可以上下移动。 想请问,如何实现此种界面?是和telnet server有关吗?是否windows的telnet server不支持? 發表人 - viery 於 2004/12/19 10:39:00
|
ddy
站務副站長 發表:262 回覆:2105 積分:1169 註冊:2002-07-13 發送簡訊給我 |
使用VT100 指令可實現你的需求
詳參考
http://www.fh-jena.de/~gmueller/Kurs_halle/esc_vt100.html
http://astronomy.swin.edu.au/~pbourke/dataformats/vt100/
http://www.dadaboom.com/pdp11/software/vt100.html 建議先將每個command 寫成function 使用起來就方便多了
至少先要知道如何在指定位置顯示有顏色的字串,以及反白與基本的鍵盤遊標控制
例:
/********************************************************************* *Function Name:color_reverse *Description:Reverse display *********************************************************************/ void color_reverse(const U8 channel) {//前景背景反相顯示 x_printf(channel,"%c[7m",ASCII_ESC); } /********************************************************************* *Function Name:color_back *Description:Set background color *********************************************************************/ void color_back(const U8 channel,VT100_COLOR_ENUM x) { x_printf(channel,"%c[4%dm",ASCII_ESC,x); } /********************************************************************* *Function Name:color_fr *Description:Set fore color *********************************************************************/ void color_fr(const U8 channel,VT100_COLOR_ENUM x) { x_printf(channel,"%c[3%dm",ASCII_ESC,x); } /********************************************************************* *Function Name:cur_addr *Description:Cursor location *********************************************************************/ void cur_addr(const U8 channel,U8 row,U8 col) { x_printf(channel,"%c[%d;%dH",ASCII_ESC,row,col);//設定游標位置。游標將會定址在 (row,col) 的位置上 } /********************************************************************* *Function Name:clr_screen *Description:Clear screen *********************************************************************/ void clr_screen(const U8 channel) //after action,cursot move to home { x_printf(channel,"%c[2J",ASCII_ESC); } /********************************************************************* *Function Name:clr_line *Description:Clear a line *********************************************************************/ void clr_line(const U8 channel,U8 row) { cur_addr(channel,row,0); x_printf(channel,"%c[2K",ASCII_ESC); } |
viery
一般會員 發表:19 回覆:11 積分:6 註冊:2002-09-16 發送簡訊給我 |
|
ddy
站務副站長 發表:262 回覆:2105 積分:1169 註冊:2002-07-13 發送簡訊給我 |
部份程式碼以delphi 型態呈現,使用IdTelnetServer 元件
大致寫個粗陋的demo,應該是能從中學習在Telnet Server 中如何使用VT100 控制碼 至於詳細的輸入控制與menu 與其它的輸入介面的設計,待小弟有時間會在站上發表 建議您先把 VT100 控制碼看過,並試著將控制碼如範例寫成function
待基礎工作完成,屆時要做出您所希望的畫面就不是難事了
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, IdBaseComponent, IdComponent, IdTCPServer, IdTelnetServer, StdCtrls; type TForm1 = class(TForm) Button1: TButton; IdTelnetServer1: TIdTelnetServer; procedure Button1Click(Sender: TObject); procedure IdTelnetServer1Execute(AThread: TIdPeerThread); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} const ASCII_ESC=char(27); //********************************************************************* //*Function Name:cur_addr //*Description:Cursor location //********************************************************************* procedure cur_addr(AThread:TIdPeerThread;row:Integer;col:Integer); begin //設定游標位置。游標將會定址在 (row,col) 的位置上 AThread.Connection.Write(format('%s[%d;%dH',[ASCII_ESC,row,col])); end; //********************************************************************* //Function Name:clr_screen //*Description:Clear screen //********************************************************************* procedure clr_screen(AThread:TIdPeerThread); begin AThread.Connection.Write(format('%s[2J',[ASCII_ESC])); end; function getString(AThread:TIdPeerThread):string; begin //輸入不自動echo result:=AThread.Connection.InputLn('',FALSE); end; procedure TForm1.Button1Click(Sender: TObject); begin IdTelnetServer1.Active:=not IdTelnetServer1.Active; end; procedure TForm1.IdTelnetServer1Execute(AThread: TIdPeerThread); var cmd:string; begin clr_screen(AThread); cur_addr(AThread,10,10); AThread.Connection.Write('Login'); cmd:=getString(AThread); clr_screen(AThread); AThread.Connection.Write(cmd); end; end. |
viery
一般會員 發表:19 回覆:11 積分:6 註冊:2002-09-16 發送簡訊給我 |
|
ddy
站務副站長 發表:262 回覆:2105 積分:1169 註冊:2002-07-13 發送簡訊給我 |
引言:我试过在普通的console application中不支持VT100的指令,而在idTelnetServer的程序中则是支持的。这是否意味者需要做一个telnet server?VT100 指令集當然是使用在所謂的"虛擬終端機"一般而言使用RS232/Telnet 連接的系統可以使用,是因為在終端機軟體能解釋這些指令 而純ap 的console 而言無法解釋這樣的指令所以會被視為看似奇怪的文字 純ap 下的console 有沒有辦法能使用這樣的指令呢? 當然是有的 在dos 時代有一個檔案叫「ANSI.SYS」就能解釋VT100 的指令 只要在config.sys 組態檔裡加入「device=ansi.sys」這一行就可以 但是這個意義並不大 一、win 系統與ansi.sys相容上也許有問題 二、誰還在local 端的操作使用console 這類文字圖型化界面? 這類的vt100的應用最常見的就是bbs,其次是一些網路設備 都算是蠻早期的技術了,當然現在還存在…大多是為了提供最基本最通用的環境 即使在最陽春只有dos 的環境下也能操作系統 所以如果您的需求是要能做到遠端控制,那就使用telnetserver 吧 < src="http://delphi.ktop.com.tw/loadfile.php?TOPICID=8147403&CC=182217"> |
Ktop_Robot
站務副站長 發表:0 回覆:3511 積分:0 註冊:2007-04-17 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |