• Trang chủ
  • Giới thiệu
    • Cơ cấu tổ chức
    • Nhân sự
    • Tầm nhìn & sứ mệnh
    • Thành tựu
    • Hỗ trợ & bảo trì
    • Hình ảnh công ty
    • Thông báo
    • Cộng tác viên & SVTT
    • Nội quy công ty
    • Văn bản - biểu mẫu
    • Quy Trình
  • Hướng dẫn
    • Dịch vụ Email Hosting
      • Hướng dẫn sử dụng IceWarp Mail Server
      • Cài đặt tài khoản mail trên điện thoại
    • Hướng dẫn quản trị website
      • Joomla
        • Cách thay đổi hình banner dạng slide với ImageSlider trong Joomla
        • Cách quản lý menu trong joomla
        • Cách quản lý phương tiện (Hình ảnh) trong joomla
        • Cách quản lý component JU Download
        • Cách thêm/ sửa / xóa bài viết trong joomla
        • Cách quản lý thể loại bài viết joomla
        • Cách đăng sản phẩm bằng "JoomShopping" trong Joomla (Website có đặt hàng)
        • Cách đăng bài giới thiệu sản phẩm trong Joomla (Website không đặt hàng)
        • Cách tạo danh mục sản phẩm (menu bên trái)
        • Cách đổi ảnh và vị trí của danh mục sản phẩm (User ở giữa)
        • Cách quản lý logo dạng slide với DJ-ImageSlider trong Joomla
        • Cách thay đổi logo đối tác (Custom HTML) trong Joomla
        • Cách thay đổi video clips (Custom HTML)
        • Cách đăng video có hỗ trợ Shortcode
      • WordPress
  • Thanh toán
  • Tuyển dụng
    • Nhân sự
    • Cộng tác viên kỹ thuật
    • Cộng tác viên kinh doanh
    • Đại lý
  • Liên hệ
  • Chia sẻ
    • Website
    • Phần mềm
    • IoT
    • Khởi nghiệp
    • SEO FAZAGO
    • Hosting
    • Email
    • Lập trình di động
    • E-logistics
    • Learning English
      • Combined stories about computing
    • Software Testing
    • Ứng dụng CNTT trong Quản lý dược
    • Hướng dẫn thực hành xử lý ảnh photoshop
    • Tin tức
    • Thông tin cần biết
  • Thông báo
  • Chương trình
  • Giải pháp
    • Giải pháp chuyển đổi số
Giỏ hàng 0
Hiển thị giỏ hàng
  • Thiết kế web
    • Gói giới thiệu chọn mẫu
      • Web giới thiệu - Joomla
      • Web giới thiệu - Agitech framework
    • Gói bán hàng chọn mẫu
      • Web bán hàng - Joomla
      • Web bán hàng - Agitech framework
    • Gói giới thiệu tham khảo
    • Gói bán hàng tham khảo
    • Gói web code theo yêu cầu
  • Phần mềm quản lý
    • Phần mềm học trực tuyến elearning
    • Phần mềm kế toán Thông tư 132
    • Quản lý nhân sự và chấm công
    • Quản lý quan hệ khách hàng
    • Quản lý tổng thể ERP
    • Quản lý khách sạn
    • Quản lý kho bán hàng
    • Quản lý quán cà phê
    • Phần mềm quản lý vận tải
    • Phần mềm quản lý bảo trì xe
    • Phần mềm quản lý trên android
    • Phần mềm quản lý Chi cục ATVSTP
    • Phần mềm quản lý cơ sở bán lẻ thuốc 540/QĐ-QLD
    • Sàn giao dịch thương mại điện tử
  • Gia công phần mềm
    • Gia công phần mềm theo lavarel
    • Gia công kiểm thử
  • Vietnamese (VN)
  • English (UK)

Liên hệ

  34A Đường Bùi Văn Danh, P Mỹ Xuyên, TP Long Xuyên, Tỉnh An Giang, Việt Nam
contact@agitech.com.vn

02966.555.226 (Văn phòng)
Kỹ thuật giờ hành chính:
02966.555.226
Hỗ trợ phần mềm:
0789.682.140
Hỗ trợ dự án:
0918.070557

Video

Điều khiển xem camera từ xa trên máy tính - IoT
Tạo cánh tay lấy đồ - IoT

Thống kê truy cập

11843567
Hôm nay
Hôm qua
Tuần này
Tháng này
Tổng
533
1297
1830
19871
11843567

  • Trang chủ/
  • Chia sẻ/
  • IoT
  • /Nạp code không dây với ESP8266

Nạp code không dây với ESP8266

Được đăng: Thứ bảy, 20 Tháng 1 2018 17:37 Lượt xem: 20813
  • In bài này
 

Làm thế nào để cập nhật từ xa cho ESP8266 ? Hẳn là các bạn có biết một cách để nạp firmware cho ESP8266 cần có kết nối với máy tính qua cổng USB, vậy nếu bạn thấy quá trình trên phải sử dụng dây nối rườm rà quá, ESP8266 có wifi mà sao không tận dụng kết nối wifi để nạp luôn firmware cho chip mà chưa biết cách thì đây đúng là bài bạn cần rồi đấy.

OTA là gì ?

Cập nhật firmware OTA (Over the Air) là quá trình tải firmware mới vào ESP8266 thông qua mạng wifi thay vì sử dụng cổng Serial truyền thống.

Có 3 cách để cập nhật OTA cho ESP8266:

  • Dùng Arduino IDE: tận dụng Arduino IDE có sẵn, thay lựa chọn Port > COM bằng Port > IP
  • Dùng Web Browser: ESP8266 tạo một webserver để ta có thể chọn đường dẫn firmware mới
  • HTTP Server: Cập nhật firmware cho ESP8266 từ một server

Trong quá trình làm thì mình sẽ sử dụng linh hoạt giữa nạp firmware qua serial (cho lần đầu tiên và các lần có sự cố) và nạp firmware qua OTA. Ngoài ra thì có một số vấn đề về bảo mật khi nạp firmware qua OTA được đề cập trong bài viết chỉ ở mức đơn giản.

Chuẩn bị

Phần cứng

  • Node MCU hoặc ESP8266 phiển bản bất kỳ từ V7 trở lên + USB2UART modul (mình dùng NodeMCU)

Phần mềm

  • Arduino IDE có cài gói lập trình với ESP8266
  • Python 2.7
  • File firmware blink LED.

Có một yêu cầu nhỏ nữa là máy tính và ESP8266 phải kết nối tới cùng một mạng (nghĩa là chung wifi)

Cài đặt

Các bạn cài đặt python như bình thường. Mình chỉ có một lưu ý khi cài đặt Python nhớ tick chọn Add python.exe to Path như hình

Chỉ cần thế là xong, chúng ta sẽ đi vào luôn cách nạp OTA qua các ví dụ cụ thể

OTA qua Arduino IDE

Cơ bản

Chương trình OTA cho Arduino có sẵn tại đường dẫn File > Examples > ArduinoOTA > BasicOTA hoặc bạn có thể xem chương trình dưới.

Ở đây chỉ có một lưu ý là bạn phải chỉnh lại ten_wifi và password lại cho phù hợp

1
2
const char* ssid = "ten_wifi";
const char* password = "password";
Chương trình OTA Arduino

 

  #include <ESP8266WiFi.h>
  #include <ESP8266mDNS.h>
  #include <WiFiUdp.h>
  #include <ArduinoOTA.h>
   
  const char* ssid = "ten_wifi";
  const char* password = "password";
   
  void setup() {
  //Cấu hình serial baud 115200
  Serial.begin(115200);
  Serial.println("Booting");
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  //Kiểm tra kết nối
  while (WiFi.waitForConnectResult() != WL_CONNECTED) {
  Serial.println("Connection Failed! Rebooting...");
  delay(5000);
  ESP.restart();
  }
   
  // Port defaults to 8266
  // ArduinoOTA.setPort(8266);
   
  // Hostname defaults to esp8266-[ChipID]
  // ArduinoOTA.setHostname("myesp8266");
   
  // Mặc định không có xác thực, muốn thêm mật khẩu để tăng bảo mật thì uncomment dòng dưới
  //ArduinoOTA.setPassword((const char *)"123");
   
  ArduinoOTA.onStart([]() {
  Serial.println("Start");
  });
  ArduinoOTA.onEnd([]() {
  Serial.println("\nEnd");
  });
  ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {
  Serial.printf("Progress: %u%%\r", (progress / (total / 100)));
  });
  ArduinoOTA.onError([](ota_error_t error) {
  Serial.printf("Error[%u]: ", error);
  if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed");
  else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed");
  else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed");
  else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed");
  else if (error == OTA_END_ERROR) Serial.println("End Failed");
  });
  ArduinoOTA.begin();
  Serial.println("Ready");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
  }
   
  void loop() {
  ArduinoOTA.handle();
  }
view raw ota-esp82666-arduino_ip.ino hosted with ❤ by GitHub

 

Kết quả

Sau khi nạp chương trình xuống và mở debug serial ra bạn sẽ thấy hiện IP address, quay lại chương trình chính điều chỉnh Port từ COM chuyển sang IP và tiếp tục complie nạp lại chương trình trên luôn, mục đích là mình kiểm tra xem nạp qua IP có được hay không

Lưu ý 1:

 

Nếu bạn không thấy hiện IP chỗ Port thì tắt Arduino đi và mở lại IP sẽ xuất hiện.

Để tăng tốc độ nạp chương trình bạn có thể thay đổi tại Tool > Upload speed thành 921600

 

Nếu thành công sẽ có thông báo như sau

Có mật khẩu

Tạm thời bước cập nhật qua firmware cơ bản đã thành công, tuy nhiên có một vấn đề phát sinh là nếu update như vậy thì cứ ai ở trong cùng một mạng, có máy tính và Arduino thì đều có thể điều chỉnh thay đổi và nạp firmware linh tinh xuống dưới ESP, nếu trong trường hợp nhà mình sử dụng có mỗi mình thì không vấn đề, nhưng nếu có ai có ý đồ đen tối muốn phá thì vô cùng nguy hiểm. Thôi thêm vào cái mật khẩu cho chắc ăn. Vậy thêm như thế nào ? Vẫn chương trình cũ, chỉ cần mở comment ra chỗ đoạn code

1
ArduinoOTA.setPassword((const char *)"123");

123 là mật khẩu mặc định, bạn có thể thay bằng mật khẩu riêng của mình

Lưu ý 2: Chương trình Arduino vẫn giữ nguyên, nếu có gặp lỗi không hiện IP chỗ port thì bạn vui lòng khởi động lại

 

Hiện tại ESP chỉ hỗ trợ nạp qua IP chứ chưa hỗ trợ debug hiện serial qua IP nhé, nên nhiều lúc ấn vào Debug bạn nhập pass và sẽ có báo sai liên tục. Vui lòng không dùng debug Serial khi nạp qua OTA.

ESPv1 không đủ bộ nhớ cho OTA, nên nếu làm sẽ có lỗi thiếu bộ nhớ

 

OTA qua WebBrowser

Từ việc up firmware qua Arduino quá bất tiện, nhiều lúc không nhận IP lại phải khởi động lại rất mất công thì có một cách khác để up firmware thông qua WebBrowser. Với cách này thì sẽ có một số ưu điểm trong các trường hợp sau:

  • Thấy Arduino rắc rối quá hoặc là vì lý do nào đó mà không nạp được firmware từ Arduino xuống ESP8266.
  • Khi không có server riêng để update OTA hoặc muốn update từ local.
  • Dùng để cập nhật firmware cho số lượng modul vừa phải.

Với chương trình thì chúng ta cần lưu ý chỉnh lại ten_wifi và password lại cho phù hợp

1
2
const char* ssid = "ten_wifi";
const char* password = "password";

ID và Mật khẩu để login mặc định là admin, admin

1
2
const char* update_username = "admin";
const char* update_password = "admin";
Chương trình OTA WebBrowser

 

  /*
  To upload through terminal you can use: curl -F "image=@firmware.bin" esp8266-webupdate.local/update
  */
   
  #include <ESP8266WiFi.h>
  #include <WiFiClient.h>
  #include <ESP8266WebServer.h>
  #include <ESP8266mDNS.h>
  #include <ESP8266HTTPUpdateServer.h>
   
  const char* host = "esp8266-webupdate";
  const char* update_path = "/firmware";
  const char* update_username = "admin";
  const char* update_password = "admin";
  const char* ssid = "ten_wifi";
  const char* password = "password";
   
  ESP8266WebServer httpServer(80);
  ESP8266HTTPUpdateServer httpUpdater;
   
  void setup(void){
  //Khởi tạo serial với baud 115200
  Serial.begin(115200);
  Serial.println();
  Serial.println("Booting Sketch...");
  WiFi.mode(WIFI_AP_STA);
  WiFi.begin(ssid, password);
   
  while(WiFi.waitForConnectResult() != WL_CONNECTED){
  WiFi.begin(ssid, password);
  Serial.println("WiFi failed, retrying.");
  }
  // In địa chỉ IP
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
  MDNS.begin(host);
  // Tạo server
  httpUpdater.setup(&httpServer, update_path, update_username, update_password);
  httpServer.begin();
   
  MDNS.addService("http", "tcp", 80);
  Serial.printf("HTTPUpdateServer ready! Open http://%s.local%s in your browser and login with username '%s' and password '%s'\n", host, update_path, update_username, update_password);
  }
   
  void loop(void){
  httpServer.handleClient();
  }
view raw ota-esp82666-web-browser.ino hosted with ❤ by GitHub

 

Thực hiện nạp chương trình và debug thông qua COM ta sẽ có thông báo

Mở đường dẫn http://esp8266-webupdate.local/firmware để vào giao diện nạp firmware, hoặc http://dia_chi_ip/firmware , như trường hợp của mình là http://192.168.1.104/firmware

Chọn browse và chọn firmware Blink.ino.bin mình đã đưa ở trên, sau khi nạp xong bạn sẽ thấy kit NodeMCU tự động Blink LED

 

OTA qua HTTP Server

Với chương trình này ta có thể cập nhật và tải firmware từ một server HTTP, yêu cầu cần có là địa chỉ IP hoặc địa chỉ domain chứa firmware

Có 2 đoạn cần lưu ý thay cho đúng

1
2
3
WiFiMulti.addAP("ten_wifi", "password");//Thay ten_wifi và password
// Bạn cần thay abc.xyz bằng địa chỉ web chứa fw của bạn và ABC là fw tương ứng
t_httpUpdate_return ret = ESPhttpUpdate.update("http://abc.xyz/ABC.ino.bin");
Chương trình OTA HTTP Server

 

  /**
  * httpUpdate.ino
  *
  * Created on: 27.11.2015
  *
  */
   
  #include <Arduino.h>
   
  #include <ESP8266WiFi.h>
  #include <ESP8266WiFiMulti.h>
   
  #include <ESP8266HTTPClient.h>
  #include <ESP8266httpUpdate.h>
   
  #define USE_SERIAL Serial
   
  ESP8266WiFiMulti WiFiMulti;
   
  void setup() {
   
  USE_SERIAL.begin(115200);
  // USE_SERIAL.setDebugOutput(true);
   
  USE_SERIAL.println();
  USE_SERIAL.println();
  USE_SERIAL.println();
   
  for(uint8_t t = 4; t > 0; t--) {
  USE_SERIAL.printf("[SETUP] WAIT %d...\n", t);
  USE_SERIAL.flush();
  delay(1000);
  }
   
  WiFiMulti.addAP("ten_wifi", "password");
   
  }
   
  void loop() {
  // wait for WiFi connection
  if((WiFiMulti.run() == WL_CONNECTED)) {
  t_httpUpdate_return ret = ESPhttpUpdate.update("http://abc.xyz/ABC.ino.bin"); // Bạn cần thay đúng địa chỉ web chứa fw của bạn
  //Ví dụ
  //t_httpUpdate_return ret = ESPhttpUpdate.update("http://hocarm.org/BasicOTA.ino.bin"); // Bạn cần thay đúng địa chỉ web chứa fw của bạn
  //t_httpUpdate_return ret = ESPhttpUpdate.update("https://server/file.bin");
   
  switch(ret) {
  case HTTP_UPDATE_FAILED:
  USE_SERIAL.printf("HTTP_UPDATE_FAILD Error (%d): %s", ESPhttpUpdate.getLastError(), ESPhttpUpdate.getLastErrorString().c_str());
  break;
   
  case HTTP_UPDATE_NO_UPDATES:
  USE_SERIAL.println("HTTP_UPDATE_NO_UPDATES");
  break;
   
  case HTTP_UPDATE_OK:
  USE_SERIAL.println("HTTP_UPDATE_OK");
  break;
  }
  }
  }
view raw ota-esp82666-http-server.ino hosted with ❤ by GitHub

 

Ở đây mình sẽ up firmware blink LED lên server. Sau đó nạp chương trình xuống ESP8266, nếu thành công bạn sẽ thấy LED blink, dưới đây là log chương trình khi nạp firmware từ xa.

Lưu ý 3:

 

Firmware up mới phải khác firmware hiện có trên ESP thì mới thành công, nếu cố ý để 2 firmware giống nhau thì sẽ bị báo FAILED

Cần phải có server riêng với địa chỉ IP/ domain để chứa firmware mới, chỉ update được với server http, chưa sử dụng được với server https

 

Tạm kết

Vậy là mình đã trình bày qua 3 cách để các bạn có thể cập nhật được firmware từ xa, bỏ qua được dây nhợ kết nối rắc rối. Nhưng đây chỉ mới là mức cơ bản, còn lại phụ thuộc vào từng ứng dụng cụ thể mà các bạn có thể áp dụng. Hi vọng nó giúp các bạn trong bước đầu tìm hiểu nhanh chóng, có cơ sở để tiếp tục tìm kiếm và áp dụng thêm.

Chia sẻ: Nguyễn Tuấn Khiêm (Nguồn: hocarm)

Liên hệ

  34A Đường Bùi Văn Danh, P Mỹ Xuyên, TP Long Xuyên, Tỉnh An Giang, Việt Nam
contact@agitech.com.vn

02966.555.226 (Văn phòng)
Kỹ thuật giờ hành chính:
02966.555.226
Hỗ trợ phần mềm:
0789.682.140
Hỗ trợ dự án:
0918.070557

Video

Điều khiển xem camera từ xa trên máy tính - IoT
Tạo cánh tay lấy đồ - IoT

Thống kê truy cập

11843567
Hôm nay
Hôm qua
Tuần này
Tháng này
Tổng
533
1297
1830
19871
11843567

Copyright © 2015 Agitech

CÔNG TY TNHH TƯ VẤN VÀ DỊCH VỤ KỸ THUẬT CÔNG NGHỆ XANH AN GIANG

34A Bùi Văn Danh, P Mỹ Xuyên, TP Long Xuyên, Tỉnh An Giang

Người đại diện theo pháp luật: Nguyễn Thị Út

Mã số thuế: 1601223524, ngày cấp lần đầu: 07/10/2009,

cấp lần cuối: 08/08/2014

Do sở Kế hoạch & Đầu Tư Tỉnh An Giang cấp

Điện thoại: 02966.555.226 - Email: contact@agitech.com.vn

ZaloPage: Công ty phần mềm An Giang

Thiết kế phần mềm website: AGITECH

Quy Định - Chính sách của AGITECH

  • ★ Chính sách thanh toán
  • ★ Chính sách vận chuyển/ cài đặt
  • ★ Chính sách bảo trì/ bảo hành
  • ★ Chính sách đổi trả hàng/ hoàn tiền
  • ★ Chính sách bảo mật thông tin

Đã thông báo

 ipv6 icon

Chấp nhận thanh toán

TK: Công Ty TNHH Tư vấn và Dịch vụ Kỹ thuật Công Nghệ Xanh An Giang

Vietcombank - số tài khoản 0151.000.482.137

Liên kết website: nang va di doi nha tu luy, nang nha tu luy, di doi nha tu luy, son sakara, son toshiko, son ninza, son aipaint, son akyo, son noi that

son ngoai that, son chong tham, thiet bi ve sinh, gach lot nen, gach op tuong, gach trang tri

  • Trang chủ
  • Giới thiệu
    • Cơ cấu tổ chức
    • Nhân sự
    • Tầm nhìn & sứ mệnh
    • Thành tựu
    • Hỗ trợ & bảo trì
    • Hình ảnh công ty
    • Thông báo
    • Cộng tác viên & SVTT
    • Nội quy công ty
    • Văn bản - biểu mẫu
    • Quy Trình
  • Hướng dẫn
    • Dịch vụ Email Hosting
      • Hướng dẫn sử dụng IceWarp Mail Server
      • Cài đặt tài khoản mail trên điện thoại
    • Hướng dẫn quản trị website
      • Joomla
        • Cách thay đổi hình banner dạng slide với ImageSlider trong Joomla
        • Cách quản lý menu trong joomla
        • Cách quản lý phương tiện (Hình ảnh) trong joomla
        • Cách quản lý component JU Download
        • Cách thêm/ sửa / xóa bài viết trong joomla
        • Cách quản lý thể loại bài viết joomla
        • Cách đăng sản phẩm bằng "JoomShopping" trong Joomla (Website có đặt hàng)
        • Cách đăng bài giới thiệu sản phẩm trong Joomla (Website không đặt hàng)
        • Cách tạo danh mục sản phẩm (menu bên trái)
        • Cách đổi ảnh và vị trí của danh mục sản phẩm (User ở giữa)
        • Cách quản lý logo dạng slide với DJ-ImageSlider trong Joomla
        • Cách thay đổi logo đối tác (Custom HTML) trong Joomla
        • Cách thay đổi video clips (Custom HTML)
        • Cách đăng video có hỗ trợ Shortcode
      • WordPress
  • Thanh toán
  • Tuyển dụng
    • Nhân sự
    • Cộng tác viên kỹ thuật
    • Cộng tác viên kinh doanh
    • Đại lý
  • Liên hệ
  • Chia sẻ
    • Website
    • Phần mềm
    • IoT
    • Khởi nghiệp
    • SEO FAZAGO
    • Hosting
    • Email
    • Lập trình di động
    • E-logistics
    • Learning English
      • Combined stories about computing
    • Software Testing
    • Ứng dụng CNTT trong Quản lý dược
    • Hướng dẫn thực hành xử lý ảnh photoshop
    • Tin tức
    • Thông tin cần biết
  • Thông báo
  • Chương trình
  • Giải pháp
    • Giải pháp chuyển đổi số
You have copied!