Wi-Fi-флешка? WTF?
Что такое Wi-Fi-флешка? Это флешка, которая опознается, как флешка, пахнет, как флешка, крякает, как флешка, но на самом деле никакая она не флешка, она просто эмулирует файловую систему, а файлы берет по Wi-Fi с сервера.
Но зачем?
Да, на самом деле, и не зачем. Просто как-то пришла в голову идея о чем-то подобном и стало интересно, реально ли это вообще? И немного подумав, я понял, что вроде все необходимое для реализации проекта у меня есть, и я таки решился попробовать. Кому-то нравится в свободное время играть в игры, качать героя, стрелять из танков, самолетов, кому-то смотреть фильмы или сериалы, кому-то читать художественную литературу, кому-то решать головоломки, проходить квесты, выбираться из комнат. А мне вот захотелось пройти свой квест, чисто For Fun. Да и к тому же, даже если результат проекта мне сейчас не нужен, это в любом случае будет хороший опыт, который может пригодится будущем. Но теоретическое назначение этому мне виделось следующее.
Есть старые устройства, которые умеют читать флешки (телевизоры, музыкальные центры), но при этом еще не доросли до сети. Чтобы постоянно не перезаписывать для них флешку с файлами, можно сделать такое вот беспроводное автоматическое обновление. Но это только один из вариантов использования, на самом деле, мне кажется, много чего можно сделать из такой технологии, поэтому вперед!
Для этого нам нужно
-
ESP32-S2 (так как она сразу умеет в USB OTG).
-
USB разъем (так как эта плата не умеет в USB через разъем для прошивки, хотя вроде есть версии с двумя USB Type-C, где один как раз OTG, но у меня такой нет).
Упрямство, отвага и возможно даже слабоумие (но это не точно).
Ну, что ж, начнем...
Для программирования плат Arduino и ESP я использую Arduino, но не саму студию (она ужасна), а только её SDK. А для написания кода мне гораздо больше нравится плагин Visual Micro для Visual Studio. Но проще (и бесплатнее) это делать через Arduino IDE. Как всем этим пользоваться я тут расписывать не буду, иначе статья растянется на километры, поэтому предположим, что вы все знаете и умеете. Брынь! (взмах волшебной палочкой). Все. Теперь вы знаете и умеете.
Первое что я сделал — взял демо скетч USBMSC, который идет в комплекте к SDK для ESP32, использующий tinyUSB:
https://github.com/espressif/arduino-esp32/blob/master/libraries/USB/examples/USBMSC/USBMSC.ino
В нем видно, что эмуляция флешки — это очень просто. Для начала я просто собрал его, чтобы проверить. Тогда я еще не знал, что tinyUSB в ESP32-S2 не может работать по встроенному USB для прошивки (Arduino Leonaro, например, может). Ну ладно, не может и не может, вопрос решался довольно просто, GPIO20 на плате это USB_DATA+, GPIO19 это USB_DATA-.
В результате получилось так:
Питание пока не подключено, только линии данных, так как при отладке она будет питаться через Micro-USB, но если делать законченное устройство, то нужно землю к земле, 5 вольт к 5-ти вольтам. После этого скетч заработал, и у меня тут же в системе появился диск какого-то микроскопического объема с файлом README + еще один COM порт. Это меня порадовало, пришло время менять код из примера на нужный мне. Я разделил этот процесс на несколько этапов.
Работа с готовым образом флешки
Сперва я решил начать с простого: взять готовый образ флешки с файлами и передавать его. Все казалось довольно легко, ведь в примере все сделано на довольно нехитрых функциях:
static int32_t onRead(uint32_t lba, uint32_t offset, void* buffer, uint32_t bufsize);
static int32_t onWrite(uint32_t lba, uint32_t offset, uint8_t* buffer, uint32_t bufsize);
Метод onWrite мне вообще не нужен, так как я пока не планирую возможность записи на такую флешку, вернем в нем bufsize, типа мы все записали. А вот метод onRead как раз нужен, и вроде все просто, данные спрашивают у меня, я спрашиваю у сервера, получаю результат, отдаю его спрашивающему.
Но начал я с того, чтобы создать образ флешки. Нужен именно чистый образ, без лишних данных и без дополнительных заголовков файловых контейнеров. Для Windows есть программы для создания подобного, вроде Win32DiskImager, но я просто написал такой код на C и создал образ с реальной флешки:
FILE* f = fopen("\\\\.\\PhysicalDrive8", "rb");
FILE* fd = fopen("V:\\WFLASH.RAW", "wb");
if (f == NULL)
{
std::cout << "Erro opening drive\n";
return 1;
}
__int64 size = 0;
const int BUFFER_SIZE = 512;
char buffer[BUFFER_SIZE];
while (fread(buffer, 1, BUFFER_SIZE, f) == BUFFER_SIZE)
{
fwrite(buffer, 1, BUFFER_SIZE, fd);
size += BUFFER_SIZE;
if ((size % 4194304) == 0)
{
std::cout << "\r Copied: " << size;
}
}
PhysicalDriveНОМЕР_ДИСКА — который можно посмотреть в оснастке управление компьютером → управление дисками.
Далее я поднял простой HTTP сервер (у меня был ламповый Apache) и накидал скрипт на PHP:
<?php
header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
header("Content-Type: application/octet-stream");
if (!isset($_GET["pos"]))
{
$_GET["pos"] = 0;
}
if (!isset($_GET["length"]))
{
$_GET["length"] = 512;
}
file_put_contents("./log.txt", "POS=".$_GET["pos"].", LENGTH=".$_GET["length"].PHP_EOL, FILE_APPEND);
$file = fopen("v:/WFLASH.RAW", "r");
fseek($file, $_GET["pos"]);
echo fread($file, $_GET["length"]);
fclose($file);
?>
Скрипт просто получает позицию и размер данных, которые ему нужно прочитать, читает и отдает. Здесь все легко.
Повозиться пришлось на стороне платы. Она никак не хотела подключаться и что-то получать. Потом до меня дошло, что в методе onRead не надо этого делать, он вызывается как-то по прерыванию, и в нем не все работает, в нем можно поспать (типа delay(1) в цикле) в ожидании нужного результата, а во время его сна уже работает основная функция цикла программы loop() и в ней как раз можно и подключаться и получать данные. После N минут (часов, дней...) отладки все наконец-таки заработало и я увидел образ флешки, как новый диск у себя в компьютере. Не скажу, что работало это быстро, скажу, что работало это очень медленно. Вначале я думал на медленный USB HOST на ESP32-S2, но потом понял, что медленно идет именно получение данных. Поэтому перешел ко второму этапу — вещать образ флешки не через HTTP, где надо еще формировать и парсить заголовки, и не PHP скрипта, который при каждом запросе по новой открывает файл, а написать на C простой сервер на сокетах с постоянным соединением явно будет быстрее.
Сказано — сделано. Сервер был написан, и даже дал определенный прирост производительности, но небольшой. Тогда я решил сделать буфер данных на плате. Например, запрашивают у меня один сектор 512 байт, но ведь наверняка, как только я его отдам, у меня тут же запросят следующий, идущий за ним. А мне надо по каждому сектору спрашивать данные и получать ответ. Но я сделаю умнее, я сразу запрошу 32 Кб данных и потом буду супер-турбо-мега-быстро отдавать данные уже из памяти. До тех пор пока не запросят что-то за пределами буфера. При случайном чтении станет, конечно же, еще медленнее, но чаще всего чтение идет последовательное, поэтому делаю кэш.
Снова сказано — снова сделано. Стало ещё чуть быстрее, но все равно не то, 65 Кб данных приходят примерно за 200 мс, 32 Кб за 100, это где-то 2–2,5 Мбит/с. Хм, надо оптимизировать что-то еще...
А ведь все начиналось так хорошо...
Дальше, что бы я не делал, скорость, увы, не росла. На форумах у людей получалось поднимать скорость Wi-Fi платы перекомпилируя SDK с другими параметрами. Я тоже пробовал так делать, но мне это дало процентов 5–10 прироста и все. "Что я делаю не так?" пролетало у меня в голове, "они ведь пишут, что им удалось поднять скорость чуть ли не в 5 раз! Почему у меня не получается?". И тут мне на выручку пришло одно полезное правило:
Когда уже больше ну ничего не помогает, прочти уже наконец целиком текст сообщений, а не только те его куски которые тебе интересны
И вот я прочел и все понял: у них изначально была скорость в 5 раз ниже моей, а после всех ускорений, стала примерно такая же, как у меня сейчас и когда они жаловались на медленный Wi-Fi, они жаловались не на 300 Кб/с, как зажравшийся я, а на 50-60 Кб/с. И выходит, что 300-350 Кб/с это и есть предел скорости на ESP32. Круче только на бенчмарках у производителей платы, но похоже, что там специфические тесты. И это весьма грустно, так как довольно прилично портит функционал устройства. Я конечно же не ожидал 54 мегабита по воздуху от ESP, но рассчитывал хотя бы на 20 мегабит. Ну хотя бы 10? Ну пожалуйста... Ну и ладно. В целом, все работает и видео с битрейтом до 2 мегабит играются без тормозов (ни о каком HD конечно же речь не идет, 2 мегабита — это довольно низкий битрейт даже для 720p, но для SD вполне). Можно пока оставить сей момент как есть, все равно с ним уже ничего не сделаешь, и продолжить двигаться дальше, туда где можно что-то еще улучшить.
— Друзья! У нас две проблемы. Минобороны и пуговица. Пуговицу мы найти можем? Чисто теоретически? Можем. А с Минобороны... ничего. Вывод: ищем пуговицу. (День радио)
Ищем пуговицу
Итак мой сервер уже умеет передавать данные с готового образа, но если бы я видел завершение проекта таким, то скорее всего даже не начал бы его. Потому, что в этом нет никакого смысла. Если для того, чтобы добавить файл для передачи его нужно копировать в образ, то тогда зачем все это, если можно точно также скопировать его на обычную флешку и вставить в устройство. Да и к тому же, у меня на диске лежит, например, фильмов на 200 Гб, получается нужно либо делать образ флешки еще на 200 Гб, либо постоянно вручную копировать их в образ меньшего объема. Нет, это все полная фигня. Я видел все совсем по другому. Я хочу, чтобы я просто указал серверу "расшаренную" папку, а он сам её просканирует и создаст у себя в мозгах виртуальный образ, но физически не будет его записывать на диск или в память. Он, понимая в каком диапазоне секторов у него находятся какие файлы и когда у него эти сектора запрашивают, будет просто открывать настоящие файлы и брать данные оттуда. Таким образом, он создаст образ, не создавая его) И это будет быстро и не потребует много памяти даже для 200+ Гб образов.
Чтобы реализовать такой алгоритм, нужно понимать какую файловую систему эмулировать. FAT16 имеет ограничения на размер раздела в 2 Гб, что сразу нет. NTFS слишком сложный и навряд ли его понимают старые устройства, как и exFAT. Остается FAT32 с его единственным важным ограничением — максимальная длина одного файла 4 Гб, остальное все неплохо. Снаружи. Тогда я еще не знал, что там внутри...
Там внутри такое... Там внутри такое! Там внутри такое!! Я не буду говорить, что там внутри никому, кроме своего психотерапевта, а так как его у меня нет, то вообще никому. Но эта информация открыта, её можно легко найти в сети, если есть такое желание. Особенно доставляет то, как там сделана поддержка длинных имен файлов, это настолько отвратительная мерзость, что даже великолепно. Но важно понимать, что перед людьми, придумавшими это, стояла важная задача — сохранить совместимость с устройствами и программами, которые знать не знали ни о каких длинных именах файлов и важно было, чтобы потом из-за этого изменения не потерялись важные файлы на тысячах компьютеров по всему миру, поэтому вариантов у разработчиков было не много. Впрочем после N минут (часов, дней...) отладки я научился читать образы FAT32 и вытаскивать оттуда файлы и папки, а после N×3 минут (часов, дней...) я научился их создавать такими, чтобы их могли читать другие. Ну а дальше, спустя еще пару веков, сервер научился и эмулировать FAT32 больших размеров, храня у себя в памяти только структуру FAT, а сами данные файлов беря из их настоящего расположения. Я попробовал проэмулировать папку с фильмами, получилось 229 Гб данных, файлы размером более 4 Гб отсекаются сервером еще на этапе сканирования папок, иначе размер образа был бы еще больше. Жаль что большая часть этих фильмов не способна воспроизводиться без жутких тормозов, но старые 700 Мб рипы играются очень даже бодро)
На сегодняшний день сервер работает только под Windows (но только из-за не стандартизированных сокетов C++ и возможно еще пары функций, вроде AnsiToOem, честно говоря было просто лень искать кроссплатформенные альтернативы и не хотелось подключать сторонние библиотеки, но думаю портировать код на другие ОС не будет большой проблемой).
Оптимизаторы оптимизировали-оптимизировали...
Еще интересный момент, связанный с инициализацией флешки. Windows подключает флешку тем дольше, чем больше она по объему, так как хочет полностью прочитать всю таблицу секторов, а для 200+ Гб она занимает более 60 Мб (а скорость помним, ~300 Кб/с) и это прям не быстро. Совсем. Флешка такого объема подключается несколько минут. А вот Android, при подключении к нему флешки, очень скромен и запрашивает данные только при необходимости, поэтому к нему флешка подключается мгновенно. Зато при запуске видео, Android начинает читать кучу всего, и самого запуска видео я на нём так и не дождался, устал ждать).
Но всё-таки решил немного ускорить загрузку данных для Windows. И раз он читает всю таблицу FAT, я могу отдать ему её быстрее. А добиться этого можно, если сделать плату чуть умнее, не просто, как прокси, которая гоняет через себя данные, а ещё совсем немного в них разбирается. И самое важное здесь то, что я эмулирую идеальный FAT. Это FAT в котором нет фрагментации, FAT в котором данные каждого файлика идут строго друг за другом, без пропусков и без перемешивания секторов, мой FAT — это FAT в котором волшебные пони кушают волшебную радугу, голосуйте за мой FAT! Поэтому в моей таблице секторов в разделе с данными самих файлов всего два варианта записей: информация о том, где следующий сектор файла (а это всегда на единицу больше текущего) или информация о том, что этот сектор для файла последний. Поэтому, чтобы построить её, нужно всего лишь иметь массив с конечным (или начальным) сектором каждого файла, отсортированный по возрастанию.
Для этого, помимо количества секторов на диске, мой сервер стал отдавать плате немного больше полезной информации. И вот, когда код был написан, и я его запустил, я ожидал, как при подключении к USB флешка в ту же секунду определится. Ну ладно, может через пару секунд. Но увы тут меня ждал второй облом, скорость увеличилась раза в 2, но не более. Я уже стал грешить, что написал медленный код генерации кусочков таблицы FAT на ESP32, но нет, мой код был быстр, как гордый лев, удирающий от разъяренного носорога, чего нельзя сказать про работу USB на плате. И тут я вспомнил... Ну конечно, там же USB 1.1 и 10 мегабит скорости! Но с другой стороны, должно же быть 1.25 Мб/с... В идеальных условиях и идеальном мире, а в реальном те 800 Кб/с, что у меня получились — это похоже был максимум, на что я мог рассчитывать, так что не так уж и страшен этот медленный Wi-Fi, все равно порог скорости не так уж далеко, не 350 Кб/с так 800 Кб/с. Ладно... Я спокоен.
Вишенкой на торте я хотел записать видео, как я запускаю с получившейся "флешки" фильм на телевизоре, и уже было собрался это делать, так как я помню что у одного из моих старых телеков точно был USB разъем, но увы, расходимся пацаны, кина не будет, не для нас USBишенька цвела:
Немного идей
Еще поразмыслив, я решил, что идеальная флешка могла бы работать не в связке с каким-то специальным сервером, а более универсально, например, подключаясь по FTP или WebDAV сама эмулировала бы FAT32, а данные получала бы прямо с этих серверов. Это было бы просто прелестно, будь у ESPшки нормальная скорость Wi-Fi и USB. Но, увы, нет ручек — нет конфеток. Но идея прекрасна, возможно когда-нибудь...
Настройка флешки
Изначально все настройки (Wi-Fi, сервер) этой "флешки" были прямо в прошивке, но я подумал, что так уж совсем негоже. По хорошему надо сделать подключение к ней с телефона, как к Wi-Fi точке доступа и настраивать все через Web. Но тогда надо еще сделать какую-то кнопку, чтобы сбрасывать настройки, иначе как потом перевести её снова в точку доступа? И если бы я делал законченное устройство, я бы так и сделал, а еще придумал бы для этого всего корпус, но мне это устройство не сильно нужно, поэтому и с настройкой я так заморачиваться не хотел и остановился на компромиссе: все будет настраиваться командами, через любой из COM портов (либо через тот, что используется для прошивки, либо через тот, что идет бонусом вместе с USB устройством). Это, конечно, еще не человек, но уже и не обезьяна, и не нужно пересобирать прошивку для изменения настроек сервера или Wi-Fi.
Итого
На этом, в общем-то, проект можно считать завершенным. У меня еще была идея сделать псевдо-меню на файлах флешки и таким принципом работы:
Мы подключаем флешку к ТВ и она показывает нам фейковый список видео файлов (это будет, например, список роликов с ютуба).
На ТВ мы выбираем файл и запускаем его.
Сервер видит к какому файлу идет обращение и может скачать этот файл с ютуба, но он не может сразу подменить содержимое у запрошенного файла. У фейкового файла был фейковый размер и он будет отличаться от реального, а менять эти данные на уже подключенной флешке мы не можем. Но мы можем послать ей команду на перезагрузку, она отвалится, подключится снова и на ней будет уже другой список файлов. Так мы и будем делать навигацию по меню с проваливанием внутрь пунктов и возвращением обратно, через отвал флешки. Можно даже сделать прогресс бар скачивания файла, когда флешка будет периодически отваливаться и там будет файл с процентами загрузки в имени файла, а потом уже скачанный файл, который можно запускать и файл "назад", который возвращает к списку. Клевое извращение, правда?))
Звучит дико и забавно, но я все таки решил этого не делать) Слишком уж большое извращение над USB, да и к тому же, я в курсе, что существуют дешевые HDMI-устройства на Android, которые превращают любой старый ТВ в смарт. У меня даже валялся такой где-то.
Ну а пока оставляю тут исходный код того, что получилось, надеюсь кому-то было интересно и кому-то будет полезно:
https://github.com/CodeName33/Wi-Fi-Flash-Drive
Спасибо за внимание)
Комментарии (76)
Indemsys
05.09.2022 11:10+1А стоило изобретать велосипед?
Я бы взял нормальный эмулятор exFAT из проекта Azure RTOS. Выполнил бы в Visual Studio на PC форматирование в RAM, и писал бы и отдавал сервером файлы любого размера.Подозрительно низкая скорость у ESP32, возможно дело во все том же отсутствии RTOS.
CodeName33 Автор
05.09.2022 11:23+2exFAT брать не стал по той причине, что если проект использовать на старых устройствах, которые сами не умеют WiFi, то скорее всего они не умеют и exFAT, насколько я помню, долгое время это был закрытый стандарт, пока хакеры не украли часть кода для работы с ним у одного гиганта, случайно не обнаружили в нем части открытого кода и не заставили этого гиганта сделать весь код открытым.
А что касается записи в RAM - так бывают файлы и поболее всей RAM) И я как раз хотел избежать ручной работы. В моей текущей схеме как, можно сделать так, чтобы при подключении устройства к серверу, сервер будет каждый раз создавать новый образ из это займет секунду времени. Т.е. чтобы обновить данные достаточно сделать выкл-вкл ТВ и все, свежескачанные файлы тут же появляются на флешке.Indemsys
05.09.2022 11:28А не писал про запись в RAM, а сказал о форматировании в RAM. Думал понятно что делать дальше. Такое форматирование займёт доли секунды. В Azure RTOS эмулируется и FAT32, это зависит лишь от опций компиляции.
CodeName33 Автор
05.09.2022 11:42Ну у меня сейчас в принципе так и делается, в памяти хранится только таблица FAT и кластеры каталогов. Для 229Гб раздела требуется мегабайт 70 оперативки + с оптимизацией которую я сделал на самой плате, можно отказать от хранения в памяти таблицы FAT и это уменьшит потребляемую память до копеек.
Z2K
05.09.2022 11:48Ну что-бы получилась настоящая вай-фай флешка (которые кстати есть) надо еще подцепить микросд и что б она подключалась к роутеру. И работала в овдт.
savostin
05.09.2022 12:35А можно ссылочку на "есть"? Интересно пощупать.
Dr_Faksov
06.09.2022 12:39+1Пользуюсь вот такой FYSETC SD-WIFI with Card-Reader Module.
Проект открытый, исходники - https://github.com/ardyesp/ESPWebDAV
Со слабым сигналом скорость СИЛЬНО падает.
А ещё есть ezSh@re. И Flash-Air SD от Toshiba
SGordon123
06.09.2022 14:06А не подскажете как оно в работе, и нет ли такого же с разъемом микро сд, в 3д принтер запихать? Про переходники - видал конечно ...
Rixty
07.09.2022 07:31У меня есть такое же. Да, оно работает, есть micro sd, но работает крайне медленно, сотые доли килобит в секунду.
И да, это устройство работает наоборот, чем у автора поста, поднимает самба-шару.
Но мне понравился пост, потому что именно так было бы интереснее всего сделать, и спасибо за то что исходники лежат на гитхабе, можно для такой флешки будет что то соорудить (в моем случае попытаться)
tzlom
05.09.2022 12:20+1Еще немножко производительности можно выжать добившись 100% заполнения TCP пакетов-для этого надо читать значение MTU, рассчитать накладные расходы и запрашивать данные кратно остатку. В принципе через WireShark можно предварительно проверить проблема ли это или нет.
Mirn
05.09.2022 20:14+2Я бы ещё порекомендовал тем же WireShark измерить время отклика на команды и весь обмен по сети, может из за большого пинга коротких команд и ожиданий таких же коротких ответов на них и получились такие просадки по скорости.
Shnurokspb
05.09.2022 12:57+5В телевизорах,USB "Ничего лишнего, только сервис" очень часто этот разъем становится полноценным по мановению волшебной палочки. в старых LG (~2012 г.в.) было точно можно, до сих пор работает с внешним винтом и прекрасно крутит 1080p.
qshiroe
05.09.2022 14:43+4Была пара устройств не умеющие в сеть, но которые очень хотели файлов, решением стало rpi4, она отлично прикидывается флешкой, а дальше все просто, подал питание (POE), примонтировал NFS и прикинулся флешкой.
ЗЫ: Там есть пара нюансов, но проблем они не доставили.
nonname
05.09.2022 17:51+6Если посмотреть сколько сейчас стоит rpi4, то можно обнаружить что за эту сумму можно купить бу телек со всеми нужными фичами
qshiroe
05.09.2022 17:57На известном китайском сайте не сильно дорого, в районе 7к на данный момент
nonname
05.09.2022 18:14+5Всё равно дорого, espшка стоит 200р, совсем другой порядок цен. Ну и в целом есть альтернативы, подороже esp, но с полноценным USB 2.0 и приличным процом и объемом памяти, чтобы жевало хотя бы те 10-20 мбит для приличного fullhd.
FGV
05.09.2022 15:35Зачем колхозить лишние провода? Есть же T-Dongle ESP32-S2 WiFi development board.
CodeName33 Автор
05.09.2022 15:41Мне кажется это довольно дорого для ESP32. Тогда уж можно взять Orange Pi I96, у неё вроде тоже OTG заявлено, не знаю насколько это будет работать.
FGV
05.09.2022 16:58Да, дороговато но там ведь не только есп32с2 а ещё всякое есть + вообщем то законченный корпус.
BasiC2k
05.09.2022 19:58Как вариант использования - закидывать на флешку музыку (если автомобиль рядом с домом).
dmitryvolochaev
05.09.2022 21:12файл для передачи его нужно копировать в образ
Более того, нельзя изменять образ, пока флешка воткнута в хост. Это известные недостатки протокола Mass Storage. А насколько сложно будет реализовать MTP? Это намного практичнее
saboteur_kiev
05.09.2022 23:40+2Отличная штука для стартапа.
Если ее можно будет сделать загрузочной, то для сисадминства это просто шикарно. Надо на новый чистый комп поставить что-то - воткнул и загружайся. Надо доложить какие-то драйвера - пока винда ставится, скачал и на шару закинул, не вынимая.
Я бы купил две.
IvanPetrof
06.09.2022 08:21Надо доложить какие-то драйвера — пока винда ставится, скачал и на шару закинул, не вынимая
а оно не глюканёт от такого «теневого» доступа к монопольному ресурсу?
помнится давно, во времена дискет, я неудачно заменил дискету в дисководе, а dos, не прочухав этот момент, скинул на новую дискету буфера с FAT-ом от прежней дискеты (причём я по-моему даже ничего не редактировал. Оно само. Просто вставил новую дискету, набрал «dir» и увидел прежнее содержимое, которое, к сожалению оказалось не глюком чтения, а глюком записи). В результате получилось две дискеты с одинаковым списком файлов, но только на одной из них файлы содержали мусор из «нарезки» прошлой жизни содержимого дискеты.saboteur_kiev
06.09.2022 23:54со времен дос софт не лазит за файлами сам, а делает через API операционной системы. По сети ты же тем же API будешь данные на диске менять.
В досе у вас просто закешировался FAT (для ускорения чтения).IvanPetrof
07.09.2022 16:26Я это понимаю. Но флешка, на которую можно «закинуть файлы, пока с этой же флешки ставится винда», работает в обход операционной системы, которая думает, что владеет этим устройством монопольно. а потому запросто возможны похожие глюки, что я описал выше.
FGV
07.09.2022 19:17msc это ж не только флэшка, может быть и cdrom. Если прикидываться сидюком то вполне все уживется без глюков.
IvanPetrof
08.09.2022 02:50Сидюк в момент открытия лотка подаёт сигнал размонтирования. Если флешка в момент докладывания на неё файлов по wifi, будет подавать сигнал «извлечения устройства», то глюков не будет.
Но тогда не получится докинуть драйвера пока с этой же флешки ставится система.
saboteur_kiev
08.09.2022 05:14работает в обход операционной системы
Это как?
Драйвер файловой системы, даже если он работает через инсталлятор, это драйвер файловой системы, который должен отрабатывать разные моменты.Да, редактировать файл, который сейчас правит кто-то другой, будет вызывать проблему. Но добавление новых файлов - ломать ФС не должно
CodeName33 Автор
06.09.2022 08:58Как раз вот так использовать будет нельзя, к сожалению. Менять содержимое флешки на лету нельзя, только с переподключением. Точнее можно, но только в определенных рамках: нельзя менять список файлов, а содержимое файлов можно менять только сохраняя размер файла заявленный изначально и только при условии, что файл ещё не читали.
saboteur_kiev
06.09.2022 23:54Хм, но почему??
Кто мешает в драйвере сделать возможность обновления кеша?
CodeName33 Автор
07.09.2022 08:06Потому что кеш не у флешки, а у того устройства, которое её будет читать, и флешка им управлять не может
ifap
05.09.2022 23:52+1но на самом деле никакая она не флешка, она просто эмулирует файловую систему, а файлы берет по WiFi с сервера. Но зачем? Да, на самом деле, и не зачем.
На этом месте где-то далеко в Поднебесной усмехнулся дядюшка Сяо, уже мысленно впаривший глупым ляоваем партию десёвый сисиди на многа-многа питабайт - бери проверяй сам, все без абмана! ;)
Aigir
06.09.2022 00:18Идея смахивает на "бесконечную флешку" Алексея Чуркина
Шуму в свое время было много (2015 год), президентский грант и ссе такое.
Вроде как даже выпустили опытную партию этого чуда. Но я что-то до сих пор не видел этого девайса в продаже.
Идея благополучно затухла.
"...спустя пару лет Чуркин отказался развивать устройство дальше, сославшись на то, что все пользуются облачными дисками от Dropbox и Google..."lopatoid
06.09.2022 06:19Скорее похоже на https://en.wikipedia.org/wiki/Eye-Fi
А "бесконечная флешка Алексея Чуркина" это самый обычный аппаратный токен для доступа к облаку (я, кстати, так и не понял, в чём "инновация", в Гугл.Диск с помощью YubiKey можно было логиниться за год до того, как эта "бесконечная флешка Алексея Чуркина" только в идеях и презентациях была)
В статье же устройство эмулирует usb-флешку, и имеет собственную связь с сетью.
Tomasina
06.09.2022 21:21Инновация в том, что на комп (как правило, не твой) не нужно инсталлировать облачные драйвера, тупо пришёл к любому кому, воткнул свою чудо-флешку - и у тебя новый раздел с твоими файлами.
AndreyDmitriev
06.09.2022 07:03Любопытно, а можно ли сделать флешку (с флеш памятью на борту), которая при вставлении в USB будет распознаваться не как обычный съёмный накопитель, а как сетевой диск?
serafims
06.09.2022 09:33+1Технически можно, если она сумеет сэмулировать RNDIS.
AndreyDmitriev
06.09.2022 12:52Во, спасибо за наводку на RNDIS! Похоже это не так сложно, как мне изначально казалось:
https://learn.adafruit.com/turning-your-raspberry-pi-zero-into-a-usb-gadget/ethernet-gadget
isden
06.09.2022 10:02У меня какой-то 3g модем так умел. Показывал на таком диске свой софт.
DaemonGloom
06.09.2022 11:403g модемы обычно эмулировали из себя CD-ROM, с которого ставились драйвера. Сетевой диск они не изображали. Да и в целом, сетевым адаптером они начали прикидываться только с переходом на 4G — до этого были другие методы взаимодействия.
axe_chita
06.09.2022 10:05Там внутри такое… Там внутри такое! Там внутри такое!!! Я не буду говорить, что там внутри никому, кроме своего психотерапевта, а т.к. его у меня нет, то вообще никому. Но эта информация открыта, её можно легко найти в сети, если есть такое желание. Особенно доставляет то, как там сделана поддержка длинных имен файлов, это настолько ублюдство, что даже великолепно. Но важно понимать, что перед людьми, придумавшими это, стояла важная задача — сохранить совместимость с устройствами и программами, которые знать не знали ни о каких длинных именах файлов и важно было, чтобы потом из-за этого изменения не потерялись важные файлы на тысячах компьютеров по всему миру, поэтому вариантов у разработчиков было не много.
Хе-хе, уважаемый автор забыл или не знал старую шутку времен win95, что прогрессивная ФС VFAT с поддержкой LFN настолько прогрессивна, что в ней у каждого файла есть два имени.
А до появления нормальных NU под Win95, народ регулярно грохал длинные имена запустив Speed Disk. Да, в win95 были ScanDisk и Defrag, но первый мог вешаться на ровном месте при проверке ФС до старта ОС, а второй был тормознутым, и считал множество файлов неперемещаемыми.CodeName33 Автор
06.09.2022 10:22В те времена я учился в школе, и для меня было магией, что там происходит внутри ScanDisk'а и Defrag'а. Но да, бывало, что после проверки диска слетали длинные имена, теперь понятно почему)
miarh
06.09.2022 10:12+2Сам точно никогда не повторю (слабо), но читать было круто. Ну и каких то вещей просто не знал. Спасибо.
jstbot
06.09.2022 10:22не понял, а как оно работает с обновлением списка файлов? в том числе в плане меню, зачем каждый раз перезагружать?
CodeName33 Автор
06.09.2022 10:29+2Пока оно так не работает, я не стал реализовывать этот функционал ввиду бессмысленности этих костылей. Смысл был в том, что когда флешка подключена, менять содержимое каталогов уже нельзя, устройство уже прочитало его. Вообще правило такое - нельзя менять ничего, что уже было прочитано устройством. А все что еще не было прочитано - менять можно. Но если вынуть/вставить флешку можно поменять хоть все, устройство все равно будет читать все данные заново. Но можно попросить флешку перезагрузиться, чтобы делать это программно, тогда она отвалится и снова подключится на устройстве без физического вытаскивания. Так можно все время менять список файлов. Но не стал я это делать потому, что на такое поведение, каждое устройство может отреагировать по своему. Например ТВ при отвале флешки может просто переключиться на другой источник сигнала и придется снова вручную переключать его на флешку. А может он так не будет делать, и останется на флешке, просто выдаст сообщение, что флешка отсутствует, а при подключении флешки уберет его.
Aquahawk
06.09.2022 10:36+4Великолепная работа, обожаю такие статьи и подходы. И очередной раз демонстрируется что лежит внизу наших технологий и каким дерьмом является то, что работает, на фоне того, о чём пишут в толстых книжках.
V-core
06.09.2022 10:45У меня в закладках на Али лежит кейс для внешних дисков с DLNA сервером. В отличие от многих в том, что он умеет по Wi-Fi
"Blueendless" https://a.aliexpress.com/_DB9mvqFandersong
06.09.2022 11:09Я купил такой пару лет назад, перепрошил на OpenWRT от Padavan для продвинутой работы с 4G модемом. Стоял в небольшом офисе, раздавал инет с 4G на несколько компов и смартфонов, служил файлохранилищем для обмена и сканов. По сути клон Nexx WT3020, есть тема с прошивками на 4PDA, ищется по ключу «Wi-Fi HDD», «KIMAX BS-U35WF». Сейчас лежит на полке — в офис протянули провод, да и слабоват он для интенсивного обмена и морально устарел.
ryzhehvost
06.09.2022 11:05+3Если бы была цель сделать законченное устройство - мне кажется самым логичным было бы настройки писать... на флешку. То есть при подключении притворяться хабом с двумя подключенными флешками, одна из которых "реальная", но очень маленькая, и хранит текстовый файл с настройками (SSID, пароль, адрес сервера), а вторая - уже собственно папка с сервера расшаренная по wifi. Поменяли файл с настройками - вторая "флешка" отвалилась и снова подключилась, пользуемся. Правда всё равно не очень понятно, зачем оно надо.
CodeName33 Автор
06.09.2022 11:08Да, кстати, хорошая идея хранить настройки на другом разделе флешки) Не подумал об этом.
akakoychenko
06.09.2022 12:38Сервер видит к какому файлу идет обращение и может скачать этот файл с ютуба, но он не может сразу подменить содержимое у запрошенного файла. У фейкового файла был фейковый размер и он будет отличаться от реального, а менять эти данные на уже подключенной флешке мы не можем
Так а в чем проблема? Флешка может отдавать 4ГБ на все фейковые файлы. А, когда пойдет воспроизведение, то отдавать блоки на лету, скачивая их с ютуба сервером, и сразу же отдававая на флешку. Единственная проблема может возникнуть с быстрой перемоткой, если пользователь ткнет в центр таймлайна, и телевизор попробует сделать seek на соответствующее смещение, чтобы там найти keyframe и от него читать далее, - то есть, если реальный объем файла 200МБ, а мы уже анонсировали 4ГБ, то вся возможная прокрутка сосредоточится в первых 5% полосы прокрутки. Но, тут я не силен (не вникал, есть ли что-то вроде таблицы соответствия время-отступ в начале видеофайла, чтобы плеер знал, как сикать, а не искал половинным делением), может, можно сэмулировать валидный неоднородный видеофайл, где, условно, 95 первых % времени видео занимает 200МБ, а последние 5% состоят напрочь из полностью черных keyframes и составляют 3800МБ, чтобы и полоса прокрутки тоже работала (ну почти) корректно.
CodeName33 Автор
06.09.2022 13:33Думал об этом, но тут еще будет играть роль видеоформат. Есть форматы у которых есть заголовки не только в начале но и в конце файла. Не к любому файлу можно в конце записать нули, чтобы он продолжал оставаться работоспособным. Не факт, что скачанное с ютуба будет в подходящем формате, придется делать еще и траскодинг на лету (кстати в транскодинге - да можно наверное установить такой битрейт, чтобы любой файл на выходе был 4ГБ)), но с транскодингом это будет уже не так быстро). Но в теории да, может быть это и могло бы получится.
Lonsdaleite
06.09.2022 17:55+1Интересная идея.
У меня есть похожий девайс. USB флешка с BT модулем. По BT определяется как наушники/колонка, можно подключиться и стримить музыку. При этом поток пишется в один и тот же файл. Таким образом можно слушать музыку по BT на магнитолах авто, поддерживающих только флешки. Покупал на алике рублей за 500 чисто ради интереса. Работает норм.
tormozedison
06.09.2022 21:11Сделать такую же штуку, но прикидывающуюся не флешкой, а дисководом, и подключать к соответствующим ретромашинам…
CodeName33 Автор
06.09.2022 22:45По USB, которого там нет) А даже если и есть, навряд ли он на уровне BIOSа тех времён распознает USB-дисковод. Или придется заморочится с подключением по floppy шлейфу.
usernameak
07.09.2022 05:37Такое добро вполне существует в виде готового продукта (правда берёт не с сети, а с флешки) — Gotek же.
igrushkin
Круто, не знал, что такое можно делать на ESP32.
Делал аналогичное на Pi Zero для подключения к фоторамке, работало без проблем
CodeName33 Автор
Если речь о Raspberry Pi Zero, то его цена вызывает большую боль, чем скорость работы проекта на ESP32) Вообще смотришь и думаешь, как так-то:
Raspberry Pi Zero - 5500р
Комплект Xeon E5 2620 + Материнка + 16 Гб DDR4 - 6700р
Хм))
А если речь об Orange Pi Zero или Banana, то все равно дороговато, хоть уже и получше.
igrushkin
не забывайте, что были времена, когда Raspberry Pi Zero стоила около 1000 руб и даже дешевле
Jesusatana
Зеон разве не ddr3 память? Или китайцы заставили переваривать ddr4?
CodeName33 Автор
Там Xeon E5 2620 v3, он как раз на DDR4
Javian
Актуальная сборка на Xeon E5 2666 v3
https://xeon-e5450.ru/socket-2011-3/aktualnye-sborki-na-2011-3-sokete/#_2
Tarakanator
У меня интереснее размышления вышли.
core 2 duo -есть бесплатно и его хватает.
Raspberry Pi надо покупать.
Казалось бы выбор очевиден. Но с2d жрёт 70вт(материнка не хочет запускаться без видеокарты, хотя по докам может) за год получается 3000р. И вот думаю что наверно стоит прикупить Raspberry Pi