[ENC28J60] Bài 8: Giao thức ARP ( phần 3)

arp

Tiếp tục chuỗi bài về giao thức arp, hôm nay chúng ta sẽ hoàn thành nốt chương trình gửi request, nhận reponse và tạo table để lưu các địa chỉ MAC của thiết bị trong mạng

Nếu chưa đọc bài trước các bạn có thể theo dõi tại đây

Hàm ARP request tương tự như reponse thôi, có opcode là khác. Gọi nó liên tục trong while(1) của hàm main để test thử xem đã gửi được đi chưa nhé !

gói tin arp request

Tuyệt vời, gói tin đã được gửi đi và wireshark đã bắt được các bản tin arp request

Bây giờ chúng ta sẽ tiếp tục viết mã đọc gói tin request trong hàm ARP_read_packet

  1. Kiểm tra opcode, nếu đúng bằng 0x0002 thì đây là bản tin request
  2. Kiểm tra target ip xem bản này có đúng là gửi cho mình không
  3. Lấy MAC và ip của thiết bị đã gửi reponse và lưu lại vào bảng lưu trữ

Mình sẽ khởi tạo 1 table để lưu trữ ip và mac. Do bộ nhớ chip có hạn nên mình sẽ tạo bảng lưu với tối đa 5 địa chỉ MAC !

Viết thêm 1 số hàm để truy xuất bảng

Trong hàm ARP_read_packet

Do cả ARP request hay ARP reponse đều cần kiểm tra IP đích xem có phải là của mình không nên mình sẽ bỏ nó lên đầu hàm luôn

Bây giờ mình sẽ cho gửi các bản tin ARP_request đến cho máy tính để xem đã nhận được gói tin phản hồi và lưu vào bảng chưa nhé ( các bạn vào cmd -> gõ ipconfig để lấy ip của máy tính, như máy tính mình là 192.168.1.15)

arp

Mình đã nhận thành công MAC của máy tính có IP 192.168.1.15

arp

Phần mềm WireShark cũng đã bắt được toàn bộ gói tin gửi nhận

Nhận các gói tin bằng ngắt

ENC28J60 hỗ trợ chân ngắt để báo có gói tin mới, khi có 1 gói tin mới chân ngắt sẽ kéo xuống mức 0,mình sẽ tận dụng điều này để nhận gói ttin cho thuận tiện thay vì hỏi vòng ở trong while(1), mình sẽ nối chân ngắt này với ngắt ngoài 1 của vi điều khiển ATmega328

giao tiếp với enc28j60

Các bạn viết thêm hàm khởi tạo ngắt ngoài 1 trong file main

Nhớ gọi nó trong hàm main để khởi tạo ngắt nhé

Chúng ta sẽ gọi hàm NET_loop trong ngắt

Mọi thứ vẫn hoạt động trơn tru

Tới lúc này các bạn có thể xóa các dòng UART_putString ở các file arp.c net.c enc28j60.c đi để tránh in debug nhiều rối mắt !

Vấn đề về thời gian tồn tại các bảng lưu trữ arp

Trong mạng LAN, IP của các thiết bị không cố định mà thường hay thay đổi, do đó, mình sẽ xóa các bảng lưu thường xuyên để tránh các ip lỗi thời. Thời gian này có thể từ 1 phút đến vài phút hoặc vài giờ. Mình sẽ sử dụng timer1 để tạo ra 1 bộ hẹn giờ xóa bảng lưu trong vòng 10 phút

Trước tiên mình tạo thêm hàm phục vụ clear bảng ở trong thư viện arp

Thêm định nghĩa thời gian xóa vào file .h

Trong file main, mình tạo file khởi tạo time1

Và gọi hàm xóa bảng trong ngắt

Kết luận

Như vậy chúng ta đã hoàn thành chương trình gửi nhận các gói tin ARP, ARP là giao đầu tiên chúng ta cần phải hoàn thành vì có nó chúng ta mới sử dụng tiếp các giao thức trong bộ giao thức IP được

Các bạn tải source cho bài này tại đây

Trong phần tiếp của chuỗi tutorila tự học lập trình enc28j60, chúng ta sẽ làm quen với giao thức ICMP và học cách trả lời lệnh ping

 

Từ tác giả:

Nếu có bất kì thắc mắc nào trong bài viết, vui lòng để lại comment dưới mỗi bài ! Mình sẽ không trả lời thắc mắc của các bạn ở facebook hay email !

Nếu trong phần code bạn nhìn thấy nhưng thứ kiểu như &amp; thì đó là lỗi hiển thị, cụ thể 3 kí tự < > & bị biến đổi thành như thế
&amp; là &
&lt;  là <
&gt; là >

Giới thiệu Đào Nguyện 80 bài viết
DIY,chế cháo, viết blog chia sẽ kiến thức về lập trình,điện tử - IoT. Rất mong được giao lưu, kết bạn với các bạn cùng đam mê. Địa chỉ Facebook: https://www.facebook.com/nguyendao207