1. 定位技术入门:为什么我们需要基站和Wi-Fi定位?

大家好,我是老张,在物联网和智能硬件这行摸爬滚打了十来年,经手过的4G模组少说也有几十款了。今天想和大家聊聊一个非常实用的话题:如何用4G模组自带的AT命令,来实现设备的定位功能。你可能听说过GPS,但在很多室内、地下或者成本敏感的项目里,GPS要么用不了,要么太贵。这时候,基站定位和Wi-Fi定位就成了我们的“备胎”方案,而且这个“备胎”往往比想象中要靠谱得多。

想象一下这个场景:你做了一个共享单车锁,或者一个物流追踪器,设备装在金属箱子里,GPS信号弱得可怜,但设备总得联网吧?只要插了SIM卡,它就能和基站“握手”。这个“握手”的过程,本身就携带了位置信息。再比如,一个室内的智能货架,它连不上卫星,但总能搜到几个Wi-Fi热点吧?利用这些热点的信息,也能大致知道它在商场几楼、哪个区域。这两种技术,不依赖昂贵的专用芯片,直接利用模组现有的通信能力,成本几乎为零,对于很多对精度要求不高(比如几百米范围内)或者需要室内定位的应用来说,简直是“白捡”的功能。

所以,这篇文章就是一份实战指南。我不会跟你大谈特谈复杂的三角定位算法,那太枯燥了。我会直接带你上手,用最通俗的话讲清楚原理,然后手把手教你发送几条AT命令,亲眼看到你的设备把自己的经纬度“报”出来。无论你是刚接触嵌入式开发的学生,还是正在做物联网产品的工程师,这篇内容都能让你快速把定位功能用起来。咱们的目标就一个:别管黑猫白猫,能抓到老鼠就是好猫。 用最简单的方法,解决实际的问题。

2. 核心原理拆解:信号如何变成坐标?

在动手写代码之前,咱们得先花点时间搞明白,手里这个小小的4G模组,是怎么“无中生有”变出位置信息的。理解了原理,后面调试的时候遇到问题,你才知道该往哪个方向琢磨。

2.1 基站定位:你的手机每天都在做的事

基站定位,本质上就是“傍大款”。移动、联通、电信这些运营商,在全国建了数百万个基站,每个基站都有一个精确的、记录在案的经纬度坐标。你的4G模组,只要插了卡、开了机,干的第一件事就是疯狂搜索周围的基站信号,就像你到一个新地方打开手机找信号格一样。

这个过程比你想象的要“花心”。模组不是只找信号最强的那个基站“结婚”就完了,它会同时和好几个基站“保持联系”,测量每个基站信号的强弱。信号强度(在专业术语里叫RSSI)和距离是成反比的,距离越远,信号越弱。虽然信号传播会受到墙壁、天气的影响,但在大范围统计上,这个关系是成立的。

好了,现在你的模组知道了:基站A 在(X1, Y1),信号强度是-70dBm,估计距离大概500米;基站B 在(X2, Y2),信号强度是-85dBm,估计距离大概1200米;基站C 在(X3, Y3),信号强度是-90dBm,估计距离大概1500米。那么,你的位置在哪里?

你可以想象一下:在地图上,以基站A为圆心,500米为半径画一个圆,你肯定在这个圆圈上的某一点。同理,以基站B为圆心,1200米画个圆,以基站C为圆心,1500米画个圆。这三个圆圈通常会相交于一个很小的区域,这个区域就是你设备最可能的位置。这就是“三角定位”最朴素的思想。基站数量越多,画出来的圆圈交点就越精确,定位也就越准。在城市里,高楼林立,基站密集,定位精度可能达到几十米到一百米;到了郊区或农村,基站少,圆圈画得大,误差可能就扩大到几百米甚至上千米了。所以,基站定位是个“大概齐”的方案,但它胜在全天候、全地域,只要你有手机信号,它就能工作。

2.2 Wi-Fi定位:蹭个热点就知道你在哪

Wi-Fi定位的思路和基站定位很像,但它“傍”的是另一个“大款”——全球海量的Wi-Fi热点(路由器)。每一个Wi-Fi路由器都有一个全球唯一的MAC地址(就像身份证号)。当你走进一家咖啡馆,你的手机或模组会扫描到一堆Wi-Fi热点的MAC地址和它们的信号强度。

关键来了:有一些公司(比如谷歌、苹果,以及国内的一些地图服务商)花了巨大的力气,派车满大街跑,采集了全世界数亿个Wi-Fi热点的MAC地址和它当时的地理位置,建成了一个超大的数据库。这个数据库不关心这个热点是谁家的,它只记录“这个MAC地址,在这个经纬度被检测到过”。

当你的设备开启Wi-Fi扫描(注意,不需要你连接上这个Wi-Fi,只需要扫描到就行),把收集到的一串MAC地址和信号强度数据,通过4G网络发送给定位服务器。服务器就会去它的巨型数据库里翻找:“哦,MAC地址为AA:BB:CC:DD:EE:FF的路由器,最后一次被记录是在XX大厦15楼;MAC地址为11:22:33:44:55:66的路由器,在隔壁的咖啡馆……”再结合你上报的各个热点的信号强度(信号强的离得近,信号弱的离得远),服务器就能综合计算出一个比较精确的位置,然后把经纬度坐标返回给你的设备。

Wi-Fi定位的精度非常依赖环境。在Wi-Fi热点密密麻麻的商场、写字楼、小区里,精度可以做到10米到30米,甚至比基站定位还准。因为热点的密度远高于基站。但如果你在荒郊野外,周围一个热点都没有,那这个功能就失效了。另外,Wi-Fi定位需要设备具备Wi-Fi扫描功能,并且需要联网查询云端数据库,所以它会消耗一些流量。但它的优势是在室内环境下表现优异,正好弥补了GPS和基站定位的短板。

注意:无论是基站定位还是Wi-Fi定位,获取到的经纬度坐标,通常都是WGS-84坐标系。这是GPS全球定位系统使用的标准坐标系。如果你需要在地图(比如百度地图、高德地图)上显示,可能需要进行一次坐标转换,因为国内很多地图服务商出于合规考虑,使用的是加密后的坐标系(如GCJ-02)。这个转换有公开的算法,可以在后端服务器处理,这里就不展开了。

3. 实战准备:硬件、软件与固件

理论说得差不多了,咱们撸起袖子开干。我以手头最常用的合宙Air780E系列模组为例,带大家走一遍完整的流程。其他品牌的4G模组(像移远、广和通等)AT命令可能略有不同,但核心思路完全一致,你完全可以举一反三。

3.1 硬件清单:别少东西

工欲善其事,必先利其器。下面这些东西,请务必在开始前准备好:

  1. 核心板与开发板:我用的是一块 合宙Air780EP全IO开发板。选择它是因为引脚全部引出,方便调试,而且自带Type-C接口和串口芯片,用一根USB线就能连接电脑供电和通信。如果你用的是其他核心板,确保你有对应的底板或自己焊接好电源和串口。
  2. 天线:两根!这是新手最容易忽略的。一根是4G天线,负责连接基站,实现上网和基站定位;另一根是Wi-Fi天线,注意,Wi-Fi定位功能必须依赖独立的Wi-Fi天线来扫描热点!很多模组的Wi-Fi和蓝牙共用一根天线,务必接上。天线接口通常是IPEX-I代,别买错了。
  3. SIM卡:一张已开通流量(并且未欠费)的物联网卡或手机卡。基站定位本身不消耗流量,但模组注册网络需要。后续Wi-Fi定位查询云端数据库时,会消耗极少量流量(一次请求几KB)。
  4. USB数据线:一根可靠的Type-C数据线,最好能传输数据,有些充电线只有电源线,没法通信。
  5. 电脑:Windows、Mac或Linux系统都行,我们主要用它来运行串口工具。

把这些东西都摆到桌面上,硬件准备就完成了。很简单,对吧?

3.2 软件与固件:烧录正确的“灵魂”

硬件是身体,固件就是灵魂。4G模组出厂时,固件可能是各种功能的合集。我们要做AT开发,就需要一个纯净的、功能稳定的AT固件

  1. 获取AT固件: 去模组厂商的官方文档中心找。以合宙为例,打开其开源文档网站,找到你的模组型号(如Air780EP),在“下载”或“固件”栏目里,找到名称类似 AirM2M_780EP_LTE_AT_Vxxxx.bin 的文件。记住,要选版本号最高的那个,新版本修复旧Bug,功能更稳定。我写这篇文章时,最新的是V1007版本。

  2. 烧录固件: 这是最关键的一步。你需要一个烧录工具。合宙的模组一般用其自家的 Luatools 来烧录。过程不复杂:

    • 安装Luatools,用USB线连接开发板和电脑。
    • 打开软件,选择正确的串口号(如果不知道,可以在设备管理器里查看端口)。
    • 点击“下载固件”,选择你刚才下载的 .bin 文件。
    • 然后,需要让模组进入下载模式:通常的方法是按住开发板上的“BOOT”或“DOWNLOAD”键不放,再按一下“RST”复位键,然后松开复位键,再松开BOOT键。此时在Luatools里可以看到进度条开始走动。
    • 等待烧录完成,提示成功。给模组重新上电(拔插USB线或按RST键),新的AT固件就开始运行了。
  3. 准备串口调试工具: 这是咱们和模组“对话”的窗口。我强烈推荐 LLCOMSecureCRTMobaXterm 这类功能强大的串口工具。LLCOM是开源免费的,对中文支持很好,还能保存会话日志,非常适合调试。安装好后,打开软件,选择模组对应的串口号(和烧录时是同一个),波特率通常设置为 115200,数据位8,停止位1,无校验位。打开串口,如果一切正常,你敲个回车,模组应该会返回一个 OK

到这里,你的开发环境就全部搭建好了。模组已经是一个“听话”的AT终端,等着你发号施令。

4. 基站定位实战:发送指令,获取坐标

现在,让我们开始第一次定位尝试。确保你的SIM卡已插入,4G天线已接好,模组通过USB连接电脑,串口工具已经打开并连接。

4.1 基础网络注册检查

在进行任何定位操作前,必须先确保模组已经成功注册到4G网络。我们通过几条基础AT命令来确认。

打开你的串口工具,在发送区输入以下命令,每条命令后按回车:

AT

模组应回复 OK。这是“握手”命令,测试通信是否正常。

AT+CPIN?

这条命令查询SIM卡状态。如果返回 +CPIN: READY,说明SIM卡识别正常。如果返回 ERROR 或其他,检查一下SIM卡是否插反、没插紧或者欠费了。

AT+CSQ

查询信号强度。返回格式类似 +CSQ: 24,99。第一个数字是信号强度值,范围是0-31,值越大信号越好。通常大于10就算不错了。第二个数字是误码率,99表示未知或不可用。

AT+CGREG?

查询网络注册状态。这是关键!你希望看到 +CGREG: 0,1+CGREG: 0,5。第二个数字是状态码:1 表示已注册到本地网络,5 表示已注册到漫游网络。只有状态是1或5时,才能进行后续操作。如果是 0(未注册)或 2(正在搜索),你需要等一会儿,或者检查天线。

4.2 执行基站定位并解析结果

当确认网络注册成功后,我们就可以发起定位请求了。不同模组的AT命令可能有差异,但核心命令通常是 AT+CLBSAT+CELLLOCATE。以合宙AT固件为例,我们使用 AT+CCED 命令来获取详细的基站信息,然后通过一个在线服务来解析位置。

步骤一:获取基站小区信息 发送命令:

AT+CCED=0,1

这条命令的意思是:获取当前服务小区和邻区的详细信息。执行后,你会得到一长串回复,内容非常丰富。我截取一段示例:

+CCED:
LTE current cell: 460,01,460060086257105,0,3,5,1650,100119839,62,24,56848,34,86
LTE neighbor cell 0: 460,01,460060086257105,0,3,5,1650,100119839,62,24,56848,34,86
LTE neighbor cell 1: 460,01,460060086257105,0,3,5,1650,100119839,62,24,56848,34,86

看起来像天书?别怕,我们不需要完全看懂它。这里面包含了移动国家码(MCC)移动网络码(MNC)小区标识(CI)跟踪区码(TAC) 以及信号强度等关键参数。这些就是定位服务器的“食材”。

步骤二:使用在线服务解析位置 我们手动解析这串数字太麻烦了。幸运的是,厂商和一些开源社区提供了在线查询服务。我们可以把上面那行 LTE current cell: 后面的关键参数提取出来。 通常我们需要这几组数字:460,01,460060086257105,1650,100119839。它们分别对应MCC、MNC、CI、频点、物理小区ID。 打开浏览器,访问合宙提供的基站定位查询网站(例如:http://bs.openluat.com/),按照网页上的输入框,将这些参数一一填入,然后点击查询。几秒钟后,网页就会返回一个经纬度坐标,以及大概的地址描述(比如“XX市XX区XX路附近”)。

这个过程模拟了模组内置的定位流程:模组获取基站信息,通过网络发送给运营商或第三方的定位服务器,服务器计算后返回坐标。在实际产品中,你需要在自己的服务器上集成类似的定位服务API,或者使用运营商提供的付费定位接口,实现自动化。

5. Wi-Fi定位实战:扫描热点,查询位置

Wi-Fi定位的流程和基站定位类似,但前提是模组必须能扫描到周围的Wi-Fi热点。所以,请务必确保你的Wi-Fi天线已经正确连接到模组上

5.1 开启Wi-Fi扫描功能

首先,我们需要发送AT命令,让模组开启Wi-Fi并开始扫描。同样,命令可能因厂商而异,合宙AT固件常用的命令是 AT+WSCAN

发送命令:

AT+WSCAN

这条命令会让模组扫描周边的Wi-Fi热点,扫描可能需要几秒到十几秒的时间。扫描完成后,模组会返回一个列表,格式如下:

+WSCAN: 0,"TP-LINK_ABCD",-45,11,0,0,0,3
+WSCAN: 1,"ChinaNet-XXXX",-68,6,0,0,0,3
+WSCAN: 2,"HUAWEI-XXXX",-72,1,0,0,0,3
OK

每一行代表一个扫描到的热点。我们主要关注两个信息:

  • 第二个参数:热点的SSID名称(如"TP-LINK_ABCD"),这个有时不太准,因为可能重名或隐藏。
  • 第三个参数:信号强度(RSSI),比如 -45,这个值越接近0(例如-30、-40),信号越强,设备离这个路由器可能越近。
  • 实际上,对于定位最关键的是每个热点对应的 MAC地址(BSSID),但在这个简化的AT命令回复里可能没有直接显示。更专业的定位命令(如 AT+WLOC)会直接要求上报MAC地址列表。

5.2 执行Wi-Fi定位请求

在获取了Wi-Fi热点信息(主要是MAC地址和RSSI)列表后,我们可以发起定位请求。一个典型的命令格式可能是:

AT+WLOC=2,10

这个命令的含义可能是:使用Wi-Fi定位方式(2),并上报信号最强的10个热点信息。模组收到这个命令后,会内部整理好扫描到的MAC和RSSI数据,通过移动网络,主动去连接预设的定位服务器(这个服务器地址通常已经写在固件里了),并将查询结果返回。

执行后,你可能会看到这样的回复:

+WLOC: 0,39.90870,116.39745,100
OK

这表示定位成功(0代表成功),返回的经纬度是(116.39745, 39.90870),最后一个参数 100 可能表示精度半径(单位米)。这个坐标就是通过云端Wi-Fi数据库计算出来的你的设备位置。

提示:Wi-Fi定位对热点数量有要求。在室内,通常能扫到几十个热点,定位很准。如果你在空旷的户外测试,可能只能扫到一两个热点,这时定位可能会失败或者误差极大。用你的手机打开Wi-Fi设置,看看能搜到多少个热点,和模组的结果对比一下,是很好的验证方法。

6. 进阶技巧与避坑指南

掌握了基本操作,咱们再来聊聊一些实战中会遇到的细节和坑。这些经验都是我在项目里真金白银试出来的,能帮你节省大量调试时间。

6.1 精度与误差:管理你的预期

首先要摆正心态:基站和Wi-Fi定位是辅助定位手段,不是高精度定位

  • 基站定位:在城市中心,误差可能在50-200米;在郊区或农村,误差可能达到500米以上甚至几公里。它的优势是覆盖广,几乎无处不在。
  • Wi-Fi定位:在Wi-Fi密集的城区、商场、办公楼、住宅区,精度可以做到10-50米,非常不错。但在没有Wi-Fi覆盖的区域(如公路、田野),完全无法工作。

所以,在你的产品设计里,要根据场景选择:

  • 物流追踪:车辆在高速上跑,用基站定位做粗轨迹记录,结合关键点(如仓库、门店)的停留判断。
  • 共享设备(如充电宝、单车):在户外停放时,用基站定位判断大致街区;在商场内归还时,用Wi-Fi定位判断具体楼层和柜机。
  • 资产防盗:主要用基站定位,只要设备移动了(小区ID变化),就发出报警,不需要知道精确到哪栋楼。

6.2 稳定性与优化:让定位更可靠

  1. 多次测量取平均:不要只相信一次定位的结果。在设备静止时,可以连续发起3-5次定位请求,将得到的经纬度坐标进行简单的算术平均,可以过滤掉一些偶然的跳动误差。
  2. 混合定位策略:这是最推荐的方式。同时支持GPS、基站、Wi-Fi三种定位模式。在代码里做一个优先级判断:户外开阔地,优先用GPS;进入室内GPS失效,自动切换到Wi-Fi定位;如果Wi-Fi也扫不到(比如在地下室),则降级到基站定位。这样能保证设备在任何环境下都有一个“虽不精确但总比没有强”的位置信息。
  3. 省电考虑:频繁的Wi-Fi扫描和网络请求非常耗电。对于电池供电的设备,需要设计合理的定位策略。例如,每小时只定位一次;或者当设备感知到移动(通过加速度计)时,才触发高频率定位。
  4. 服务器端纠偏:如前所述,获取的WGS-84坐标如果要在国内地图显示,需要转换成GCJ-02坐标系。这个转换应该在你的应用服务器上完成,而不是在资源有限的嵌入式设备上。设备只负责上报原始坐标。

6.3 常见问题排查(Q&A)

这里汇总几个我遇到最多的问题:

  • Q:发送AT命令后,模组毫无反应,连“OK”都不回。

    • A:首先检查串口连接:端口号选对了吗?波特率是115200吗?USB线是否松动?可以尝试发送最基本的 AT 命令,看是否返回 OK。如果还不通,检查模组是否已供电,或者重新烧录一下AT固件。
  • Q:基站定位查询(AT+CCED)返回的数据全是0,或者小区信息很少。

    • A:这说明模组当前搜索到的有效基站很少。可能的原因:1) 你处在信号覆盖边缘(如地下室、封闭金属柜内),尝试将设备和天线移到窗口或开阔处。2) SIM卡没有成功注册网络,用 AT+CGREG? 命令确认注册状态。3) 4G天线未接好或损坏。
  • Q:Wi-Fi定位命令返回ERROR,或者定位坐标明显不对(比如定到了外省)。

    • A:分步排查:1) 先用 AT+WSCAN 确认是否能扫描到足够多(建议>3个)的Wi-Fi热点。如果扫不到,检查Wi-Fi天线是否连接。2) 确认模组是否成功连接到互联网(可以用 AT+NETOPENAT+PING="www.baidu.com" 测试)。因为Wi-Fi定位需要访问云端服务器,没有网络是不行的。3) 云端数据库可能没有收录你周围这些新路由器的MAC地址信息,导致定位失败或偏差大。这种情况在城市新区或偏远地区可能出现。
  • Q:定位速度很慢,每次要等十几秒。

    • A:这是正常的。无论是基站定位还是Wi-Fi定位,都需要模组花时间扫描环境(几秒),然后建立网络连接、发送请求、等待服务器响应(几秒到十几秒)。这不是实时定位。在设计产品交互时,要给定位操作预留足够的等待时间,并给用户一个“正在定位中”的提示。

最后我想说,AT命令开发就像和硬件设备“对话”,一开始可能会觉得枯燥,但一旦掌握了这套语言,你会发现它能实现的功能远超想象。定位只是其中一个应用,还有短信、电话、TCP/IP通信、MQTT协议等等,都可以通过AT命令来控制。多动手试,多看看官方手册,遇到问题先自己思考再搜索,你会进步得非常快。希望这篇长文能帮你少走些弯路,顺利把定位功能集成到你的下一个酷炫项目里。如果在实际操作中遇到新的问题,也欢迎随时交流讨论。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐