【逗老师的无线电】骚活,GPS热点盒子自动上报APRS位置

在这里插入图片描述
在这里插入图片描述

逗老师最近整了个有意思的小活,组装了一个有4G网卡带GPS功能的热点盒子,让盒子基于GPS位置信息,自动上报APRS位置帧
全篇亮点

  • 基于GPS和AGPS共同定位
  • 基于TCP直接上报APRS数据帧

别说,这小活整完之后,还是有点意思的,于是写篇文章分享一下。可能受限于不同的硬件本篇文章分享的代码不一定能直接跑起来,但是分享一下思路,各位HAM们也可以试试看。

一、硬件情况

在这里插入图片描述
这次使用的是树莓派Zero 2W,加上了一个SIMCOM 7600的4G网卡,这个4G网卡自身带GPS功能(其实绝大部分的网卡都带GPS功能)
热点板用的是BH3BBU老师的版本,BBU老师的板子做工真的好,手动鼓掌

二、获取GPS

SIM7600-H的GPS需要外接天线,然后通过ttyUSB1串口发送NMEA数据,或者通过ttyUSB2串口通过AT指令获取。
同时,关键的来了,SIM7600-H的AGPS,也就是基站辅助定位,同样可以通过AT指令获取坐标。
本文,优先通过GPS获取定位,但是如果在室内,或者没有外接GPS天线的时候,会通过AGPS基站辅助定位获得稍微不那么精准的坐标。

1、开启GPS功能

1.1、单次开启关闭GPS功能

AT+CGPS=1

该指令用于一次性开启GPS功能
同样,AT+CGPS=0用于关闭GPS功能

1.2、开机自启GPS

AT+CGPSAUTO=1

该指令用于配置模块自动启动GPS,加电后GPS功能即运行

2、AT指令获取GPS坐标

AT+CGPSINFO

该指令用于获取当前GPS的定位信息,GPS获取位置后,正常回显GPS坐标
在这里插入图片描述
如果当前GPS定位未成功,回显空数据
在这里插入图片描述

3、AT指令获取AGPS坐标

如果当前GPS信号弱,可以通过AGPS来通过基站辅助定位获取坐标
使用AGPS前,需要确保数据链路已经建立

AT+CNETSTART

通过该指令建立数据链路

AT+CLBS=1

通过该指令,获取AGPS坐标
在这里插入图片描述
正常情况下,只要插着SIM卡,能正常联网,兜底方案AGPS都能算出一个大概的坐标出来。

三、上报APRS数据

1、APRS基本上报方式

HTTP方式连接:
服务器地址:china.aprs2.net
服务器端口:14580

telnet上去之后输入
user XXXXXX pass YYYYY(换行回车符)

XXXXXX为你的呼号,YYYYY为你呼号的passcode
passcode的生成方式google一下,就有好多在线工具可以帮忙生成。
下面的网站就是一个可以生成passcode的站点

https://apps.magicbug.co.uk/passcode/index.php
在这里插入图片描述
在这里插入图片描述
哎,这玩意就是这样,明文生成密码,还没有鉴权,所以,大家自觉遵守道德规范就好。

输入user和pass之后,等待几秒(我设置是等待5秒),收到验证通过的反馈后
在这里插入图片描述

之后再发送符合APRS的数据帧字符串即可。
例如:

BI1FQO-13>APDG03,TCPIP*,qAC,BI1FQO-CS:!4008.22ND11632.89E&/A=000000440 HelloWorld!

在这里插入图片描述
之后再去APRS网站上查一下,诶嘿,这不就出来啦
在这里插入图片描述

2、脚本上报

Python中有一个包,名字就叫aprs,导入此包之后方便了很多,无需构建HTTP Request报文,只需调用时候传递拼好的字符串即可。

pip install aprs

然后,直接附上脚本,各位HAM们自己研究一下,简单的很

#!/usr/bin/python

import serial
import time
ser = serial.Serial("/dev/ttyUSB2",115200)
import aprs

rec_buff = ''

def send_at(command,back,timeout):
	rec_buff = ''
	ser.write((command+'\r\n').encode())
	time.sleep(timeout)
	if ser.inWaiting():
		time.sleep(0.01 )
		rec_buff = ser.read(ser.inWaiting())
	if back!='' and back not in rec_buff.decode():
		print(command + ' ERROR')
		print(command + ' back:\t' + rec_buff.decode())
		return 0,0
	else:
		run_resule=rec_buff.decode()
		#print(run_resule)
		return (1,run_resule)

def get_gps_position():
	rec_null = True
	answer = 0
	print('Start GPS session...')
	rec_buff = ''
	send_at('AT+CNETSTART','',1)
	time.sleep(1)
	GPS_Info=send_at('AT+CGPSINFO','+CGPSINFO: ',1)[1]
	AGPS_Info=send_at('AT+CLBS=1','OK',5)[1]
	#print(GPS_Info)
	#print(AGPS_Info)
	if ',,,,,,' in GPS_Info:
		print('GPS is not ready')
		#print(AGPS_Info.split())
		if len(AGPS_Info.split())>3:
			lat=float(AGPS_Info.split()[3].split(',')[1])*100
			lng=float(AGPS_Info.split()[3].split(',')[2])*100
		else:
			lat,lng=0,0
	else:
		lat=float(GPS_Info.split()[2].split(',')[0])*1
		lng=float(GPS_Info.split()[2].split(',')[2])*1
	#print(lat,lng)
	lat=round(lat,2)
	lng=round(lng,2)
	return lat,lng

if __name__ == '__main__':
	while True:
		try:
			lat,lng=get_gps_position()
			if lat==0 and lng==0:
				raise
			#print(lat,lng)
			frame_text=('BI1FQO-P>APDG03,TCPIP*,qAC,BI1FQO-RS:!%sND%sE&/A=000000 Auto Report by RPI with GPS module.逗老师的带GPS的盒子自动上报'%(lat,lng)).encode()
			a = aprs.TCP(b'BI1FQO', b'12345')#12345替换成你的passcode
			a.start()
		
			a.send(frame_text)
		except Exception as err:
			print(err)
		time.sleep(300)

然后,写个sheel脚本,开机自动运行,就OKK啦
这个小项目基本就这样了,对于开发者来说,这个项目非常简单。但是对于HAM们来说,如果理解起来费劲的话,也可以私信联系我帮忙处理。
这里是BI1FQO,DMR ID:4606666,希望各位HAM通联愉快!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

逗老师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值