SIM8200EA-M2 5G HAT for Raspberry Pi 5G智能小车 GPS功能与手机APP定位服务
来自Waveshare Wiki
关于GPS:
SIM8200EA模块的GPS信号支持NMEA协议,首先测试GPS信号,在微雪官方说明文档下载串口调试助手和GPS调试工具
SIM8200EA连接电脑进行测试
通过3.0USB对插线连接电脑,打开串口调试助手。选择AT串口,设置波特率115200打开串口进行调试。
输入AT指令:
AT+CGPS=1
返回值为OK即已打开GPS定位功能,通过串口调试助手查看NMEA串口,使用uSTAR软件打开串口进行GPS定位测试,选择NMEA串口设置好波特率确定打开串口。
手机APP编写
使用团队已经开源的app代码
打开VScode
创建目录打开终端输入以下内容下载源代码。
git clone https://gitee.com/dream_lan/yun-smart-mobile.git
打开目录如图所示:
终端输入npm i安装脚本,脚本安装成功运行脚本
在终端显示脚本运行状态,运行成功返回app前端页面,访问localhost:8080显示页面
通过MQTT协议建立系统
选择MQTT的服务器是自己的服务器,是我团队目前正在内测的物联网云平台,
首先添加设备
打开在线调试
查看到消息和控制调试接口收到信息成功。
树莓派设备端代码编写:
mqtt协议的使用函数
这里的sub/pub标签分别对应与在MQTT服务器设置的设备信息中的sub/pub信息
# 发起MQTT连接 def on_connect(client, userdata, flags, rc): print("Connected with result code " + str(rc) + '\n') client.subscribe("需要填入自己设置的sub标签") def SendMQTT(latitude, longitude, satenum): client.publish("需要填入自己设置的pub标签",json.dumps({ "latitude":latitude, "longitude":longitude, "satenum":satenum })) # 接收MQTT消息 def on_message(client, userdata, msg): payload = json.loads(msg.payload.decode()) # 获取指令 print(payload.get("code")) # 根据指令执行对应操作
初始化设置代码及其含义
def setup(): global Latitude # 纬度变量 global Longiture # 经度变量 global line # global line1 global ser1 # 定义串口1 global ser2 # 定义串口2 # global response ser2 = serial.Serial("/dev/ttyUSB2",115200) ser2.write('AT+CGPS=1\r'.encode()) # 发送指令打开GPS功能 #ser2.write('AT+CSQ\r'.encode()) #response = ser1.readline() #response = str(response,encoding='utf-8') #if response.startswith("+CSQ"): # rule = r': (.*?),' # slotList = re.findall(rule, response) # print(slotList) ser2.close() # 关闭串口2通道,为打开串口1通道做准备
载入代码及其含义
def loop(): ser1 = serial.Serial("/dev/ttyUSB1",115200) while True: line = ser1.readline() # 读取每一行的NMEA信号 line = str(line,encoding='utf-8') if line.startswith("$GNRMC"):# 读取到$GNRMC信号时开始解析 global Longiture # 全局变量 global Latitude global slotList # 卫星数量函数 rmc = pynmea2.parse(line) # 用pynmea2解析库进行解析 print(rmc)打印出结果 if re.match("^\d+?\.\d+?$", rmc.lat)is not None: # 开始执行程序过程中SIM8200EA获取GPS信号要稍等一会,判断信号获取成功进行赋值并发送MQTT消息 print(rmc) longitude = str(int(float(rmc.lat)/100)+((float(rmc.lat)/100)-int(float(rmc.lat)/100))/0.6) latitude = str(int(float(rmc.lon)/100)+((float(rmc.lon)/100)-int(float(rmc.lon)/100))/0.6) satenum = 8 print (latitude) print (longitude) SendMQTT(latitude, longitude,satenum) time.sleep(2)
接入MQTT服务器代码放置主函数中
def destroy(): ser.close() if __name__ == "__main__": # 配置MQTT服务 client = mqtt.Client() client.on_connect = on_connect client.on_message = on_message HOST = ""# IP地址填入MQTT服务器地址 client.connect(HOST, 1883, 60)# 配置信息不适用于所有MQTT服务器,需要查看MQTT端口号进行更改 client.loop_start() # 程序开始 try: setup() loop() except KeyboardInterrupt: destroy()
设备端整体代码
直接复制粘贴不能使用,需要自行接入MQTT服务器,接入方式阅读上文
from socket import socket import sys import re import pynmea2 import serial import chardet import time import math import paho.mqtt.client as mqtt import socket import json # 发起MQTT连接 def on_connect(client, userdata, flags, rc): print("Connected with result code " + str(rc) + '\n') client.subscribe("") # 发送MQTT消息 def SendMQTT(latitude, longitude, satenum): client.publish("",json.dumps({ "latitude":latitude, "longitude":longitude, "satenum":satenum })) # 接收MQTT消息 def on_message(client, userdata, msg): payload = json.loads(msg.payload.decode()) # 获取指令 print(payload.get("code")) # 根据指令执行对应操作 # 这里设备没有控制 def setup(): global Latitude global Longiture global line global line1 global ser1 global ser2 # global response ser2 = serial.Serial("/dev/ttyUSB2",115200) ser2.write('AT+CGPS=1\r'.encode()) #ser2.write('AT+CSQ\r'.encode()) #response = ser2.readline() #response = str(response,encoding='utf-8') #if response.startswith("+CSQ"): # rule = r': (.*?),' # slotList = re.findall(rule, response) # print(slotList) ser2.close() def loop(): ser1 = serial.Serial("/dev/ttyUSB1",115200) while True: line = ser1.readline() line = str(line,encoding='utf-8') if line.startswith("$GNRMC"): global Longiture global Latitude global slotList rmc = pynmea2.parse(line) print(rmc) if re.match("^\d+?\.\d+?$", rmc.lat)is not None: print(rmc) longitude = str(int(float(rmc.lat)/100)+((float(rmc.lat)/100)-int(float(rmc.lat)/100))/0.6) latitude = str(int(float(rmc.lon)/100)+((float(rmc.lon)/100)-int(float(rmc.lon)/100))/0.6) satenum = 8 print (latitude) print (longitude) SendMQTT(latitude, longitude,satenum) time.sleep(2) def destroy(): ser1.close() ser2.close() if __name__ == "__main__": # 配置MQTT服务 client = mqtt.Client() client.on_connect = on_connect client.on_message = on_message HOST = "" client.connect(HOST, 1883, 60) client.loop_start() # 程序开始 try: setup() loop() except KeyboardInterrupt: destroy()
进行APP打包
使用脚本build打包
整体运行过程
SIM8200EA模块安装至树莓派上,打开SIM8200EA电源,运行树莓派
在树莓派运行设备端代码,获取到GPS信号之后传入手机app即可查看当时位置