尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

GSM空口信号接收解码实战:从SDR扫频到基站信息还原

GSM空口信号接收解码实战:从SDR扫频到基站信息还原 GSM都快退网了为什么还有人折腾空口信号这是不少朋友看到项目标题时的第一反应。先说结论GSM不只是一个即将退役的蜂窝通信标准它更是理解现代无线电通信底层语感的最佳教材。手机和基站之间通过空口Um接口交换信息的机制包括TDMA帧结构、GMSK调制、逻辑信道映射、加密算法种类这些概念在4G/5G里全部有进化版的存在。把GSM空口信号的接收和解码完整跑通一遍你收获的不只是一堆频谱图和信令消息而是对电波如何变成比特比特如何变成业务这条链路的系统工程认知。我自己也花过相当一段时间在这个项目上。当时拿到一套RF接收前端最直观的冲动就是打开频谱仪看一眼基站长什么样然后想办法把那串空中广播的消息解出来。整个过程踩了不少坑从频偏噪声到同步失败每一关都有值得记录的细节。这篇文章就按我的实际操作顺序来写不堆教科书理论重点讲接收流程、信号特征、解码步骤、踩坑经验和排错思路。不管你手里是入门级的电视棒还是更专业的射频前端里面的思路应该都能复用。1. GSM都退网了还有什么值得听的很多人会觉得研究一个正在退网的2G标准没什么价值。这个看法可以理解但实际动手之后你会发现GSM空口几乎是蜂窝通信原理的最佳教学切片。1.1 它是蜂窝架构的最小完整样本现代移动通信无论发展到第几代基本骨架都是从GSM时代确定下来的小区Cell覆盖、基站BTS收设、基站控制器BSC统筹、核心网MSC/HLR等完成移动性管理和鉴权计费。这套架构在3G/4G/5G里虽然名字换成了eNodeB、gNodeB、AMF/SMF但分工逻辑一眼就能认出是同一个祖宗。而且GSM足够简单。它没有OFDMA这种极其精巧复杂的多载波调度也没有Massive MIMO这种硬件阵列的加持它就是最基本的FDMATDMA组合加上GMSK这种恒包络调制。你能在相对低的复杂度下走完天线接收-下变频-采样-同步-解调-信道解码-信令解读的完整链路。这在5G时代是难以做到的因为那套协议栈对个人玩家来说太重了。1.2 一次接收能讲清楚三个核心概念GSM空口实践能帮你把下面三件事焊死在脑子里双工距离与频点规划GSM900的下行频段是935~960MHz上行是890~915MHz上下行固定间隔45MHz。你只要扫到一个下行载波就知道对应的上行频率是多少。这种对称双工方式在FDD LTE里依然沿用。复用时隙与突发脉冲一个TDMA帧只有4.615ms被切成8个时隙每个用户在自己的时隙里发射能量。理解了这个后续再看LTE的RB资源调度、5G的时隙配比思路是顺滑的。逻辑信道与物理信道的映射基站在载波上不管发什么内容都要先按信道的类型装进特定位置。手机开机扫频后要想完成小区驻留必须依次找到FCCH频率校正信道、SCH同步信道、BCCH广播控制信道。这种逻辑信道思维在LTE里换成了PSS/SSS/PBCH本质上一模一样。就凭这三点GSM空口项目就值得做。它不是无用功而是帮你建立移动通信世界观的一块压舱石。1.3 商用价值之外的文化意义还有一个感性层面的理由。GSM是第一个真正意义上的数字蜂窝系统1991年首次商用到今天已经三十多年。全球各地陆续宣布关闭2G网络但很多物联网终端、紧急呼叫通道仍在依赖它。这时候你把SDR天线对准窗外捕获一段GSM下行信号解出附近的基站编号和网络代码就像在数字时代给一个即将退场的时代留言。永不消逝的电波这个标题在我理解其实有两层意思一格信号确实还飘在空气里二格它在通信技术史上的影响还会延续很久。2. 空口信号解剖GSM在空气里到底长什么样说动手之前得先把信号长相搞清楚。GSM空口不是一坨持续发射的连续波它是一串精确定时的突发脉冲流。你不理解它的结构后面做同步和解码就会很懵。2.1 频率资源先从信道号说起GSM系统把频谱按200kHz等宽切成信道每个物理频点对应一个ARFCN绝对射频信道号。不同频段的计算公式不一样以最常用的GSM900下行为例[ F_{\text{down}} 935.0 0.2 \times (\text{ARFCN} - 1) \quad \text{MHz} ]也就是说ARFCN50时下行频率是935 0.2×49 944.8MHz。实际操作中你不知道运营商占用了哪些ARPFCN需要先在频段内扫一遍找到能量峰值的位置再推算信道号。这正是后面kalibrate这类工具的用武之地。有个细节新手容易忽略GSM系统的载波分为BCCH载波广播控制信道所在的那个频点和非BCCH载波。手机驻留和小区选择依赖的是BCCH载波它通常恒定功率发射不会因为业务量变化而功率波动。你扫频时看到的那些持续高能量的频点绝大多数就是BCCH载波。2.2 时间资源TDMA帧与8个时隙GSM空口的时间组织是严格分层的一个时隙是156.25bit时长约577μs8个时隙组成一个TDMA帧时长4.615ms若干帧再组成更长的复帧结构用于承载不同功能的逻辑信道。每个用户在物理上不是随时都能收发它只在属于自己的时隙上发射。这种时分共享方式就是TDMA时分多址。GSM在频谱上还有FDMA频分多址即不同用户在相隔200kHz的频点上同时工作。这两种多址方式叠加构成了GSM的基础容量模型。理解了这个时间结构你就能解释一个现象为什么GSM手机通话时你偶尔会听到嗒嗒的脉冲背景音因为手机发射功率不是连续的而是按帧的时隙节奏一簇一簇地发一部分能量泄漏到音频电路后形成周期性的噪声。2.3 突发脉冲五种类型各司其职GSM站在一个时隙上发送的内容叫做突发脉冲burst有五种类型普通突发脉冲NB承载业务数据与部分控制信令中间是58bit的加密信息两边各有3bit的尾比特中央还有一个26bit的训练序列用于信道估计频率校正突发脉冲FB全0序列经过GMSK调制后等效是一个接近纯正弦波的信号频偏约67.7kHz。它就是FCCH信道的内容手机靠识别这个偏频来确定频率基准同步突发脉冲SB紧跟在FCCH之后承载TDMA帧号和BSIC基站识别码用于时间同步接入突发脉冲AB用于手机随机接入有更长的保护期来应对未知传输时延伪突发脉冲/空闲突发DummyBCCH载波在无真实消息要发时发送的占位符保证载波一直在发射状态。在这些突发脉冲中新手最常打交道的三个是FB、SB和NB。用SDR把一段基带IQ数据抓下来你用肉眼就能在时间-频率图上看到一小段一小段亮线那些亮线大概率就是FCCH/FB的位置。只要定位到FB后面的解调就有锚点了。2.4 GMSK调制恒包络中的相位变化GSM采用的GMSK高斯最小频移键控是一种特殊的连续相位调制每个符号携带1bit信息。它和普通的调频有点像但相位路径经过了高斯滤波导致频谱效率高、带外辐射小。最有用的性质是它属于恒包络调制发射机的功率放大器因此可以工作在非线性区域对功耗很友好这也是当年手持终端续航考量下的选择。在GMSK解调里你实际需要关心的是每个符号时刻的相位增量。如果是1相位在这个符号周期内正向偏转如果是−1则负向偏转。配合已知的训练序列做差分检测或Viterbi均衡就能把这串相位偏移还原成比特流。gr-gsm实际用的是GMSK解调加均衡器的组合你不需要自己从零写解调器但理解这一层对后续调参很有帮助。2.5 逻辑信道与系统消息基站永远在打招呼基站通过BCCH载波的时隙0持续广播系统消息包括小区全球标识CGI由MCC移动国家码、MNC移动网络码、LAC位置区码、Cell ID组成频率校正信道FCCH与同步信道SCH帮助手机完成时间/频率同步并读取帧号邻区列表告诉手机周围有哪些同邻频的小区控制信道配置CCCH配置参数、寻呼信道配置、随机接入参数等。这些系统消息以L2帧的形式周期性封装在BCCH/CCCH信道上。使用gr-gsm接收BCCH载波后你可以借助Wireshark的GSM协议解析器直接看到MCC/MNC/LAC/Cell ID等内容。整个过程不需要任何破解操作因为这些本来就是基站向全体终端广播的公开信息相当于收音机里的电台呼号。这个性质决定了它适合作为业余无线电和通信爱好者的学习标的。3. 接收平台搭建SDR选型、天线设计与关键参数硬件选型这块不同预算和目标的方案差别挺大。我按入门到进阶来理一理。3.1 三档接收方案对比方案典型设备采样带宽适合场景上手难度入门RTL-SDR Blog V3 / V4RTL2832U R820T2最高约2.4MHz~3.2MHz扫描GSM频点、接收FCCH/SCH、解BSIC低进阶HackRF One20MHz宽频段扫描、同时捕获多条载波中专业USRP B200/B21056MHz多通道、更长IQ记录、科研级实验高很多人以为接收GSM一定要用HackRF其实不是。GSM900一个频点只占200kHz用RTL-SDR的2.4MHz采样带宽就能同时覆盖十来个频点的频谱内容。入门阶段完全是够用的。RTL-SDR的优势是便宜、稳固、资料多缺点是8bit ADC的动态范围和镜频抑制一般但这不影响BCCH载波的捕获因为它功率强且是恒包络的。3.2 天线半波偶极子是最不折腾的选择天线是接收链路上最容易被低估的一环。GSM900的下行中心频率在947MHz附近半波长大约16厘米GSM1800中心频段更高半波长大约8厘米。自己做一根偶极子并不难取一段同轴线把末端屏蔽层和芯线分开各接一根约7.8厘米GSM900或4厘米GSM1800长的金属振子整体垂直架设离地面和金属物体尽量远有条件的话放在窗外或阳台接收效果提升明显。为什么偶极子够用因为基站的天线往往是定向的、向下倾角的你只需要在水平面内获得全向或接近全向的接收能力偶极子正好满足这个需求它的增益绝对数值不高但方向图对称、制作简单作为SDR第一根天线非常合适。如果发现基站距离比较远再考虑在馈线前端加一个低噪声放大器LNA而不是先去换高增益定向天线后者反而容易把方向调错。3.3 参数设置采样率、增益与晶振校准实际用GNU Radio或gr-gsm跑的时候最核心的接收参数有三个采样率RTL-SDR建议设到2.4MHz或2.048MHz既保证带宽又为后续信号处理留了点余量。设太低会截断频带设太高可能超出设备的稳定带宽导致样本丢失。增益数字接收机里增益不是越高越好。RTL-SDR的增益太高容易把8bit ADC推入饱和区产生削波失真反而让同步失败太低又会让信号埋在量化噪声里。一个实用策略是先用频谱观察BCCH载波是否清晰可见再微调增益使信号峰值约在满量程的-20dBFS到-10dBFS之间。晶振校准SDR设备常见的频率偏移在1~100ppm量级。GSM的空口对频率精度有严格要求频偏稍有风吹草动解调器就抓不住FCCH。如果你有GPS/北斗驯服时钟或已知的强信号参考源可以先用kalibrate做一次补偿把频偏校正写入SDR驱动配置。3.4 环境干扰处理在城市环境里接收GSM最大的敌人不是距离而是同频干扰和杂散信号。GSM900下行频段紧挨着其他应用附近如果有较强的广播或工业射频源很容易让SDR前端饱和。实践中最有效的措施是在SDR输入端加一个高中频的带通滤波器比如专门过滤GSM900下行的成品滤波器或者先用频谱仪在天线口测一遍环境底噪有条件的用软件做频段扫描确认主要干扰源的方向软件里再用一个简单的频带选择滤波器把200kHz左右的信号带出来压低带外噪声。这一步做扎实了后面解码的成功率会高很多。4. 实战解码从扫频到读出基站身份信息的四步流程工具链我推荐直接用GNU Radio搭配gr-gsm这是社区里最成熟的开源GSM空口接收解码方案没有之一。下面是我跑通的完整流程每一步目标明确。4.1 环境搭建与工具链安装在Ubuntu/Debian系统上大致需要安装sudo apt update sudo apt install gr-osmosdr gr-gsm wireshark kalibrate-rtl如果发行版源里没有gr-gsm也可以从源码编译依赖项主要是GNU Radio、boost、libosmocore。源码编译时注意GNU Radio版本要和gr-gsm匹配否则模块加载时会报找不到符号的错误。安装完毕之后用rtl_test确认SDR能被识别rtl_test如果设备驱动没问题rtl_test会打印出设备名称和基础参数。很多频点扫不出来的问题其实在第一步就该暴露了。4.2 第一步频点扫描锁定BCCH载波扫频工具可选的不少我用得最多的是kalibrate。它的原理是快速扫过GSM900/1800频段寻找FCCH特征峰进而输出所有可见BCCH频点的能量列表kal -s E-GSM-900扫描结果大致长这样Kanal : 971 (944.2MHz) - signal: 47.2dB - 2.4kHz off Kanal : 974 (944.8MHz) - signal: 63.8dB - 1.1kHz off Kanal : 977 (945.4MHz) - signal: 41.7dB - -0.3kHz off输出的信号强度不是绝对场强但相对排序很有参考价值。你选信号最强、偏移量最小的那个频点作为解码目标。实测中最稳定的做法是扫两遍取两次都出现的能量峰作为候选BCCH频点列表。因为GSM基站有跳频机制但BCCH载波基本固定扫两遍能明显剔除偶发的干扰峰。4.3 第二步在GNU Radio里观察FCCH与SCH启动gr-gsm的实时监测脚本grgsm_livemon -f 944.8M这时会打开GNU Radio的窗口在频谱图和时间瀑布图里应该能看见规律出现的强信号脉冲。FCCH的特征特别明显它是一段67.7kHz偏置的正弦波在瀑布图上呈现为一条比其他突发更平直、明亮的水平亮线。这一步的目的不是立刻看数据而是确认你的接收链路在频段、频率、增益三个方面都是正确的。如果FCCH看起来断断续续或者偏置不在预期位置回到第3节处理频偏和增益如果FCCH完全消失检查天线连接和频谱范围。grgsm_livemon在正常锁频后会尝试自动解码SCH。同步成功的时候窗口会输出一行包含BSIC基站识别码和TDMA帧号的信息。看到这行输出说明你已经跨过空口解码最关键的一道坎。4.4 第三步用gr-gsm接收并保存基带数据实时脚本适合验证但要做系统性分析最好先把原始IQ数据抓下来再离线处理。抓取命令是grgsm_capture -f 944.8M -s 1e6 -c 30参数里-s 1e6是采样率1Msps-c 30是抓取30秒。GSM的BCCH消息是周期广播的30秒足够抓到好几轮系统消息。有个建议抓取时尽量选业务量低的时间段。后半夜基站广播的内容更规整旁路的寻呼消息也少方便过滤出BCCH系统消息。我个人经常在凌晨跑抓取效果比白天好很多。4.5 第四步离线解调并用Wireshark分析信令抓取之后用grgsm_decode或者直接在GNU Radio Companion里搭解调流程grgsm_decode --cfilegsm_capture.cfile --arfcn974 --enable-bcch参数里--arfcn填目标频点对应信道号--enable-bcch表示解析BCCH信道。成功的话程序会输出一串GSM Layer 2帧你可以把这些帧导入Wiresharktshark -r decoded_frames.pcap -Y gsm_bssmap || gsm_sysinfo在Wireshark里展开GSM系统消息字段你会看到MCC/MNC网络运营商的国家码和网络码LAC位置区码这是移动性管理的根Cell ID小区编号邻区BCCH频点表CCCH配置、接入参数等。我看到自己附近基站信息被打出来的时候说实话挺感叹的。那串十六进制和十进制编码背后是几十公里外塔顶设备持续发送、被SDR空中截获并还原成的结构化信息。整个链路你从头到尾深度参与了一遍这种感觉和看了十遍GSM系统结构幻灯片完全不同。4.6 Wireshark筛选小技巧在Wireshark里GSM消息很多很杂最常用的是这几个过滤表达式gsm.bssmap gsm.sysinfo gsm.rr.cell_id如果有兴趣还可以对多段抓取结果做对比观察相邻小区之间的LAC和BSIC分布这能顺带理解蜂窝网络的频率规划思路。比如你会发现相邻小区的BCCH频点不会重复这是为了避免同频干扰而BSIC在相邻小区之间也会有规则地区分。5. 实战踩坑与排错频偏、增益与同步的拉锯战这个项目有相当一部分时间贡献给了信号看着挺强就是解不出来这种东西。我把最有代表性的几个问题和排查思路记下来省得后面的人再走弯路。5.1 频偏飘移最隐蔽的系统性失败如果你是第一次用RTL-SDR跑GSM最常见的失败现象是扫频能看到强峰但grgsm_livemon一直报同步失败或者FCCH的频偏线在瀑布图上歪歪扭扭。这个锅一般不是天线而是SDR的本振频率不准。RTL-SDR使用普通的TCXO时出厂误差可能有几十ppm在900MHz频段上相当于几十kHz的偏移。GSM的GMSK信号对频率误差很敏感几kHz的偏移可能就能让解调器抓不住特征峰。解决办法是先用已知信号做频偏校准。最简单的方式是打开kal -s E-GSM-900它输出的offset值就是一种参考。如果你有GPS驯服或一个独立的高精度源也可以用rtl_test -f 947000000观察实际频谱峰值位置来测算偏移。校准后把偏移量写入gr-osmosdr的frequency correction参数通常单位是ppmosmocom Source Frequency Correction: -12 # ppm实测把ppm设置正确后FCCH的亮线会从斜的/虚的变成直的/实的同步成功率大幅提升。5.2 增益管理不是越强越好有段时间我的信号强度很高但解码总出误码查了半天发现是增益推太高ADC饱和削波了。RTL-SDR的ADC是8bit动态范围本就有限如果强信号被放大到满量程附近非线性失真会让GMSK的相位历史变得一团糟。操作原则是够用就行。先把增益从低往高慢慢加同时观察频谱上的底噪抬升和信号波形信号和底噪一起快速抬升说明增益主要放大了噪声信号抬升明显而底噪抬升不明显说明还没到增益极限信号变成平顶或频谱出现明显谐波那就是进入压缩区了。找到一个信号清晰但不削波的甜点值之后就不要频繁动了。5.3 多径衰落与天线位置调整室内接收时我还遇到过一种情况同一副天线摆在窗台边能稳定解出SCH挪到桌子中间就只剩噪声。原因是GSM900波长只有33厘米左右在室内环境里金属桌椅、墙体反射造成的多径衰落极其明显。解决方式也很朴素换位置、换高度、旋转天线角度。不必一开始就上增益天线或昂贵前端先花20分钟把天线放在不同位置看看信号强度的变化。如果家里有条件窗外垂到屋檐下往往比室内强不少因为基站信号从高处来室内会有钢筋混凝土的屏蔽损耗。5.4 同时抓到多个邻区信号选错目标频点扫频工具通常会扫出很多强频点有时隔壁基站信号更猛导致你把目标锁定在了邻区上。这不算错误但是会带来困惑为什么Cell ID和我手机里看到的不一样或者为什么有些系统消息解析不完整解决方案是同时并排比较几个频点的解码结果找BCCH消息最完整、SCH同步最稳的那个点作为主目标。grgsm_decode也可以分别处理每个频点的抓取数据最后对比它们的小区参数这样还能顺便画出一个简单的可见小区表。5.5 抓包数据解不出来检查采样率和触发时长有个低级但常见的错误是抓包时长太短。BCCH系统消息虽然是周期广播但如果它的发送周期赶巧落在你抓包截断之后离线解码就看不到完整消息。我建议至少抓30秒稳妥一点可以抓90秒。采样率也别设太低1Msps是下限2Msps更稳。6. 从GSM实践里学到的通信底层思维最后篇幅留给迁移收获。做完GSM空口接收项目之后我再看4G/5G资料明显觉得不再是一团雾。6.1 同步始终是无线通信的第一性问题GSM的FCCH/SCH设计告诉我任何无线通信系统接收端要做的第一件事不是解业务数据而是先解决频率同步和时间同步。LTE里PSS/SSS和PBCH承担的角色和GSM的FCCH/SCH几乎是同一个故事你先让收发双方对上表、对上频率后面的OFDM符号才能谈得上解调。5G同样有同步栅格和SSB波束扫描这些概念底层思维一脉相承。6.2 广播信道永远是与生俱来的入口GSM的BCCH广播内容对空口可见的设备是公开透明的。这种设计上就必须开放的广播信道在每个制式里都是入口级的存在。研究空口信号时从广播信道入手永远是最快的切入路径。理解了这一点你在看LTE的MIB/SIB、5G的系统信息块时就不会觉得它们是一堆堆莫名其妙的参数而是能猜到每个字段大概在干一件什么事。6.3 逻辑信道设计是蜂窝网络优雅的核心GSM把不同功能的信令和业务拆成逻辑信道再通过固定映射或随机接入机制复用在同一物理频点上。这套设计在GSM时代就已经相当成熟。做接收和解码之后你再去看LTE的逻辑信道/传输信道/物理信道三层映射看调度器如何把不同用户的业务打包进RB逻辑会非常顺。6.4 对2G安全问题有了切身体会顺着这个项目我也翻了不少GSM安全机制的资料。GSM早起在空口加密上的核心弱点是网络对手机的单向认证为主终端很难验证明基站的合法性这给后续多种攻击方式留下了空间。A5/1加密算法被大量研究早期实现还暴露出密钥长度和生成机制上的不足。这些不是纸上谈兵而是促使3G时代引入双向认证和更强加密的直接动因。你在SDR上亲手收到基站的系统消息再回看这段历史会比只看新闻片段有更深的理解。回到项目本身GSM空口接收与解码是一个特别适合个人去完整走通的端到端项目。它不需要昂贵的实验室设备逻辑链条清楚难度曲线平缓但每一步的成功信号都非常明确先是扫到频点再是FCCH亮线然后是SCH同步成功最后是BCCH系统消息清晰可读。整个过程下来你对空口协议的感知会发生质变再去碰其他通信系统不再觉得那是黑盒了。如果后面想做进阶可以尝试同时接收多个频点做邻区表绘制或者把这套流程迁移到LTE/5G的同步信号接收解析上。核心方法是通用的先扫频再同步然后沿着广播信道往深处挖。希望这篇记录能帮你少踩几个坑也期待看到更多人把这段永不消逝的电波玩出自己的花样。
返回列表