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.

Команды для настройки флешки
Команды для настройки флешки

Итого

На этом, в общем-то, проект можно считать завершенным. У меня еще была идея сделать псевдо-меню на файлах флешки и таким принципом работы:

  1. Мы подключаем флешку к ТВ и она показывает нам фейковый список видео файлов (это будет, например, список роликов с ютуба).

  2. На ТВ мы выбираем файл и запускаем его.

  3. Сервер видит к какому файлу идет обращение и может скачать этот файл с ютуба, но он не может сразу подменить содержимое у запрошенного файла. У фейкового файла был фейковый размер и он будет отличаться от реального, а менять эти данные на уже подключенной флешке мы не можем. Но мы можем послать ей команду на перезагрузку, она отвалится, подключится снова и на ней будет уже другой список файлов. Так мы и будем делать навигацию по меню с проваливанием внутрь пунктов и возвращением обратно, через отвал флешки. Можно даже сделать прогресс бар скачивания файла, когда флешка будет периодически отваливаться и там будет файл с процентами загрузки в имени файла, а потом уже скачанный файл, который можно запускать и файл "назад", который возвращает к списку. Клевое извращение, правда?))

Звучит дико и забавно, но я все таки решил этого не делать) Слишком уж большое извращение над USB, да и к тому же, я в курсе, что существуют дешевые HDMI-устройства на Android, которые превращают любой старый ТВ в смарт. У меня даже валялся такой где-то.

Ну а пока оставляю тут исходный код того, что получилось, надеюсь кому-то было интересно и кому-то будет полезно:

https://github.com/CodeName33/Wi-Fi-Flash-Drive

Спасибо за внимание)

Комментарии (76)


  1. igrushkin
    05.09.2022 10:55
    +2

    Круто, не знал, что такое можно делать на ESP32.

    Делал аналогичное на Pi Zero для подключения к фоторамке, работало без проблем


    1. CodeName33 Автор
      05.09.2022 11:38
      +8

      Если речь о Raspberry Pi Zero, то его цена вызывает большую боль, чем скорость работы проекта на ESP32) Вообще смотришь и думаешь, как так-то:
      Raspberry Pi Zero - 5500р
      Комплект Xeon E5 2620 + Материнка + 16 Гб DDR4 - 6700р
      Хм))

      А если речь об Orange Pi Zero или Banana, то все равно дороговато, хоть уже и получше.


      1. igrushkin
        05.09.2022 15:29
        +9

        не забывайте, что были времена, когда Raspberry Pi Zero стоила около 1000 руб и даже дешевле


      1. Jesusatana
        05.09.2022 22:10

        Xeon E5 2620 + Материнка + 16 Гб DDR4 - 6700р

        Зеон разве не ddr3 память? Или китайцы заставили переваривать ddr4?


        1. CodeName33 Автор
          05.09.2022 22:11
          +1

          Там Xeon E5 2620 v3, он как раз на DDR4


      1. Javian
        06.09.2022 06:35

        Актуальная сборка на Xeon E5 2666 v3

        https://xeon-e5450.ru/socket-2011-3/aktualnye-sborki-na-2011-3-sokete/#_2


      1. Tarakanator
        06.09.2022 10:57

        У меня интереснее размышления вышли.
        core 2 duo -есть бесплатно и его хватает.
        Raspberry Pi надо покупать.
        Казалось бы выбор очевиден. Но с2d жрёт 70вт(материнка не хочет запускаться без видеокарты, хотя по докам может) за год получается 3000р. И вот думаю что наверно стоит прикупить Raspberry Pi


  1. Indemsys
    05.09.2022 11:10
    +1

    А стоило изобретать велосипед?
    Я бы взял нормальный эмулятор exFAT из проекта Azure RTOS. Выполнил бы в Visual Studio на PC форматирование в RAM, и писал бы и отдавал сервером файлы любого размера.

    Подозрительно низкая скорость у ESP32, возможно дело во все том же отсутствии RTOS.


    1. CodeName33 Автор
      05.09.2022 11:23
      +2

      exFAT брать не стал по той причине, что если проект использовать на старых устройствах, которые сами не умеют WiFi, то скорее всего они не умеют и exFAT, насколько я помню, долгое время это был закрытый стандарт, пока хакеры не украли часть кода для работы с ним у одного гиганта, случайно не обнаружили в нем части открытого кода и не заставили этого гиганта сделать весь код открытым.

      А что касается записи в RAM - так бывают файлы и поболее всей RAM) И я как раз хотел избежать ручной работы. В моей текущей схеме как, можно сделать так, чтобы при подключении устройства к серверу, сервер будет каждый раз создавать новый образ из это займет секунду времени. Т.е. чтобы обновить данные достаточно сделать выкл-вкл ТВ и все, свежескачанные файлы тут же появляются на флешке.


      1. Indemsys
        05.09.2022 11:28

        А не писал про запись в RAM, а сказал о форматировании в RAM. Думал понятно что делать дальше. Такое форматирование займёт доли секунды. В Azure RTOS эмулируется и FAT32, это зависит лишь от опций компиляции.


        1. CodeName33 Автор
          05.09.2022 11:42

          Ну у меня сейчас в принципе так и делается, в памяти хранится только таблица FAT и кластеры каталогов. Для 229Гб раздела требуется мегабайт 70 оперативки + с оптимизацией которую я сделал на самой плате, можно отказать от хранения в памяти таблицы FAT и это уменьшит потребляемую память до копеек.


      1. Z2K
        05.09.2022 11:48

        Ну что-бы получилась настоящая вай-фай флешка (которые кстати есть) надо еще подцепить микросд и что б она подключалась к роутеру. И работала в овдт.


        1. savostin
          05.09.2022 12:35

          А можно ссылочку на "есть"? Интересно пощупать.


          1. Javian
            05.09.2022 14:14
            +1

            есть карты SD с WiFi

            https://habr.com/ru/post/191742/


            1. savostin
              06.09.2022 12:51

              Супер, спасибо. Только это противоположное тому, что предлагает автор, нет?


              1. Javian
                06.09.2022 16:19

                Файлы не берет с сервера. Т.е. имеет только свою память. Во многих сценариях использования этого должно хватить. Для просмотра фильмов, взамен DLNA, это не подходящий вариант.


          1. Dr_Faksov
            06.09.2022 12:39
            +1

            Пользуюсь вот такой FYSETC SD-WIFI with Card-Reader Module.

            https://www.aliexpress.com/item/4001119021440.html?spm=a2g0o.store_pc_allProduct.8148356.2.6dfa38edgImIL8&pdp_npi=2%40dis!CAD!C%24 22.61!C%24 19.67!!!!!%402101e9d316624569400403454ee3cf!10000014541801055!sh

            Проект открытый, исходники - https://github.com/ardyesp/ESPWebDAV

            Со слабым сигналом скорость СИЛЬНО падает.

            А ещё есть ezSh@re. И Flash-Air SD от Toshiba


            1. savostin
              06.09.2022 12:51

              Супер, спасибо. Только это противоположное тому, что предлагает автор, нет?


            1. SGordon123
              06.09.2022 14:06

              А не подскажете как оно в работе, и нет ли такого же с разъемом микро сд, в 3д принтер запихать? Про переходники - видал конечно ...


              1. Rixty
                07.09.2022 07:31

                У меня есть такое же. Да, оно работает, есть micro sd, но работает крайне медленно, сотые доли килобит в секунду.

                И да, это устройство работает наоборот, чем у автора поста, поднимает самба-шару.

                Но мне понравился пост, потому что именно так было бы интереснее всего сделать, и спасибо за то что исходники лежат на гитхабе, можно для такой флешки будет что то соорудить (в моем случае попытаться)


            1. Tomasina
              06.09.2022 21:15

              А что оно реально умеет? И пару сценариев применения, если можно.


  1. tzlom
    05.09.2022 12:20
    +1

    Еще немножко производительности можно выжать добившись 100% заполнения TCP пакетов-для этого надо читать значение MTU, рассчитать накладные расходы и запрашивать данные кратно остатку. В принципе через WireShark можно предварительно проверить проблема ли это или нет.


    1. Mirn
      05.09.2022 20:14
      +2

      Я бы ещё порекомендовал тем же WireShark измерить время отклика на команды и весь обмен по сети, может из за большого пинга коротких команд и ожиданий таких же коротких ответов на них и получились такие просадки по скорости.


      1. denaturat
        06.09.2022 10:44

        Все эти проблемы решает windowing, зачем изобретать велосипед?


  1. Shnurokspb
    05.09.2022 12:57
    +5

    В телевизорах,USB "Ничего лишнего, только сервис" очень часто этот разъем становится полноценным по мановению волшебной палочки. в старых LG (~2012 г.в.) было точно можно, до сих пор работает с внешним винтом и прекрасно крутит 1080p.


  1. qshiroe
    05.09.2022 14:43
    +4

    Была пара устройств не умеющие в сеть, но которые очень хотели файлов, решением стало rpi4, она отлично прикидывается флешкой, а дальше все просто, подал питание (POE), примонтировал NFS и прикинулся флешкой.

    ЗЫ: Там есть пара нюансов, но проблем они не доставили.


    1. nonname
      05.09.2022 17:51
      +6

      Если посмотреть сколько сейчас стоит rpi4, то можно обнаружить что за эту сумму можно купить бу телек со всеми нужными фичами


      1. qshiroe
        05.09.2022 17:57

        На известном китайском сайте не сильно дорого, в районе 7к на данный момент


        1. nonname
          05.09.2022 18:14
          +5

          Всё равно дорого, espшка стоит 200р, совсем другой порядок цен. Ну и в целом есть альтернативы, подороже esp, но с полноценным USB 2.0 и приличным процом и объемом памяти, чтобы жевало хотя бы те 10-20 мбит для приличного fullhd.


  1. FGV
    05.09.2022 15:35

    Зачем колхозить лишние провода? Есть же T-Dongle ESP32-S2 WiFi development board.


    1. CodeName33 Автор
      05.09.2022 15:41

      Мне кажется это довольно дорого для ESP32. Тогда уж можно взять Orange Pi I96, у неё вроде тоже OTG заявлено, не знаю насколько это будет работать.


      1. FGV
        05.09.2022 16:58

        Да, дороговато но там ведь не только есп32с2 а ещё всякое есть + вообщем то законченный корпус.


  1. BasiC2k
    05.09.2022 19:58

    Как вариант использования - закидывать на флешку музыку (если автомобиль рядом с домом).


    1. Tomasina
      06.09.2022 21:16

      Так ведь содержимое такой "флешки" обнуляется при пропадании сигнала.


      1. lonelymyp
        06.09.2022 22:25
        +1

        Подключить флешку к флешке, чтобы с флешки закидывать файлы на флешку.


  1. dmitryvolochaev
    05.09.2022 21:12

    файл для передачи его нужно копировать в образ

    Более того, нельзя изменять образ, пока флешка воткнута в хост. Это известные недостатки протокола Mass Storage. А насколько сложно будет реализовать MTP? Это намного практичнее


    1. CodeName33 Автор
      05.09.2022 21:41

      MTP не будут поддерживать старые устройства.


  1. saboteur_kiev
    05.09.2022 23:40
    +2

    Отличная штука для стартапа.

    Если ее можно будет сделать загрузочной, то для сисадминства это просто шикарно. Надо на новый чистый комп поставить что-то - воткнул и загружайся. Надо доложить какие-то драйвера - пока винда ставится, скачал и на шару закинул, не вынимая.

    Я бы купил две.


    1. IvanPetrof
      06.09.2022 08:21

      Надо доложить какие-то драйвера — пока винда ставится, скачал и на шару закинул, не вынимая

      а оно не глюканёт от такого «теневого» доступа к монопольному ресурсу?
      помнится давно, во времена дискет, я неудачно заменил дискету в дисководе, а dos, не прочухав этот момент, скинул на новую дискету буфера с FAT-ом от прежней дискеты (причём я по-моему даже ничего не редактировал. Оно само. Просто вставил новую дискету, набрал «dir» и увидел прежнее содержимое, которое, к сожалению оказалось не глюком чтения, а глюком записи). В результате получилось две дискеты с одинаковым списком файлов, но только на одной из них файлы содержали мусор из «нарезки» прошлой жизни содержимого дискеты.


      1. saboteur_kiev
        06.09.2022 23:54

        со времен дос софт не лазит за файлами сам, а делает через API операционной системы. По сети ты же тем же API будешь данные на диске менять.
        В досе у вас просто закешировался FAT (для ускорения чтения).


        1. IvanPetrof
          07.09.2022 16:26

          Я это понимаю. Но флешка, на которую можно «закинуть файлы, пока с этой же флешки ставится винда», работает в обход операционной системы, которая думает, что владеет этим устройством монопольно. а потому запросто возможны похожие глюки, что я описал выше.


          1. FGV
            07.09.2022 19:17

            msc это ж не только флэшка, может быть и cdrom. Если прикидываться сидюком то вполне все уживется без глюков.


            1. IvanPetrof
              08.09.2022 02:50

              Сидюк в момент открытия лотка подаёт сигнал размонтирования. Если флешка в момент докладывания на неё файлов по wifi, будет подавать сигнал «извлечения устройства», то глюков не будет.
              Но тогда не получится докинуть драйвера пока с этой же флешки ставится система.


          1. saboteur_kiev
            08.09.2022 05:14

            работает в обход операционной системы

            Это как?
            Драйвер файловой системы, даже если он работает через инсталлятор, это драйвер файловой системы, который должен отрабатывать разные моменты.

            Да, редактировать файл, который сейчас правит кто-то другой, будет вызывать проблему. Но добавление новых файлов - ломать ФС не должно


    1. CodeName33 Автор
      06.09.2022 08:58

      Как раз вот так использовать будет нельзя, к сожалению. Менять содержимое флешки на лету нельзя, только с переподключением. Точнее можно, но только в определенных рамках: нельзя менять список файлов, а содержимое файлов можно менять только сохраняя размер файла заявленный изначально и только при условии, что файл ещё не читали.


      1. saboteur_kiev
        06.09.2022 23:54

        Хм, но почему??

        Кто мешает в драйвере сделать возможность обновления кеша?


        1. CodeName33 Автор
          07.09.2022 08:06

          Потому что кеш не у флешки, а у того устройства, которое её будет читать, и флешка им управлять не может


  1. ifap
    05.09.2022 23:52
    +1

    но на самом деле никакая она не флешка, она просто эмулирует файловую систему, а файлы берет по WiFi с сервера. Но зачем? Да, на самом деле, и не зачем.

    На этом месте где-то далеко в Поднебесной усмехнулся дядюшка Сяо, уже мысленно впаривший глупым ляоваем партию десёвый сисиди на многа-многа питабайт - бери проверяй сам, все без абмана! ;)


  1. Aigir
    06.09.2022 00:18

    Идея смахивает на "бесконечную флешку" Алексея Чуркина
    Шуму в свое время было много (2015 год), президентский грант и ссе такое.
    Вроде как даже выпустили опытную партию этого чуда. Но я что-то до сих пор не видел этого девайса в продаже.
    Идея благополучно затухла.
    "...спустя пару лет Чуркин отказался развивать устройство дальше, сославшись на то, что все пользуются облачными дисками от Dropbox и Google..."


    1. lopatoid
      06.09.2022 06:19

      Скорее похоже на https://en.wikipedia.org/wiki/Eye-Fi

      А "бесконечная флешка Алексея Чуркина" это самый обычный аппаратный токен для доступа к облаку (я, кстати, так и не понял, в чём "инновация", в Гугл.Диск с помощью YubiKey можно было логиниться за год до того, как эта "бесконечная флешка Алексея Чуркина" только в идеях и презентациях была)

      В статье же устройство эмулирует usb-флешку, и имеет собственную связь с сетью.


      1. Tomasina
        06.09.2022 21:21

        Инновация в том, что на комп (как правило, не твой) не нужно инсталлировать облачные драйвера, тупо пришёл к любому кому, воткнул свою чудо-флешку - и у тебя новый раздел с твоими файлами.


  1. AndreyDmitriev
    06.09.2022 07:03

    Любопытно, а можно ли сделать флешку (с флеш памятью на борту), которая при вставлении в USB будет распознаваться не как обычный съёмный накопитель, а как сетевой диск?


    1. serafims
      06.09.2022 09:33
      +1

      Технически можно, если она сумеет сэмулировать RNDIS.


      1. AndreyDmitriev
        06.09.2022 12:52

        Во, спасибо за наводку на RNDIS! Похоже это не так сложно, как мне изначально казалось:
        https://learn.adafruit.com/turning-your-raspberry-pi-zero-into-a-usb-gadget/ethernet-gadget


    1. isden
      06.09.2022 10:02

      У меня какой-то 3g модем так умел. Показывал на таком диске свой софт.


      1. DaemonGloom
        06.09.2022 11:40

        3g модемы обычно эмулировали из себя CD-ROM, с которого ставились драйвера. Сетевой диск они не изображали. Да и в целом, сетевым адаптером они начали прикидываться только с переходом на 4G — до этого были другие методы взаимодействия.


        1. isden
          06.09.2022 11:41

          Нет, на винде он именно как сетевой диск показывался, это я точно помню.


  1. axe_chita
    06.09.2022 10:05

    Там внутри такое… Там внутри такое! Там внутри такое!!! Я не буду говорить, что там внутри никому, кроме своего психотерапевта, а т.к. его у меня нет, то вообще никому. Но эта информация открыта, её можно легко найти в сети, если есть такое желание. Особенно доставляет то, как там сделана поддержка длинных имен файлов, это настолько ублюдство, что даже великолепно. Но важно понимать, что перед людьми, придумавшими это, стояла важная задача — сохранить совместимость с устройствами и программами, которые знать не знали ни о каких длинных именах файлов и важно было, чтобы потом из-за этого изменения не потерялись важные файлы на тысячах компьютеров по всему миру, поэтому вариантов у разработчиков было не много.
    Хе-хе, уважаемый автор забыл или не знал старую шутку времен win95, что прогрессивная ФС VFAT с поддержкой LFN настолько прогрессивна, что в ней у каждого файла есть два имени.
    А до появления нормальных NU под Win95, народ регулярно грохал длинные имена запустив Speed Disk. Да, в win95 были ScanDisk и Defrag, но первый мог вешаться на ровном месте при проверке ФС до старта ОС, а второй был тормознутым, и считал множество файлов неперемещаемыми.


    1. CodeName33 Автор
      06.09.2022 10:22

      В те времена я учился в школе, и для меня было магией, что там происходит внутри ScanDisk'а и Defrag'а. Но да, бывало, что после проверки диска слетали длинные имена, теперь понятно почему)


  1. miarh
    06.09.2022 10:12
    +2

    Сам точно никогда не повторю (слабо), но читать было круто. Ну и каких то вещей просто не знал. Спасибо.


  1. jstbot
    06.09.2022 10:22

    не понял, а как оно работает с обновлением списка файлов? в том числе в плане меню, зачем каждый раз перезагружать?


    1. CodeName33 Автор
      06.09.2022 10:29
      +2

      Пока оно так не работает, я не стал реализовывать этот функционал ввиду бессмысленности этих костылей. Смысл был в том, что когда флешка подключена, менять содержимое каталогов уже нельзя, устройство уже прочитало его. Вообще правило такое - нельзя менять ничего, что уже было прочитано устройством. А все что еще не было прочитано - менять можно. Но если вынуть/вставить флешку можно поменять хоть все, устройство все равно будет читать все данные заново. Но можно попросить флешку перезагрузиться, чтобы делать это программно, тогда она отвалится и снова подключится на устройстве без физического вытаскивания. Так можно все время менять список файлов. Но не стал я это делать потому, что на такое поведение, каждое устройство может отреагировать по своему. Например ТВ при отвале флешки может просто переключиться на другой источник сигнала и придется снова вручную переключать его на флешку. А может он так не будет делать, и останется на флешке, просто выдаст сообщение, что флешка отсутствует, а при подключении флешки уберет его.


  1. Aquahawk
    06.09.2022 10:36
    +4

    Великолепная работа, обожаю такие статьи и подходы. И очередной раз демонстрируется что лежит внизу наших технологий и каким дерьмом является то, что работает, на фоне того, о чём пишут в толстых книжках.


  1. V-core
    06.09.2022 10:45

    У меня в закладках на Али лежит кейс для внешних дисков с DLNA сервером. В отличие от многих в том, что он умеет по Wi-Fi
    "Blueendless" https://a.aliexpress.com/_DB9mvqF


    1. andersong
      06.09.2022 11:09

      Я купил такой пару лет назад, перепрошил на OpenWRT от Padavan для продвинутой работы с 4G модемом. Стоял в небольшом офисе, раздавал инет с 4G на несколько компов и смартфонов, служил файлохранилищем для обмена и сканов. По сути клон Nexx WT3020, есть тема с прошивками на 4PDA, ищется по ключу «Wi-Fi HDD», «KIMAX BS-U35WF». Сейчас лежит на полке — в офис протянули провод, да и слабоват он для интенсивного обмена и морально устарел.


  1. ryzhehvost
    06.09.2022 11:05
    +3

    Если бы была цель сделать законченное устройство - мне кажется самым логичным было бы настройки писать... на флешку. То есть при подключении притворяться хабом с двумя подключенными флешками, одна из которых "реальная", но очень маленькая, и хранит текстовый файл с настройками (SSID, пароль, адрес сервера), а вторая - уже собственно папка с сервера расшаренная по wifi. Поменяли файл с настройками - вторая "флешка" отвалилась и снова подключилась, пользуемся. Правда всё равно не очень понятно, зачем оно надо.


    1. CodeName33 Автор
      06.09.2022 11:08

      Да, кстати, хорошая идея хранить настройки на другом разделе флешки) Не подумал об этом.



  1. akakoychenko
    06.09.2022 12:38

    Сервер видит к какому файлу идет обращение и может скачать этот файл с ютуба, но он не может сразу подменить содержимое у запрошенного файла. У фейкового файла был фейковый размер и он будет отличаться от реального, а менять эти данные на уже подключенной флешке мы не можем

    Так а в чем проблема? Флешка может отдавать 4ГБ на все фейковые файлы. А, когда пойдет воспроизведение, то отдавать блоки на лету, скачивая их с ютуба сервером, и сразу же отдававая на флешку. Единственная проблема может возникнуть с быстрой перемоткой, если пользователь ткнет в центр таймлайна, и телевизор попробует сделать seek на соответствующее смещение, чтобы там найти keyframe и от него читать далее, - то есть, если реальный объем файла 200МБ, а мы уже анонсировали 4ГБ, то вся возможная прокрутка сосредоточится в первых 5% полосы прокрутки. Но, тут я не силен (не вникал, есть ли что-то вроде таблицы соответствия время-отступ в начале видеофайла, чтобы плеер знал, как сикать, а не искал половинным делением), может, можно сэмулировать валидный неоднородный видеофайл, где, условно, 95 первых % времени видео занимает 200МБ, а последние 5% состоят напрочь из полностью черных keyframes и составляют 3800МБ, чтобы и полоса прокрутки тоже работала (ну почти) корректно.


    1. CodeName33 Автор
      06.09.2022 13:33

      Думал об этом, но тут еще будет играть роль видеоформат. Есть форматы у которых есть заголовки не только в начале но и в конце файла. Не к любому файлу можно в конце записать нули, чтобы он продолжал оставаться работоспособным. Не факт, что скачанное с ютуба будет в подходящем формате, придется делать еще и траскодинг на лету (кстати в транскодинге - да можно наверное установить такой битрейт, чтобы любой файл на выходе был 4ГБ)), но с транскодингом это будет уже не так быстро). Но в теории да, может быть это и могло бы получится.


  1. Mike-M
    06.09.2022 15:45
    +2

    Понравилась тема статьи, то как она раскрыта, и чувство юмора. Спасибо!


  1. Lonsdaleite
    06.09.2022 17:55
    +1

    Интересная идея.

    У меня есть похожий девайс. USB флешка с BT модулем. По BT определяется как наушники/колонка, можно подключиться и стримить музыку. При этом поток пишется в один и тот же файл. Таким образом можно слушать музыку по BT на магнитолах авто, поддерживающих только флешки. Покупал на алике рублей за 500 чисто ради интереса. Работает норм.


  1. tormozedison
    06.09.2022 21:11

    Сделать такую же штуку, но прикидывающуюся не флешкой, а дисководом, и подключать к соответствующим ретромашинам…


    1. CodeName33 Автор
      06.09.2022 22:45

      По USB, которого там нет) А даже если и есть, навряд ли он на уровне BIOSа тех времён распознает USB-дисковод. Или придется заморочится с подключением по floppy шлейфу.


      1. usernameak
        07.09.2022 05:37

        Такое добро вполне существует в виде готового продукта (правда берёт не с сети, а с флешки) — Gotek же.


        1. CodeName33 Автор
          07.09.2022 08:08

          Он как раз подключается через настоящий floppy-шлейф