Хотите увидеть нечто любопытное? Вот, как устранили проблему «антеннагейта» на iPhone в 2010 году. 20 байт.

iOS 4.0: 8d ff ff ff 91 ff ff ff 95 ff ff ff 99 ff ff ff 9d ff ff ff  iOS 4.0.1: 86 ff ff ff 98 ff ff ff 9e ff ff ff a7 ff ff ff b0 ff ff ff
iOS 4.0: 8d ff ff ff 91 ff ff ff 95 ff ff ff 99 ff ff ff 9d ff ff ff iOS 4.0.1: 86 ff ff ff 98 ff ff ff 9e ff ff ff a7 ff ff ff b0 ff ff ff

Контекст: в 2010 году, когда выпустили iPhone 4, пользователи заметили, что если взять телефон определённым образом, то количество полосок сигнала сети падает с 5 до примерно 2. Спустя насколько недель компания опубликовала письмо, в котором свалила вину за это на неправильную формулу: https://www.apple.com/newsroom/2010/07/02Letter-from-Apple-Regarding-iPhone-4/

Upon investigation, we were stunned to find that the formula we use to calculate how many bars of signal strength to display is totally wrong. Our formula, in many instances, mistakenly displays 2 more bars than it should for a given signal strength. For example, we sometimes display 4 bars when we should be displaying as few as 2 bars. Users observing a drop of several bars when they grip their iPhone in a certain way are most likely in an area with very weak signal strength, but they don’t know it because we are erroneously displaying 4 or 5 bars. Their big drop in bars is because their high bars were never real in the first place.
Проведя расследование, мы неожиданно обнаружили, что формула, по которой вычисляется количество полосок силы сигнала, совершенно неправильная. Во многих случаях наша формула ошибочно отображала на две полоски больше, чем на самом деле требовалось. Например, иногда телефон отображал четыре полоски, хотя на самом деле он должен был показывать всего две. Если пользователи наблюдали исчезновение нескольких полосок, когда брали iPhone определённым образом, то это, скорее всего, происходило в местах с очень слабым сигналом, но они не знали этого, потому что телефон ошибочно отображал четыре или пять полосок. Такое резкое снижение количества полосок вызвано тем, что эта индикация изначально была неправильной.

Над этим письмом много смеялись (https://daringfireball.net/2010/07/translation_iphone_4), но никто не изучал различия в формуле между 4.0 и патчем в 4.0.1. В то время я был глупым восьмилетним ребёнком, но теперь уже я глупый взрослый, владеющий дизассемблером.

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

strings CommCenter | grep -i bars  UseEcn0Bars ecn0 is %d / signal is %d, assuming 5 bars ecn0 is %d / signal is %d, assuming 4 bars ecn0 is %d / signal is %d, we say %d bars telling UI to draw %d bars, %d signal

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

; Table lookup loop              loc_3434e: 0003434e         ldr.w      r3, [r2, r4, lsl #2]     ; Load threshold[bar_count] 00034352         cmp        r5, r3                   ; Compare RSSI to threshold 00034354         ble        loc_3435c                ; If RSSI <= threshold, stop 00034356         adds       r4, #0x1                 ; bar_count++ 00034358         cmp        r4, #0x5                 ; Check if reached 5 bars 0003435a         bne        loc_3434e                ; Loop

...а здесь. Это таблица поиска. При преобразовании байтов в децибел-милливатты (дБм) мы получаем -115, -111, -107, -103 и -99 (чем ближе к нулю, тем лучше сигнал). Например, для отображения трёх полосок значение должно быть -107 или больше.

Raw bytes
Five threshold values for signal bars. - 0x8DFFFFFF equals −115 dBm, marking the 1-bar threshold. - 0x91FFFFFF equals −111 dBm, 2-bar threshold. - 0x95FFFFFF equals −107 dBm, 3-bar threshold. - 0x99FFFFFF equals −103 dBm, 4-bar threshold. - 0x9DFFFFFF equals −99 dBm, 5-bar threshold.

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

В 4.0.1 компания изменила эти значения, сделав их гораздо более плавными.

Raw 4.0.1 lookup table values
• 0x86FFFFFF equals −122 dBm — 1 bar threshold. • 0x98FFFFFF equals −104 dBm — 2 bars threshold. • 0x9EFFFFFF equals −98 dBm — 3 bars threshold. • 0xA7FFFFFF equals −89 dBm — 4 bars threshold. • 0xB0FFFFFF equals −80 dBm — 5 bars threshold.

Из графика видно, что для снижения с пяти до нуля полосок требуется сильное падение сигнала. Пользователь реже будет видеть пять полосок, но и резко падать их количество тоже будет реже.

4.0 and 4.0.1 signal bar thresholds mapped onto each other. The 4.0 line jumps from 0 to full bars in a fairly short span compared to 4.0.1

Вот и всё. 20 байт.

А, и ещё в 4.0.1 они изменили высоту полосок низкого сигнала, сделав их выше. Забавно.

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


  1. Astroscope
    18.12.2025 23:04

    Что меня продолжает неприятно удивлять начиная с моего первого телефона, тогда еще аналогового, так это то, что во всех телефонах отсутствует стандартный S-метр, а вместо него отображение в попугаях, которые никак и ничем не нормированы, и каждый производитель их программирует как хочет.

    Кто не в курсе. Стандартный S-метр состоит из девятибальной шкалы, в которой цена одного балла - 6dB (в четыре раза по мощности), а девяти баллам соответствует -93dBm (или 5uV). То есть 8 баллов это -99dBm и так далее. Все, что выше 9 баллов, обозначается плюсом к 9, например "9+30" означает 9 баллов + 30dB = -63dBm. Это невероятно удобная для человека шкала оценки уровня сигнала, которую исключительно просто выполнить программно вместо безымянных полосок, кубиков и прочей ерунды.

    Ну а победа маркетинга Apple над здравым смыслом и инженерией - это вообще притча во языцех.


    1. nnutts
      18.12.2025 23:04

      Радиотракт — это очень далеко и абстрактно для пользователя, связь либо есть, либо её нет, это бинарное значение, ну а для расширения своего радиолюбительского опыта есть netmonitor.


      1. DaneSoul
        18.12.2025 23:04

        Далеко не бинарное, даже для самого далекого от техники пользователя.
        Потому как связь бывает вроде как есть, но с помехами, "заиканием" и периодическими обрывами. Или при слабом сигнале на улице еще есть, а зашел в кафе и она пропала.


        1. JBFW
          18.12.2025 23:04

          Тогда уж и список БС выводить с этими параметрами, и всякие там rssi/rsrp/sinr по каждой, потому что телефон это не радиоприемник, он зацепится за соту и давай на ней висеть, хотя рядом есть получше в моменте. И помехи.

          Простому юзеру это все равно непонятно, ему только и надо "работает" - "не работает". В идеале - чтобы стрелочка на карте показывала, куда идти где сигнал лучше - и всё (и то для тех случаев когда очень надо, а не ловит)


      1. Astroscope
        18.12.2025 23:04

        связь либо есть, либо её нет, это бинарное значение,

        Зависит от разрядности ADC в вашем сознании. При желании все можно свести к двоичному "работает/не работает", но только в реальной жизни часто есть весьма широкий градиент полутонов даже в абсолютно техничных, как например электросвязь, вопросах.

        Общеприянята такая шкала субъективной оценки качества связи в баллах такова:

        5 - идеальная разборчивость, помехи или артефакты отсутствуют полностью либо незаметны.

        4 - хорошая разборчивость; несмотря на заметные помехи или артефакты речь передается полноценно и воспринимается без напряжения.

        3 - приемлемая разборчивость; речь передается с потерями из-за помех или артефактов, требует внимательного вслушивания, иногда требует уточнения и повторной передачи.

        2 - неприемлемая разборчивость, различаются отдельные слова или обрывки фраз.

        1 - связь номинально установлена, но фактически различить речь невозможно.

        То есть можно слышать на 59+20 (читается "пять девять плюс двадцать", где 5 - субъективная разборчивость, 9+20 - объективный уровень принимаемого сигнала), а можно и на 33 (читается "три три", аналогично) - и то, и другое, очевидно относится к "связь есть". А поскольку сейчас связь это преимущественно цифра, то практически достигаемая скорость передачи данных может сильно разниться - и доли мегабита, и сотни мегабит, это все "связь есть", но только если вы неправильно его держите, то практическая применимость такой связи сильно варьируется.


        1. nnutts
          18.12.2025 23:04

          Ну я заострил, конечно, сведя пользовательский опыт к медиане, к тому же как вы заметили, в цифровой связи потери пакетов могут нивелироваться до весьма тяжёлых условий приёма. Семь три! :)


          1. Astroscope
            18.12.2025 23:04

    1. 1dNDN
      18.12.2025 23:04

      Пользователю не нужно знать, сколько dBm сигнала его телефон принимает. Пользователю (за исключением малочисленных гиков) нужно знать "хороший" ли сигнал, "плохой" или "средний", а конкретные числа ему малоинтересны. Кроме того, если вы будете показывать пользователю конкретные значения уровня сигнала, то вам придётся пояснять, какой уровень сигнала будет соответствовать "хорошему" сигналу, а какой "плохому" и что для UMTS, EDGE и LTE эти уровни сигнала по разному нормируются.

      Для этой задачи лучше подходит показометр.


      1. HardWrMan
        18.12.2025 23:04

        У меня с одним экземпляром китайского телефона iOcean показометр был сломан, поэтому приходилось использовать виджет Battery, который считывал у системы не процентаж, а напряжение. И на практике выучить пороговые значения напряжения батареи для оценки заряда. Ничего страшного в этом нет, просто непрезентабельно, за 1к баксов такое не продашь.


      1. geher
        18.12.2025 23:04

        Кроме того, если вы будете показывать пользователю конкретные значения уровня сигнала, то вам придётся пояснять, какой уровень сигнала будет соответствовать "хорошему" сигналу, а какой "плохому" и что для UMTS, EDGE и LTE эти уровни сигнала по разному нормируются.

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


    1. shadovv76
      18.12.2025 23:04

      Наберите код (звёздочка)3001#12345#* на iPhone и нажмите кнопку "позвонить. Хабр не дает поставить обе звездочки с коде.


      1. vesper-bot
        18.12.2025 23:04

        Хаброхак: используйте бэкслэш \* и будет вам щщастье.


    1. jar_ohty
      18.12.2025 23:04

      Если б этот стандартный S-метр был столь стандартным даже на КВ и УКВ технике, где он таки есть! Начиная с того, что 9 баллов может на УКВ означать как 5, так и 50 микровольт (первое по стандарту для УКВ -- второе как на КВ), заканчивая тем, что у Icom балл -- это не 6 дБ, а 3. А уж в портативках S-метры показывают кто во что горазд.


      1. Astroscope
        18.12.2025 23:04

        Icom пытается быть Apple. Поясню на примере. Примерно во всех портативных р/ст есть функция VOX. Даже в китайских говнофенгах по $20 в розницу, пусть и коряво реализованная (не имеет настроек длительности), но есть и работает. Есть такая функция и в Icom, например в ID-52 - цену гуглите сами, если интересно. Но вот незадача, чтобы включить VOX в Icom (вы уже нагуглили цену?), вам нужно купить специальный фирменный кабель-переходник, пассивный, без ничего, за $30 в розницу плюс доставка. Но это еще не все. Ваш новенький ID-52 продается с тонкой батареей, которой хватает на несколько часов, и зарядным устройством, которое даже эту батарею заряжает вечность. То есть вам по сути необходимо сразу докупить еще один, адекватный на этот раз, аккумулятор, и еще одно, менее медленное, зарядное устройство. В $100 вряд ли вложитесь, и это не считая кабеля за $30. Естественно, что с таким подходом у них и S-метр может быть не стандартным, а как им заблагорассудится, и все остальное.


    1. TimsTims
      18.12.2025 23:04

      Это невероятно удобная для человека шкала оценки уровня сигнала

      Для инженера - возможно. Для 99% пользователей Айфона - нет. Возьмите первого встречного человека с айфоном я спросите его: Будет ли вам невероятно удобно оценивать уровень сигнала в -120db , или вам лучше нарисовать полоски? Большинство скажет полоски)

      Стандартный S-метр состоит из девятибальной шкалы

      Ну, и вы должны понимать, что корпорация Apple никогда не допустит внедрения стандартной шкалы измерения. Она внедрила бы i-метр, там было бы 4 шкалы, а не 9, она бы его по-любому запатентовала бы (чтобы хвастаться, в айфонах 4 i-метра, а Самсунг даже его не изобрели!), и выпускала бы i-метр совместимые чехольчики по $50 повышающие значения i-метров в вашем телефоне. А каждая следующая модель Айфона изначально шла бы с +1 i-метром из коробки.


      1. Astroscope
        18.12.2025 23:04

        Для инженера - возможно. Для 99% пользователей Айфона - нет.

        Хм... Похоже, вы правы. По крайней мере я инженер и, возможно вследствие этого, не пользователь Apple.

        Возьмите первого встречного человека с айфоном я спросите его: Будет ли вам невероятно удобно оценивать уровень сигнала в -120db , или вам лучше нарисовать полоски? Большинство скажет полоски)

        Большинство начнет что-то мычать про фан и экспириенс. Не знаю точно, что это такое, но точно знаю, что кроме айфона такого нет нигде.

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

        Разумеется, здесь вы снова правы.

        Она внедрила бы i-метр, там было бы 4 шкалы, а не 9, она бы его по-любому запатентовала бы (чтобы хвастаться, в айфонах 4 i-метра, а Самсунг даже его не изобрели!), и выпускала бы i-метр совместимые чехольчики по $50 повышающие значения i-метров в вашем телефоне.

        И, что характерно, это было бы чистой правдой - не маркетинговым приемом, направленным на оболванивание малограмотной аудитории, а именно тем, о чем вы говорите - буквально и непосредственно i-метром, совершенно недоступной никакому другому производителю функцией, которую многие постарались бы скопировать, но так и не смогли бы, даже Samsung, точнее они как раз в первую очередь не смогли бы. А это, разумеется, оправдывает стоимость что айфона, что аксессуаров, а что кто-то там нищеброд и не может себе позволить купить божественный айфон с i-метром, так это и понятно, техника Apple - она илитная™.

        А каждая следующая модель Айфона изначально шла бы с +1 i-метром из коробки.

        Инновации™.


  1. tklim
    18.12.2025 23:04

    Зачем сюда пихать эти низкосортные статьи с кликбейтом?

    Если в заголовке про 20 байт, которые изменили мир, то обычно это про 20 байт хитрого кода, который "стоит" больше этих самых байт.

    И тут патч не на 20 байт, а на 5, если что.


    1. HardWrMan
      18.12.2025 23:04

      Больше. Но почему-то акцент именно на 5. Возможно, там просто несколько таблиц для разных диапазонов, просто показана одна.

      20 это 4 по 5. Т.е., условные 2G и 3G и ещё 2 поддиапазона. Наверное.

      PS А ещё перед таблицей выше различие 00 и FF. Возможно, 20 относятся только к проблеме показометра. Короче, обычный кликбейт.


      1. nin-jin
        18.12.2025 23:04

        Там 5 интов, не тупите.


        1. HardWrMan
          18.12.2025 23:04

          Да, но в заголовке - байты. А не инты или дворды. И на пикче специально обведено что различия есть даже за пределами выделенной области с 5 байтами отличий (расширенные знаки интов там одинаковые).


          1. LinkToOS
            18.12.2025 23:04

            Да, но в заголовке - байты.

            Потому что в тексте оригинальной статьи так написано.


            1. HardWrMan
              18.12.2025 23:04

              И вы тоже игнорируете подчёркнутое красным на фото в моём сообщении выше? Заметьте, те же самые значения. Если бы предоставили дамп длиннее, то мы бы скорее всего увидели несколько "копий" таких таблиц.


              1. LinkToOS
                18.12.2025 23:04

                Патчем очевидно являлось не прямое редактирование бинарника, а изменение в исходном коде. Значит были заменены константы, в формате DWORD, а не байты.

                Автор оригинала написал "20 байт". Что именно он имел ввиду - 20 констант, или участок кода в 20 байт, это надо смотреть в оригинале.

                Хотя на суть это не влияет. "20 байт" это по сути синоним "очень мало". Apple решила проблему небольшим изменением в исходном коде. В чем здесь собственно кликбейтность?


      1. LinkToOS
        18.12.2025 23:04

        Возможно, 20 относятся только к проблеме показометра.

        Да, именно об этой проблеме шла речь в статье. И ее причины могли быть разные, включая сложно исправляемые аппаратные ошибки. А оказалось что все дело в нескольких нерационально подобранных константах.

        5 или 20, это сути не меняет. Все равно изменение пустяковое. Никакого вызывающего кликбейта в данном случае нет.


    1. LinkToOS
      18.12.2025 23:04

      Если в заголовке про 20 байт, которые изменили мир, то обычно это про 20 байт хитрого кода, который "стоит" больше этих самых байт.

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

      И тут патч не на 20 байт, а на 5, если что.

      Ну значит автор "недокликбейтил". Можно было написать что проблему решили "изменив всего лишь 5 байт". Но тогда некоторые возмутились бы, и сказали что изменили на самом деле гораздо больше - 5 DWORD, а не 5 байт. А заголовок про "всего лишь 5 байт" кликбейтный.


      1. HardWrMan
        18.12.2025 23:04

        Повторюсь, что судя по "ушам" на фото там скорее всего как раз 20 DWORD/INT32, что выливается в 4 таблицы по 5 значений. По одной таблице на каждый диапазон (вы же в курсе, что у разных диапазонов разные частоты и чувствительность?). А так из-за маленьких значений 3 байта в каждом INT32 не меняется (и являются просто расширением знака минуса FF FF FF), то 20 байт соответствует истине. Кто-ж знал, что так совпадёт размерность и многие начнут путать?


  1. ImagineTables
    18.12.2025 23:04

    При преобразовании байтов в децибел-милливатты (дБм) мы получаем -115, -111, -107, -103 и -99 (чем ближе к нулю, тем лучше сигнал). Например, для отображения трёх полосок значение должно быть -107 или больше.

    Забавно. Во времена iPhone 4 я как раз занимался тем, что отправлял Hayes-команды (+CSQ), пересчитывая результат в dBm по знаменитой формуле 2 * x - 113 и далее в число полосочек. Ну так вот, в мануале к моему модему шла такая таблица:

    -120 is unacceptable
    -100 is poor but usable
    -80 is acceptable/decent
    -60 is good
    -40 is excellent
    

    А в мануале к Blackberry, куда я заглянул для сравнения, такая:

    1 Bar   -102 to -120 dBm
    2 Bars  -93 to -101 dBm
    3 Bars  -87 to -92 dBm
    4 Bars  -78 to -86 dBm
    5 Bars  -40 to -77 dBm
    

    Яблоки и тут решили calc think different?


    1. sadPacman
      18.12.2025 23:04

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


  1. anonymous
    18.12.2025 23:04


    1. vanxant
      18.12.2025 23:04

      зато у них показывало 5 палок там, где у остальных 3. Очередное доказательство крутизны айфона)


    1. romanetz_omsk
      18.12.2025 23:04

      -40 - это надо прям под вышкой стоять - скорость там в сотнях мегабит будет измеряться
      -120 - единицы килобит вплоть до -102 - около мегабита
      (в GPS DSSS принцип работы и низкая битовая скорость дают возможность до -146 дБм принимать сигнал в режиме трекинга)
      ну и промежуточные значения дают промежуточные скорости... смотря как ещё этот уровень нормируется
      а так - теорема Шеннона; в принципе, современная электроника к пределу подошла достаточно близко, хорошим считается радиотракт, который 2-3 дБ разницу с теоретическим даёт.


      1. Astroscope
        18.12.2025 23:04

        в GPS DSSS принцип работы и низкая битовая скорость дают возможность до -146 дБм принимать сигнал в режиме трекинга

        Можно и в узкой полосе просто в лоб методично "долбить" повторы для накопления и наращивать FEC - номинально SNR будет отрицательным, но за счет "математики" работать, в каких-то пределах, будет.

        теорема Шеннона

        Не перепрыгнешь никакими ухищрениями.


        1. vanxant
          18.12.2025 23:04

          Дальние космические миссии изначально работают ниже уровня шума. При широкой полосе теорема Шеннона вполне позволяет и такое. Те же Вояджеры вполне работают на технологиях 60-ых годов.


    1. LinkToOS
      18.12.2025 23:04

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


  1. CitizenOfDreams
    18.12.2025 23:04

    Маркетологи: Наш новый телефон goes all the way to eleven везде показывает пять полосок!

    Техподдержка: Милорд, народ умнеет!