35
QT/Embedded 와 와 와와 Qt/Embedded 와와 Qt/Embedded 와와 와와 와와 Qt/Embedded 와와 와와 와와 와 와와와 와와와와 와 와와 와와와와 와 와와 와와

QT /Embedded 와 웹 서버

Embed Size (px)

DESCRIPTION

QT /Embedded 와 웹 서버. Qt/Embedded 개요 Qt/Embedded 개발 환경 구축 Qt/Embedded 실행 환경 구축 및 테스트 임베디드 웹 서버 임베디드 웹 서버 응용. Qt/Embedded 개요. 임베디드 리눅스에서 많이 쓰는 GUI 프로그래밍 도구 TinyX, GTK, C SDL, C/C++ Qt/Embedded Qt/Embedded 의 특징 원시 코드가 공개되어 쉽게 수정해 사용 가능 많은 이미지 형식을 지원하지만 메모리 효율이 좋음 - PowerPoint PPT Presentation

Citation preview

Page 1: QT /Embedded 와  웹 서버

QT/Embedded 와 웹 서버

• Qt/Embedded 개요• Qt/Embedded 개발 환경 구축• Qt/Embedded 실행 환경 구축 및 테스트• 임베디드 웹 서버• 임베디드 웹 서버 응용

Page 2: QT /Embedded 와  웹 서버

임베디드 리눅스에서 많이 쓰는 GUI 프로그래밍 도구 TinyX, GTK, C SDL, C/C++ Qt/Embedded

Qt/Embedded 의 특징 원시 코드가 공개되어 쉽게 수정해 사용 가능 많은 이미지 형식을 지원하지만 메모리 효율이 좋음 i386, ARM, MIPS, PowerPC 등 다양한 플랫폼 지원 Qt 기반의 코드와 호환성이 양호하고 쉽게 변환 가능 프레임 버퍼를 직접 접근할 수 있고 가속 드라이버를 사용해 성능을 개선

가능 다수의 응용 프로그램을 동시에 실행 가능 다국적 언어 및 유니 코드 지원 풍부한 API 제공 시그널 /슬롯 구조 채택

Qt/Embedded 개요Qt/Embedded 개요

Page 3: QT /Embedded 와  웹 서버

개발 환경 구축을 위해 Qt/Embedded, QVFB, UIC 를 호스트 시스템에 설치

QVFB(Qt Virtual Frame Buffer) X 윈도우에서 프레임 버퍼를 구현해주는 기능 임베디드시스템 환경에서 비디오 카드와는 독립적인 프레임

버퍼를 사용 X 윈도우와 콘솔 상의 화면을 전환할 필요가 없고 화면 갈무리 ,

화면 확대 및 축소 등도 가능 UIC(User Interface Compiler)

Qt 설계자에 의해 XML 로 생성된 사용자 인터페이스 정의를 읽어서 C++ 헤더나 소스 파일들을 생성하는 도구

Qt/Embedded 개요Qt/Embedded 개요

Page 4: QT /Embedded 와  웹 서버

강의 홈페이지에서 다운로드할 파일 Qt/Embedded: qt-embedded-free-3.3.3.tr.bz2 Qt 라이브러리 : qt_lib.zip Qt 도구 (qvfb, uic): source1.tar

Qt/Embedded 개요Qt/Embedded 개요

Page 5: QT /Embedded 와  웹 서버

다운로드받은 파일의 압축을 풀고 경로를 재설정 , 터치 스크린을 인식하도록 관련 파일을 수정

실습 실습 Qt/Embedded 환경 설정

④⑤

⑥⑦ ⑧

Page 6: QT /Embedded 와  웹 서버

⑥ #gedit ~/.bash_profile

⑧ #gedit src/embedded/qmouselinuxtp_qws.cpp

실습 실습 Qt/Embedded 환경 설정

Page 7: QT /Embedded 와  웹 서버

② Makefile 수정 . 컴파일 시간이 많이 소요되는 부분 제거

③ configure 명령을 사용해 ARM 용으로 환경을 설정

실습 실습 Qt/Embedded 환경 설정

Page 8: QT /Embedded 와  웹 서버

④ 환경 설정을 진행하면서 메시지 출력을 관찰

⑤ 정상적으로 환경 설정이 끝난 것을 확인

실습 실습 Qt/Embedded 환경 설정

Page 9: QT /Embedded 와  웹 서버

라이브러리 압축 파일 (qt_lib.zip) 을 사용해 libstdc++.so 를 심볼릭 링크하고 복사

실습 실습 Qt/Embedded 라이브러리와 도구 설치

④⑤

Page 10: QT /Embedded 와  웹 서버

② QVFB 와 UIC 도구를 사용할 수 있도록 Qt/Embedded의 bin 디렉토리에 설치

②③

④⑤

실습 실습 Qt/Embedded 라이브러리와 도구 설치

Page 11: QT /Embedded 와  웹 서버

③ Qt/Embedded 의 홈 디렉토리로 이동한 후 Make 유틸리티를 사용해 컴파일

④ 컴파일 결과

실습 실습 Qt/Embedded 라이브러리와 도구 설치

Page 12: QT /Embedded 와  웹 서버

⑤ 정상적으로 컴파일되었는지 확인

실습 실습 Qt/Embedded 라이브러리와 도구 설치

Page 13: QT /Embedded 와  웹 서버

① 호스트 시스템에서 생성한 Qt/Embedded 자원을 NFS 마운트 디렉토리 /mnt/nfs_host 로 복사

②③

④⑤

실습 실습 NFS 를 이용한 Qt/Embedded 실행 환경의 타겟 시스템 탑재

Page 14: QT /Embedded 와  웹 서버

② NFS 마운트 디렉토리 공유 설정 파일인 /etc/exports 파일이 다음 내용을 포함하도록 편집 /mnt/nfs_host 192.168.233.200(rw,sync,no_root_squash)

③ 호스트 시스템에 NFS 데몬을 재실행

실습 실습 NFS 를 이용한 Qt/Embedded 실행 환경의 타겟 시스템 탑재

Page 15: QT /Embedded 와  웹 서버

④ 타겟 시스템에 마운트하고 , Qt 라이브러리를 위한 심볼릭 링크를 생성

②③

④ ⑤

실습 실습 NFS 를 이용한 Qt/Embedded 실행 환경의 타겟 시스템 탑재

Page 16: QT /Embedded 와  웹 서버

Qt/Embedded 응용 프로그램 (main.cpp)

11 #include "hello.h"12 #include <qapplication.h>……20 int main( int argc, char **argv )21 {22 QApplication a(argc,argv);23 QString s;24 for ( int i=1; i<argc; i++ ) {25 s += argv[i];26 if ( i<argc-1 )27 s += " ";28 }29 if ( s.isEmpty() )30 s = "Hello, World";31 Hello h( s );……35 QObject::connect( &h, SIGNAL(clicked()), &a, SLOT(quit()) );36 h.setFont( QFont("times",32,QFont::Bold) ); // default font37 h.setBackgroundColor( Qt::white ); // default bg color38 a.setMainWidget( &h );39 h.show();40 return a.exec();41 }

Page 17: QT /Embedded 와  웹 서버

Qt/Embedded 응용 프로그램 (hello.cpp)

10 #include "hello.h"……20 Hello::Hello( const char *text, QWidget *parent, const char *name )21 : QWidget(parent,name), t(text), b(0)22 {23 QTimer *timer = new QTimer(this);24 connect( timer, SIGNAL(timeout()), SLOT(animate()) );25 timer->start( 40 );2627 resize( 260, 130 );28 }……35 void Hello::animate()36 {37 b = (b + 1) & 15;38 repaint( FALSE );39 }……48 void Hello::mouseReleaseEvent( QMouseEvent *e )49 {50 if ( rect().contains( e->pos() ) )51 emit clicked();52 }……61 void Hello::paintEvent( QPaintEvent * )62 {63 static int sin_tbl[16] = {64 0, 38, 71, 92, 100, 92, 71, 38, 0, -38, -71, -92, -100, -92, -71, -38};6566 if ( t.isEmpty() )67 return;68

Page 18: QT /Embedded 와  웹 서버

69 // 1: Compute some sizes, positions etc.70 QFontMetrics fm = fontMetrics();71 int w = fm.width(t) + 20;72 int h = fm.height() * 2;73 int pmx = width()/2 - w/2;74 int pmy = height()/2 - h/2;7576 // 2: Create the pixmap and fill it with the widget's background77 QPixmap pm( w, h );78 pm.fill( this, pmx, pmy );7980 // 3: Paint the pixmap. Cool wave effect81 QPainter p;82 int x = 10;83 int y = h/2 + fm.descent();84 int i = 0;85 p.begin( &pm );86 p.setFont( font() );87 while ( !t[i].isNull() ) {88 int i16 = (b+i) & 15;89 p.setPen( QColor((15-i16)*16,255,255,QColor::Hsv) );90 p.drawText( x, y-sin_tbl[i16]*h/800, t.mid(i,1), 1 );91 x += fm.width( t[i] );92 i++;93 }94 p.end();9596 // 4: Copy the pixmap to the Hello widget97 bitBlt( this, pmx, pmy, &pm );98 }

Qt/Embedded 응용 프로그램 (hello.cpp)

Page 19: QT /Embedded 와  웹 서버

호스트 시스템에서 Hello 프로그램을 컴파일하고 NFS 마운트 디렉토리로 복사

실습 실습 Hello 응용 프로그램의 컴파일

②③④

Page 20: QT /Embedded 와  웹 서버

⑤ #gedit Makefile

실습 실습 Hello 응용 프로그램의 컴파일

Page 21: QT /Embedded 와  웹 서버

타겟 시스템에서 실행 중인 X-Server 를 종료

타겟 시스템의 Qt/Embedded 와 관련된 환경 변수를 설정하고 hello 파일을 실행

실습 실습 타겟 시스템에서 Hello 응용 프로그램 실행

Page 22: QT /Embedded 와  웹 서버

임베디드시스템용 웹 서버의 특징 웹 서버 수행 파일의 크기가 매우 작아야 함 ( 수십 ~ 수백 KB)

시스템의 성능을 저하를 막기 위해 힙 메모리의 사용을 최소화 정적 웹 페이지는 압축되어 저장되어 있다가 클라이언트의

요구가 있을 때 압축을 풀어서 제공 표준화된 인터페이스로 쉬운 이식성 인터넷을 통해 시스템을 관리할 수 있는 기능

Qt/Embedded 웹서버Qt/Embedded 웹서버

Page 23: QT /Embedded 와  웹 서버

GoAhead 웹 서버 크기가 적으면서도 다양한 기능을 제공 컴파일하기 쉽고 , 사용이 단순 실행 파일의 용량이 적어 임베디드시스템에 적합 사건 타이머 (event timer) 와 TCP/IP 스택 필요 ASP, CGI, 임베디드 자바 스크립트를 지원 HTTP 1.0 프로토콜을 사용 보안을 위해서 SSL(Secure Socket Layer) v3.0, DAA(Digest

Access Authentication) 를 지원 리눅스 , 윈도우 CE, VxWorks, QNX, eCOS 등 다양한

운영체제에서 동작 무료

Qt/Embedded 웹서버Qt/Embedded 웹서버

Page 24: QT /Embedded 와  웹 서버

다운로드받은 파일의 압축을 풀고 경로를 재설정 . 관련 파일을 수정

실습 실습 GoAhead 웹 서버 컴파일 및 설치

②③④⑤

⑥⑦⑧

Page 25: QT /Embedded 와  웹 서버

⑦ #gedit Makefile

실습 실습 GoAhead 웹 서버 컴파일 및 설치

Page 26: QT /Embedded 와  웹 서버

② 컴파일 결과 확인

③ web 디렉토리를 tar 명령을 사용해 하나의 파일로 압축

②①

실습 실습 GoAhead 웹 서버 컴파일 및 설치

Page 27: QT /Embedded 와  웹 서버

④ 컴파일된 웹 서버 webs 와 web.tgz 를 타겟 시스템으로 전송 ⑤ 타겟 시스템에서 web.tgz 파일의 압축을 풀고 웹 서버를 실행

③④

실습 실습 GoAhead 웹 서버 컴파일 및 설치

Page 28: QT /Embedded 와  웹 서버

⑥ 호스트 시스템의 Firefox 웹 브라우저를 사용해 타겟 시스템의 웹 서버에 접속 .→ http://192.168.233.200/home.asp 를 입력해 웹 서버가 작동되는지 확인

실습 실습 GoAhead 웹 서버 컴파일 및 설치

Page 29: QT /Embedded 와  웹 서버

웹 브라우저를 사용해 임베디드시스템 내의 각종 디바이스 제어 가능

웹을 이용하여 타겟 시스템의 FND 디바이스에 숫자를 표시 하기 위해 필요한 프로그램

11 장에서 작성한 FND 디바이스 드라이버 웹 페이지를 표시하기 위한 HTML 문서 동적 웹 문서 전달을 위한 CGI(Common Gateway Interface)

프로그램 .

Qt/Embedded 웹서버 응용Qt/Embedded 웹서버 응용

Page 30: QT /Embedded 와  웹 서버

실습 실습 FND 제어용 HTML 문서 작성 (fnd.htm)

01 <html>02 <head><title>Web Server Application</title></head>03 <body>04 <H1>Web Server Application</H1>0506 <form method="GET" action="cgi-bin/fnd">07 Enter a 8-digit number:08 <input name="send_number" maxlength="8" type="text"

size="20">09 <input type="submit" value="SEND">10 </form>11 <br>12 Then see the FND device on the taget system.13 <br>14 </body>15 </html>

Page 31: QT /Embedded 와  웹 서버

016 #include <stdio.h>……025 static char fndDev[] = "/dev/FND";026 static int fndFd = (-1);027028 asc2fnd(char *s, long n)029 {030 char c;031 int l;032 while (n > 0) {033 l = n % 10;034 switch (l) {035 case 0: c = 0x3f; break;……046 }047 *s++ = c;048 n = n/10;049 }050 }051052 int send_number_FND(long av)053 {054 int n;055 char buf[MAXFND+1];056057 fndFd = open( fndDev, O_RDWR);058 if (fndFd < 0) {059 fprintf(stderr, "cannot open FND (%d)", fndFd);060 exit(2);061 }062 memset(buf, 0, sizeof(buf));063064 asc2fnd(buf, av);065 write(fndFd, buf, MAXFND);066 return 0;067 }……

실습 실습 FND 디바이스 제어용 CGI 프로그램 작성(fnd.c)

Page 32: QT /Embedded 와  웹 서버

073 int main(int argc, char *argv[])074 {075 char *cgiinput ;076 long send_number;……082 printf("Content-type:text/html;charset=iso-8859-1%c%c\n\n",13,10) ;……086 printf("<html>\n");087 printf("<head><title>Web Server Application</title></head>\n");088 printf("<body>\n");089 printf("<H1>Web Server Application</H1>\n");090091 cgiinput= getenv("QUERY_STRING");092 if(cgiinput == NULL)093 printf("<P>Error in passing data from form to script.");094 else if(sscanf(cgiinput, "send_number=%ld", &send_number)!=1)095 printf("<P>Invalid data. Data must be numeric.");096 else097 send_number_FND(send_number);098099 printf("<center> Check the FND, [%ld] is displayed</center>\n", send_number);100 printf("</body>\n");101 printf("</html>\n");102103 return 0;104 }

실습 실습 FND 디바이스 제어용 CGI 프로그램 작성(fnd.c)

Page 33: QT /Embedded 와  웹 서버

③ 작성한 프로그램을 ARM 용으로 컴파일

④ fnd.htm 문서와 fnd 파일을 타겟 시스템으로 전송 ⑤ 11 장에서 빌드한 FND 디바이스 드라이버 fnd.ko 를

타겟 시스템으로 전송

실습 실습 웹 페이지 및 CGI 프로그램 작성

Page 34: QT /Embedded 와  웹 서버

⑥ 다운로드받은 파일의 재배치 , 디바이스 드라이버의 재적재 , 웹 서버 실행 등을 수행

②③④⑤

⑥⑦

⑨⑩

실습 실습 웹 페이지 및 CGI 프로그램 작성

Page 35: QT /Embedded 와  웹 서버

⑦ Firefox 를 가동→ http://192.168.233.200/cgi.htm 으로 접속→ FND 로 출력할 숫자를 입력 후 <SEND> 버튼 클릭

⑧ 타겟 시스템의 FND 에서 입력한 숫자를 관찰 . 호스트 시스템의 웹 브라우저에서 FND 에 입력한 숫자 확인

실습 실습 웹 페이지 및 CGI 프로그램 작성