Làm sao để tạo ra được webserver?

Chào mọi người,

Mình hiện tại đang lập trình cho 1 con chip wifi (esp8266), mình thắc mắc rằng làm sao để khi có 1 thiết bị A trong cùng mạng, truy cập vào địa chỉ IP của thiết bị B, thì nó sẽ được B trả về 1 trang web?

Quá trình mà thằng B, nó biết có thằng truy cập tới IP của nó, và trả về 1 đoạn HTML như vậy, cần làm những step nào, có liên quan tới socket, tcp/ip hay http như thế nào? (nếu các ngôn ngữ bậc cao đều có các hàm echo rất dễ sử dụng để trả về 1 webpage, thì bản chất đằng sau nó chạy những gì?)

Mong mọi người giúp đỡ với ạ. Mình xin cảm ơn!

1 Like

Tạm bỏ qua các vấn đề routing, gateway, multithread, hay multi task.

  1. Sơ đồ kết nối gồm
  • Máy tính <—> Cục wifi <—> ESP8266
  1. Với 1 phần cứng đơn giản như ESP8266 thì quá trình như sau:
  • Khi thiết bị gửi request bằng giao thức http tới 1ip, cục wifi sẽ có nhiệm vụ điều hướng tới thiết bị có ip tương ứng.
  • ESP8266 liên tục kiểm tra xem có dữ liệu gửi qua cổng LAN tới không bằng cách check vùng nhớ đệm (thanh ghi vùng nhớ đệm) của module mạng. (giống như bộ nhớ đệm trong serial)
  • Nếu có giá trị trong bộ nhớ đệm, chờ tới khi gói tin kết thúc. (Mình sẽ giải thích phương thức đóng gói tập tin http sau)
  • Khi gói tin kết thúc ESP8266 sẽ phân tích cấu trúc của gói tin và trả về tương ứng.
  • Việc trả về html thưc chất là trả về 1 đoạn text. (giống với Serial.print) nhưng thông qua cổng Ethernet.
  • html trả về được gửi lại cục wifi và cục wifi có nhiệm vụ trả về cho cái máy tính hiện thị trang web
  1. Vấn đề đóng gói.
    Giả sử máy tính bạn truy cập địa chỉ http://192.168.1.12
  • Browser có nhiệm vụ đóng gói thành gói tin http. Thực chất cũng là 1 đoạn text:
GET /led1 HTTP/1.1
Host: 192.168.1.12

Cấu trúc http bạn có thể tham khảo. HTTP overview

  • Đoạn text này sẽ được thêm các thông tin để đóng gói và gửi đi. (Nếu dài có thể bị cắt ra thêm các mã nhị phân mở đầu, kết thúc, và vị trí trong gói tin) gọi là Mô hình OSI
  • Cục wifi đọc gói tin biết cần gửi tới 192.168.1.12
  • ESP 8266 nhận gói tin và dựa vào việc đóng gói để biết gói tin đã kết thúc chưa sau đó giải mả thông tin. Trong gói tin trên ESP8266 biết dc sẽ xử lý method GET cho route /led1
if (request.route == "/led1" && method=="GET") {
     renderHtml(statusHtml, led1);
}
  1. Vấn đề renderHtml của ESP 8266.
    Gói tin trả về cũng được mã hoá dưới giao thức http
HTTP/1.1 200 OK
Content-Type: text/html
<html>
<body>LED1: ON</body>
</html>

ESP8266 print đoạn text kia thông qua module wifi của nó. (Giống print thông qua modul serial).

  wifiClient.println("HTTP/1.1 200 OK"); //
  wifiClient.println("Content-Type: text/html");
  wifiClient.println("<html>");
  wifiClient.println("<body>LED1: ON</body>");
  wifiClient.println("</html>");
  1. Các vấn đề khác
  • Về tcp/ip đó là cách đóng gói tin trong mô hình OSI mà mình đã nói ở phần 3. Nó cho phép biết gói tin chia như thế nào, phần nào mở đầu phần nào kết thúc, gói tin ở vị trí thứ mấy trong toàn bộ gói tin …, Cái này thuộc tầng vật lý, được cá module esp phần cứng xử lý.

  • http còn nhiều dạng content-Type khác

7 Likes

Tải vscode.
Cài extension : Platformio.
Trong platformio cài package ESP8266.
Sau đó mở example webserver và xem code.
Cũng tương đối phức tạp.

3 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?