DEV Community

钟智强
钟智强

Posted on

打造你自己的虚拟定位神器:Linux Bash 脚本模拟 GPS NMEA 坐标

在移动定位相关的测试中,很多同学只会用手机上的 Mock Location App,那也太低阶了吧?👀 本文教你如何在 Linux 下用 Bash 纯手工打造一个可以生成 NMEA 数据的脚本,搭配工具如 gpsfake 直接伪造城市坐标。

什么是 NMEA?

NMEA 是 GPS 接收器输出的标准数据格式,核心结构像这样:

$GPGGA,123519,4807.038,N,01131.000,E,1,08,0.9,545.4,M,46.9,M,,*47
Enter fullscreen mode Exit fullscreen mode

我们只需要制造这些数据,注入虚假坐标,系统或应用就会以为你在某地。
咱们就是要从代码层欺骗设备,优雅又精确!


📦 系统要求

✅ Linux 系统(推荐 Kali、Ubuntu、Debian)
✅ 安装 bc(数学计算)
✅ 安装 gpsfake(模拟 GPS 设备)

安装命令:

sudo apt update
sudo apt install bc gpsd gpsfake
Enter fullscreen mode Exit fullscreen mode

专属 Bash 脚本:




脚本功能:
- 支持多城市坐标(江西、上海、新加坡、伦敦、纽约等)
- 自动计算 DMM 坐标格式
- 自动生成 NMEA 校验和
- 每隔几秒输出一个城市的假定位 .nmea 文件


```bash
#!/bin/bash

set -e

if ! command -v bc >/dev/null 2>&1; then
  echo "🔧 'bc' is required. Installing..."
  sudo apt update && sudo apt install -y bc
fi

declare -A LOCATIONS
LOCATIONS["jiangxi"]="27.6167 N 115.7500 E"
LOCATIONS["shanghai"]="31.2304 N 121.4737 E"
LOCATIONS["singapore"]="1.3521 N 103.8198 E"
LOCATIONS["hongkong"]="22.3193 N 114.1694 E"
LOCATIONS["london"]="51.5074 N 0.1278 W"
LOCATIONS["berlin"]="52.5200 N 13.4050 E"
LOCATIONS["newyork"]="40.7128 N 74.0060 W"

to_dmm() {
  DEC="$1"
  DEGREE=$(echo "$DEC" | cut -d. -f1)
  FRACTION="0.$(echo "$DEC" | cut -d. -f2)"
  MINUTES=$(echo "$FRACTION * 60" | bc -l)
  printf "%02d%07.4f" "$DEGREE" "$MINUTES"
}

nmea_checksum() {
  local raw="$1"
  local sum=0
  for (( i=0; i<${#raw}; i++ )); do
    sum=$((sum ^ $(printf "%d" "'${raw:$i:1}") ))
  done
  printf "%02X" "$sum"
}

for CITY in "${!LOCATIONS[@]}"; do
  IFS=' ' read -r LAT LAT_DIR LON LON_DIR <<< "${LOCATIONS[$CITY]}"
  LAT_DMM=$(to_dmm "$LAT")
  LON_DMM=$(to_dmm "$LON")
  UTC_TIME=$(date -u +"%H%M%S")
  ALT=50.0

  GGA="GPGGA,${UTC_TIME},${LAT_DMM},${LAT_DIR},${LON_DMM},${LON_DIR},1,08,0.9,${ALT},M,46.9,M,,"
  CHKSUM=$(nmea_checksum "$GGA")
  FINAL="\$${GGA}*${CHKSUM}"

  echo "$FINAL" > "${CITY}.nmea"
  echo "✅ ${CITY} → ${FINAL}"
  sleep 2
done
Enter fullscreen mode Exit fullscreen mode

如何运行?

chmod +x run_fake_location.sh
./run_fake_location.sh
Enter fullscreen mode Exit fullscreen mode

查看生成的文件:

ls *.nmea
Enter fullscreen mode Exit fullscreen mode

模拟某地定位:

gpsfake -c 1 shanghai.nmea
Enter fullscreen mode Exit fullscreen mode

有些人用手机 App 模拟定位,而我们,用代码骗过整个系统。

Top comments (0)

Some comments may only be visible to logged-in visitors. Sign in to view all comments.