在移动定位相关的测试中,很多同学只会用手机上的 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
我们只需要制造这些数据,注入虚假坐标,系统或应用就会以为你在某地。
咱们就是要从代码层欺骗设备,优雅又精确!
📦 系统要求
✅ Linux 系统(推荐 Kali、Ubuntu、Debian)
✅ 安装 bc(数学计算)
✅ 安装 gpsfake(模拟 GPS 设备)
安装命令:
sudo apt update
sudo apt install bc gpsd gpsfake
专属 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
如何运行?
chmod +x run_fake_location.sh
./run_fake_location.sh
查看生成的文件:
ls *.nmea
模拟某地定位:
gpsfake -c 1 shanghai.nmea
有些人用手机 App 模拟定位,而我们,用代码骗过整个系统。
Top comments (0)
Some comments may only be visible to logged-in visitors. Sign in to view all comments.