Vi điều khiển ATmega32 là bộ xử lí trung tâm cho hệ thống. Vi điều khiển xử lí và nhận các tín hiệu từ các IO được truyền từ web server :
Hình III. 1: Mô hình tổng quan hệ thống.
I.1 Nguồn
Chúng ta sử dụng trực tiếp nguồn điện AC 220V để chuyển đổi qua nguồn DC 9V. Nguồn DC 9V cung cấp cho mạch sẽ được hạ áp thành 2 nguồn điện:
• Nguồn DC 5V : sử dụng để nuôi chíp vi điều khiển Atmega32, điều khiển tín hiệu vào ra của các thiết bị điện gia dụng.
• Nguồn DC 3.3V: sử dụng để nuôi chíp ethenet ENC28j60.
I.2 Giao tiếp cổng COM
Có 3 chức năng của cổng Com trong mạch:
• Xác định địa chỉ động của mạch.
• Xác định kết nối dữ liệu giữa PC và mạch.
• Sử dụng để tích hợp thêm Camera.
Chip ENC28J60 có chức năng như card mạng cho vi điều khiển ATmega32 kết nối với internet. Giao tiếp với avr32 qua giao tiếp SPI.
I.4 Giao tiếp giữa các thiết bị với vi điều khiển
Các thiết bị được điều khiển qua các cổng IO của IC Atmega32:
• Hệ thống đèn được điều khiển từ cổng PA2.
• Hệ thống quạt, hoạt thiết bị khác được điều khiển từ cổng PA3.
• Hệ thống thời gian tự động được điều khiển từ cổng PA4.
• Hệ thống chống trộm được điều khiển từ cổng PA4.
II. Sơ đồ mạch nguyên lý
II.1 Mạch nguồn
II.1.1 Nguồn 5V
Hình III. 3. Nguồn 5V
- D1N4007: diot chỉ cho dòng điện chạy đúng chiều từ dương sang âm, có tác dụng chống ngược dòng.
- C16,C17,C18,C19: các tụ điện có tác dụng như ổn áp ổn định nguồn điện và chống nhiễu.
- IC 7805: sử dụng để hạ áp từ DC 9V xuống DC 5V dùng để cung cấp cho vi điều khiển.
II.1.2 Nguồn 3V
Hình III. 4. Nguồn 3V
- IC AMS1117: sử dụng để hạ áp xuống 3.3V dùng để cung cấp cho chip ethenet ENC28J60.
- C20,C21: các tụ điện có tác dụng như ổn áp ổn định nguồn điện và chống nhiễu.
II.3 Mạch Ethenet
Hình III. 5. Mạch IC ENC28J60
- Vi điều khiển ENC28J60 được điều khiển thông qua giao tiếp SPI với AVR32 qua chân INT
- Thạch anh 25MHz : Dùng tạo xung clock cho IC. - Nguồn 3.3 V : dùng để nuôi IC ENC28J60.
II.4 Mạch cổng Serial port
- PC kết nối mạch qua cổng Com MAX232.
- Cổng Com kết nối với vi điều khiển qua cổng TXD,RXD.
II.5 Mạch cổng RJ45
Hình III. 7. Mạch cổng RJ45
- RJ45: Cổng kết nối mạng cho mạch,có hỗ trợ ổn áp và đèn tín hiệu.
- Cổng kết nối với vi điều khiển qua cổng TPOUT+, TPOUT+, TPIN+, TPIN-.
II.6 Mạch ISP
- Mạch ISP sử dụng để kết nối với mạch nạp, nạp chương trình vào vi điều khiển.
- Chân MOSI, RES, SCK, MISO vừa được nối trực tiếp với vi điều khiển, chip ethenet, vừa được nối với các chân mạch nạp chíp.
CHƯƠNG IV: CẤU TRÚC CHƯƠNG TRÌNH HỆ THỐNG
I. Các module chính
I.1. Các module gao thức Tcp/Ip trong ENC28j60
Hình IV. 1. Lưu đồ dữ liệu vào ra
I.2. Module giao thức Ethernet I.2.1. Cấu trúc 1 frame Ethernet
HÌnh IV. 2. Cấu trúc Frame Enthernet
Một frame ethernet bắt đầu bắng các byte Preamble để dồng bộ và 1 byte Start of Frame để xác định đầu frame.Phần này sẽ được ENC28J60 tự động lược bỏ. Tiếp theo là địa chỉ MAC của host nhận (destination address), địa chỉ MAC của host gửi (source address), mỗi địa chỉ MAC này gồm 6 byte. Kế đến là 2 byte length (cho biết chiều dài) hoặc type (cho biết dữ liệu chứa trong frame là loại dữ liệu của giao thức
lớp trên nào). Kế đến là dữ liệu. Cuối cùng là phần kiểm tra lỗi (FCS), phần này cũng được ENC28J60 tự xử lý.
Như vậy ta cần khai báo cấu trúc của header frame ethernet (từ phần địa chỉ đến 2 byte type) trong file “packet.h”.
I.2.2. Hàm xử lý giao thức ethernet
Hình IV. 3. các hàm xử lý trong giao thức ethenet
- Trong chồng giao thức TCP/IP, giao thức ethernet đóng vai trò lớp truy nhập và truyền dẫn. Việc gửi và nhận dữ liệu ở lớp ethernet được thực hiện dựa vào địa chỉ vật lý hay còn gọi là địa chỉ MAC.
- Trong mỗi frame ethernet đều chứa 2 địa chỉ MAC: một địa chỉ của host gửi và 1 địa chỉ của host nhận.
- khi lớp ethernet nhận được 1 frame dữ liệu, trước hết nó sẽ kiểm tra địa chỉ host nhận xem có phải là địa chỉ của nó không (tức là gửi cho nó), nếu đúng nó sẽ nhận frame này và chuyển đến lớp IP. Ngoài ra còn có 1 trường hợp nữa lớp ehternet sẽ nhận frame: đó là nếu địa chỉ host nhận là địa chỉ broadcast (tức là gửi cho tất cả mọi máy trong mạng LAN), trong trường hợp này frame sẽ được nhận và xử lý.
- Ngoài việc kiểm tra địa chỉ, trong frame ethernet còn có 1 trường chứa mã kiểm tra lỗi giúp phát hiện những lỗi xảy ra trong quá trình truyền, các frame bị xác định là có lỗi sẽ bị bỏ qua.
- Trong mạch của chúng ta, việc kiểm tra lỗi và kiểm tra địa được thực hiện tự động bởi IC ENC28J60, do đó ta không cần lập trình cho các chức năng này. Mỗi khi nhận được 1 frame trên đường truyền, ENC28J60 sẽ kiểm tra lỗi xem có sai sót không, tiếp đó nó sẽ đối chiếu địa chỉ host nhận với địa chỉ đã được cấu hình cho nó (trong các thanh ghi địa chỉ MAC: MAADR0-5). Nếu không có lỗi và địa chỉ là gửi cho nó, nó sẽ tạo 1 ngắt cứng (trên chân INT của ENC28J60) để báo cho VĐK biết là nó vừa nhận được 1 frame hợp lệ và yêu cầu VĐK xử lý frame này.
- Vậy công việc của chúng ta là viết hàm xử lý cho trường hợp này, cũng như cung cấp 1 hàm gửi đi 1 frame dữ liệu (để sử dụng khi muốn gửi dữ liệu đi). Bên cạnh đó ta cũng cần một số hàm cung cấp các chức năng bổ sung như set/get địa chỉ MAC,…
I.3. Module giao thức IP
I.3.1. Cấu trúc của gói IP như sau
Hình IV. 4. Cấu trúc gói IP
- Ý nghĩa các field trong header IP:
+ Version (có chiều dài 4 bit): cho biết phiên bản của giao thức, đối với trường hợp của chúng ta, giao thức là IP version 4, trường này sẽ luôn có giá trị là 4 (0100). + Header Length (4 bit): cho biết chiều dài của header IP, tính theo đơn vị 4 byte (32 bit).
+ TOS (8 bit): Type of Service.
+ Total Length (16 bit): 16 bit tổng chiều dài của gói IP gồm cả phần header + Identification (16 bit): dùng nhận diện các phân đoạn của gói IP.
+ Flags: gồm 3 bit.
. Bit đầu tiên: không sử dụng.
. Bit 2: DF (Don’t Fragment) = 1 có nghĩa là không phân đoạn gói này . Bit 3: MF (More Fragment) = 0 => đây là phân đoạn cuối cùng.
+ Fragmented offset (13 bit): độ dời (đơn vị 8 byte) tính từ điểm bắt đầu của Header tới điểm bắt đầu của phân đoạn(3 trường trên: Identification, Flags, Fragmented offset dùng cho trường hợp đặc biệt khi ta cần chia đoạn dữ liệu ban đầu thành nhiều phân đoạn, đóng gói trong các gói tin nhỏ hơn, khi đó ta cần dùng các trường này cho mục đích ráp lại các phân đoạn để khôi phục lại đoạn dữ liệu ban đầu, trong project của chúng ta sẽ không có xử lý trường hợp này).
+ TTL (Time to Live) (8 bit): thời gian tồn tại trên mạng hoặc số chặng trên mạng mà gói đi qua trước khi bị hủy bỏ.
+ Protocol (8 bit): nhận diện Protocol trên lớp IP. + Header checksum (16 bit): sửa sai cho phần Header. + Các vùng địa chỉ nguồn, địa chỉ đích: địa chỉ IP 32 bit.
+ Option: các tùy chọn dùng cho việc kiểm tra: Loose source routing, Strict source routing, Record route và Timestamp.
+ Padding: Gồm các số zero được thêm vào sao cho chiều dài của vùng Header là bội số của 32 bit.
I.3.2.Hàm xử lý giao thức IP
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ư ở trên 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.
I.4. Module giao thức ICMP
- Đây là cấu trúc của bản tin ICMP:
Hình IV. 5 : Cấu trúc bản tin ICMP
- Hàm xử lý khi nhận được bản tin “Echo Request” (tức là có máy tính “ping” đến board mạch.
- hàm icmpEchoReply để gửi bản tin “Echo Reply” để trả lời cho bản tin “Echo Request”.
I.5. Module giao thức UDP
- Cấu trúc giao thức UDP :
I.6. Module giao thức TCP
Cấu trúc header :
Hình IV. 7. Cấu trúc header giao thức TCP
- Để có thể giám sát chặt chẽ trạng thái và mọi sự kiện xảy ra trong 1 kết nối TCP, trạng thái của một kết nối TCP được chuyển đổi tuân theo một lưu đồ trạng thái như sau :
Giải thích :
- Trong lưu đồ trên, áp dụng cho cả client và server. Cả client và server đều bắt đầu bằng trạng thái “Close”. Client sẽ thiết lập kết nối theo con đường Active Open (nó chủ động thiết lập kết nối). Server sẽ thiết lập kết nối theo con đường Passive Open (thụ động, vì nó đợi client bắt đầu mà).
Quá trình chuyển trạng thái: ta hãy xem xét kịch bản thông thường nhất. - Cả hai bắt đầu bằng trạng thái close, không có kết nối nào tồn tại.
- Khi Server mở một port TCP để đợi client thiết lập kết nối, nó chuyển sang trạng thái “Listen”.
- Khi client gửi đi bản tin SYN (bước số 1 trong ví dụ minh họa, giai đoạn thiết lập kết nối), nó chuyển sang trạng thái “SYN sent”.
- Lúc này khi server nhận được bản tin SYN từ client và gửi đáp lại 1 bản tin SYN (bước 2 trong VD), nó chuyển sang trạng thái “SYN Received”.
- Lúc này client gửi lại bản tin xác nhận ACK (bước 3 trong ví dụ), nó chuyển sang trạng thái thiết lập kết nối “Established”.
- Server nhận được bản tin ACK trên của client, nó cũng chuyển sang trạng thái “Established”.
- Sau đó 2 bên tiến hành truyền dữ liệu, trạng thái cả 2 phía đều là “Established”.
- Một trong hai phía truyền xong dữ liệu, đến đây thì vai trò hai bên là như nhau, ta giả sử client truyền xong dữ liệu trước, nó sẽ gửi bản tin FIN, và chuyển sang trạng thái “FIN wait 1”.
- Phía server nhận được bản tin này, gửi xác nhận ACK, và chuyển sang trạng thái “Close wait”.
- Khi client nhận được xác nhận từ server (nhận được bản tin ACK trên) thì nó chuyển sang trạng thái “FIN wait 2”.
- Đến lúc này server vẫn có thể tiếp tục gửi dữ liệu và client vẫn tiếp tục nhận (vì chỉ có client báo là gửi xong dữ liệu).
- Đến khi nào server cũng gửi hết dữ liệu, nó sẽ gửi đi bản tin FIN, cho biết nó cũng đã gửi xong dữ liệu và chuyển sang trạng thái “LAST ACK”.
- Khi client nhận được bản tin FIN trên từ server, nó gửi xác nhận (ACK) và chuyển sang trạng thái “Time wait”, sau đó chờ 1 khoảng thời gian Timeout và đóng kết nối, quay lại trạng thái “Close”.
- Khi server nhận được nó cũng chuyển từ “Last ACK” sang “Close” (không cần đợi Timeout).
I.7. Module giao thức DHCP
I.7.1.Giao thức DHCP
- DHCP là một giao thức được sử dụng để phân phối động các tham số cấu hình TCP/IP cho các máy tính. Một DHCP server có thể cho client DHCP một số thiết lập TCP/IP, như là địa chỉ IP, subnet mask, và máy chủ DNS.
- Mỗi client sẽ nhận một hợp đồng thuê địa chỉ trong thời gian hạn định. Nếu client không còn sử dụng địa chỉ khi hợp đồng thuê hết hạn, địa chỉ đó có thể cấp phát cho các client khác.
I.7.2.Cơ chế làm việc của DHCP
- DHCPDISCOVER: DHCP client khởi tạo tiến trình bằng cách quảng bá một gói tới cổng UDP 68 (sử dụng cho máy chủ BOOTP và DHCP). Gói đầu tiên này được gọi là bản tin DHCP Discover, nó sẽ yêu cầu bất cứ DHCP server nào nhận được gói thực hiện việc cấu hình. Gói DHCP discover gồm rất nhiều trường, nhưng một vùng quan trọng nhất chứa địa chỉ vật lý của DHCP client.
- DHCPOFFER: Một DHCP server được cấu hình cung cấp hợp đồng địa chỉ cho mạng mà client cư trú sẽ đáp ứng lại một gói tên là DHCP offer và gửi nó dưới dạng quảng bá tới máy đưa ra DHCP discover. Thông điệp quảng bá này được gửi tới cổng UDP 67 và bao gồm địa chỉ vật lý của client, địa chỉ vật lý và địa chỉ IP của DHCP server, cũng như giá trị địa chỉ IP và subnet mask cung cấp cho DHCP client. - DHCPREQUEST: Client chọn một DHCP offer, tạo một gói DHCP request và
quảng bá gói này. Gói DHCP request này bao gồm địa chỉ IP của server phát ra DHCP offer và địa chỉ vật lý của DHCP client. DHCP request này thực hiện hai việc :
+ Báo cho DHCP server được chọn rằng nó yêu cầu một địa chỉ IP.
+ Thông báo cho các DHCP server khác là DHCP offer của chúng không được