Публичный тестовый корпус
Наши заявления о совместимости со сканерами не лучше доказательств, на которых они основаны. Эта страница и есть корпус, входные данные, по которым мы регрессионно тестируем семейства наших кодировщиков, плюс поведение камеры телефона, которое можно проверить самостоятельно, не доверяя нам на слово.
Скачать corpus.zip Набор fixtures JSON + CSV + методология + README. ~4 КБ.
Загрузка версии…
Как использовать корпус
Каждый тестовый вектор находится в /test-vectors/fixtures.json. Один объект JSON на тип с полями ввода и ожидаемыми декодированными подстроками. Загружается в реальном времени с этого сайта, никаких устаревших копий.
Возьмите карту fields любого fixture, введите значения в генератор для этого типа и нажмите «Сгенерировать». Полученный QR-код побитово идентичен тому, что наш CI тестирует в цикле.
Направьте iPhone Camera, Android Camera, Google Lens, промышленный сканер (Zebra, Honeywell, Datalogic) или специализированный считыватель приложений (банковское приложение, аутентификатор) на сгенерированный QR-код. Убедитесь, что декодированный текст содержит каждую подстроку expect для данного fixture.
Если сканер в вашем парке вернёт декодирование, не совпадающее с fixture, создайте задачу. Мы воспроизведём проблему, добавим ваш сканер в публичную матрицу совместимости и (если это ошибка кодировщика) выпустим исправление.
Ожидаемые результаты сканирования
Рендерится из того же набора данных, что и матрица совместимости, и строка «Сканируется на» на каждой странице типа, поэтому эти три источника не могут расходиться. Полный файл fixture на /test-vectors/ содержит 33 записей, по одной на семейство кодировщиков, которое мы регрессионно тестируем; это не одна строка на каждый тип продукта, и мы этого не утверждаем.
| Тип | Входные данные fixture | iPhone Camera | Android Camera | Профессиональный сканер |
|---|---|---|---|---|
| URL | https://example.com/test | Открывает ссылкуA1 | Открывает ссылкуA5 | ДекодируетA8 |
| WiFi | WIFI:S:MyNet;T:WPA;P:...;; | Подключается к сетиA1 | Подключается к сетиA5 | Декодирует payloadA8 |
| WiFi Enterprise (EAP) | WPA2-EAP PEAP identity=alice@corp | iOS 17+, по сообщениямU | Декодирует; подключение зависит от производителяU | Декодирует payloadQ |
| vCard | FN=Alice ORG=Acme ... | Добавить в контактыA1 | Добавить в контактыA5 | Декодирует payloadA8 |
| TOTP | otpauth://totp/...?secret=JBSW... | Читает приложение-аутентификаторA9, A10 | Читает приложение-аутентификаторA9, A10 | Декодирует URIA8 |
| eSIM | LPA:1$rsp.example.com$K2-LM... | iOS 17.4+ подготавливаетA4 | Android 13+ подготавливаетU | Декодирует URIQ |
| Bitcoin (BIP-21) | bitcoin:1A1zP1eP... | Открывает приложение кошелькаQ | Открывает приложение кошелькаQ | Декодирует URIQ |
| SEPA (EPC) | BCD header + name + IBAN + amount | Только сырая строкаQ | Только сырая строкаQ | Декодирует сырую строкуQ |
| Swiss QR-bill | SPC header + IBAN + address + amount | Только сырая строкаQ | Только сырая строкаQ | Декодирует сырую строкуQ |
| Micro QR | Compact payload | Не декодируетV, U | Не декодируетG | Промышленные считывателиZ |
| rMQR | Rectangular payload | Не декодируетU | Не декодируетG | Новые прошивки Zebra, Scandit и CognexZ |
| GS1 Digital Link | https://id.gs1.org/01/09506000134352 | Открывает URLQ | Открывает URLQ | Прошивка POS разбирает AIQ |
| Aztec | Arbitrary payload | Не декодируетA2 | Google Lens, некоторые вариантыA7 | НативноA8 |
| Data Matrix | Arbitrary payload | Не декодируетA2 | Google LensA6 | НативноA8 |
| PDF417 | AAMVA or arbitrary | Не декодируетA2 | Google Lens, нестабильноA7 | НативноA8 |
| AAMVA driver license | @\n\x1e\rANSI 636014100002DL... | iOS 17+, поток с поддержкой удостоверенийA3 | Только приложения с поддержкой удостоверенийU | НативноA8 |
| EAN-13 / UPC-A | 0012345678905 | Не декодируетAp | Google LensG | Любой розничный POSA8 |
| Code 128 | ABC-123 | Не декодируетAp | Google LensG | НативноA8 |
Как читать отметки
- ✓: читает из стандартного приложения камеры, без дополнительного приложения
- ~: читает при условии, указанном в ячейке (конкретное приложение, версия ОС или режим)
- ✗: не декодирует; нужно приложение-сканер или отдельное устройство
Доказательства
- A: our own device test; the number is the row in the attestation log
- Ap: Apple's support page describes the Camera app and Code Scanner as reading QR codes and lists no other symbology
- G: Google Lens decodes the ML Kit barcode formats: Codabar, Code 39, Code 93, Code 128, EAN-8, EAN-13, ITF, UPC-A, UPC-E, Aztec, Data Matrix, PDF417 and QR Code; Micro QR and rMQR are not on the list
- Z: Zebra lists Micro QR and rectangular Micro QR among the DS8100 series' 2D symbologies
- V: Apple's Vision framework decodes Micro QR for third-party apps since iOS 15; that is a developer API, not the Camera app
- Q: a standard QR symbol, so decoding is the attested QR result; the question is what the phone does with the payload
- U: not in our attestation log yet; from vendor documentation or field reports, treat as provisional
Что означает «ожидаемый результат сканирования»
- Декодирует, нативный считыватель камеры телефона возвращает payload без необходимости отдельного приложения.
- Частично, декодирование зависит от конкретного приложения (аутентификатор, кошелёк, банкинг) или конкретной версии ОС.
- Нет декодирования, нативная камера ничего не возвращает. Требуется специализированный сканер или считыватель.
- Маленькие буквы после каждого результата называют доказательство: буква A с числом, это строка журнала аттестации ниже; другие буквы, это документация производителя, перечисленная под каждой таблицей. Буква U означает, что мы ещё не проверяли эту ячейку на собственных устройствах.
Методологические заметки
- Каждый fixture проходит полный цикл. Наш CI генерирует каждый код в безголовом Chromium, декодирует его обратно через API
BarcodeDetectorбраузера и проверяет совпадение подстроки. Зелёный CI означает, что корпус внутренне согласован. - Результаты сканеров в этой таблице получены при ручном тестировании на реальных устройствах. Не синтезированы. iPhone 15 Pro на iOS 18.3, Pixel 8 на Android 14, Zebra DS8100 imager на прошивке CAAACS00-002-R06.
- Мы публикуем отрицательные результаты. Если iPhone Camera отказывается декодировать симбологию (Data Matrix, Aztec, PDF417), в таблице это «Нет декодирования», мы не переименовываем это в «нативный считыватель».
- Корпус версионирован. Когда мы добавляем тип или исправляем ошибку кодировщика, соответствующая запись fixture поставляется в том же коммите. Журнал изменений фиксирует каждое изменение fixture, а corpus.VERSION.txt содержит хеш файла fixture, из которого собран текущий ZIP.
Журнал аттестации парка сканеров
Каждый ручной прогон устройства, датированный. Строки добавляются, когда мы получаем новое оборудование или пользователь сообщает о расхождении; результат никогда не меняется незаметно, для этого создаётся новая строка.
| # | Device | OS / app | Corpus slice | Result | Date | Notes |
|---|---|---|---|---|---|---|
| A1 | iPhone 15 Pro | iOS 18.3, native Camera | All QR fixtures | pass | 2026-04-10 | |
| A2 | iPhone 15 Pro | iOS 18.3, native Camera | Aztec, PDF417, Data Matrix | fail | 2026-04-10 | Ни один не декодирует нативно (ожидаемо, см. /standards/non-qr-2d/) |
| A3 | iPhone 15 Pro | iOS 18.3, native Camera | AAMVA PDF417 | partial | 2026-04-10 | Поток iOS 17+ с поддержкой удостоверений предлагает добавить в Wallet; сырой PDF417 не возвращается |
| A4 | iPhone 15 Pro | iOS 18.3, Wallet | eSIM LPA | pass | 2026-04-12 | Поток добавления eSIM срабатывает корректно |
| A5 | Pixel 8 | Android 14, native Camera | All QR fixtures | pass | 2026-04-10 | |
| A6 | Pixel 8 | Android 14, Google Lens | Data Matrix | pass | 2026-04-10 | |
| A7 | Pixel 8 | Android 14, Google Lens | Aztec, PDF417 | partial | 2026-04-10 | Некоторые варианты декодируются; поддержка нестабильна |
| A8 | Zebra DS8100 | firmware CAAACS00-002-R06 | All 2D + 1D fixtures | pass | 2026-04-11 | Промышленный имиджер, эталонный образец |
| A9 | Google Authenticator | v7.0+ (iOS/Android) | TOTP, HOTP | pass | 2026-04-12 | Только SHA-1, 6 цифр (игнорирует параметры algorithm/digits по де-факто профилю Google) |
| A10 | 1Password | v8 (iOS/Android/macOS) | TOTP, HOTP | pass | 2026-04-12 | Полная поддержка RFC, включая SHA-256, SHA-512, 8 цифр |
Что ожидается
- Предварительно отрисованные артефакты. Текущий ZIP содержит fixtures + методологию + CSV. Будущая версия добавит предварительно отрисованные SVG + PNG каждого fixture, чтобы их можно было напрямую вставить в тестовую оснастку парка сканеров. Ожидает шага безголового браузера во время сборки.
- Аттестация парка сканеров. Датированный журнал устройств опубликован на этой странице и пополняется при каждой проверке нового устройства.
- Верификация третьей стороной. Независимая лаборатория безопасности прогоняет корпус через парк сканеров и публикует подписанную аттестацию. В процессе, заказано; отчёт будет опубликован здесь по получении.
Смотрите также
- /test-vectors/, полный fixture JSON и таблица с поиском.
- /compatibility/, актуальная матрица совместимости сканеров.
- /standards/, справочные страницы по стандартам.
- /print-size/, руководство по физической печати, дополняющее корпус.