[ENC28J60] Bài 15: Giao thức DHCP – lấy IP động

dhcp
guao-thuc-dhcp

Trong các bài học trước, chúng ta đã quen với việc sử dụng ip tĩnh được gán sẵn trong chương trình. Tiếp tục bài này, chúng ta sẽ làm quen với giao thức DHCP . DHCP – Dynamic Host Configuration Protocol giúp cấp ip một cách tự động và lấy các thông tin cấu hình khác như gateway

Quá trình đạt được địa chỉ của giao thức dhcp gồm các bước sau:

  • Bước 1: Thiết bị phát tán 1 thông điệp DHCP Discover có chứa địa chỉ MAC, tên thiết bị …
  • Bước 2: Máy chủ nhận thông điệp và chuẩn bị địa chỉ IP cho thiết bị và phát tán bản tin offer lên mạng
  • Bước 3: Thiệt bị nhận thông điệp, lấy địa chỉ IP và gửi bản tin DHCP Request
  • Bước 4: Máy chủ nhận bản tin và trả lời lại bằng bản tin ACK

Cấu trúc gói tin

Gói tin Discovery

Gói tin Offer

Gói tin Request

Gói tin Acknowledgement

Các bạn tìm hiểu chi tiết hơn tại đây

Tải file chụp gói tin bằng wireshark tại đây

Dùng bộ lọc để lọc ra các gói tin dhcp nhé

Lập trình

Do phần mềm mô phỏng không hỗ trợ giao thức dhcp và các giao thức về sau nên bắt đầu từ bài này mình sẽ chuyển sang dùng module thật. Phần cứng mình cũng sẽ chuyển luôn qua kit stm32f103c8t6 vì mình đang có kit này :v

Chuẩn bị đồ nghề

  • Với stm32f103c8t6 thì mình sử dụng thử viện HAL, nên các bạn chuẩn bị HAL CUBEMX để sinh code nhé
  • Module USB-TTL để debug dữ liệu, phần mềm Hercules
  • Kit STM32, mạch nạp
  • Moudle ENC28J60
  • Modem mạng, dây nối …

Kết nối phần cứng

ENC28J60STM32F103C6
MOSIA7
MISOA6
SCKA5
CSB1
INTB0
GNDGND
5V5V
PL2303 (USB – TTL)STM32F103C8
RXA9
GNDGND

Nói chúng, mính sẽ dùng bộ SPI1 và USART1 để debug

Khởi tạo project với CUBEMX

Bật thạch anh ngoài
Cấu hình timer 2
Cấu hình USART1
Cấu hình SPI1
Cấu hình GPIO, ngắt
Kích hoạt ngắt timer và ngắt ngoài

Trong phần Clock Configuration, chọn thạch anh 8M, tốc độ 72Mhz

Sinh code tùy theo trình dịch của bạn, sau đó đó tải thư viện cho các bài trước mà mình đã “remake” lại cho phù hợp với thư viện HAL. Còn ở đây, mình sử dụng trình dịch KeilC

Các bạn tải thư viện tại đây

Hướng dẫn add thư viện vào KeilC

Các bạn sử dụng trình dịch khác thì tham khảo cách add thư viện trên google nhé

Sau khi sinh code và mở project, các bạn giải nén và copy thư mục thư viện tên là “IOT47_lib” vào thư mục Drivers

copt thư viện vào

Trong KeilC, click vào Option for Target

Chọn thẻ C/C++ -> Include Paths

Add dòng này vào dưới cùng

../Drivers/IOT47_lib/ENC28J60

Để dẽ quản lí, chúng ta sẽ đưa tất cả các file thư viện .c và trong cây Project và nhóm riêng vào trong group tên là ENC28J60 nhé

Các bạn ấn chuột phải vào project trong cây Project và chọn Add group, group New Folder được tạo ,click và đổi tên group thành tên gì các bạn muốn, ở đây mình sẽ đổi tên là ENC28J60

Click đúp vào group vừa tạo và tiến hành add tất cả các file .c vào cây quản lí project

Bây giờ add các thư viện cần thiết vào file main và biên dịch thử nhé

Thêm chương trình ngắt timer và ngắt ngoài

Và thêm hàm khởi tạo vào đầu chương trình (trong hàm main, trước while(1) )

Các bạn có thể test lại các giao thức xem thư viện hoạt động ok chưa nhé, bây giờ sẽ đi vào phần chính là viết thư viện dhcp ( trong file thư viện mình để đã có sẵn thư viện dhcp rồi đó)

Thư viện DCHP

File dhcp.h

File dhcp.c

Trong hàm main gọi hàm DHCP_get_ip với tham số timeout là 10000, tức 10 giây

Hàm DHCP_get_ip trả về 0 tức là timeout, 1 là OK và sẽ in ra màn hình Serial ip mà ENC28J60 được mode wifi phát

Chúng ta đã lấy được IP cá nhân, IP của Gateway và Mac của Gate, đây sẽ là các giá trị quan trọng được sử dụng cho các giao thức tiếp theo

Tải full project với cubemx và keilc tại đây

Xem toàn bộ các bài viết về ENC28J60
http://iot47.com/category/iot-tutorial/ethernetgiao-tiep-enc28j60/

Lưu ý: Thư viện dhcp chưa hoàn chỉnh, các bạn cũng phải thêm phần đọc thời gian sống của ip để yêu cầu gateway cấp phát lại ip, thông thường các ip sẽ có thời gian dùng khoảng 24 giờ

 

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