OTA'yı etkinleştirmeden önce sahada çalışan ESP32'lerin bölüm tablosunu okumak
Yapay zekâ tarafından English dilinden çevrildi ·
Hermetry’ye MQTT üzerinden sıcaklık bildiren, soğutmalı tırlarda çalışan 31 adet ESP32-WROOM-32 kartımız var. Firmware bizim yazdığımız kod ve Arduino core 2.x ile derleniyor. Hermetry’nin firmware güncellemelerini, dizüstü bilgisayarla depoya gitmek yerine kullanmaya başlamak istiyoruz.Sorun şu: ilk 12 kart bir yüklenici tarafından flashlendi ve hangi bölüm şemasını seçtiğini kimse not etmedi. Mevcut derlemimiz yaklaşık 1,4 MB. Bazı kartlar tek ve büyük bir uygulama bölümüyle flashlendiyse OTA yazacak yer bulamaz; bir şey atamadan önce bunu bilmek ve filonun yarısının Failed durumuna düşmesini izlemek istemem.Çalışan bir kartın bölüm tablosunu, yeniden flashlemeden okumanın bir yolu var mı? Tırlar üç depoya dağıldığı için ideal olarak uzaktan.
We have 31 ESP32-WROOM-32 boards in refrigerated trailers reporting temperatures to Hermetry over MQTT. Firmware is ours, built with Arduino core 2.x. We’d like to start using Hermetry’s firmware updates instead of driving to the depot with a laptop.
Problem: the first 12 boards were flashed by a contractor and nobody wrote down which partition scheme he picked. Our current build is about 1.4 MB. If some boards were flashed with a single big app partition, OTA has nowhere to write to and I’d rather know that before I assign anything and watch half the fleet go to Failed.
Is there a way to read the partition table of a running board without reflashing it? Ideally remotely, since the trailers are spread over three depots.
Yapay zekâ tarafından English dilinden çevrildi ·
0x8000 adresinde esptool read_flash?
esptool read_flash at 0x8000?
Yapay zekâ tarafından English dilinden çevrildi ·
Bunun için yine de USB gerekiyor. Trailer’lar hafta boyunca çoğunlukla dışarıda.
That needs USB though. The trailers are out most of the week.
Yapay zekâ tarafından English dilinden çevrildi ·
Sorduğun soru bu değil ama madem bunla uğraşıyorsun: bir imzalama anahtarı kaydet ve o profilde “İmzasız imajlara izin ver” seçeneğini kapalı tut. İmzasız imajlar yalnızca test cihazları içindir, yolda giden römorklar ise test cihazı değildir.
Not your question, but while you’re at it: register a signing key and keep “Allow unsigned images” off on that profile. Unsigned is meant for test devices only, and trailers on the road aren’t test devices.
Yapay zekâ tarafından English dilinden çevrildi ·
Bir yüklenici firmasının sayaç kartlarında tam olarak bu durum yaşandı. Çalışan firmware’e sorabilirsiniz: ESP-IDF’deki partition API’si Arduino çekirdeğinde de sorunsuz çalışıyor. Ulaşabildiğiniz kartlara (kendi partinizden olanlara) tek bir derleme gönderin ya da diğerlerinin depoya gelmesini bekleyin; bağlandıktan sonra tabloyu bir kez client attributes olarak raporlayacak:
#include "esp_partition.h"
void reportPartitions() {
String json = "{";
esp_partition_iterator_t it =
esp_partition_find(ESP_PARTITION_TYPE_ANY, ESP_PARTITION_SUBTYPE_ANY, NULL);
bool first = true;
while (it != NULL) {
const esp_partition_t *p = esp_partition_get(it);
if (!first) json += ",";
json += ""part." + String(p->label) + "":"" +
String(p->address, HEX) + "/" + String(p->size) + """;
first = false;
it = esp_partition_next(it);
}
esp_partition_iterator_release(it);
json += "}";
mqtt.publish("v1/attributes", json.c_str());
}
Ardından Attributes sekmesinde, Client scope altında her kart için part.app0, part.app1, part.otadata vb. görünecek. Görmek istediğiniz şey: iki uygulama alanı (ota_0 ve ota_1, Arduino tablolarında app0/app1 olarak geçer) ile otadata, her biri imajınızdan en az o kadar büyük olmalı. Tek bir app0 3 MB görüp app1 yoksa, bu “Huge APP” şemasıdır, OTA yapılamaz.Yeni derleme gönderemediğiniz kartlar için emily’nin yöntemi depoda işe yarar:
esptool.py --port /dev/ttyUSB0 read_flash 0x8000 0xc00 pt.bin
python gen_esp32part.py pt.bin
Yanlış şemaya sahip kartların, iki alanlı bir tabloyla bir kez USB üzerinden yeniden flaşlanması gerekir. Bundan sonra OTA kalıcı olarak çalışır.
Had this exact situation with meter boards a contractor did. You can ask the running firmware: the partition API in ESP-IDF works fine from the Arduino core. Push one build to the boards you can reach (the ones from your own batch), or wait until the others are at the depot, that reports the table as client attributes once after connecting:
#include "esp_partition.h"
void reportPartitions() {
String json = "{";
esp_partition_iterator_t it =
esp_partition_find(ESP_PARTITION_TYPE_ANY, ESP_PARTITION_SUBTYPE_ANY, NULL);
bool first = true;
while (it != NULL) {
const esp_partition_t *p = esp_partition_get(it);
if (!first) json += ",";
json += ""part." + String(p->label) + "":"" +
String(p->address, HEX) + "/" + String(p->size) + """;
first = false;
it = esp_partition_next(it);
}
esp_partition_iterator_release(it);
json += "}";
mqtt.publish("v1/attributes", json.c_str());
}
Then the Attributes tab, Client scope, shows part.app0, part.app1, part.otadata and so on per board. What you want to see is two app slots (ota_0 and ota_1, called app0/app1 in the Arduino tables) plus otadata, each at least as big as your image. If you see one app0 of 3 MB and no app1, that’s the “Huge APP” scheme, no OTA possible.
For the boards you can’t get a new build on, emily’s way works at the depot:
esptool.py --port /dev/ttyUSB0 read_flash 0x8000 0xc00 pt.bin
python gen_esp32part.py pt.bin
Boards with the wrong scheme need one USB reflash with a two-slot table. After that OTA works for good.
Yapay zekâ tarafından English dilinden çevrildi ·
Tamam. Yüklenicinin 12 cihazından 9’u tek bir 3 MB app0 ile geri geldi, dolayısıyla bunlarda ziyaret yapılmadan OTA yok. Diğer 3 cihaz ve bizimkilerin tümünde app0/app1 birer 1,25 MB, bu da 1,4 MB derlememiz için çok dar. Bu yüzden daha ileri gitmeden önce bölüm tablosunu 1,9 MB’lık yuvalarla minimal SPIFFS tablosuna geçiriyorum. Önce kontrol etmemiz iyi oldu.
Done. 9 of the contractor’s 12 came back with a single 3 MB app0, so no OTA on those without a visit. The other 3 and all of ours have app0/app1 at 1.25 MB each, which is tight against our 1.4 MB build, so I’m switching our table to the minimal SPIFFS one with 1.9 MB slots before we go further. Good thing we checked first.
Yapay zekâ tarafından English dilinden çevrildi ·
Depo ziyaretlerini onaylayan kişi olarak: bir sonraki parti flash’lanmadan önce lütfen bunu kontrol edin.
As the one who signs off on the depot visits: please check this before the next batch gets flashed.
- Bu konuyu yanıtlamak için giriş yapmış olmalısınız.
Sohbete katılın
Soru sormak ve yanıtlamak, yararlı gönderileri beğenmek ve sorununuzu çözen yanıtı işaretlemek için oturum açın. Her katkı puan ve seviye kazandırır.

