有人送你半价
解锁时在应用里输入这个码。它不与你或这部手机绑定。
一部手机,
就是一台真正的仪器。
Signal Collector 持续记录手机所能触及的传感器、无线电和网络数据,直接写入手机——没有云存储,测得的数据不会离开设备。
真实截图 · Pixel 10a
-
运行中的测量。圆环随数据到来显示卫星、网络和传感器。
-
选择测量什么。每个数据源是一行,写明它记录什么。
-
开始、重置和停止,上方是时长、距离和记录条数。
-
面板底部:每个数据源在做什么,以及将要离开手机的文件。
-
设置:投送到你自己的服务器、单位,以及停止之后发生什么。
MVP 范围
走一趟。
拿到完整的环境。
- 01GPS、GNSS 和设备传感器
- 02蜂窝网络:LTE / 5G / 3G / 2G
- 03Wi‑Fi、Bluetooth 和网络环境
- 04在 Wi‑Fi 和蜂窝网络上的连续互联网测绘
用来做什么
每一个场景
最后都落到一个文件里。
衡量一台仪器的不是它的数据源清单,而是它能回答什么问题。以下是本应用为之而生的十二个场景中的六个——每一个都是一次走查,末尾都有一个文件。
会议室里的信号盲点
把手机放进口袋走一遍楼层,每到一个门口说一句备注。得到的是逐秒的吞吐量、手机实际连接的 AP,以及 一个具体的房间,而不是一场争论 ——在两个部门之间。
不用工程车的路测
两张 SIM 同时扫描,GPS 一秒一次,手机锁在仪表台上。制式、Cell ID 或 PCI 的每一次变化都记为一个事件,因此 切换点可以精确到米.
GPS 派不上用场的勘测
在仓库里,天空就是屋顶。用应用自带的取景器给每条通道拍一张照片作为标记,同时采集 AP、MLO 链路和 RTT 距离—— 在买下第一个新 AP 之前就有一张覆盖图.
自己上报的传感器
楼里几十个 BLE 温度计,一个都没有配对。走过去,它们的温度、湿度和电池电压就会 带着名称、以 SI 单位到达,与它们来源的原始字节并排放在一起。
给房东看的证据
走十分钟,就有一个带时间戳、位置、信号强度和房间照片的文件。“到处信号都很好”于是变成 一句可以核对的说法.
不接受云服务的客户
照常测量,然后投送到你自己的 S3、WebDAV 或 SFTP——或者直接交付一个文件。照片和语音备注从不进入手机相册,因此 保密协议依然签得下去.
工作进度,
看得见。
1.5.1 版在每一次安装中都带上全部十二种语言,让漫长的导出或重置过程看得见,并新增了活页本,用来记下没有测量运行时标记的点、拍下的照片和做过的测试。
真正在里面的语言
Google Play 过去只投送手机在安装时拥有的语言,因此按应用选择语言时列出的捷克语等选项 背后其实没有任何字符串。现在全部十二种译文都随每一次安装一起提供。
按键上的彗星
在大型测量上,下载、分享和重置需要几秒到几分钟。现在有一颗彗星沿着按键边缘绕行,尾巴随已完成的部分变长,下方还有一行实时文字说明 已经完成多少、已经运行多久,以及大约还剩多久。可用空间在写入开始之前就会显示——紧张时为琥珀色,导出放不下时为红色。
一本活页本
测量点、照片、语音备注、一次性互联网测试和一轮 Wi-Fi 吞吐量循环都不再需要先按“开始”。在没有测量运行时,它们会进入一份单独的记录 不启动采集器、不占用唤醒锁,也不计入免费时长 ——它有自己的卡片、自己的分享文件和自己的清空。
从图标分享,使用系统控件
测量停止之后长按应用图标, “分享”就在“开始”旁边;它会打开应用并立即开始导出。开关、文本框、选项和提示现在都是标准的 Android 控件——按键和仪器本身保持原样。
Nothing lost
on the way out.
Version 1.5.0 adds no new key. It goes over everything that could cost a measurement its data — a Reset under a stray thumb, a point number used twice, an export torn in half by a second export — and closes each one, with a test that keeps it closed.
A Reset that asks first
The first touch on Reset deletes nothing. It opens a dialog that names what would go: the measurements, the photos and the voice notes. Cancel keeps everything; only a confirmation wipes. A thumb that brushes the key in a corridor no longer ends a day's work.
Points keep their numbers
Stop a measurement, start it again, mark a point: it gets the next number, not a repeat of one already in the file. The same holds for photo and voice marks, so two records never share one point index and the export stays unambiguous.
An export in one piece
Export takes a single atomic snapshot of the database, and two export requests at once queue instead of tearing one archive. The manifest is computed from the bytes that actually went into the archive, with a SHA-256 for every file. You get a readable archive or a plain error — never a silent torso.
Failures that stay failures
When the writer loses a batch, Stop cannot turn the run into a success. Encrypted Eddystone telemetry stops showing up as plausible plain numbers. Dual-SIM attribution, WPA3-only networks, probe time budgets and the microphone handoff are hardened, and the expandable cards tell TalkBack what they are.
Started without
opening it.
Version 1.4.0 puts Start and Stop where the hand already is — the quick settings shade and the app icon — and lets a marked point carry a photo and a voice, so what a corridor looked like leaves together with the numbers.
A tile in the shade
Start and Stop in the quick settings shade, within reach from any app and over the lock screen, where a widget cannot go. Over a secured lock it unlocks first — what it starts is location with a microphone. It measures with whatever the app measured with last, so one key never starts two different measurements.
Shortcuts under the icon
A long press on the app icon is the only control that is always on the home screen, so it offers the one thing that makes sense now: Start while nothing runs, Stop and Mark point once it does. The gate the launcher walks through is locked with a token no other app can read.
A photo and a voice at the point
A marked point can carry a photo taken through the app's own viewfinder, or a spoken note of up to ten minutes. The media never touch the phone gallery: they sit in the app's private storage and leave only through an export, which becomes a single tar.gz with a SHA-256 for every file.
Settings you can take with you
A new phone set up like the old one, without walking through two dozen sources by hand. Passwords go into the backup only if you ask, and only after a fingerprint, a face or the screen lock. The licence and the free hour never travel in it.
The data, open
to be looked at.
Version 1.3.0 puts the keys on the home screen, opens the measured rows inside the app, lets the controls be carried to the edge of the display, and starts reading sensors that are not in the phone at all.
Keys on the home screen
Three widgets that need no app opened first: a point mark with your own labels, a key that starts a saved set of sources, and a tile showing what one source is collecting. Each key keeps its own copy of what it starts, so a preset switched in the app later changes nothing on the home screen.
Rows you can read on the spot
Browse records opens the raw rows of the last measurement: filter by type and time, search the payload, and a sequence number that holds across the whole file. Marking and hiding is crossing out in the printout — the stored measurement and the export are untouched.
Keys carried to the edge
Hold Start, Reset or Stop and drag it to the bottom edge of the display; there it stays put while you scroll anywhere. Let go outside a berth and the key swings back with an overshoot as big as the distance it travelled.
Sensors that are not in the phone
BTHome, Ruuvi, ATC and pvvx, Eddystone telemetry. Read straight from the Bluetooth scan that is already running: nothing to pair, nothing to connect, no new permission. The values land named and in SI units, beside the bytes they came from.
A panel you can
put your thumb on.
Version 1.2.0 turns the screens into the front panel of an instrument. Switches light up as a whole, keys sink into their base under the thumb, and colour is left to mean a reading — everything else is grey.
Switches that light up as one
The switch is a rocker from a switchboard, cast from translucent red plastic. Switched on, the whole rocker glows instead of a dot in the corner; the I/O marking stays readable in both positions and the rocker always leans to the side that applies.
Keys that stand on a base
Start, stop and the export keys sit on their own base and a press sinks them into it, the same as the buttons here on the site. Haptics answer in the same order: a click going down, a quieter clack coming back.
Grey panel, colour that means something
The panel is neutral grey, so every colour on it is a reading: green for controls and for running, amber for warnings, red for stopping. A screen grid with divisions and dashed axes lies under the content.
Half the download
The release build is shrunk and optimised by R8, which took the bundle from 8.3 MB down to 4.3 MB, and the outdated library Google Play kept reporting is raised through the services that pull it in.
Edges instead
of pebbles.
Version 1.1.0 stops the app looking like a sketch. Shapes go to the right angle, measured values get a dial typeface, and selections become rows that say what each option means.
Sharp edges and a dial typeface
Cards, fields and buttons keep at most two pixels of rounding, and measured values are set in a face where every digit is the same width — a column of numbers no longer dances under the eye. Spacing sits on a four-point grid.
Rows with a description, not pills
Technologies, presets and targets are rows with the current value on the right. On a source with parameters, tapping the row switches it and the chevron opens its settings — a pill could not tell those two apart.
Units say what they changed
Switching units used to close the menu and leave no trace. The dialog now says what it switched to, where it shows up, and that the export stays in metres.
Out of testing,
into the world.
Version 1.0.0 is the first public release. The instrument itself is unchanged; what is new is that anyone can install it, try it for an hour before paying, and read the screens in their own language.
An hour of measuring, on the house
Every phone gets one hour of measuring time a year, split across as many measurements as you like — the tool is meant to be tried in the field, not from a screenshot. The remaining time and the date it comes back are shown right above the Start button.
Bought once, not rented
Unlocking is a single in-app purchase at the Google Play price for your country. No subscription, no expiry, and it follows the account onto every other phone you sign in to.
Permissions explained before they are asked
The first launch no longer opens with a stack of system dialogs. A screen says what each permission is for — and that location is what Android ties cells and Wi-Fi to — and the system asks only after you press the button.
Screens in your language
The app and this site speak a whole range of languages, chosen by the phone or set for Signal Collector alone. The export never follows: it stays in SI, UTC and English column names, so two files from two countries are still one dataset.
Ready for the world
and for the Store.
Version 0.10.0 completes the move to the production identity, adds full English and US units, closes the release blockers and gives the instrument a calmer, more precise visual system — without changing how it is operated.
English and Czech, neither one a bolt-on
Text is no longer produced inside the collection layer, and errors are no longer recognised by their wording. The language can be switched for the app alone, and an English phone never gets half-Czech screens. Numbers follow the locale; the export deliberately stays stable.
Metres, feet and miles
Units can follow the phone automatically, or be forced to metric or imperial in the settings. Only the screen and the notification are converted; the database and the scientific export always stay in SI.
A release with no silent traps
The production bundle requires the upload key, targets Android 16 / API 36 and carries the final identity app.signalcollector. Corrected permission checks close the crashes that followed a revoked permission, and the updated SSH client brings security fixes.
Around the globe
runs time itself.
Inside the globe sits only what has a bearing. Quantities without direction got their own bands outside the horizon, the operator composes the instrument themselves — and measured data can finally leave the phone by a route other than the share sheet.
Four quantities in the ring
Noise, temperature, pressure and now light. The angle along a band is time, not bearing — one minute split into seconds, so the head of the trace sweeps like a second hand with a gap behind it where values have aged out of the minute.
You compose the view
The middle button switches off whatever the cursor rests on. A switched-off row stays in the list with its value, only struck through: the filter changes the picture, not the measurement.
Data can leave on their own
The gear icon gained S3, WebDAV and SFTP destinations. Passwords are encrypted with a key from the Android Keystore, an address without https is rejected, and the server key fingerprint is verified.
You can see
where the signal came from.
The pulsing background circle gave way to a globe of the sky. Satellites sit where they actually are — and anything without a direction lights the whole ring instead of inventing a bearing.
Satellites in their real place
Android reports azimuth and elevation for GNSS only, and the app has recorded them since day one — there was simply nowhere to see them. Colour separates the constellation, size and brightness carry C/N0, a filled dot counts towards the fix. Verified on a Pixel 10a: 20 satellites from four constellations, 14 in the fix.
What has no bearing lights the whole horizon
Wi‑Fi gives strength, not azimuth; Bluetooth gives none either, and cells report only their identity. Samples without direction therefore ripple the entire ring rather than a sector — a sector would claim the signal came from there. The ripples also rotate, so not even the tallest of them points anywhere.
It tilts with the phone, not just turns
Lying face up it looks into the zenith, held upright it looks at the horizon — and what was near the horizon moves behind the phone. Collapsed, the card leaves a flat compass with a needle to north: calm, no flicker.
Scrolling that
never jumps away.
While hiding, the header used to take part of the gesture for itself and the content was re-measured under the finger. Now it only observes the scroll and takes nothing from it.
Content follows the finger the whole time
The finger used to drag while the page stood still until the header had collapsed — and on reversing direction it expanded again first. The header now sits above the content and takes no part in scrolling; it simply moves away, taking the status row with it.
Nothing is re-measured mid-scroll
It hides by offsetting at draw time, not by changing its height, so the content inset stays constant. Measured on a Pixel 10a: 0.30 % janky frames and no missed vsync across ten drags over the threshold where the header switches.
It returns the moment you pull down
Direction decides, not position — you do not have to scroll back to the top to get the header. Because it also returns mid-page, it got an opaque backdrop; otherwise the title would sit on top of the card text.
A scan that does not
pretend to be a measurement.
Android throttles Wi‑Fi scans and keeps handing back the same result meanwhile. The app used to write it down again and again — and the export then claimed a measurement every five seconds.
A repeated scan is recognisable
Every attempt records the state FRESH, THROTTLED or UNCHANGED together with the age of the result; per-AP records are written only for a fresh scan. Without that, the data could not tell you where measuring actually happened — and for a coverage map, that is the whole difference.
Six times denser sampling
Measured on a Pixel 10a: with throttling on, 70 rejected attempts against 45 fresh scans; with it off, zero rejections and a fresh scan every 4.2 s at the median. At walking pace that is one sample every 6 metres instead of every 40.
Points on a floor plan, throughput per network
GPS gives no position indoors, so a place marker was added — you stop, mark a point, walk on. And a new optional source visits the Wi‑Fi networks you list one by one and measures their actual throughput, not just their signal.
Every second
gets its own row.
Continuous internet measurement no longer leaves holes in the timeline. When measuring is impossible, the reason is written down — and a Wi‑Fi network that is gone is recognised at once, not ten minutes later.
A second without a measurement is still a row
A capacity burst or a manual speed test holds the link for several seconds, and the data used to be left with a gap — a full minute in the worst case. Now it says BUSY, naming who held the link. A missing second cannot be told apart from a failed measurement; a written one can.
A dead Wi‑Fi is recognised immediately
After losing Wi‑Fi, the app stayed bound to a network that no longer existed, and over six hundred samples claimed the internet was not answering. The handle is now dropped as soon as the system stops knowing about it, and the app waits for a new Wi‑Fi with internet.
A sample knows which Wi‑Fi it came from
SSID and BSSID were added to the quality record — until now only the direct Wi‑Fi source knew them, and measured quality could not be tied to a network. Android placeholder values (RSSI −127, frequency −1) are also left empty instead of looking like readings.
From your pocket you can tell
how the run is going.
The notification for a running measurement no longer just says “collecting data”. It shows the duration and the record count, refreshes every five seconds and speaks up when data stops being stored.
Time and count in the notification
On a dark screen you see 00:02:43 · 29,880 records instead of a terse line. The duration is pure collection time, the same as on the status card — a pause between Stop and Start does not count towards it.
Data loss reports itself
As soon as samples are dropped, their count joins the line, and the title changes when writing stalls or fails. It is the one thing worth reporting before the operator looks at the screen again.
Ready for Live Updates
The notification declares itself to the system as a Live Update — Android's counterpart to the iOS Dynamic Island, a strip inside the status bar itself. On the Android 16 build under test it does not render yet, because that part of the system is not switched on; the app is waiting for it, ready.
The colour tells you
what was just captured.
A wave crosses the background every time something is written — and now in a colour that says where the sample came from. From across the desk you can see not only that data is flowing, but what is being heard right now.
A colour per source
Green is sensors, blue networks, amber GNSS and violet Bluetooth. Sensors run at 50 ms, so green is a continuous swell with the other colours flashing through it — a blue flash is a network scan, a violet one Bluetooth.
The wave keeps off the text
It used to be drawn over the content as well, tinting the title in the header, the messages and the status row. Now it sits at the very bottom: it passes under the header but leaves the type alone.
Content runs under the bars
When the header hides on scroll, the cards continue under the status bar instead of stopping at it and leaving an empty strip above. The wave shows through under the bars too.
Start no longer overwrites
work in progress.
Start resumes the last measurement instead of quietly replacing it with a new one. Beyond that, the phone lets your pocket know when the connection drops or data stops being stored.
Start continues, it does not restart
Until now every Start opened a new measurement and the previous one became unreachable — it stayed in the phone, but only the new one could be exported. Now it continues, and a clean slate comes only from Reset, which deletes the previous measurement.
A pause does not count towards the duration
The duration is the sum of the time actually spent collecting, not the span from the first Start to the last Stop — for a run interrupted overnight that would claim fifteen hours of collection. In the export it is running_ms.
Interruptions are in the data
Every stop and every resume adds its own session record with a timestamp. The data therefore shows when collection ran and when it waited, so a pause is not mistaken for a hole in coverage.
A buzz at a hole in coverage
Losing the connection is a soft thud, regaining it two light taps, a failed write three firm knocks. The phone is in your pocket while you walk, and these are the events the screen cannot tell you about. Every buzz goes into the data as haptic, so a window can be cut around the vibration.
The counter runs live
The count is no longer sampled. At two thousand records per second it used to jump by more than five hundred; now it flows, and only the digits slow enough to read are animated. The figures have fixed slots and sit on the baseline.
A panel instead of a form
Start, Reset and Stop are solid colour fields — an unavailable switch turns translucent but keeps its colour. Export got its own plate with a label on which the size of the pending file grows, and a green wave crosses the background with every written sample.
How much ground
we actually covered.
This version adds distance walked next to the duration, in a way that does not credit metres to a phone lying on a desk. Beyond that, the capacity burst shows its progress and technology selection is driven by presets.
Distance walked, in metres
The status card shows Distance instead of a static source count. The value is stored with the session, so a finished measurement still shows it after an app restart, and in the export it is distance_m.
Metres, not GPS noise
A walker covers about 1.4 m between one-second fixes, while the uncertainty of a single fix is usually larger. Distance is therefore not measured between neighbours but by moving an anchor once it passes the threshold max(3 m, accuracy).
Location accuracy on show
The accuracy of the last fix sits under the metrics. When the position is too coarse to count towards distance, the card says so outright, so a number that will not move has an explanation.
The capacity burst shows its progress
A new record for the start of a burst puts its beginning into the data, not only its result. Meanwhile the UI runs a countdown next to the transport, and a burst interrupted by Stop is not left hanging.
Technology presets
“All” and “Clear all” became a single switch, with Default in front of it. The app recognises hand-tuned sensor values, asks before overwriting them and offers to keep them as the Custom preset.
Legible messages
A dark treatment tinted by message type, dismissible by dragging down. An error stays on screen for 15 seconds, an ordinary notice disappears after four.
Internet mapping
while moving through a building.
Continuous transfer mapping got its own card ahead of Start, a heartbeat began watching collection from the inside, and a code audit cleaned up the bindings to Android callbacks.
A card of its own for mapping
A separate card keeps continuous mapping apart from the one-off speed test. It can measure Wi‑Fi, cellular data or both transports at once over a specific Android Network.
A data estimate up front
The interface shows the upper bound before you start: at most 204 MB per 30 minutes for one transport and 407 MB for both.
A heartbeat over collection
A running check of the collectors, the writer and the write queue. The session then distinguishes an ordinary Stop, a writer failure and an interruption after the process died.
The export admits its gaps
The header carries the last stored timestamp, the trailing gap and the counts of accepted, written and dropped samples.
Audited callbacks
Registrations for GPS, GNSS, NMEA and navigation messages are visible in the export itself. Bluetooth Classic stores the states of the discovery cycle as well as the devices actually found.
Fixes from the code audit
The duration of a finished measurement is computed from stored timestamps, stopping the mapping leaves no NetworkCallback hanging, and sensors deliver data on their own thread.
Maintenance that
stops dropping samples.
No new measurement feature. A version born from a code audit, fixing the reliability of collection, writing and export, and moving the format to V3.
Dropped samples on show
When writing falls behind, the count appears in the app and goes into the header as dropped_samples. Samples used to vanish unannounced; ending a measurement no longer loses the last of them either.
Ranges hold
A setting outside the allowed range is pulled back into it, so a zero interval no longer spins a scan with no pause.
A disabled Bluetooth is recognised
With the adapter off, the sources are not marked as measured and ADAPTER_DISABLED goes into the export instead of a blank.
Collection off the main thread
The GNSS, location, Wi‑Fi RTT and cellular callbacks run aside, so raw GNSS no longer slows the controls. The microphone is released only after the read completes.
Format V3
SIGNAL_COLLECTOR_TXT_V3 adds the dropped_samples header and drops the source_timestamp_ns column, which only duplicated elapsed_realtime_ns.
Schema 2 without losses
The database moves by migration and existing measurements survive. Temporary files created for sharing are cleaned up, so the cache no longer grows by a whole measurement.
Transfer quality,
measured continuously.
Alongside the one-off speed test there is now a per-second stream of samples of real download, upload and RTT — bound to a specific network and enriched with radio context.
A sample every second
The measurement runs from Start to Stop and produces roughly one network_quality_sample per second.
What a sample holds
A 64 KiB download, an 8 KiB upload and three small HTTPS RTT probes. The output carries the real transfer times, short-term throughput, RTT min/avg/max, jitter, errors and timeouts.
Capacity burst
Every 30 seconds a network_capacity_probe is produced with a 1 MiB download and a 128 KiB upload.
Forced transport
The test can be sent over a specific Wi‑Fi or cellular Android Network, even when both are available at once.
Radio and location with the sample
Every sample carries the last Wi‑Fi or cellular radio context and the last known location, including its age.
Quality, not a record
The small samples are labelled as measurements of quality over time, not of maximum internet speed. The server layer supports the CLOUDFLARE, CUSTOM and LOCAL modes.
Controls that
stay where they are.
A small interface release. Actions no longer move with the state of the measurement, the top bar gives room to the content, and a message can be dismissed when it is in the way.
Download and Share stay put
The buttons keep their place. Without a finished measurement they are dimmed and inactive, not hidden.
A vanishing top bar
It hides when you scroll down and comes back when you scroll up.
Recommend from the bar
Prepares a new e‑mail with no recipient filled in, carrying a subject, a message and links to the app.
Dismissible messages
Status notices are a bottom message that can be closed; otherwise they disappear on their own after a longer interval.
The storage note moved down
The note about local data storage now sits at the very bottom, visually subdued.
Active scan
and a measured speed test.
This version introduces an experimental active cellular scan with an exact reason for refusal, and a full speed test bound to the transport actually chosen.
Active scan events
Unambiguous ACTIVE_NETWORK_SCAN_REQUESTED, STARTED, RESULT, COMPLETE and FAILED instead of guessing support from the phone brand.
The exact reason for refusal
A failed scan stores the numeric code, the exception type, the message, the carrier privileges state and the state of the MODIFY_PHONE_STATE permission.
Kept apart from passive cells
The result carries scan_mode=ACTIVE_NETWORK_SCAN and only the operator Android supplied; an unknown one stays UNKNOWN.
A test over the chosen transport
Manually over MOBILE, WIFI or sequentially BOTH, with the traffic genuinely bound to the requested Android Network. The options offered follow the validated networks available.
A complete test summary
speed_test_result carries download and upload in Mb/s, bytes and times, the minimum, mean, median, maximum and p95 RTT, jitter, packet loss, errors and the server — together with the last cell or Wi‑Fi context.
Collection that survives
The measurement continues in the background through a foreground service, preferences survive a restart, and from an estimated 10 MB upwards the export preselects GZIP.
安装
只通过
Google Play 安装。
- 1
从 Google Play 安装——不需要邀请、不需要测试者名单、不需要等待。
- 2
每年最多可以免费测量一小时。
- 3
当这一小时不够用时,可以在应用内解锁无限测量。
Google Play 是唯一的分发渠道:它为更新链签名,任何地方都不提供直接下载的 APK。应用本身运行时不需要我们的账号,也不需要我们的服务器。
试用、价格与支持
每年一小时,
让你拿定主意。
现场仪器无法靠截图来判断,因此 Signal Collector 每年给每部手机一小时测量时长——足够走完一条路线、看着圆环填满并打开导出文件。这一小时按测量时长计算,而不是按次数,因此可以分在几天、几个地点使用。用完之后,解锁是一次性的应用内购买,价格按你所在国家或地区的 Google Play 定价:没有订阅,没有续费日期,并且会带到用同一账号登录的每一部手机上。
反馈通过 Google Play 的评价进行;每一条新评价都会在一天之内被读到、转成问题并得到答复,修复随下一次更新发布。付费应用没有广告、没有分析统计,测量过程中也没有任何第三方 SDK——开发由售价支撑。
应用实际采集什么
从物理传感器
到你周围的网络。
每个数据源都可以在测量之前单独开关,部分技术还可以设置间隔。
蜂窝网络
服务小区与邻区、LTE/NR/3G/2G 参数、注册变化以及实验性主动扫描。
GNSS 与位置
1 Hz 的 GPS、卫星、GNSS 原始观测、时钟、AGC、导航电文、NMEA 和天线信息。
Wi‑Fi 与 RTT
当前连接、附近的 AP、Wi‑Fi 7 MLO、能力集,以及到支持的接入点的 RTT/FTM 测距。
Bluetooth
经典设备发现与 BLE 广播数据,包括厂商数据和服务数据。
传感器与噪声
运动、磁场、气压、光线、距离、旋转矢量,以及参考性的 dBFS 电平,不存储任何音频。
网络与传输
逐秒采集真实的下载、上传、RTT、抖动和超时,30 秒的容量突发测试,并可同时绑定到指定的 Wi‑Fi 和蜂窝网络。
SIM 与 eSIM
卡槽、运营商、MCC/MNC、漫游,以及哪张卡承载数据——小区本身指明的是发射端,而不是谁在观测。ICCID 和 EID 都不记录:它们是长期不变的订阅号码,连换手机都不会改变。
外部传感器
不在手机里的
传感器。
手机测量它能触及的东西。墙上的探头、线缆另一端的仪表、屋顶上的接收机——这些必须通过别的途径进来。进来的途径有四条,第一条已经可用。
会广播的传感器 · 现已可用
BTHome、Ruuvi、ATC 与 pvvx、Eddystone 遥测。无需配对,也无需连接:传感器把读数喊进房间,正在运行的扫描就听见了。温度、湿度、气压、CO₂、颗粒物、电压——带着名称、以 SI 单位,写在与其他一切相同的文件里。
Bluetooth LE 配置文件 · 计划中
Environmental Sensing 会自述它测的是什么,因此一台从没听说过的仪表也能连同单位一起读出。旁边还有标准配置文件——电池、体温计、位置——以及 Nordic UART 服务,自制探头通常就用它说话。
线缆上的串口 · 计划中
CDC-ACM、FTDI、CP210x、PL2303、CH340。这五类芯片几乎覆盖了所有插上 USB 又不是磁盘的设备:Arduino 和 ESP32 开发板、u-blox 接收机、频谱分析仪,以及用 SCPI 应答的仪表。
本地网络上的设备 · 计划中
通过 mDNS 发现,通过 HTTP 或纯 TCP 流读取。请求绑定在 Wi-Fi 网络上,因此不会从移动数据出去,也不会在通往隔壁房间那台机器的路上迷路。
不作任何猜测。传感器自己标记为无效的读数会被略去,而不是写成一个数字;加密的数据记为加密,而不是解成臆造的内容;应用不认识的格式则以原始字节留在文件里。所有键都列在 数据字典.
应用之外的控制
不必先打开应用
就能按下的按键。
现场测量往往一只手拿着手机,另一只手忙别的。因此每一个要紧的控制在应用之外都有位置,而且它们发出的指令与屏幕上完全一样。
测量面板
一个小部件,启动它内部保存的数据源组合和间隔。运行时它会显示状态、带上测量的数字,再点一次会先询问再停止。这个按键保留自己那份启动内容的副本,因此之后在应用中切换预设,不会悄悄改变桌面测量的内容。
标记点
最多四个你自己的标签并排——门口、拐角、窗口各点一下,立即写入该点。没有测量运行时,这个按键会一次完成开始测量和标记点。
数据源磁贴
把一个数据源显示为一个大数字:范围内的接入点、参与定位的卫星、响度。没有测量运行时点一下,会只用这个数据源开始一次测量。
数据源读数
最多六个数据源,每行一个,按你挑选的顺序排列——一眼读完,不必去找。
快捷设置中的磁贴
在任何应用中以及锁屏上开始和停止。它使用应用上次测量时的配置。在有安全锁的锁屏上,它会先要求解锁手机:启动的毕竟是带麦克风的定位。
图标下的快捷方式
长按应用图标,在没有测量时给出“开始”,测量进行时给出“停止”和“标记点”。这样标记的点没有标签——标签在小部件按键上,那里放得下。
通知
测量时它带有时长、记录条数和步行距离,下方是“标记点”和“停止”。在没有测量运行的整段时间里,“开始”都可以留在通知栏中,这样分段进行的测量就不必每次都去找应用。
按键由测量本身每五秒重绘一次——小部件不可能比喂给它数据的应用更新。因此每个按键都带着它的数字被读取的时间;秒表是例外,它自己走。所有按键都在同一个地方设置, 桌面按键 位于设置菜单中,说明见 帮助.
现场核验,2026 年 8 月 10 日
来自一部真实
手机的数据。
以下所有数据都在运行 Android 16 的 Google Pixel 10a 上测得。在 0.7.2 版上,一次分三段进行的测量共采集了 87,597 条记录:时长从 2:49 经 7:21 增至 8:12,测量编号始终没变,各段之间二十多分钟的暂停也没有计入时长。距离数字来自同一部手机上 0.7.1 版的一次九分钟运行——此后距离滤波没有改动。
前 274 次定位的精度在 9 到 114 米之间。把相邻定位之间的距离相加会得到 429 米,滤除粗略定位后为 28 米;把锚点移过阈值之后则为零。测试手机中没有 SIM,因此测绘的蜂窝分支正确地把网络报告为不可用。
版本与资料
安装、变更
与源代码。
代码仓库保持私有。已登录的协作者可以在其中找到源代码、打了标签的发布和 APK 校验和。
隐私
测得的数据从不离开手机。
应用可离线工作,不含任何分析、广告、归因或崩溃上报 SDK——今后也不会加入。构建这个应用所用的每一个库都 在隐私政策中列明,并各自锁定到确切版本,因此内部的任何变化都必然伴随一次说明此事的发布。可选的传输质量连续测绘使用公开的 Cloudflare Speedtest 端点进行小型 HTTPS 测试传输和周期性突发;它不是最大互联网速度的测量。该模块默认关闭。如果你购买解锁,会有一份购买回执离开手机,其中不含任何测得的数据;相关说明见 隐私政策。导出文件可能包含敏感的位置数据和附近网络的标识符。
工作原理
从一个传感器
到文件里的一行。
每个数据源按自己的节奏运行。采样会被打上时间和最后已知位置,经过一个非阻塞队列,分批写入本地数据库。图中带下划线的键指向 数据字典.
采集设置
与应用在测量开始前为每个数据源提供的参数相同。取值范围和数据量估算与实现一致;有改动会立刻反映到上面的图中。
范围 10–1000 ms
范围 100–60000 ms
范围 5–300 秒
范围 5–60 秒
范围 5–300 秒
互联网测绘连续测量使用的网络
两者都选时,会同时运行两个独立的 Android Network 句柄。
范围 500–5000 ms
范围 1–1024 KiB
范围 1–256 KiB
范围 10–300 秒
范围 64–10240 KiB
范围 8–2048 KiB
这个估算是上限:链路慢时一次采样耗时更长,同样的时间里采样更少,传输的数据也更少。这不是最大速度的测量—— 原因.