Thông báo

Collapse
No announcement yet.

Giao thức TCP/IP và Web server với AVR

Collapse
This is a sticky topic.
X
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • Nguyên văn bởi nttam79 Xem bài viết
    Code:
    #define MY_DEFAULT_HOST_NAME			"OLIMEX BOARD"
    anh tâm cái dòng trên có nghĩa là gì nhỉ?
    em thay "OLIMEX BOARD" = 1 cái tên bất kỳ sao khi dịch nó lại báo lỗi nhỉ?
    em nghĩ đây chỉ là cách định nghĩa mạc nhiên thui mà,tại sao thay bằng chữ khác nó lại báo lỗi?
    cám ơn anh!

    Comment


    • Trình dịch nó không cho define kiểu string.
      , , ,

      Comment


      • Nguyên văn bởi rptdnmqs Xem bài viết
        Trình dịch nó không cho define kiểu string.
        mình vẫn giữ nguyên mọi thứ chỉ thay mỗi "OLIMEX BOARD"="HEPLME"
        sao nó lại báo lỗi nhỉ?
        ở đây có gì uẩn khúc chăng?
        p/s: bác nào cho em hỏi thêm ở con ic 28j60 ấy:
        +chân số 3 ( là chân CLOCK OUT) có tác dụng gì?
        +chân số 5 (là chân WOL) có tác dụng gì?
        +chân số 10(là chân reset) thì reset ở mức cao hay thấp hay khi nào rs?
        vậy trong 3 chân này có thể bỏ chân nào ko dùng ko?
        cám ơn các bác!

        Comment


        • Cái define string mình thấy 1 số trình dịch kô cho làm cái này.Còn winavr thì kô biết.
          , , ,

          Comment


          • Nguyên văn bởi rptdnmqs Xem bài viết
            Cái define string mình thấy 1 số trình dịch kô cho làm cái này.Còn winavr thì kô biết.
            nó có hỗ trợ mà

            #define MY_DEFAULT_HOST_NAME "OLIMEX BOARD"
            thì ko báo lỗi
            nhưng thay "OLIMEX BOARD"= "ppp" thì nó báo lỗi

            Comment


            • Nguyên văn bởi rptdnmqs Xem bài viết
              Cái define string mình thấy 1 số trình dịch kô cho làm cái này.Còn winavr thì kô biết.
              Bạn này đang biên dịch cho PIC với MPLAB C18, nó cho phép define string như vậy.

              Nguyên văn bởi kiemkhach10 Xem bài viết
              mình vẫn giữ nguyên mọi thứ chỉ thay mỗi "OLIMEX BOARD"="HEPLME"
              sao nó lại báo lỗi nhỉ?
              ở đây có gì uẩn khúc chăng?
              p/s: bác nào cho em hỏi thêm ở con ic 28j60 ấy:
              +chân số 3 ( là chân CLOCK OUT) có tác dụng gì?
              +chân số 5 (là chân WOL) có tác dụng gì?
              +chân số 10(là chân reset) thì reset ở mức cao hay thấp hay khi nào rs?
              vậy trong 3 chân này có thể bỏ chân nào ko dùng ko?
              cám ơn các bác!
              Bạn xem lại xem, chứ thay bình thường mà, chỉ sao cho string không vượt quá 16 ký tự thôi. Hay bạn copy thông báo lỗi lên thì mới biết được.
              Chân CLOCK OUT cho phép xuất xung clock từ ENC28J60 (25MHz) với các hệ số chia lập trình được (1,2,3,4,8)
              WOL=Wake up On LAN, 1 chức năng cho phép kích hoạt thiết bị từ trạng thái standby khi có hoạt động trên mạng LAN, nhưng lưu ý là chức năng này trên ENC28J60 chưa có nhé, chỉ chừa sẵn chân này thôi.
              Chân reset tích cực mức thấp.

              3 chân này có thể bỏ được hết, nhưng nhớ kéo reset lên thôi.

              Comment


              • Bài 7: Giao thức HTTP
                - HTTP là chữ viết tắt từ HyperText Transfer Protocol (giao thức truyền tải siêu văn bản). Nó là giao thức cơ bản mà World Wide Web sử dụng để truyền tải nội dung các trang web. HTTP xác định cách các thông điệp (các file văn bản, hình ảnh đồ hoạ, âm thanh, video, và các file multimedia khác được định dạng và truyền tải ra sao, và hoạt động của Web server và các trình duyệt Web.

                - Trong mô hình của HTTP, Webserver đồng thời cũng là TCP server, mở sẵn port mặc định dành cho dịch vụ HTTP là TCP80 (ở chế độ listen), sẵn sàng đợi yêu cầu kết nối từ các client.

                - Các client sẽ khởi tạo kết nối TCP thông qua port này, sau khi Webserver chấp nhận kết nối, client sẽ gửi một bản tin HTTP (HTTP message) gọi là HTTP request tới server trên kết nối TCP vừa thiết lập.

                - Server sẽ trả lời lại bằng một bản tin HTTP khác là HTTP response. Bản tin này sẽ chứa nội dung trang Web yêu cầu (được viết bằng ngôn ngữ HTML).

                Như vậy giao thức HTTP sẽ dựa cơ bản trên các bản tin HTTP, gồm 2 loại là HTTP request và HTTP response.

                Giả sử người dùng truy cập URL: www.dientuvietnam.net/index.html (trang web có text và 10 hình ảnh jpeg):

                1a-HTTP client thiết lập liên kết TCP với HTTP server (process) tại địa chỉ www.dientuvietnam.net, cổng 80 (ngầm định cho dịch vụ HTTP).

                1b-HTTP server tại máy chủ www.dientuvietnam.net chờ yêu cầu kết nối TCP tại cổng 80, chấp nhận kết nối rồi thông báo với client.

                2-HTTP client gửi HTTP request message (bao gồm cả URL) tới TCP connection socket.

                3-HTTP server nhận request message, tạo ra HTTP response message có chứa các đối tượng được yêu cầu rồi gửi vào socket.

                4-HTTP server ngắt liên kết.

                5-HTTP client nhận response message có chứa file html, hiển thị html. Sau đó, phân tích file html, tìm URL của 10 hình ảnh jpeg trong tài liệu.

                6-Bước 1-5 được lặp lại với từng hình ảnh.

                Có nhiều phiên bản HTTP, tuy nhiên ở đây chúng ta sẽ bắt đầu với phiên bản HTTP đơn giản nhất: HTTP 1.0

                1-Cấu trúc các bản tin HTTP:

                Bản tin HTTP (HTTP message) gồm 2 loại: HTTP request và HTTP response. Đối với HTTP request ta có Simple-Request và Full-Request. Tương tự ta cũng có Simple-Response và Full-Response.

                1.1-Bản tin HTTP request:


                a-Simple-Request: có cấu trúc rất đơn giản
                GET<space><Request-URI><CRLF>

                b-Full-Request: có cấu trúc tổng quát gồm có 3 phần như sau
                [Request-Line]
                [Headers]
                <CRLF>
                [Entity-Body]

                Request-Line: có cú pháp như sau:
                <Method><space><Request-URI><space><HTTP-Version><CRLF>

                Trong đó:
                - Method là tên phương thức HTTP, với HTTP 1.0 ta có các method chính là: "GET", "HEAD" và "POST".

                - Request-URI là đường dẫn tới trang web cần tải, có thể là đường dẫn tương đối hay tuyệt đối.

                - HTTP-Version: cho biết phiên bản HTTP đang sử dụng.

                Ví dụ:
                - Request line với URI tuyệt đối:
                GET http://www.w3.org/pub/WWW/TheProject.html HTTP/1.0

                - Request line với URI tương đối:
                GET /pub/WWW/TheProject.html HTTP/1.0

                Headers: có 3 loại: General-Header; Request-Header; Entity-Header

                Có nhiều Header khác nhau trong mỗi loại, ở đây không tiện trình bày hết, nhưng nhìn chung, HTTP Header có cú pháp như sau:
                <field-name>: <field-value> <CRLF>

                Entity-Body: chứa các thông tin kèm theo request đó (ví dụ khi ta nhấn nút Submit trên 1 trang web sử dụng phương thức HTTP POST, trạng thái của các nút check, giá trị trong các ô edit text,... sẽ được chứa trong phần này.

                Ví dụ:
                - Một bản tin HTTP request dùng phương thức GET:
                GET /path/file.html HTTP/1.0<CRLF>
                From: someuser@jmarshall.com<CRLF>
                User-Agent: HTTPTool/1.0<CRLF>
                <CRLF>

                Trong phương thức GET này, phần body là trống (không có message body)

                - Một bản tin HTTP request dùng phương thức POST:
                POST /path/script.cgi HTTP/1.0<CRLF>
                From: frog@jmarshall.com<CRLF>
                User-Agent: HTTPTool/1.0<CRLF>
                Content-Type: application/x-www-form-urlencoded<CRLF>
                Content-Length: 32<CRLF>
                <CRLF>
                home=Cosby&favorite+flavor=flies

                Dòng 1 là request line
                Dòng 2,3,4,5 là các header
                Dòng 6 chỉ chứa 1 ký tự xuống dòng (<CRLF>) báo hết phần Header, bắt đầu mesage body
                Dòng 7 chính là phần body

                Ở đây chúng ta cần lưu ý là độ dài Headers không cố định, nhưng kết thúc bằng <CRLF>. Do đó khi viết chương trình cho AVR, ta sẽ tìm chỗ nào có 2 ký tự <CRLF> liên tiếp thì đó là kết thúc Headers.

                1.1-Bản tin HTTP response:


                a-Simple-Response: có cấu trúc rất đơn giản, chỉ chứa phần Entity-Body
                [Entity-Body]

                b-Full-Response: có cấu trúc tổng quát gồm có 3 phần như sau
                <Status-Line>
                <Headers>
                <CRLF>
                [Entity-Body]

                Status-Line: có cú pháp như sau
                <HTTP-Version><space><Status-Code><Space><Reason-Phrase><CRLF>

                Trong đó:
                - HTTP-Version: cho biết phiên bản giao thức HTTP. Ví dụ: "HTTP/1.0"

                - Status-Code: cho biết mã trạng thái của response. Gồm 3 chữ số, được qui định như sau
                + 1xx: Informational - chưa được sử dung, để dự phòng
                + 2xx: Thành công (Success) - cho biết request được chấp nhận và đáp u.
                + 3xx: Chuyển hướng (Redirection) - yêu cầu client chuyển hướng request
                + 4xx: Lỗi do client (Client Error) - request không hợp lệ
                + 5xx: Lỗi do sever (Server Error) - request hợp lệ nhưng server bị lỗi không thể trả lời

                Các Status-Code cụ thể hay dùng:
                + "200" ; OK
                + "201" ; Created
                + "202" ; Accepted
                + "204" ; No Content
                + "301" ; Moved Permanently
                + "302" ; Moved Temporarily
                + "304" ; Not Modified
                + "400" ; Bad Request
                + "401" ; Unauthorized
                + "403" ; Forbidden
                + "404" ; Not Found
                + "500" ; Internal Server Error
                + "501" ; Not Implemented
                + "502" ; Bad Gateway
                + "503" ; Service Unavailable

                - Reason-Phrase: chứa nội dung text giải thích cho response.

                Headers: cú pháp tương tự header của request, cũng gồm General-Header; Response-Header; Entity-Header

                Entity-Body:chứa phần nội dung trả lời của response (ví du nội dung file html)

                Ví dụ: Một response cho phương thức GET

                HTTP/1.0 200 OK<CRLF>
                Date: Fri, 31 Dec 1999 23:59:59 GMT<CRLF>
                Content-Type: text/html<CRLF>
                Content-Length: 1354<CRLF>
                <CRLF>
                <html>
                <body>
                <h1>Happy New Millennium!</h1>
                (more file contents)
                .
                .
                .
                </body>
                </html>

                Dòng 1: Status-Line
                Dòng 2: General Header
                Dòng 3,4: Entity-Header
                Dòng 5: <CRLF>, báo hiệu kết thúc headers
                Dòng 6 trở đi: Entity body
                Last edited by nttam79; 22-11-2011, 21:39.

                Comment


                • Ngôn ngữ HTML và thiết kế web cho AVR webserver:
                  Phần này không biết phải trình bày sao nữa, vì giải thích về HTML và thiết kế web thì dài dòng quá, nên chỉ hướng dẫn các bạn làm 1 trang web đơn giản để nhúng vào AVR thôi.

                  Đầu tiên ta dùng bất cứ 1 phần mềm có hỗ trợ thiết kế web nào cũng được, microsoft ofice word, microsoft ofice frontpage, ofice publisher, ... (mình dùng Adobe Dreamweaver CS5 do sẵn tiện đang dùng để viết PHP) để thiết kế 1 trang web đơn giản tương tự như sau:



                  Bạn nào chưa biết làm hoặc lười có thể làm như sau:
                  1-Mở notepad.

                  2-Copy code html sau vào:
                  Code:
                  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
                  <html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" lang="en">
                  <head>
                  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
                  <title>AVR web server</title>
                  </head>
                  <body style="background: #048C04; color: #FFFFFF">
                  <br>
                  <table bgcolor="#489D48" border="0" width="975" cellpadding="0" cellspacing="0" align="center">
                   <tbody>
                    <tr>
                     <td height="31" align="center">
                      <div style="font-size:48pt; color:#F4FC8F"><strong>REMOTE  CONTROL AVR WEBSERVER</strong></div>
                     </td>
                    </tr>
                   </tbody>
                  </table>
                  <table width="100%" cellpadding="0" cellspacing="0">
                   <tbody>
                    <tr>
                     <td>
                      <br>
                      <div align="center">
                       <div style="background: #ffffff; color: #000000; width:975px; text-align:left">
                        <div style="padding:0px 15px 0px 15px" align="left">
                         <br>
                          <table style="background: #999999; color: #000000; border: 1px solid #6581c1" cellpadding="6" cellspacing="1" border="0" width="100%" align="center">
                           <tbody>
                            <tr style="background: #FFFFFF; color: #545454; border-left: 1px solid #FFFFFF; border-top: 1px solid #FFFFFF">
                             <td width="100%">
                              <div style="font-size:10pt"><strong>DESIGNER: THANH - TAM</strong></div>
                             </td>
                             <td nowrap="nowrap" style="padding:0px">
                              
                             </td>
                            </tr>
                           </tbody>
                          </table>
                          <br>
                          <table style="background: #999999; color: #000000; border: 1px solid #6581c1" cellpadding="6" cellspacing="1" border="0" width="100%" align="center">
                           <thead>
                            <tr valign="top">
                             <td style="background: #FFFFFF; color: #048C04" colspan="3"><strong>Remote control webserver with ATmega32</a></strong></td>
                            </tr>
                           </thead>
                           <tbody id="collapseobj_vietvbb_stats" style="">
                                  <tr>
                             <td style="background: #FFFFFF; color: #545454; border-left: 1px solid #FFFFFF; border-top: 1px solid #FFFFFF">
                              <table border="1" cellpadding="0" cellspacing="0" width="100%">
                               <tbody>
                                <tr style="font-size:12pt">      
                                 <td style="padding: 5px 5px 5px 5px;" width="25%">
                                  <div>
                                   <strong>Camera view</strong>
                                  </div>
                                 </td>
                                 <td style="padding: 5px 5px 5px 5px;" width="25%">
                                  <div>
                                   <strong>Devices control</strong>
                                  </div>
                                 </td>
                                 <td style="padding: 5px 5px 5px 5px;" width="50%">
                                  <div>
                                   <strong>Sensors</strong>
                                  </div>
                                 </td>
                                </tr>
                                <tr style="font:bold 12pt">      
                                 <td style="padding: 5px 5px 5px 5px;" width="25%">
                                  <div id="vietvbb_topstats_s_content" style="display: block;">
                                   <img src="http://d.f5.photo.zdn.vn/upload/original/2011/06/19/1/24/1308421475585659804_574_0.jpg" width="320" height="240" />
                                  </div>
                                 </td>
                                 <td style="padding: 5px 5px 5px 5px;" width="25%">
                                  <div>
                                   <form method="POST" action="">
                                    <p align="left"><input type="checkbox" name="RELAY1" value="ON"%RL1>Relay 01</p>
                                    <p align="left"><input type="checkbox" name="RELAY2" value="ON"%RL2>Relay 02</p>
                                    <p align="left"><input type="checkbox" name="RELAY3" value="ON"%RL3>Relay 03</p>
                                    <p align="left"><input type="checkbox" name="RELAY4" value="ON"%RL4>Relay 04</p>
                                    <p align="left"><input type="submit" value="Submit" name="CTRL"></p>
                                   </form>
                                  </div>
                                 </td>
                                 <td style="padding: 5px 5px 5px 5px;" width="50%">
                                  <div>
                                   
                                   <table border="1" width="100%" id="table1">
                                    <tr>
                                     <td>Environment Sensors</td>
                                     <td width="42">Value</td>
                                     <td width="33">Unit</td>
                                     <td width="150">&nbsp;</td>
                                    </tr>
                                    <tr>
                                     <td>Sensor 01</td>
                                     <td width="42">%AD0</td>
                                     <td width="33"><sup>o</sup>C</td>
                                     <td width="150">&nbsp;</td>
                                    </tr>
                                    <tr>
                                     <td>Sensor 02</td>
                                     <td width="42">%AD1</td>
                                     <td width="33"><sup>o</sup>C</td>
                                     <td width="150">&nbsp;</td>
                                    </tr>
                                   </table>
                                  </div>
                                 </td>
                                </tr>
                               </tbody>
                              </table>
                             </td>
                            </tr>
                           </tbody>
                          </table>
                          <br><br><br>
                          <div align="center">Timezone: GMT+7. Current time <span>%TI</span>.</div>
                           <br>
                          </div>
                         </div>
                        </div>
                        <form action="footer" method="get">
                         <br>
                         <div align="center">
                          <div align="center">Designed by thanh - tam</div>
                         </div>
                        </form>
                       </td>
                      </tr>
                     </tbody>
                    </table>
                   </div>
                  </body>
                  </html>
                  3-Chọn Save as: Chọn Save as type: All file; Encoding: UTF-8; Đặt tên file là web.html (nhớ đúng đuôi nhé).

                  4-Dùng trình duyệt mở xem thử.

                  5-Dùng Microsoft Office word hay bất cứ phần mềm soạn thảo web nào edit lại theo ý mình.

                  Đoạn code trên chính là mã HTML mô tả nội dung trang web mà webserver phải trả lời lại cho 1 bản tin HTTP request (GET hay POST)

                  Trong trang web trên ta có 1 hình ảnh (chú cún nhà mình) nhưng ta không lưu hình ảnh này trên ROM mà upload trên 1 server khác rồi nhúng code vào thôi, để tiết kiệm bộ nhớ cho AVR.

                  Như vậy kịch bản truy cập vào webserver với trang web trên như sau (giả sử ta chỉ mới truy cập trong mạng LAN với IP của mạch là 192.168.1.10):


                  1-Webserver (mạch AVR+ENC28J60) mở sẵn cổng TCP 80 (listen) đợi nhận kết nối từ client.

                  2-Ta mở trình duyệt, gõ địa chỉ http://192.168.1.10

                  3-Máy tính khởi tạo 1 kết nối TCP tới địa chỉ IP 192.168.1.10, port đích là 80, port nguồn do nó tự chọn (gửi bản tin SYN).

                  4-Webserver chấp nhận kết nối (trả lời bản tin SYN), client xác nhận ACK (xem lại phần giao thức TCP). Kết nối TCP được thiết lập.

                  5-Client gửi bản tin HTTP request với phương thức GET. Nội dung như sau (ví dụ):
                  Code:
                  GET http://192.168.1.10/index.html HTTP/1.0<CRLF>
                  User-Agent: Chrome/15.0<CRLF>
                  <CRLF>
                  6-Webserver trả lời bằng một bản tin HTTP response, với phần Entity-body chính là nội dung mã HTML của trang web trên:
                  Code:
                  HTTP/1.0 200 Document follows<CRLF>
                  Server: AVR_Small_Webserver<CRLF>
                  Content-Type: text/html<CRLF>
                  Content-Length: 1234<CRLF>
                  <CRLF>
                  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
                  <html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" lang="en">
                  <head>
                  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
                  <title>AVR web server</title>
                  </head>
                  <body style="background: #048C04; color: #FFFFFF">
                  <br>
                  <table bgcolor="#489D48" border="0" width="975" cellpadding="0" cellspacing="0" align="center">
                   <tbody>
                    <tr>
                     <td height="31" align="center">
                      <div style="font-size:48pt; color:#F4FC8F"><strong>REMOTE  CONTROL AVR WEBSERVER</strong></div>
                     </td>
                    </tr>
                   </tbody>
                  </table>
                  <table width="100%" cellpadding="0" cellspacing="0">
                   <tbody>
                    <tr>
                     <td>
                      <br>
                      <div align="center">
                       <div style="background: #ffffff; color: #000000; width:975px; text-align:left">
                        <div style="padding:0px 15px 0px 15px" align="left">
                         <br>
                          <table style="background: #999999; color: #000000; border: 1px solid #6581c1" cellpadding="6" cellspacing="1" border="0" width="100%" align="center">
                           <tbody>
                            <tr style="background: #FFFFFF; color: #545454; border-left: 1px solid #FFFFFF; border-top: 1px solid #FFFFFF">
                             <td width="100%">
                              <div style="font-size:10pt"><strong>DESIGNER: THANH - TAM</strong></div>
                             </td>
                             <td nowrap="nowrap" style="padding:0px">
                              
                             </td>
                            </tr>
                           </tbody>
                          </table>
                          <br>
                          <table style="background: #999999; color: #000000; border: 1px solid #6581c1" cellpadding="6" cellspacing="1" border="0" width="100%" align="center">
                           <thead>
                            <tr valign="top">
                             <td style="background: #FFFFFF; color: #048C04" colspan="3"><strong>Remote control webserver with ATmega32</a></strong></td>
                            </tr>
                           </thead>
                           <tbody id="collapseobj_vietvbb_stats" style="">
                                  <tr>
                             <td style="background: #FFFFFF; color: #545454; border-left: 1px solid #FFFFFF; border-top: 1px solid #FFFFFF">
                              <table border="1" cellpadding="0" cellspacing="0" width="100%">
                               <tbody>
                                <tr style="font-size:12pt">      
                                 <td style="padding: 5px 5px 5px 5px;" width="25%">
                                  <div>
                                   <strong>Camera view</strong>
                                  </div>
                                 </td>
                                 <td style="padding: 5px 5px 5px 5px;" width="25%">
                                  <div>
                                   <strong>Devices control</strong>
                                  </div>
                                 </td>
                                 <td style="padding: 5px 5px 5px 5px;" width="50%">
                                  <div>
                                   <strong>Sensors</strong>
                                  </div>
                                 </td>
                                </tr>
                                <tr style="font:bold 12pt">      
                                 <td style="padding: 5px 5px 5px 5px;" width="25%">
                                  <div id="vietvbb_topstats_s_content" style="display: block;">
                                   <img src="http://d.f5.photo.zdn.vn/upload/original/2011/06/19/1/24/1308421475585659804_574_0.jpg" width="320" height="240" />
                                  </div>
                                 </td>
                                 <td style="padding: 5px 5px 5px 5px;" width="25%">
                                  <div>
                                   <form method="POST" action="">
                                    <p align="left"><input type="checkbox" name="RELAY1" value="ON"%RL1>Relay 01</p>
                                    <p align="left"><input type="checkbox" name="RELAY2" value="ON"%RL2>Relay 02</p>
                                    <p align="left"><input type="checkbox" name="RELAY3" value="ON"%RL3>Relay 03</p>
                                    <p align="left"><input type="checkbox" name="RELAY4" value="ON"%RL4>Relay 04</p>
                                    <p align="left"><input type="submit" value="Submit" name="CTRL"></p>
                                   </form>
                                  </div>
                                 </td>
                                 <td style="padding: 5px 5px 5px 5px;" width="50%">
                                  <div>
                                   
                                   <table border="1" width="100%" id="table1">
                                    <tr>
                                     <td>Environment Sensors</td>
                                     <td width="42">Value</td>
                                     <td width="33">Unit</td>
                                     <td width="150">&nbsp;</td>
                                    </tr>
                                    <tr>
                                     <td>Sensor 01</td>
                                     <td width="42">%AD0</td>
                                     <td width="33"><sup>o</sup>C</td>
                                     <td width="150">&nbsp;</td>
                                    </tr>
                                    <tr>
                                     <td>Sensor 02</td>
                                     <td width="42">%AD1</td>
                                     <td width="33"><sup>o</sup>C</td>
                                     <td width="150">&nbsp;</td>
                                    </tr>
                                   </table>
                                  </div>
                                 </td>
                                </tr>
                               </tbody>
                              </table>
                             </td>
                            </tr>
                           </tbody>
                          </table>
                          <br><br><br>
                          <div align="center">Timezone: GMT+7. Current time <span>%TI</span>.</div>
                           <br>
                          </div>
                         </div>
                        </div>
                        <form action="footer" method="get">
                         <br>
                         <div align="center">
                          <div align="center">Designed by thanh - tam</div>
                         </div>
                        </form>
                       </td>
                      </tr>
                     </tbody>
                    </table>
                   </div>
                  </body>
                  </html>
                  7-Webserver đóng kết nối TCP.

                  8-Trình duyệt trên client phân tích mã HTML, hiển thị nôi dung trang web, phần hình ảnh (<img src="http://d.f5.photo.zdn.vn/upload/original/2011/06/19/1/24/1308421475585659804_574_0.jpg" width="320" height="240" />) vẫn chưa có (chừa trống).

                  9-Client căn cứ vào URL của hình ảnh (http://d.f5.photo.zdn.vn/upload/original/2011/06/19/1/24/1308421475585659804_574_0.jpg) thiết lập 1 kết nối TCP mới, tải hình ảnh trên về và hiển thị lên.
                  Last edited by nttam79; 23-11-2011, 05:17.

                  Comment


                  • Mọi người có gì thắc mắc cứ hỏi nhé. Đôi chỗ có lẽ giải thích không được rõ ràng lắm.

                    Bây giờ bắt đầu phần Coding:

                    Tương tự, ta tạo ra các file source và header trong project:
                    File "http.c"
                    Code:
                    //----------------------------------------------------------------------------
                    // Writen by NTTam - PTITHCM
                    //----------------------------------------------------------------------------
                    #include "packet.h"
                    #include "ethernet.h"
                    #include "http.h"
                    #include "webpage.h"
                    #include "uart.h"
                    #include "ntAVRnet.h"
                    File "http.h"
                    Code:
                    //----------------------------------------------------------------------------
                    // Writen by NTTam - PTITHCM
                    //----------------------------------------------------------------------------
                    #ifndef HTTP_H
                    #define HTTP_H
                    
                    
                    //----------------------------------------------------------------------------
                    #endif //HTTP_H
                    Ta tạo thêm 1 file header có tên "webpage.h" chứa nội dung trang web
                    Code:
                    //----------------------------------------------------------------------------
                    // Writen by NTTam - PTITHCM
                    //----------------------------------------------------------------------------
                    #ifndef WEBPAGE_H
                    #define WEBPAGE_H
                    
                    
                    //----------------------------------------------------------------------------
                    #endif //WEBPAGE_H
                    Bây giờ ta bắt đầu với file "webpage.h" trước, chuyển nội dung file HTML mà ta đã soạn thảo ở phần trước vào trong ROM của AVR:

                    Ta khai báo trong "webpage.h" một chuỗi ký tự lưu trong bộ nhớ ROM:
                    Code:
                    //----------------------------------------------------------------------------
                    // Writen by NTTam - PTITHCM
                    //----------------------------------------------------------------------------
                    #ifndef WEBPAGE_H
                    #define WEBPAGE_H
                    //
                    #include <avr/pgmspace.h>
                    
                    PROGMEM char Page1[] = {};
                    //----------------------------------------------------------------------------
                    #endif //WEBPAGE_H
                    Tiếp theo ta chuyển nội dung file html trên vào chuỗi trên. Làm theo các bước sau:

                    1-Mở notepad, copy tất cả mã html trong file "web.html" đã chuẩn bị vào. Có thể bỏ các ký tự <space> ở đầu dòng cho tiết kiệm bộ nhớ.

                    2-Bấm Ctrl-H để mở công cụ find & replace: tìm ký tự dấu nháy kép: " và thay tất cả bằng: \". Lý do của thao tác này là trong ngôn ngữ C, dấu nháy kép sẽ kết thúc 1 chuỗi, do đó nếu trong chuỗi của ta có dấu nháy này thì phải thay bằng \" .

                    Kết quả tại đây ta sẽ được nội dung trên notepad như sau:
                    Code:
                    <!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">
                    <html xmlns=\"http://www.w3.org/1999/xhtml\" dir=\"ltr\" lang=\"en\">
                    <head>
                    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">
                    <title>AVR web server</title>
                    </head>
                    <body style=\"background: #048C04; color: #FFFFFF\">
                    <br>
                    <table bgcolor=\"#489D48\" border=\"0\" width=\"975\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\">
                    <tbody>
                    <tr>
                    <td height=\"31\" align=\"center\">
                    <div style=\"font-size:48pt; color:#F4FC8F\"><strong>REMOTE  CONTROL AVR WEBSERVER</strong></div>
                    </td>
                    </tr>
                    </tbody>
                    </table>
                    <table width=\"100%\" cellpadding=\"0\" cellspacing=\"0\">
                    <tbody>
                    <tr>
                    <td>
                    <br>
                    <div align=\"center\">
                    <div style=\"background: #ffffff; color: #000000; width:975px; text-align:left\">
                    <div style=\"padding:0px 15px 0px 15px\" align=\"left\">
                    <br>
                    <table style=\"background: #999999; color: #000000; border: 1px solid #6581c1\" cellpadding=\"6\" cellspacing=\"1\" border=\"0\" width=\"100%\" align=\"center\">
                    <tbody>
                    <tr style=\"background: #FFFFFF; color: #545454; border-left: 1px solid #FFFFFF; border-top: 1px solid #FFFFFF\">
                    <td width=\"100%\">
                    <div style=\"font-size:10pt\"><strong>DESIGNER: THANH - TAM</strong></div>
                    </td>
                    <td nowrap=\"nowrap\" style=\"padding:0px\">
                    </td>
                    </tr>
                    </tbody>
                    </table>
                    <br>
                    <table style=\"background: #999999; color: #000000; border: 1px solid #6581c1\" cellpadding=\"6\" cellspacing=\"1\" border=\"0\" width=\"100%\" align=\"center\">
                    <thead>
                    <tr valign=\"top\">
                    <td style=\"background: #FFFFFF; color: #048C04\" colspan=\"3\"><strong>Remote control webserver with ATmega32</a></strong></td>
                    </tr>
                    </thead>
                    <tbody id=\"collapseobj_vietvbb_stats\" style=\"\">
                    <tr>
                    <td style=\"background: #FFFFFF; color: #545454; border-left: 1px solid #FFFFFF; border-top: 1px solid #FFFFFF\">
                    <table border=\"1\" cellpadding=\"0\" cellspacing=\"0\" width=\"100%\">
                    <tbody>
                    <tr style=\"font-size:12pt\">      
                    <td style=\"padding: 5px 5px 5px 5px;\" width=\"25%\">
                    <div>
                    <strong>Camera view</strong>
                    </div>
                    </td>
                    <td style=\"padding: 5px 5px 5px 5px;\" width=\"25%\">
                    <div>
                    <strong>Devices control</strong>
                    </div>
                    </td>
                    <td style=\"padding: 5px 5px 5px 5px;\" width=\"50%\">
                    <div>
                    <strong>Sensors</strong>
                    </div>
                    </td>
                    </tr>
                    <tr style=\"font:bold 12pt\">
                    
                    <td style=\"padding: 5px 5px 5px 5px;\" width=\"25%\">
                    
                    <div id=\"vietvbb_topstats_s_content\" style=\"display: block;\">
                    
                    <img src=\"http://d.f5.photo.zdn.vn/upload/original/2011/06/19/1/24/1308421475585659804_574_0.jpg\" width=\"320\" height=\"240\" />
                    </div>
                    </td>
                    <td style=\"padding: 5px 5px 5px 5px;\" width=\"25%\">
                    <div>
                    <form method=\"POST\" action=\"\">
                    <p align=\"left\"><input type=\"checkbox\" name=\"RELAY1\" value=\"ON\"%RL1>Relay 01</p>
                    <p align=\"left\"><input type=\"checkbox\" name=\"RELAY2\" value=\"ON\"%RL2>Relay 02</p>
                    <p align=\"left\"><input type=\"checkbox\" name=\"RELAY3\" value=\"ON\"%RL3>Relay 03</p>
                    <p align=\"left\"><input type=\"checkbox\" name=\"RELAY4\" value=\"ON\"%RL4>Relay 04</p>
                    <p align=\"left\"><input type=\"submit\" value=\"Submit\" name=\"CTRL\"></p>
                    </form>
                    </div>
                    </td>
                    <td style=\"padding: 5px 5px 5px 5px;\" width=\"50%\">
                    <div>
                    <table border=\"1\" width=\"100%\" id=\"table1\">
                    <tr>
                    <td>Environment Sensors</td>
                    <td width=\"42\">Value</td>
                    <td width=\"33\">Unit</td>
                    <td width=\"150\">&nbsp;</td>
                    </tr>
                    <tr>
                    <td>Sensor 01</td>
                    <td width=\"42\">%AD0</td>
                    <td width=\"33\"><sup>o</sup>C</td>
                    <td width=\"150\">&nbsp;</td>
                    </tr>
                    <tr>
                    <td>Sensor 02</td>
                    <td width=\"42\">%AD1</td>
                    <td width=\"33\"><sup>o</sup>C</td>
                    <td width=\"150\">&nbsp;</td>
                    </tr>
                    </table>
                    </div>
                    </td>
                    </tr>
                    </tbody>
                    </table>
                    </td>
                    </tr>
                    </tbody>
                    </table>
                    <br><br><br>
                    <div align=\"center\">Timezone: GMT+7. Current time <span>%TI</span>.</div>
                    <br>
                    </div>
                    </div>
                    </div>
                    <form action=\"footer\" method=\"get\">
                    <br>
                    <div align=\"center\">
                    <div align=\"center\">Designed by thanh - tam</div>
                    </div>
                    </form>
                    </td>
                    </tr>
                    </tbody>
                    </table>
                    </div>
                    </body>
                    </html>
                    3-Ta thêm dấu nháy kép vào đầu và cuối mỗi dòng.

                    4-Copy tất cả, bỏ vào giữa 2 dấu ngoặc nhọn trong khai báo PROGMEM char Page1[] = {};

                    Kết quả ta sẽ được file "webpage.h" như vầy:
                    Code:
                    //----------------------------------------------------------------------------
                    // Writen by NTTam - PTITHCM
                    //----------------------------------------------------------------------------
                    #ifndef WEBPAGE_H
                    #define WEBPAGE_H
                    //
                    #include <avr/pgmspace.h>
                    
                    PROGMEM char Page1[] = {"<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">"
                    "<html xmlns=\"http://www.w3.org/1999/xhtml\" dir=\"ltr\" lang=\"en\">"
                    "<head>"
                    "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">"
                    "<title>AVR web server</title>"
                    "</head>"
                    "<body style=\"background: #048C04; color: #FFFFFF\">"
                    "<br>"
                    "<table bgcolor=\"#489D48\" border=\"0\" width=\"975\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\">"
                    "<tbody>"
                    "<tr>"
                    "<td height=\"31\" align=\"center\">"
                    "<div style=\"font-size:48pt; color:#F4FC8F\"><strong>REMOTE  CONTROL AVR WEBSERVER</strong></div>"
                    "</td>"
                    "</tr>"
                    "</tbody>"
                    "</table>"
                    "<table width=\"100%\" cellpadding=\"0\" cellspacing=\"0\">"
                    "<tbody>"
                    "<tr>"
                    "<td>"
                    "<br>"
                    "<div align=\"center\">"
                    "<div style=\"background: #ffffff; color: #000000; width:975px; text-align:left\">"
                    "<div style=\"padding:0px 15px 0px 15px\" align=\"left\">"
                    "<br>"
                    "<table style=\"background: #999999; color: #000000; border: 1px solid #6581c1\" cellpadding=\"6\" cellspacing=\"1\" border=\"0\" width=\"100%\" align=\"center\">"
                    "<tbody>"
                    "<tr style=\"background: #FFFFFF; color: #545454; border-left: 1px solid #FFFFFF; border-top: 1px solid #FFFFFF\">"
                    "<td width=\"100%\">"
                    "<div style=\"font-size:10pt\"><strong>DESIGNER: THANH - TAM</strong></div>"
                    "</td>"
                    "<td nowrap=\"nowrap\" style=\"padding:0px\">"
                    "</td>"
                    "</tr>"
                    "</tbody>"
                    "</table>"
                    "<br>"
                    "<table style=\"background: #999999; color: #000000; border: 1px solid #6581c1\" cellpadding=\"6\" cellspacing=\"1\" border=\"0\" width=\"100%\" align=\"center\">"
                    "<thead>"
                    "<tr valign=\"top\">"
                    "<td style=\"background: #FFFFFF; color: #048C04\" colspan=\"3\"><strong>Remote control webserver with ATmega32</a></strong></td>"
                    "</tr>"
                    "</thead>"
                    "<tbody id=\"collapseobj_vietvbb_stats\" style=\"\">"
                    "<tr>"
                    "<td style=\"background: #FFFFFF; color: #545454; border-left: 1px solid #FFFFFF; border-top: 1px solid #FFFFFF\">"
                    "<table border=\"1\" cellpadding=\"0\" cellspacing=\"0\" width=\"100%\">"
                    "<tbody>"
                    "<tr style=\"font-size:12pt\">"
                    "<td style=\"padding: 5px 5px 5px 5px;\" width=\"25%\">"
                    "<div>"
                    "<strong>Camera view</strong>"
                    "</div>"
                    "</td>"
                    "<td style=\"padding: 5px 5px 5px 5px;\" width=\"25%\">"
                    "<div>"
                    "<strong>Devices control</strong>"
                    "</div>"
                    "</td>"
                    "<td style=\"padding: 5px 5px 5px 5px;\" width=\"50%\">"
                    "<div>"
                    "<strong>Sensors</strong>"
                    "</div>"
                    "</td>"
                    "</tr>"
                    "<tr style=\"font:bold 12pt\">"
                    
                    "<td style=\"padding: 5px 5px 5px 5px;\" width=\"25%\">"
                    
                    "<div id=\"vietvbb_topstats_s_content\" style=\"display: block;\">"
                    
                    "<img src=\"http://d.f5.photo.zdn.vn/upload/original/2011/06/19/1/24/1308421475585659804_574_0.jpg\" width=\"320\" height=\"240\" />"
                    "</div>"
                    "</td>"
                    "<td style=\"padding: 5px 5px 5px 5px;\" width=\"25%\">"
                    "<div>"
                    "<form method=\"POST\" action=\"\">"
                    "<p align=\"left\"><input type=\"checkbox\" name=\"RELAY1\" value=\"ON\"%RL1>Relay 01</p>"
                    "<p align=\"left\"><input type=\"checkbox\" name=\"RELAY2\" value=\"ON\"%RL2>Relay 02</p>"
                    "<p align=\"left\"><input type=\"checkbox\" name=\"RELAY3\" value=\"ON\"%RL3>Relay 03</p>"
                    "<p align=\"left\"><input type=\"checkbox\" name=\"RELAY4\" value=\"ON\"%RL4>Relay 04</p>"
                    "<p align=\"left\"><input type=\"submit\" value=\"Submit\" name=\"CTRL\"></p>"
                    "</form>"
                    "</div>"
                    "</td>"
                    "<td style=\"padding: 5px 5px 5px 5px;\" width=\"50%\">"
                    "<div>"
                    "<table border=\"1\" width=\"100%\" id=\"table1\">"
                    "<tr>"
                    "<td>Environment Sensors</td>"
                    "<td width=\"42\">Value</td>"
                    "<td width=\"33\">Unit</td>"
                    "<td width=\"150\">&nbsp;</td>"
                    "</tr>"
                    "<tr>"
                    "<td>Sensor 01</td>"
                    "<td width=\"42\">%AD0</td>"
                    "<td width=\"33\"><sup>o</sup>C</td>"
                    "<td width=\"150\">&nbsp;</td>"
                    "</tr>"
                    "<tr>"
                    "<td>Sensor 02</td>"
                    "<td width=\"42\">%AD1</td>"
                    "<td width=\"33\"><sup>o</sup>C</td>"
                    "<td width=\"150\">&nbsp;</td>"
                    "</tr>"
                    "</table>"
                    "</div>"
                    "</td>"
                    "</tr>"
                    "</tbody>"
                    "</table>"
                    "</td>"
                    "</tr>"
                    "</tbody>"
                    "</table>"
                    "<br><br><br>"
                    "<div align=\"center\">Timezone: GMT+7. Current time <span>%TI</span>.</div>"
                    "<br>"
                    "</div>"
                    "</div>"
                    "</div>"
                    "<form action=\"footer\" method=\"get\">"
                    "<br>"
                    "<div align=\"center\">"
                    "<div align=\"center\">Designed by thanh - tam</div>"
                    "</div>"
                    "</form>"
                    "</td>"
                    "</tr>"
                    "</tbody>"
                    "</table>"
                    "</div>"
                    "</body>"
                    "</html>"};
                    //----------------------------------------------------------------------------
                    #endif //WEBPAGE_H
                    Ai mà lười thì copy y chang file này, kết quả là trang web sẽ có hình chú cún nhà mình.
                    Last edited by nttam79; 23-11-2011, 11:19.

                    Comment


                    • Tiếp theo, ta quay lại file "http.h". Thêm các define cho các method của request:
                      Code:
                      //
                      #define	HTTP_REQUEST_GET		1//"GET"
                      #define	HTTP_REQUEST_POST		2//"POST"
                      #define	HTTP_REQUEST_HEAD		3//"HEAD"
                      #define	HTTP_REQUEST_UNKNOWN	4//Request quai qui gi do ma ta khong biet
                      //
                      #define	HTTP_REQUEST_GET_STR		"GET"
                      #define	HTTP_REQUEST_POST_STR		"POST"
                      #define	HTTP_REQUEST_HEAD_STR		"HEAD"
                      //
                      Sau đó là khai báo struct tương ứng với bản tin request:
                      Code:
                      //
                      struct httpRequest{
                      	unsigned char method;		//end with space
                      	unsigned char *requestURI;	//end with space
                      	unsigned char *version;		//end with \n\r
                      	unsigned char *header;		//end with \n\r\n\r
                      	unsigned char *body;		//
                      	unsigned int bodyLen;
                      };
                      Ở đây các bạn lưu ý là khác với các header khác, ta dùng chủ yếu biến con trỏ để trỏ các field trong bản tin request, vì kích thước các field trong bản tin không cố định, nên vị trí bắt đầu field cũng không cố định. Ta dùng biến co trỏ để trỏ đến đầu mỗi field, còn kết thúc field thì đương nhiên là trước khi bắt đầu filed tiếp theo, trừ field cuối cùng là body, ta cho nó 1 biến chiều dài.

                      Webserver phải có khả năng thiết lập đồng thời nhiều phiên kết nối, do đó ta khai báo 1 struct nữa lưu thông tin về mỗi phiên kết nối HTTP:
                      Code:
                      struct httpSession{
                      	unsigned char status;			//Trang thai hien tai
                      	const prog_char *headerPointer;	//Con tro den header trong bo nho chuong trinh
                      	const prog_char *bodyPointer;	//Con tro den du lieu can gui trong bo nho chuong trinh
                      	unsigned char *authStr;			//Con tro den chuoi xac thuc
                      	unsigned char auth;				//Xac thuc
                      	struct httpRequest rqst;		//Request tuong ung
                      	struct tcpSession *pTCPSession;
                      };
                      Trong struct trên ta có dùng từ khóa prog_char (để chỉ bộ nhớ chương trình: ROM) nên các bạn nhớ include file "pgmspace.h" vào (đầu file) nếu không sẽ có báo lỗi:
                      Code:
                      #include <avr/pgmspace.h>
                      Cuối cùng là define các trạng thái của 1 phiên HTTP và số phiên tối đa có thể thiết lập đồng thời:
                      Code:
                      //
                      #define HTTP_STATUS_IDLE			0
                      #define HTTP_STATUS_GOT_REQUEST		1
                      #define HTTP_STATUS_HEADER_SENT		2
                      #define HTTP_STATUS_HEADER_RECEIVED	3
                      #define HTTP_STATUS_FINISH			4
                      //
                      #define MAX_HTTP_SESSION			8
                      //
                      Last edited by nttam79; 23-11-2011, 11:53.

                      Comment


                      • Tới lượt file source "http.c"

                        Đầu tiên ta khai báo một số bản tin response chuẩn để webserver sử dụng:
                        Bản tin response cho một request GET/POST hợp lệ, kèm theo sẽ là nội dung trang web:
                        Code:
                        prog_char http_pageheader_ok[]={	"HTTP/1.0 200 Document follows\r\n"
                        								"Server: AVR_Small_Webserver\r\n"
                        								"Content-Type: text/html\r\n\r\n"};
                        Trên đây là Status-line và Response Header, Entity Header của bản tin response, phần Entity-body chính là nội dung webpage mà ta đã chuẩn bị trong file "webpage.h"

                        Bản tin response yêu cầu xác thực. Tất nhiên trang web remote control của chúng ta phải có xác thực username/password rồi, chắc các bạn không muốn ai cũng có thể truy cập vào bật tắt thiết bị lung tung chứ.
                        Code:
                        prog_char http_pageheader_unauth[]={	"HTTP/1.0 401 Unauthorized\r\n"
                        								"Server: AVR_Small_Webserver\r\n"
                        								"WWW-Authenticate: Basic realm=\"NeedPassword\""
                        								"\r\nContent-Type: text/html\r\n\r\n"};
                        Bản tin báo việc xác thực thất bại:
                        Code:
                        prog_char http_pageheader_auth_error[] = {"401 Unauthorized%END"};
                        Bản tin báo lỗi request một đối tượng không có:
                        Code:
                        prog_char http_error_notimp[]={	"HTTP/1.1 501 Not Implemented\r\n"
                        								"Server: AVR_Small_Webserver\r\n"
                        								"WWW-Authenticate: Basic realm=\"My AVR web server\""
                        								"\r\nContent-Type: text/html\r\n\r\n"};
                        Khai báo 1 array các biến struct chứa thông tin về các phiên HTTP:
                        Code:
                        struct httpSession	httpSessionTable[MAX_HTTP_SESSION];
                        Khai báo 1 char array chứa chuỗi xác thực:
                        Code:
                        unsigned char http_auth_password[20];
                        Last edited by nttam79; 23-11-2011, 11:57.

                        Comment


                        • Đầu tiên, ta viết hàm tính mã xác thực cho username/password:
                          Code:
                          //----------------------------------------------------------------------------
                          PROGMEM char BASE64CODE[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
                          //
                          void decode_base64 (unsigned char *str1_in,unsigned char *str2_out)
                          {
                          	unsigned char *strp;
                              unsigned char end_byte = 0;
                          	
                          	strp = str2_out;
                          	
                          	while (*str1_in != 0)
                          	{
                          		*str2_out++= (*str1_in & 0xFC)>>2;
                          		
                          		*str2_out = (((*str1_in++)&0x03)<<4); 
                          		if (*str1_in==0)
                          		{
                          			str2_out++;
                                      end_byte = 2;
                          			break;
                          		}
                          		else
                          		{
                          			*str2_out++ += ((*str1_in & 0xF0)>>4);
                          			*str2_out = (((*str1_in++)& 0x0F)<<2);
                          			if (*str1_in==0)
                          			{
                          				str2_out++;
                                          end_byte = 1;
                                          break;
                          			}
                          			else
                          			{
                          				*str2_out++	+= ((*str1_in & 0xC0)>>6);
                          				*str2_out++= *str1_in++ & 0x3F;
                          			}
                          		}
                          	}
                          	*str2_out = 0;
                              
                          	while(strp != str2_out)
                          	{
                          			*strp = pgm_read_byte(&BASE64CODE[(*strp) & 0x3F]);
                          			strp++;
                          	}
                           
                              while (end_byte--)
                              {
                                  *strp = '=';
                                  strp++;
                              }
                              *strp = 0; 
                          }
                          Hàm khởi tạo giao thức HTTP (thực chất là khởi tạo giá trị ban đầu cho các biến):
                          Code:
                          //----------------------------------------------------------------------------
                          void httpInit()
                          {
                          	unsigned char i;
                          	decode_base64((unsigned char*)HTTP_AUTH_STRING,http_auth_password);
                          	for(i=0; i < MAX_HTTP_SESSION; i++){
                          		httpSessionTable[i].status = HTTP_STATUS_IDLE;
                          	}
                          	//UpdateCtrlSts(0x00);
                          }
                          Ta mở file "ntAVRnet.h" khai báo chuỗi xác thực username/password cho trang web của chúng ta (giả sử username là admin, password là 1234):
                          Code:
                          #define HTTP_AUTH_STRING "admin:1234"
                          Tiếp theo, ta viết hàm xử lý 1 request nhận được. Lúc này, request nhận được qua port TCP 80 đang nằm trên buffer, ngay sau TCP Header. Nhiệm vụ của hàm này là xác định phương thức (method) của request, xác định vị trí các field, và lưu nhưng thông tin này vào struct httpRequest tương ứng.
                          Code:
                          //----------------------------------------------------------------------------
                          //Ham xu ly mot request cua giao thuc HTTP
                          void httpGetRequest(unsigned char *buffer,unsigned int bufferLen,struct httpRequest* rqst)
                          {
                          	unsigned int i;
                          	if((buffer[0] == 'G')&&(buffer[1] == 'E')&&(buffer[2] == 'T')){
                          		rqst->method = HTTP_REQUEST_GET;
                          		#ifdef HTTP_DEBUG
                          		printf("GET\r\n");
                          		#endif
                          	}else if((buffer[0] == 'P')&&(buffer[1] == 'O')&&(buffer[2] == 'S')&&(buffer[3] == 'T')){
                          		rqst->method = HTTP_REQUEST_POST;
                          		#ifdef HTTP_DEBUG
                          		printf("POST\r\n");
                          		#endif
                          	}else if((buffer[0] == 'H')&&(buffer[1] == 'E')&&(buffer[2] == 'A')&&(buffer[3] == 'D')){
                          		rqst->method = HTTP_REQUEST_HEAD;
                          		#ifdef HTTP_DEBUG
                          		printf("HEAD\r\n");
                          		#endif
                          	}else{
                          		rqst->method = HTTP_REQUEST_UNKNOWN;
                          		#ifdef HTTP_DEBUG
                          		printf("UNKNOWN\r\n");
                          		#endif
                          	}
                          	//Bat dau tim URI va HTTP version
                          	i = 0;
                          	while(++i<bufferLen){
                          		if(buffer[i] == ' '){	//khoang trang dau tien
                          			rqst->requestURI = &buffer[i+1];
                          			break;
                          		}
                          	}
                          	while(++i<bufferLen){
                          		if(buffer[i] == ' '){	//khoang trang dau tien
                          			rqst->version = &buffer[i+1];
                          			break;
                          		}
                          	}
                          	//Tim header
                          	while(++i<bufferLen){
                          		if((buffer[i] == 0x0d) && (buffer[i+1] == 0x0a)){	//\n\r dau tien, bat dau header
                          			rqst->header = &buffer[i+2];
                          			break;
                          		}
                          	}
                          	//Tim ket thuc header
                          	while(++i<bufferLen){
                          		if((buffer[i] == 0x0d) && (buffer[i+1] == 0x0a) && (buffer[i+2] == 0x0d)){	//\n\r\n\r
                          			i += 4;
                          			break;
                          		}
                          	}
                          	rqst->body = &buffer[i];
                          	rqst->bodyLen = bufferLen - i;
                          
                          	#ifdef HTTP_DEBUG
                          	printf("Buffer Len:%d\r\n",bufferLen);
                          	printf("URI start:%d\r\n",(rqst->requestURI - buffer));
                          	printf("HTTP Version:%d\r\n",(rqst->version - buffer));
                          	printf("Header:%d\n\r",(rqst->header - buffer));
                          	printf("Body:%d\n\r",(unsigned int)(rqst->body - buffer));
                          	printf("Body:%x-%x\n\r",(unsigned int)(rqst->body),(unsigned int)buffer);
                          	printf("Body i:%d\n\r",i);
                          	#endif
                          }
                          Và hàm lấy giá trị của 1 trường HTTP Header:
                          Code:
                          //----------------------------------------------------------------------------
                          //Ham lay gia tri mot truong trong HTTP Header,
                          // tra lai con tro vi tri bat dau value cua truong nay
                          unsigned char * httpHeaderGetField(const prog_char fieldname[],struct httpRequest *rqst)
                          {
                          	unsigned char *header;
                          	unsigned int i,j,headerLen;
                          	header = rqst->header;
                          	headerLen = (rqst->header) - (rqst->body) - 4;
                          	i=0;
                          	j=0;
                          	while(i<headerLen){
                          		if(header[i++] != pgm_read_byte(fieldname + j++)){
                          			j = 0;
                          		}
                          		if(pgm_read_byte(fieldname + j) == 0){
                          			return(header+i+2);
                          		}
                          	}
                          	return(0);
                          }
                          Last edited by nttam79; 23-11-2011, 12:20.

                          Comment


                          • Tiếp theo, ta viết 2 hàm chính của giao thức HTTP: hàm gửi một bản tin HTTP đi và hàm xử lý 1 request nhận được:

                            Đầu tiên, ta cần 2 hàm tìm kiếm chuỗi mà ta sẽ sử dụng trong 2 hàm chính trên:

                            - Hàm tìm 1 chuỗi lưu trong bộ nhớ chương trình (ROM) trong 1 chuỗi lưu trong RAM
                            Code:
                            //----------------------------------------------------------------------------
                            unsigned int findstr(const prog_char progstr[],unsigned char* str,unsigned int len)
                            {
                            	unsigned int i,j;
                            	i=0;
                            	j=0;
                            	while(i<len){
                            		if(str[i++] != pgm_read_byte(progstr + j++)){
                            			j = 0;
                            		}
                            		if(pgm_read_byte(progstr + j) == 0){
                            			return(i-j);
                            		}
                            	}
                            	return(-1);
                            }
                            - Hàm tìm 1 chuỗi lưu trong bộ nhớ RAM trong 1 chuỗi cũng lưu trong RAM
                            Code:
                            //----------------------------------------------------------------------------
                            unsigned int findstrdatamem(unsigned char* str1,unsigned char* str2,unsigned int len)
                            {
                            	unsigned int i,j;
                            	i=0;
                            	j=0;
                            	while(i<len){
                            		if(str2[i++] != str1[j++]){
                            			j = 0;
                            		}
                            		if(str1[j] == 0){
                            			return(i-j);
                            		}
                            		if(str2[i] == 0){
                            			return(-1);
                            		}
                            	}
                            	return(-1);
                            }
                            Và đây là hàm gửi đi một bản tin HTTP:
                            Code:
                            //----------------------------------------------------------------------------
                            //Ham gui mot doan du lieu chua trong bo nho chuong trinh ra theo giao thuc HTTP
                            void	HTTPSend(const prog_char progdata[],unsigned int dataLen,struct tcpSession *pSession, unsigned char endData)
                            {
                            	unsigned int i;
                            	unsigned int srcDataIdx = 0;
                            	unsigned char* dataBuffer;
                            	unsigned char Flags;
                            	unsigned char tmpChr;
                            
                            	Flags = TCP_PSH_FLAG;
                            	dataBuffer = ethGetBuffer() + ETH_HEADER_LEN + IP_HEADER_LEN + TCP_HEADER_LEN;
                            	if(dataLen == 0){
                            		Flags |= TCP_ACK_FLAG;
                            		if(endData){
                            			if(srcDataIdx == dataLen){
                            				Flags |= TCP_FIN_FLAG;
                            				pSession->sesState = TCP_STATE_FIN_WAIT1;
                            			}
                            		}
                            		TCPPackedSend(pSession,Flags,0,dataBuffer);
                            	}
                            	while(srcDataIdx < dataLen){
                            		i = 0;
                            		while(i<MAX_SEGMENT_SIZE){
                            			tmpChr = pgm_read_byte(progdata + srcDataIdx++);
                            			dataBuffer[i++] = tmpChr;	//Copy data to tcp data buffer
                            			if(srcDataIdx==dataLen){
                            				break;
                            			}
                            		}
                            		Flags |= TCP_ACK_FLAG;
                            		if(endData){
                            			if(srcDataIdx == dataLen){
                            				Flags |= TCP_FIN_FLAG;
                            				pSession->sesState = TCP_STATE_FIN_WAIT1;
                            			}
                            		}
                            		TCPPackedSend(pSession,Flags,i,dataBuffer);
                            		//delay_ms(100);
                            		#ifdef NETSTACK_DEBUG
                            		printf("Sent %d byte\r\n",srcDataIdx);
                            		#endif
                            	}
                            }
                            Hàm xử lý 1 request nhận được:
                            Code:
                            //----------------------------------------------------------------------------
                            //Ham xu ly mot goi thuoc giao thuc HTP nhan duoc
                            void httpDataIn(unsigned char *buffer,unsigned int bufferLen,struct tcpSession *pSession)
                            {
                            	unsigned char i;
                            	unsigned char *tmpstr;
                            	prog_char Auth_str[]="Authorization";
                            	//Tim xem cophien HTTP service da co cho phien TCP nay khong
                            	for(i=0; i < MAX_HTTP_SESSION; i++){
                            		if((httpSessionTable[i].status != HTTP_STATUS_IDLE) && (httpSessionTable[i].pTCPSession == pSession))
                            			break;
                            	}
                            	if(i == MAX_HTTP_SESSION){
                            		//Tim 1 phien trong
                            		for(i=0; i < MAX_HTTP_SESSION; i++){
                            			if(httpSessionTable[i].status == HTTP_STATUS_IDLE){
                            				httpSessionTable[i].pTCPSession = pSession;
                            				break;
                            			}
                            		}
                            	}
                            	if(httpSessionTable[i].status == HTTP_STATUS_IDLE){
                            	//Neu day la 1 HTTP request moi
                            		//Kiem tra method cua request
                            		httpGetRequest(buffer,bufferLen,&(httpSessionTable[i].rqst));
                            		if(httpSessionTable[i].rqst.method == HTTP_REQUEST_UNKNOWN){
                            		//Neu request khong biet, thoat tro ve trang thai idle
                            			httpSessionTable[i].status = HTTP_STATUS_IDLE;
                            			return;
                            		}else{
                            		//Set trang thai cua HTTP session thanh HEADER_RECEIVED (da nhan header)
                            			httpSessionTable[i].status = HTTP_STATUS_HEADER_RECEIVED;
                            		}
                            	}
                            	//Neu da nhan header
                            	if(httpSessionTable[i].status == HTTP_STATUS_HEADER_RECEIVED){
                            		//Kiem tra xem da xac thuc hay chua
                            		if(httpSessionTable[i].auth != 1){
                            			tmpstr = httpHeaderGetField(Auth_str,&(httpSessionTable[i].rqst));
                            			if(findstrdatamem(http_auth_password,tmpstr,httpSessionTable[i].rqst.body-tmpstr) != -1){
                            				#ifdef HTTP_DEBUG
                            				printf("Auth OK\n\r");
                            				printfStr(http_auth_password);
                            				printf("Input\n\r");
                            				printfStr(tmpstr);
                            				#endif
                            				httpSessionTable[i].auth = 1;
                            			//Neu xac thuc khong hop le
                            			}else{
                            				#ifdef HTTP_DEBUG
                            				printf("Auth fail\n\r");
                            				printf("Auth string:");
                            				printfStr(http_auth_password);
                            				printf("\n\r");
                            				printf("Received string:");
                            				printfStrLen(tmpstr,0,20);
                            				#endif
                            				HTTPSend(http_pageheader_unauth,sizeof(http_pageheader_unauth)-1,pSession,0);
                            				HTTPSend(http_pageheader_auth_error,sizeof(http_pageheader_auth_error)-1,pSession,1);
                            				httpSessionTable[i].status = HTTP_STATUS_IDLE;
                            				return;
                            			}
                            		}
                            		//Process for each method
                            		//If GET method
                            		if(httpSessionTable[i].rqst.method == HTTP_REQUEST_GET){
                            			#ifdef HTTP_DEBUG
                            			printf("GET HEADER:\n\r");
                            			printfStrLen(httpSessionTable[i].rqst.header,0
                            					,(httpSessionTable[i].rqst.body - httpSessionTable[i].rqst.header) + httpSessionTable[i].rqst.bodyLen);
                            			#endif
                            			//If GET the main website
                            			if((httpSessionTable[i].rqst.requestURI[0] == '/') && (httpSessionTable[i].rqst.requestURI[1] == ' ')){
                            				HTTPSend(http_pageheader_ok,sizeof(http_pageheader_ok)-1,pSession,0);
                            				HTTPSend(Page1,sizeof(Page1)-1,pSession,1);
                            				httpSessionTable[i].status = HTTP_STATUS_IDLE;
                            			//If error
                            			}else{
                            				HTTPSend(http_error_notimp,sizeof(http_error_notimp),pSession,1);
                            				httpSessionTable[i].status = HTTP_STATUS_IDLE;
                            			}
                            			return;
                            		//If POST method
                            		}else if(httpSessionTable[i].rqst.method == HTTP_REQUEST_POST){
                            			//Update POST data
                            			if(findstr(PSTR("SUB=Submit"),buffer,bufferLen) != -1){
                            				//Send HTTP data
                            				HTTPSend(http_pageheader_ok,sizeof(http_pageheader_ok)-1,pSession,0);
                            				HTTPSend(Page1,sizeof(Page1)-1,pSession,1);
                            				httpSessionTable[i].status = HTTP_STATUS_IDLE;
                            				return;
                            			}else if(findstr(PSTR("APPLY=Apply"),buffer,bufferLen) != -1){
                            				HTTPSend(http_pageheader_ok,sizeof(http_pageheader_ok)-1,pSession,0);
                            				HTTPSend(Page1,sizeof(Page1)-1,pSession,1);
                            				httpSessionTable[i].status = HTTP_STATUS_IDLE;
                            			}else{
                            				HTTPSend("",0,pSession,0);
                            			}
                            		}
                            	}
                            }
                            Trong các hàm trên ta có gọi hàm của giao thức TCP nên các bạn include file "tcp.h" vào đầu file nhé:
                            Code:
                            #include "tcp.h"
                            Và nhớ thêm khai báo các hàm đã viết vào file header "http.h"

                            Để có thể biên dịch và khởi động webserver, ta cần sửa 1 ít trong chương trình chính.

                            Mở file "ntAVRnet.h", thêm vào các include 2 file "tcp.h" và "http.h":
                            Code:
                            #include "tcp.h"
                            #include "http.h"
                            Thêm vào hàm netInit lệnh khởi động giao thức TCP và HTTP:
                            Code:
                            TCPInit();
                            httpInit();
                            Thêm vào hàm main lệnh khởi động phiên TCP port 80 ở trạng thái listen cho dịch vụ HTTP (trước vòng lặp while(1)):
                            Code:
                            TCPCreateSession(80,httpDataIn);
                            Bây giờ các bạn có thể biên dịch và chạy thử, có thể truy cập web nhưng chưa có chức năng giám sát và điều khiển từ xa qua webserver, đợi bài tiếp theo nhé .
                            Last edited by nttam79; 23-11-2011, 13:32.

                            Comment


                            • Thầy cho em hỏi câu này với:
                              Hàm này trong file udp.c: void udpSend(unsigned long dstIp, unsigned int dstPort, unsigned int len, unsigned char* udpData)
                              Còn câu lệnh gọi hàm này trong file dhcp.c:udpSend(DhcpServerIP, DHCP_UDP_SERVER_PORT, DHCP_UDP_CLIENT_PORT, DHCP_HEADER_LEN+3+6+6+1, (unsigned char*)packet);
                              agrument (số biến gọi hàm không như nhau)của câu lệnh gọi hàm ko đúng, e ko bit sửa thế nào? Mong thầy giúp!

                              Comment


                              • Nguyên văn bởi dinh_dong Xem bài viết
                                Thầy cho em hỏi câu này với:
                                Hàm này trong file udp.c: void udpSend(unsigned long dstIp, unsigned int dstPort, unsigned int len, unsigned char* udpData)
                                Còn câu lệnh gọi hàm này trong file dhcp.c:udpSend(DhcpServerIP, DHCP_UDP_SERVER_PORT, DHCP_UDP_CLIENT_PORT, DHCP_HEADER_LEN+3+6+6+1, (unsigned char*)packet);
                                agrument (số biến gọi hàm không như nhau)của câu lệnh gọi hàm ko đúng, e ko bit sửa thế nào? Mong thầy giúp!
                                cái này, thầy Tâm nói rõ là sửa lại rùi mà. bạn tìm kỹ lại xem, cụ thể như sau:
                                void udpSend(unsigned long dstIp, unsigned int dstPort, unsigned int srcPort, unsigned int len, unsigned char* udpData)
                                {
                                struct ntUDPHeader* udpHeader;
                                udpHeader = (struct ntUDPHeader*)(udpData - UDP_HEADER_LEN);
                                len += UDP_HEADER_LEN;
                                udpHeader->desPort = HTONS(dstPort);
                                udpHeader->srcPort = HTONS(srcPort);
                                udpHeader->Len = HTONS(len);
                                udpHeader->Checksum = 0;
                                ipSend(dstIp, IP_PROTO_UDP, len, (unsigned char*)udpHeader);
                                }
                                Last edited by hieppro89; 24-11-2011, 00:15.

                                Comment

                                Về tác giả

                                Collapse

                                nttam79 Tìm hiểu thêm về nttam79

                                Bài viết mới nhất

                                Collapse

                                Đang tải...
                                X