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 và gateway_mac và thư viện tcp
1 2 |
extern uint8_t gateway_ip[4]; extern uint8_t gateway_mac[6]; |
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):
1 2 3 4 |
else { memcpy(tcp_client1.mac_defaul,gateway_mac,6); } |
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 đó)
1 |
uint8_t ip_server[4]={103,82,32,32}; |
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
1 2 |
HTTP_request(ip_server,80,(uint8_t *)"GET / HTTP/1.1\r\nHost: enc28j60.iot47.com\r\n\r\n",44,3000); HAL_Delay(3000); |
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é
1 |
uint8_t ip_server[4]={184,106,153,149}; |
Đượ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
1 2 3 |
sprintf((char *)thingspeak_data,"GET http://api.thingspeak.com/update?api_key=0JH8D4CLZMDXZ6MM&field2=%i\r\n\r\n",rand()%99); HTTP_request(ip_server,80,thingspeak_data,strlen((char *)thingspeak_data),3000); HAL_Delay(5000); |
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
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
b nối với router thì gói tin đầu còn đi qua máy tính nữa mà wireshark bắt được