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

  • bài rất hay thanks bác nhiều

    Comment


    • Cảm ơn anh nttam79 rất nhiều! Anh ơi, từ PIC chuyển sang AVR có đơn giản không ạ? Tại e đang dùng quen trên AVR. Em làm một Project với con này, ứng dụng công nghệ wifi trong hệ thống đo lường đa điểm. Tức là em sẽ có hai mạch: 1 master và 2 Slaver.
      - 2 Mạch slaver sẽ đo nhiệt độ, độ ẩm và đặt ở các khu vực khác nhau.
      - Mạch master sẽ thu thập thông tin và hiển thị lên LCD hoặc máy tính qua UART. Còn chuẩn TCP/IP thì là phát triển sau này.
      Như vậy thì việc giao tiếp với MRF24WB0MA sẽ đơn giản hơn đúng không anh?
      Cảm ơn anh đã chia sẻ!

      Comment


      • Nguyên văn bởi nttam79 Xem bài viết
        Anh có dùng con này, nhưng với PIC chứ ko phải AVR. Anh có 1 mớ module này:

        Giống từ lớp giao thức IP trở lên, giao thức lớp truy cập mạng (Network Access Layer) thì khác, phức tạp hơn do phải xử lý nhiều vấn đề liên quan đến wifi như điều khiển công suất, mã hóa dữ liệu, ....

        Nó có hỗ trợ đầy đủ trong thư viện của Microchip, ở đây:
        Microchip Application Libraries
        Cảm ơn anh nttam79 rất nhiều! Anh ơi, từ PIC chuyển sang AVR có đơn giản không ạ? Tại e đang dùng quen trên AVR. Em làm một Project với con này, ứng dụng công nghệ wifi trong hệ thống đo lường đa điểm. Tức là em sẽ có hai mạch: 1 master và 2 Slaver.
        - 2 Mạch slaver sẽ đo nhiệt độ, độ ẩm và đặt ở các khu vực khác nhau.
        - Mạch master sẽ thu thập thông tin và hiển thị lên LCD hoặc máy tính qua UART. Còn chuẩn TCP/IP thì là phát triển sau này.
        Như vậy thì việc giao tiếp với MRF24WB0MA sẽ đơn giản hơn đúng không anh?
        Cảm ơn anh đã chia sẻ!

        Comment


        • Chào mọi người.

          Mình mới xem qua các bài viết của anh Tâm thấy rất rất hay. Mình đã mắc mạch theo nguyên lý của a.Tâm nhưng chỉ mới kết nối atmega 32 với enc28J60H thôi, mấy phần khác như LCD, LM35, cổng com để debug... thì mình chưa lắp vào vì mình chưa làm tới. Mạch mình kết nối trực tiếp với máy tính qua cáp mạng RJ45, không qua hub hay switch. Nhưng sao mình ping từ máy tính tới mạch thì có lúc được lúc không.
          Có lúc nó báo là: destination address unreachable.

          Mình không chuyên về IT nên mình đang cố gắng đọc đi đọc lại để hiểu bài viết của anh Tâm. Mong a.Tâm và mọi người hướng dẫn mình cách khắc phục.

          Thân chào.

          @dinh_dong: Mình đọc thấy bạn dinh_dong fusebit sai nên không nạp được chuẩn spi. Bạn đã nạp được lại con mega32 đó chưa? Nếu chưa được thì liên hệ với mình mình sẽ reset fusebit lại giúp cho.

          Comment


          • Nguyên văn bởi atmelavr Xem bài viết
            Cảm ơn anh nttam79 rất nhiều! Anh ơi, từ PIC chuyển sang AVR có đơn giản không ạ? Tại e đang dùng quen trên AVR. Em làm một Project với con này, ứng dụng công nghệ wifi trong hệ thống đo lường đa điểm. Tức là em sẽ có hai mạch: 1 master và 2 Slaver.
            - 2 Mạch slaver sẽ đo nhiệt độ, độ ẩm và đặt ở các khu vực khác nhau.
            - Mạch master sẽ thu thập thông tin và hiển thị lên LCD hoặc máy tính qua UART. Còn chuẩn TCP/IP thì là phát triển sau này.
            Như vậy thì việc giao tiếp với MRF24WB0MA sẽ đơn giản hơn đúng không anh?
            Cảm ơn anh đã chia sẻ!
            Anh không hiểu lắm ý định của em dùng module wifi này mà chưa phát triển TCP/IP là sao?
            Vì module này cũng giống như IC ENC28J60 đóng vai trò lớp truy cập mạng (Network Access Layer) trong chồng giao thức TCP/IP, không giống như Bluetooth hay Zigbee, vậy nếu em không dùng TCP/IP thì phải xây dựng 1 giao thức riêng để truyền data trên đó.
            Nếu mô hình 1 master nhiều slave thì master không dùng module wifi này được đâu mà phải dùng 1 Accesspoint wifi.
            Điều khiển module nay rất phức tạp, em có thể down thư viện này mở source viết cho Pic rồi viết lại để dùng cho AVR, nhưng anh khuyên là không nên làm vậy vì mất rất nhiều thời gian, trừ khi em kiếm được code ai đó cho sẵn.

            Comment


            • Nguyên văn bởi nttam79 Xem bài viết
              Bài 5: Lập trình cho giao thức IP (Internet Protocol) và giao thức ARP (Address Réolution Protocol)

              Trước hết, ta cần tìm hiểu về hoạt động của giao thức IP.
              (phần này viết một cách đơn giản và dễ hiểu nhất cho dân điện tử, không chuyên về network có thể hiểu phần nào hoạt động của các giao thức để có thể hiểu code và tự viết code, dân IT vào đọc đừng cười nhé)

              Cách thức mà dữ liệu được gửi qua giao thức IP được tiến hành như sau:
              - Khi nhận được 1 segment dữ liệu (từ giao thức lớp trên là TCP hay UDP) cần gửi đến đích nào đó, địa chỉ đích này phải được xác định bằng địa chỉ IP (tức là địa chỉ mạng hay địa chỉ luận lý). Lớp giao thức IP sẽ gắn thêm vào đầu segment dữ liệu một header IP để tạo thành gói IP hoàn chỉnh. Trong header IP này có chứa 2 thông tin quan trọng, đó là địa chỉ host gửi (source IP address) và địa chỉ host nhận (destination IP address). Địa chỉ source đương nhiên là địa chỉ của bản thân nó, còn địa chỉ đích phải được cung cấp cho lớp IP khi muốn gửi dữ liệu qua giao thức này.

              - Gói tin IP này sau đó được chuyển đến lớp giao thức ethernet để thêm phần header ethernet vào và gửi đi.

              - Nhưng như ở phần trước ta đã biết, giao thức ethernet lại gửi các frame dữ liệu đi dựa vào 1 loại địa chỉ khác là địa chỉ MAC (hay còn gọi là địa chỉ vật lý). Tại sao lại cần đến 2 địa chỉ như vậy? Lý do là địa chỉ vật lý chỉ có giá trị trong phạm vi mạng LAN, nó sẽ không thể giúp xác định vị trí host ở bên ngoài phạm vi mạng LAN. Khi gửi dữ liệu ra ngoài mạng LAN, các router sẽ chuyển dữ liệu đi dựa và địa chỉ IP.

              - Như vậy trong phần địa chỉ MAC nguồn và địa chỉ MAC đích trong header của frame ehternet, ta sẽ điền các địa chỉ nào? Đối với địa chỉ MAC nguồn, đương nhiên ta sẽ điền địa chỉ MAC của chính ENC28J60 đã được xác lập. Nhưng còn địa chỉ MAC đích, sẽ có 2 trường hợp xảy ra:
              + Nếu host đích nằm trong cùng 1 mạng LAN với chúng ta, ta sẽ điền địa chỉ MAC đích là địa chỉ tương ứng của host đích. Frame dữ liệu sẽ được gửi thẳng đến đích.
              + Nếu host đích nằm bên ngoài mạng LAN, rõ ràng ta không thể gửi dữ liệu trực tiếp đến host đích mà phải thông qua gateway, khi đó địa chỉ MAC đích phải là địa chỉ gateway. (Để dễ hiểu, cứ hình dung ta gắn mạch này tại nhà, sau modem ADSL cùng với 1 máy tính để bàn tại nhà, nếu mạch của chúng ta cần gửi dữ liệu đến máy tính cũng ở tại nhà, trong cùng mạng LAN, nó sẽ gửi trực tiếp theo địa chỉ MAC của máy tính đó. Nhưng nếu cần gửi dũ liệu đến 1 máy tính bên ngoài, nằm trên mạng Internet, khi đó nó không thể gửi frame dữ liệu thẳng đến máy tính kia mà nó phải gửi qua gateway, trong trường hợp này chính là modem ADSL. Như vậy lúc đó địa chỉ MAC đích phải là địa chỉ MAC của gateway).

              - Vẫn còn một vấn đề nữa mà ta phải giải quyết. Đó là trong cả hai trường hợp trên, dù là cần gửi cho gateway hay thẳng đến host đích, thì đến đây, ta mới chỉ biết địa chỉ IP của host đích (hay của gateway) mà không biết địa chỉ MAC tương ứng. Vậy nảy sinh một vấn đề là làm sao biết được địa chỉ MAC của một host khi biết địa chỉ IP?


              Đến đây, chính là phát sinh vai trò của giao thức phân giải địa chỉ (APR – Address Resolution Protocol). Vai trò của giao thức này là tìm ra địa chỉ MAC khi biết địa chỉ IP của 1 host.
              Hoạt động của giao thức ARP:

              - Cách thức làm việc của giao thức ARP thực ra khá đơn giản. Nhiệm vụ của nó là khi giao thức IP hỏi nó: “Host có địa chỉ IP là a.b.c.d thì địa chỉ MAC là bao nhiêu?” thì nó phải trả lời ngay: “Địa chỉ MAC của nó là XX:XX:XX:XX:XX:XX!”. Chức năng này trong project của chúng ta sẽ được cung cấp bởi hàm “arpIpOut” (xem lại lưu đồ dữ liệu vào ra). Tức là trước khi giao thức IP chuyển dữ liệu xuống cho giao thức ethernet, nó sẽ gọi hàm “arpIpOut” để phân giải địa chỉ MAC cho host đích.

              - Tuy nhiên chỉ chừng đó chưa đủ giải thích cho hoạt động của ARP. Câu hỏi tiếp theo sẽ là: Vậy ARP lấy thông tin ở đâu để trả lời cho câu hỏi trên?

              - Cách thức nó giải quyết vấn đề cũng đơn giản không kém: giao thức ARP duy trì một bảng gọi là ARP cache gồm 2 cột, một cột ghi địa chỉ IP, một cột ghi địa chỉ MAC tương ứng với địa chỉ IP đó. Mỗi khi được hỏi bởi giao thức IP, nó sẽ tra bảng này để tìm câu trả lời.

              - Vậy đến đây, các bạn phải nảy ra ngay 1 câu hỏi kế tiếp: vậy những gì chứa trong bảng ARP cache từ đâu mà có, khi mới khởi động hệ thống, bảng này đương nhiên sẽ trống trơn. Và chuyện gì sẽ xảy ra khi giao thức ARP được hỏi về 1 địa chỉ IP, mà khi nó tra trong bảng ARP thì không thấy?

              - Cách giải quyết của giao thức ARP như sau: khi được hỏi về một địa chỉ IP a.b.c.d nào đó mà không có sẵn trong bảng ARP cache, nó sẽ lập tức “la lớn” trong mạng LAN: “Ai là người có địa chỉ IP là a.b.c.d?” Các máy tính trong mạng LAN đều nghe được câu hỏi này, và lẽ dĩ nhiên chỉ có đúng máy tính có địa chỉ IP a.b.c.d sẽ trả lời: “Là tôi đây, tôi có địa chỉ MAC là XX:XX:XX:XX:XX:XX!”. Vậy giao thức ARP sẽ lập tức thêm cặp địa chỉ IP a.b.c.d và địa chỉ MAC XX:XX:XX:XX:XX:XX vào trong bảng ARP cache và trả lời lại cho giao thức IP: “Địa chỉ MAC của nó là XX:XX:XX:XX:XX:XX!”.

              - Nghe có vẻ buồn cười nhưng trong thực tế, trên máy tính của chúng ta, mọi việc diễn ra đúng như vậy, việc “la lớn” của ARP được thực hiện bằng cách nó gửi đi một gói tin có tên gọi là ARP request dưới dạng broadcast, tức là gửi đến mọi máy trong mạng LAN, địa chỉ MAC đích của gói broadcast sẽ là FF:FF:FF:FF:FF:FF. Trong gói ARP request có chứa địa chỉ IP mà nó cần tìm. Tất cả các máy tính trong mạng LAN sẽ nhận được gói tin này, và máy tính có địa chỉ IP trên sẽ trả lời bằng bản tin ARP reply, trong bản tin này sẽ có địa chỉ MAC của nó.

              - Đó là cách thứ nhất để giao thức ARP điền thông tin vào bảng ARP cache. Còn có 1 cách nữa khá đơn giản giúp nó điền đầy thông tin vào bảng ARP cache: đó là mỗi khi có 1 gói tin IP đến, lẽ dĩ nhiên là phía host đã gửi gói tin này đã điền đầy đủ thông tin địa chỉ MAC (chứa trong header ehternet) và địa chỉ IP của nó (chứa trong header IP). Như vậy giao thức ARP sẽ lấy cặp địa chỉ này và cập nhật vào bảng ARP cache.

              - Điều cuối cùng cần lưu ‎ý về bảng ARP cache này là các dòng (tức cặp địa chỉ IP – MAC) chứa trong nó không được duy trì mãi mãi mà có 1 thời gian timeout, quá thời gian này mà không có thông tin cập nhật cho cặp địa chỉ đó thì nó sẽ bị xóa khỏi ARP cache, và nếu lỡ giao thức IP cần gửi dữ liệu cho địa chỉ IP đã bị xóa thì ARP sẽ đi hỏi lại về địa chỉ IP đó.

              Note: để xem được bảng arp cache trên máy tính của mình, các bạn có thể mở cửa sổ command (vào Start->Run->gõ cmd, nhấn Enter), sau đó gõ lệnh "arp -a".
              Anh Tâm cho em hỏi một chút về hoạt động của ARP với ạ. Chẳng hạn mạch muốn gửi gói tin đến host ở ngoài Internet có IP là: 113.179.7.234
              Vậy khi Arp gửi Broadcast để hỏi thì nó có biết được host 113.179.7.234 có MAC là bao nhiêu để điền vào header IP ko ạ?

              Comment


              • Nguyên văn bởi nacdanh90 Xem bài viết
                Anh Tâm cho em hỏi một chút về hoạt động của ARP với ạ. Chẳng hạn mạch muốn gửi gói tin đến host ở ngoài Internet có IP là: 113.179.7.234
                Vậy khi Arp gửi Broadcast để hỏi thì nó có biết được host 113.179.7.234 có MAC là bao nhiêu để điền vào header IP ko ạ?
                Em hiểu rồi ạ! Thắc mắc của em đã có bạn hỏi rồi!

                Comment


                • Mọi người cho mình hỏi là web sever trên arm tức là chip arm có chức năng như 1 web server. Vậy mình viết web page bằng ngôn ngữ gì để deploy lên arm đó.
                  Hay là cứ viết bằng web bình thường asp.net,php bình thường rồi đưa vào arm như mình đưa lên 1 web server bình thường như IIS......

                  Comment


                  • Nguyên văn bởi thanhle_uit Xem bài viết
                    Mọi người cho mình hỏi là web sever trên arm tức là chip arm có chức năng như 1 web server. Vậy mình viết web page bằng ngôn ngữ gì để deploy lên arm đó.
                    Hay là cứ viết bằng web bình thường asp.net,php bình thường rồi đưa vào arm như mình đưa lên 1 web server bình thường như IIS......
                    Website chuẩn viết bằng code HTML, đây chính là code mà web sever gửi tới client PC. Code PHP hay ASP thực ra được phần mềm trên web sever thực thi rồi sinh ra code HTML trả lại cho client PC thôi.
                    Ví dụ code PHP là:
                    echo "<div>© Copyright Information. All Rights Reserved.</div>"
                    Thì phần mềm PHP server sẽ thực thi lệnh này (lệnh echo) và trả lại code HTML tương ứng.
                    Vậy nếu trên arm bạn có PHP server hay ASP server thì mới viết bằng PHP hay ASP được, ko thì phải viết HTML thôi.

                    Comment


                    • Anh nttam79 cho em hỏi trong phần cấu trúc gói tin Ip của anh post có trường Version(4bits).Em đang test bắt gói tin bằng WireShark nhưng giá trị trong version lại là : 46? Anh giải thích giúp em với ạ!

                      Comment


                      • Nguyên văn bởi nacdanh90 Xem bài viết
                        Anh nttam79 cho em hỏi trong phần cấu trúc gói tin Ip của anh post có trường Version(4bits).Em đang test bắt gói tin bằng WireShark nhưng giá trị trong version lại là : 46? Anh giải thích giúp em với ạ!
                        Trường version chỉ có 4 bit thôi, 4 bit tiếp theo là trường Header length, nên nếu em bắt được byte đầu của gói IP là 46 (mã hex) thì tương ứng với trường version là 4 (cho biết là IP version 4) và chiều dài của Header là 6x32bit (vậy là gói IP này có trường option)

                        Comment


                        • Vâng em cảm ơn anh nhiều ạ!

                          Comment


                          • Anh ơi.Các file anh đính kèm trên bài viết đã bị xóa.A có thể up lại link được không ạ?

                            Comment


                            • Em chào thày Tâm và các bạn. Em mới tìm hiểu về ethernet sử dụng avr theo hướng dẫn của thày Tâm. Em có 1 số điều không hiểu lắm xin Thày Tâm và các bạn giải thích giúp.
                              1. Trong file ethernet.h có đoan khai báo macro
                              #ifndef ETHERNET_BUFFER_SIZE
                              #define ETHERNET_BUFFER_SIZE (700+ETH_HEADER_LEN+IP_HEADER_LEN+TCP_HEADER_LEN)
                              #endif
                              số 700 đó có phải là do mình tự chọn không để phù hợp với dung lượng Ram của MCU.
                              2. Ở trong file icmp.c trong hàm icmpEchoReply. Nếu theo như sơ đồ về luồng dữ liệu vào ra các lớp và các hàm sử dụng thì hàm này sẽ cung cấp dữ liệu cho hàm ipsend rồi tới hàm ethSendFrame sẽ tiếp tục gửi dữ liệu. Nhưng trong code lại không có sự tham gia của các hàm theo trình tự như vậy.
                              .Xin mọi người giúp đỡClick image for larger version

Name:	hoitcp.JPG
Views:	1
Size:	66.1 KB
ID:	1358712

                              3. Trong file arp.c hàm arpUpdateEntry. Giải thuật áp dụng là tim entry có cùng ip, nếu tìm thấy thì update giá trị time to live. Nếu không tìm thấy entry cùng ip thì tìm entry có time to live =0 rồi tiến hành update. Khi không thỏa mãn các điều kiện trên thì...mặc kệ. Như vậy cảm giác không ổn lắm. Có cách nào vẫn lưu được entry cần update không ah.
                              Last edited by vuxuansyhut; 16-03-2012, 18:01.

                              Giải pháp điện tử của bạn

                              Comment


                              • Chào Thầy,

                                Module WIFI giao tiếp mạng MRF24WB0MA có thể mua ở đâu vậy? Em muốn mua một cái về nghiên cứu.
                                Driver cho module này có phức tạp không, mình có thể sài chung TCP/IP stack dùng cho con ENC28j60
                                Em thử vào microchip tìm mà không down được source code cho con wifi này. Thầy có thể gởi em source code hay driver để có thể sử dụng với webserver không?

                                Cám ơn thầy,
                                THANH NHI

                                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