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

news2024/12/23 15:41:23

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

逗老师最近整了个有意思的小活,组装了一个有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通联愉快!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/445598.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

linux coredump

文章目录 是什么生成原理coredump 的“危害” reference: 一文读懂Coredump文件是如何生成的 GDB是什么? 是什么 简单的讲:当进程接收到某些信号而导致异常退出时,就会生成 coredump 文件 在程序发生某些错误而导致进程异常退出时&#x…

技术分析内核并发消杀器(KCSAN)一文解决!

一、KCSAN介绍 KCSAN(Kernel Concurrency Sanitizer)是一种动态竞态检测器,它依赖于编译时插装,并使用基于观察点的采样方法来检测竞态,其主要目的是检测数据竞争。 KCSAN是一种检测LKMM(Linux内核内存一致性模型)定义的数据竞争(data race…

亿发软件:中大型仓库进出货管理系统解决方案,定制软件让仓储作业高效便捷

中大型仓库出入库管理是传统厂家供应链管理流程的重要部分,直接关乎货物在仓库当中存储的安全,和员工工作的效率。一旦仓库管理当中出现了疏漏,那么货物的信息数据就会发生变动,导致实际与账目不符。人工带来的低效与不可控是传统…

软件测试行业到底有没有前景和出路?

我现在来跟你说说软件测试的真正情况。 首先一个软件做出来,最不能少的人是谁?不用说就是开发,因为开发是最了解软件运作的那个人,早期不少一人撸网站或者APP的例子,相当于一个人同时是产品、研发、测试、运维等等&am…

15-721 Chapter9 数据压缩

Background disk database的瓶颈在disk IO上的话(也就是说数据压缩的好处很大,可以比较放心的做),那么内存数据库的瓶颈是多方面的,其中包含cpu。所以我们要在计算量和压缩率(DRAM还是有点贵的&#xff0c…

需求管理实践四大流程的注意事项

需求管理实践包括四大流程:需求采集、需求分析、需求筛选和需求处理。 1、需求采集注意事项 需求采集需要通过多种形式对不同用户需求进行收集,并对需求的属性进行详细记录,并记录可追溯的反馈人员,以便后期跟踪修改。 需求管理实…

你不知道的Redis Search 以及安装指南

theme: orange 本文正在参加「金石计划」 这篇文章是为了使用Redis Search 的向量搜索功能提前做的环境准备工作。即讨论如何在准备生产的 linux 环境中安装 RediSearch 和 RedisJSON 模块。 什么是RediSearch? 根据RediSearch的官方文档 RediSearch是这样描述的。 …

线性表,栈和队列(2)

作者:额~我那个早过50了,忘记了 言归正传ca 什么是栈? 小李攒钱买了车,可是他家住在胡同的尽头。胡同很窄,只能通过一辆车,而且是死胡同。小李每天都为停车发愁,如果回家早了停在里面&#x…

pandas笔记:pandas 排序 (sort_values)

1 函数说明 DataFrame.sort_values(by,*, axis0, ascendingTrue, inplaceFalse, kindquicksort, na_positionlast, ignore_indexFalse, keyNone) 2 参数说明 by string或者一组string组成的list,根据什么进行排序 axis{0 or ‘index’, 1 or ‘columns’}ascendi…

其它 Composition API

1.shallowReactive 与 shallowRef shallow有浅的意思 首先在原有的页面上引入它,然后用shallowReactive包裹它 浅层次的意思就是像name,age这些是响应式的,而job就不处理,意思就是只处理第一层数据,像第二层的都不处理…

电气互联系统有功-无功协同优化模型

目录 1 主要内容 模型示意图 目标函数 程序亮点 2 部分程序 3 程序结果 4 程序链接 1 主要内容 本程序基本复现《“碳中和”目标下电气互联系统有功-无功协同优化模型》,文献模型提供了一个很好的创新思路,把常规电气互联系统的调度和有功无功优化…

【Linux】-关于Linux的指令(上)

作者:小树苗渴望变成参天大树 作者宣言:认真写好每一篇博客 作者gitee:gitee 如 果 你 喜 欢 作 者 的 文 章 ,就 给 作 者 点 点 关 注 吧! TOC 前言 今天我们来讲关于Linux的基本指令,博主讲的指令会对应着Windows…

Java 8中新特性Stream的详细理解和使用

Java 8中新特性Stream的基本理解和使用 Stream基本概念 Stream流是来自数据源的元素队列并支持聚合操作 **元素:**是特定类型的对象,是数据源形成的一个队列。Java中Stream不会存储元素,而是按需计算 数据源:Stream流数据的来…

自定义函数 | R语言批量计算组间差值

批量字符替换、数值大小比较并重新赋值 cal_repeat()函数的实际操作1.不考虑处理变量。考虑多变量和指定2列变量的情况(长数据):2.考虑处理变量。考虑多处理,多变量的情况(长数据):3.考虑处理变…

Node【Global全局对象】

文章目录 🌟前言🌟Global全局对象🌟Global对象属性与方法🌟Global对象属性🌟process🌟Buffer类🌟console 🌟写在最后 🌟前言 哈喽小伙伴们,新的专栏 Node 已…

华为OD机试真题(Java),最优策略组合下的总的系统消耗资源数(100%通过+复盘思路)

一、题目描述 在通信系统中有一个常见的问题是对用户进行不同策略的调度,会得到不同系统消耗的性能。 假设由N个待串行用户,每个用户可以使用A/B/C三种不同的调度策略,不同的策略会消耗不同的系统资源。 请你根据如下规则进行用户调度&…

netty源码阅读--服务启动

背景 netty是一个非常成熟的NIO框架,众多apache的顶级项目底层通信框架都是用的是netty,本系列博客主要是记录自己复习netty源码的过程,重在理解netty的关键如:如何启动,如何接受网络数据、netty的内存管理机制以及编解码器等&am…

【KingSCADA】如何建立硬件系统及相关变量

小伙伴们大家好,我是雷工! 本篇学习了解KingSCADA3.8如何建立硬件系统及相关变量,以下为学习过程和操作记录。 一、前言 本篇主要讲解如何定义设备,如何定义变量。 KingSCADA3.8的采集系统是指负责和现场设备进行通讯&#xff0…

通过azure学生认证拿到一年服务器使用权

通过azure学生认证 因为国内备案被迫找其他服务器 开始我买了一个华为的服务器,大家都知道,在国内,服务器是需要备案的。如果你备案过的话,就知道这个是非常麻烦的事情。时间久不说。过程也是非常的繁琐。这个繁琐的过程&#x…

《Linux基础》06. 进程管理 · 服务管理

Linux基础-06 1:进程管理1.1:查看进程1.1.1:ps1.1.2:pstree1.1.3:top 1.2:终止进程1.2.1:kill1.2.2:killall 2:服务管理2.1:运行级别2.2:服务查看…