[ENC28J60] Bài 18: Giao thức HTTP Client, khám phá internet và gửi data lên thingspeak

Chúng ta đã làm việc rất nhiều trong mạng LAN rồi, đã đến lúc đi ngoài và thăm thú thế giới internet đầy rẫy nguy hiểm ngoài kia

Trước tiên, hãy hoàn thiện lại giao thức TCP Client ở bài 17 đã nhé, vì muốn giao tiếp với bên ngoài, chúng ta phải thông qua gateway, nhờ vào dhcp, chúng ta đã lấy được IP và MAC của gateway, mình sẽ extern 2 biến gateway_ip gateway_mac và thư viện tcp

Trong hàm TCP_sendSYN, thay vì phát bản tin ARP lấy MAC của các thiết bị trong LAN, chúng ta sẽ dùng MAC của gateway, do vậy hay thêm rẽ nhánh vào lệnh if(IP_server[0] == 192 && IP_server[1] == 168):

Bây giờ qua lại main và sửa ip_server thành 103.82.32.32 nhé ( chính là IP của website này đó)

Kết nối thử nào

Toẹt vời, đây là lần đầu tiên chúng ta ra được internet

Mình đã tạo 1 trang web đơn giản có địa chỉ http://enc28j60.iot47.com/
Khi các bạn ấn vào sẽ thấy nội dung Xin chao, toi la IOT47.com

Bây giờ hãy cho ENC28J60 gửi 1 request GET tới trang web này nhé. Trong hercules UART mình sẽ gửi xuống

GET / HTTP/1.1$0D$0AHost: enc28j60.iot47.com$0D$0A$0D$0A

Ú òa ! Chúng ta đã tải được mã html của trang web http://enc28j60.iot47.com/ . Ngay sau khi gửi request xong, do không có thuộc tính keep alive nên server đã chủ động đóng kết nối ngay ! Các bạn hãy thử gửi request tương tự tới google, thingspeak để tải mã html trang web của họ xem nhé 😛

Hoàn thiện thư viện HTTP Client

Chúng ta sẽ hoàn thiện thư viện http.c

Tạo hàm HTTP_request

void HTTP_request(uint8_t *IP_server,uint16_t port,uint8_t *data,uint16_t length,uint32_t timeout) { TCP_Connect(IP_server,port,timeout,0); //ket noi TCP_sendData(data,length,3000); //gửi tin nhắn với timeout là 3s }

Các bạn có thể test hàm bằng cách liên tục gọi request lên server

Demo gửi dữ liệu lên thingspeak

Trong bài 2 của khóa ESP8266 mình đã demo gửi lên thingspeak với tập lệnh AT rồi, lần này cũng tương tự nhé

Thingspeak là 1 nên tảng cung cấp các hoạt động giám sát dữ liệu, mình sẽ demo gửi thử nhiệt độ lên

Các bạn vào https://thingspeak.com/ đăng kí tài khoản và đăng nhập
Trong mục, chanel, hãy thêm 1 feild dưới dạng chart ( biểu đồ)

Vào tab API_Key, người ta rất tâm lí tạo sẵn request mẫu cho mình rồi kia

OK, giờ gửi thử request lên xem nào, mình sẽ tạo 1 mảng uint8_t thingspeak_data[100]; để có thể add nhiệt độ vào qua hàm sprintf

Cũng đừng quên đổi địa chỉ ip_server sang server của thingspeak nhé

Được rồi, giờ gửi dữ liệu lên thôi, phần nhiệt độ mình sẽ dùng hàm rand() để tạo chứ cũng k có cảm biến thật ( include thư viện math.h để gọi hàm rand) và chia lấy dư cho 99 để giới hạn kết quả random trong phạm vi 0 đến 99

Trong while main mình sẽ cho gửi liên tục mỗi 5s 1 lần nhiệt độ

Và mình sẽ show live biểu đồ đó ở đây cho các bạn xem nhé 😛

Có vẻ cái anh thingspeak này mới thay đổi cơ chế, tầm 10 tới 20s mới nhận quest 1 lần thì phải. Nếu trả về 0 là quest đó server không chấp nhận vì gửi nhanh quá

Download

Các bạn có thể tải toàn bộ source cho bài này tại đây:
https://drive.google.com/file/d/1qlJ1PhpDJamWCp_xTqw0Mq44o67t06pq/view?usp=sharing

 

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

2 bình luận

  1. anh ơi cho em hỏi. em kết nối cáp với máy tình thì tất cả cac bài đều làm việc bình thường. nhưng sao em kết nối với rounter thì nó k bắt được cái gói tin nào gửi đi ạ. rounter cũng k thấy hiển thị ip của con ethernet

Đã đóng bình luận.