存档

文章标签 ‘终端’

采用PHP在终端上进行打印控制

2009年6月3日

众所周知,PHP主要用于服务器端的开发,本博曾讲到采用PHP开发终端系统。其实除了采用PHP进行终端系统的开发,还可以采用PHP在终端上进行终端打印机的控制。

实际上在终端上进行打印机的控制,非常简单!大家知道ASCII码吧?学过计算机的人都应该知道,在讲计算机基础时,都会讲ASCII码!其中,就有关于一些控制字符,不知道的XDM呢,可以参考本博所的ASCII码。其中,十进制031之前的那些编码,基本上都是一些控制字符,这些字符在屏幕上不会显示成键盘上的特定字符,而是显示为一些特殊的控制字符,比如说F12显示为^Oz,看起来是否相关奇怪?有关于这方面的详细资料,还请关注本博,本博近期内将会把这方面的问题一一进行说明。

好了,谈到本文的主题了,采用PHP进行终端打印机的控制。什么?PHP控制打印机?有没有听错?不错,你没有听错,的确是采用PHP控制终端打印机进行相应内容的打印!

是不是感觉很茫然?没有关系,听本博慢慢道来!

要采用PHP控制终端的打印机,首先需要确认终端打印机正常联机,如果不知道什么叫正常联机,先去看看打印机方面的文章吧!能够正常联机后,只需要在PHP中抛出相关的打印机控制字符,就可以打开打印机的端口了,然后就只管echo或者print你要打印机打印的内容即可。输出完了以后呢,就只需要再输出打印机端口命令,即调用关闭打印机的控制符实现打印机的关闭。此时由于打印机不会自动进行纸张的处理,因此还需要在PHP进行纸张的控制。

由于和终端联机的打印机有很多种,这里以得实2100为例,其打印机主要是以OKI仿真命令的方式进行处理,因为我们在操作该打印机时,只需要查看该打印机所提供的指令序列,然后在PHP中输出该指令序列即可。例如,进入打印机的透明打印是ESC [5i,我们只需要在PHP输出该指令即可打开透明打印方式。但实际上直接输出ESC是达不到效果的,此时需要查看ESC的ASCII码表,其相应的ASCII码的八进制为033,那么只需要echo “\033 [5i”;这么一条指令即可打印得实2100打印机的透明打印。

怎么?不相信这么简单?不错,这就是现实!确实很简单,PHP操作终端打印机就是这么简单!你也可以实现!

以下是我在进行这方面的开发时所写的一个DEMO。希望能够各位看官一点启发!

echo "\033[5i";//进入透明打印
echo "this is test.\n";
echo "this is test 这是否可以打印机.\n";
echo str_pad(" ", 30) . "this is 这是非颠倒.\n";

echo "this 你死我活 is test.\n";
echo "this is test.\n";
echo str_pad(" ", 10) . "this is test.\n";

echo "this is test.\n";
echo "this is 工作队 test.\n";
echo "this is test.\n";

echo str_pad(" ", 20) ."this is test.\n";

//echo "\33[0i" ;
echo "\014";//换页

echo "\033[4i";//关闭透明打印

怎么样,看明白没有?没看懂的,可以给我留言,我会以最快的速度回复您!

PHP教程, 电脑使用 , , , ,

ASCII码表

2009年6月2日

由于在做终端开发的时候需要使用到相关的ascii码,虽然没有几个,但却也记不全,PS一个:)

这里将ASCII码表罗列在此,与需要的XDJM分享。有需要的朋友也可DOWN下DOC版本的.

ASCII Table (7-bit)
(ASCII = American Standard Code for Information Interchange)

Decimal   Octal   Hex    Binary     Value
——-   —–   —    ——     —–
000      000    000   00000000      NUL    (Null char.)
001      001    001   00000001      SOH    (Start of Header)
002      002    002   00000010      STX    (Start of Text)
003      003    003   00000011      ETX    (End of Text)
004      004    004   00000100      EOT    (End of Transmission)
005      005    005   00000101      ENQ    (Enquiry)
006      006    006   00000110      ACK    (Acknowledgment)
007      007    007   00000111      BEL    (Bell)
008      010    008   00001000       BS    (Backspace)
009      011    009   00001001       HT    (Horizontal Tab)
010      012    00A   00001010       LF    (Line Feed)
011      013    00B   00001011       VT    (Vertical Tab)
012      014    00C   00001100       FF    (Form Feed)
013      015    00D   00001101       CR    (Carriage Return)
014      016    00E   00001110       SO    (Shift Out)
015      017    00F   00001111       SI    (Shift In)
016      020    010   00010000      DLE    (Data Link Escape)
017      021    011   00010001      DC1 (XON) (Device Control 1)
018      022    012   00010010      DC2       (Device Control 2)
019      023    013   00010011      DC3 (XOFF)(Device Control 3)
020      024    014   00010100      DC4       (Device Control 4)
021      025    015   00010101      NAK    (Negative Acknowledgement)
022      026    016   00010110      SYN    (Synchronous Idle)
023      027    017   00010111      ETB    (End of Trans. Block)
024      030    018   00011000      CAN    (Cancel)
025      031    019   00011001       EM    (End of Medium)
026      032    01A   00011010      SUB    (Substitute)
027      033    01B   00011011      ESC    (Escape)
028      034    01C   00011100       FS    (File Separator)
029      035    01D   00011101       GS    (Group Separator)
030      036    01E   00011110       RS    (Request to Send)(Record Separator)
031      037    01F   00011111       US    (Unit Separator)
032      040    020   00100000       SP    (Space)
033      041    021   00100001        !    (exclamation mark)
034      042    022   00100010        “    (double quote)
035      043    023   00100011        #    (number sign)
036      044    024   00100100        $    (dollar sign)
037      045    025   00100101        %    (percent)
038      046    026   00100110        &    (ampersand)
039      047    027   00100111        ‘    (single quote)
040      050    028   00101000        (    (left/opening parenthesis)
041      051    029   00101001        )    (right/closing parenthesis)
042      052    02A   00101010        *    (asterisk)
043      053    02B   00101011        +    (plus)
044      054    02C   00101100        ,    (comma)
045      055    02D   00101101        -    (minus or dash)
046      056    02E   00101110        .    (dot)
047      057    02F   00101111        /    (forward slash)
048      060    030   00110000        0
049      061    031   00110001        1
050      062    032   00110010        2
051      063    033   00110011        3
052      064    034   00110100        4
053      065    035   00110101        5
054      066    036   00110110        6
055      067    037   00110111        7
056      070    038   00111000        8
057      071    039   00111001        9
058      072    03A   00111010        :    (colon)
059      073    03B   00111011        ;    (semi-colon)
060      074    03C   00111100        <    (less than)
061      075    03D   00111101        =    (equal sign)
062      076    03E   00111110        >    (greater than)
063      077    03F   00111111        ?    (question mark)
064      100    040   01000000        @    (AT symbol)
065      101    041   01000001        A
066      102    042   01000010        B
067      103    043   01000011        C
068      104    044   01000100        D
069      105    045   01000101        E
070      106    046   01000110        F
071      107    047   01000111        G
072      110    048   01001000        H
073      111    049   01001001        I
074      112    04A   01001010        J
075      113    04B   01001011        K
076      114    04C   01001100        L
077      115    04D   01001101        M
078      116    04E   01001110        N
079      117    04F   01001111        O
080      120    050   01010000        P
081      121    051   01010001        Q
082      122    052   01010010        R
083      123    053   01010011        S
084      124    054   01010100        T
085      125    055   01010101        U
086      126    056   01010110        V
087      127    057   01010111        W
088      130    058   01011000        X
089      131    059   01011001        Y
090      132    05A   01011010        Z
091      133    05B   01011011        [    (left/opening bracket)
092      134    05C   01011100        \    (back slash)
093      135    05D   01011101        ]    (right/closing bracket)
094      136    05E   01011110        ^    (caret/circumflex)
095      137    05F   01011111        _    (underscore)
096      140    060   01100000        `
097      141    061   01100001        a
098      142    062   01100010        b
099      143    063   01100011        c
100      144    064   01100100        d
101      145    065   01100101        e
102      146    066   01100110        f
103      147    067   01100111        g
104      150    068   01101000        h
105      151    069   01101001        i
106      152    06A   01101010        j
107      153    06B   01101011        k
108      154    06C   01101100        l
109      155    06D   01101101        m
110      156    06E   01101110        n
111      157    06F   01101111        o
112      160    070   01110000        p
113      161    071   01110001        q
114      162    072   01110010        r
115      163    073   01110011        s
116      164    074   01110100        t
117      165    075   01110101        u
118      166    076   01110110        v
119      167    077   01110111        w
120      170    078   01111000        x
121      171    079   01111001        y
122      172    07A   01111010        z
123      173    07B   01111011        {    (left/opening brace)
124      174    07C   01111100        |    (vertical bar)
125      175    07D   01111101        }    (right/closing brace)
126      176    07E   01111110        ~    (tilde)
127      177    07F   01111111      DEL    (delete)

——————————————————————

0   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F
0  NUL SOH STX ETX EOT ENQ ACK BEL BS  HT  LF  VT  FF  CR  SO  SI
1  DLE DC1 DC2 DC3 DC4 NAK SYN ETB CAN EM  SUB ESC FS  GS  RS  US
2   SP  !   “   #   $   %   &   ‘   (   )   *   +   ,   -   .   /
3   0   1   2   3   4   5   6   7   8   9   :   ;   <   =   >   ?
4   @   A   B   C   D   E   F   G   H   I   J   K   L   M   N   O
5   P   Q   R   S   T   U   V   W   X   Y   Z   [   \   ]   ^   _
6   `   a   b   c   d   e   f   g   h   i   j   k   l   m   n   o
7   p   q   r   s   t   u   v   w   x   y   z   {   |   }   ~ DEL

——————————————————————

PHP教程, 电脑使用 ,

采用php开发终端字符界面

2009年6月1日

众所周知,PHP通常情况下都用于动态网站的开发,抑或采用PHP_CLI进行命令行的开发。其实PHP除了能进行以上两种开发外,还可以进行终端系统的开发。

废话以后再讲,先上个图一看便知。

dev terminal by php

这个界面没见过?不会吧,各位XD去过银行吧?留心看过其操作界面没有?想起来了?对了,他们的操作界面就是类似于这个东东。当然这只是一个登录界面而已。虽然这只是一个登录界面,但其所有代码均采用PHP完成,没想到吧?

那就来看看Code:

<?php
define('MY_NCURSES_KEY_ESC',   27);
define('MY_NCURSES_KEY_NUM_MIN',	48);//0
define('MY_NCURSES_KEY_NUM_MAX',	57);//9
define('MY_NCURSES_KEY_INPUT_MIN',	65);//A
define('MY_NCURSES_KEY_INPUT_MAX',	122);//z

function login_win() {

	$login_rows = 10;
	$login_cols = 40;

	$login_y = ((25 - $login_rows) >> 1) + 1;
	$login_x = ((80 - $login_cols) >> 1) + 1;

	ncurses_init();
	$login_win = ncurses_newwin ( $login_rows, $login_cols, $login_y, $login_x );
	if (empty ( $login_win )) {
		trigger_error ( 'unable to create window' );
		return NULL;
	}
	ncurses_wborder ( $login_win, 0, 0, 0, 0, 0, 0, 0, 0 );
	ncurses_wrefresh ( $login_win );

	ncurses_wattron ( $login_win, NCURSES_A_REVERSE );
	ncurses_mvwaddstr ( $login_win, 0, 2, "登录" );
	ncurses_wattroff ( $login_win, NCURSES_A_REVERSE );

	$well_str = "请输入用户名和密码";
	$title_x = ( int ) ($login_cols - strlen ( $well_str ) >> 1) + 1;
	$title_y = 2;
	ncurses_mvwaddstr ( $login_win, $title_y, $title_x, $well_str );

	$name_var ="";
	$name_len = 0;
	$pass_var = "";
	$pass_len = 0;

	$u_cursor_y = 4;
	$u_cursor_x = 12;
	$p_cursor_y = 5;
	$p_cursor_x = 12;

	$b_y = 7;
	$b_commit_x = 8;
	$b_reset_x = 20;

	$v_current = 0;
	$h_current = 0;
	$do_loop = 1;

	$commit_str = "登录";
	$reset_str = "重置";
	ncurses_mvwaddstr ( $login_win, $b_y, $b_commit_x, $commit_str );
	ncurses_mvwaddstr ( $login_win, $b_y, $b_reset_x, $reset_str );

	//第四行第四列
	ncurses_mvwaddstr($login_win, 4, 4, "用户名:");
	//第五行第四列
	ncurses_mvwaddstr($login_win, 5, 4, "密  码:");

	ncurses_wmove ( $login_win, $u_cursor_y, $u_cursor_x );

	ncurses_wrefresh ( $login_win );
	ncurses_keypad ( $login_win, TRUE );
	ncurses_noecho ();
	ncurses_curs_set ( 1 );

	$logined = FALSE;

	while ($do_loop) {

		$key = ncurses_wgetch($login_win);

		$v_move = 0;
		$h_move = 0;

		switch ($key) {
			case NCURSES_KEY_UP:
				if ($v_current > 0) {
					$v_move = -1;
				}

				break;
			case NCURSES_KEY_DOWN:
				if ($v_current < 2) {
					$v_move = 1;
				}

				break;
			case NCURSES_KEY_LEFT:
				if ($h_current > 0) {
					$h_move = -1;
				}
				break;
			case NCURSES_KEY_RIGHT:
				if ($h_current < 1) {
					$h_move = 1;
				}
				break;
			case MY_NCURSES_KEY_LF:
			case MY_NCURSES_KEY_CR:
				//reset
				if (($h_current == 1) &&($v_current == 2)) {
					$name_var = "";
					$name_len = 0;
					$name_char= "";

					$pass_var = "";
					$pass_len = 0;
					$pass_char= "";

					$u_cursor_x = 12;
					$p_cursor_x = 12;

					$fill = str_pad(" ", 10);
					ncurses_mvwaddstr ( $login_win, $u_cursor_y, $u_cursor_x, $fill );
					ncurses_mvwaddstr ( $login_win, $p_cursor_y, $p_cursor_x, $fill );

					ncurses_mvwaddstr ( $login_win, $u_cursor_y, $u_cursor_x, "" );
					ncurses_mvwaddstr ( $login_win, $p_cursor_y, $p_cursor_x, "" );

				}elseif (($h_current == 0) && ($v_current == 2)) {
					//login

					if (($name_var == "cc") && ($pass_var == "cc")) {
						;
						$do_loop = 0;
						$logined = TRUE;
					}
				}

				break;
			case MY_NCURSES_KEY_BACKSPACE:
				if (($v_current == 0) && ($name_len  > 0)) {
					$name_len --;
					$name_var = substr ( $name_var, 0, $name_len );
					$u_cursor_x --;
					ncurses_mvwaddstr ( $login_win, $u_cursor_y, $u_cursor_x, "" );
				} else if (($v_current == 1) && ($pass_len > 0)) {
					$pass_len --;
					$pass_var = substr ( $pass_var, 0, $pass_len );
					$p_cursor_x --;
					ncurses_mvwaddstr ( $login_win, $p_cursor_y, $p_cursor_x, "" );
				}
				break;
			case MY_NCURSES_KEY_ESC:
				ncurses_flushinp ();
				$do_loop = 0;
				$logined = FALSE;
				break;
			default:
				if ((($key >= MY_NCURSES_KEY_INPUT_MIN) && ($key <= MY_NCURSES_KEY_INPUT_MAX)) ||
					(($key >= MY_NCURSES_KEY_NUM_MIN) && ($key <= MY_NCURSES_KEY_NUM_MAX))) {
					if (($v_current == 0) && ($name_len < 10)) {
						$name_len ++;
						$name_var .= $name_char = chr ( $key );
						ncurses_mvwaddstr ( $login_win, $u_cursor_y, $u_cursor_x, $name_char );
						$u_cursor_x ++;
					} else if (($v_current == 1) && ($pass_len < 10)) {
						$pass_len ++;
						$pass_var .= $pass_char = chr ( $key );
						ncurses_mvwaddstr ( $login_win, $p_cursor_y, $p_cursor_x, "*" );
						$p_cursor_x ++;
					}
				}
				break;
		}

		$v_current += $v_move;
		if ($v_current == 0) {
			ncurses_wattron ( $login_win, NCURSES_A_REVERSE );
			ncurses_mvwaddstr ( $login_win, $u_cursor_y, $u_cursor_x, "" );
			ncurses_wattroff ( $login_win, NCURSES_A_REVERSE );
		}elseif ($v_current == 1) {
			ncurses_wattron ( $login_win, NCURSES_A_REVERSE );
			ncurses_mvwaddstr ( $login_win, $p_cursor_y, $p_cursor_x, "" );
			ncurses_wattroff ( $login_win, NCURSES_A_REVERSE );
		}else {

			$h_current += $h_move;
			if ($h_current == 0) {
				ncurses_mvwaddstr ( $login_win, $b_y, $b_reset_x, $reset_str );

				ncurses_wattron ( $login_win, NCURSES_A_REVERSE );
				ncurses_mvwaddstr ( $login_win, $b_y, $b_commit_x, $commit_str );
				ncurses_wattroff ( $login_win, NCURSES_A_REVERSE );
			}else {
				ncurses_mvwaddstr ( $login_win, $b_y, $b_commit_x, $commit_str );

				ncurses_wattron ( $login_win, NCURSES_A_REVERSE );
				ncurses_mvwaddstr ( $login_win, $b_y, $b_reset_x, $reset_str );
				ncurses_wattroff ( $login_win, NCURSES_A_REVERSE );

			}

		}

		ncurses_wrefresh ( $login_win );
	}// end while

	ncurses_werase($login_win);
	ncurses_clear();
	ncurses_end();

	if (isset($logined) && $logined) {
		return TRUE;
	}else {
		return FALSE;
	}

}
?>

现在明白是怎么回事了吧?当然各位兄弟把这代码拿下去,可能你们的环境中是无法RUN的,因为这采用了其它的PHP包。

对于采用的什么包,各位XDJM,还敬请关注本博,稍后将奉上相关的PHP包的安装与配置 :)

PHP教程 , , , ,