SIM8200EA-M2 5G HAT for Raspberry Pi 5G智能小车 GPS功能与手机APP定位服务

来自Waveshare Wiki
跳转至: 导航搜索

关于GPS:

SIM8200EA模块的GPS信号支持NMEA协议,首先测试GPS信号,在微雪官方说明文档下载串口调试助手和GPS调试工具

GPS模块连接SIM8200EA第6个串口
5G GNSS CAR (1).png

SIM8200EA连接电脑进行测试

通过3.0USB对插线连接电脑,打开串口调试助手。选择AT串口,设置波特率115200打开串口进行调试。
5G GNSS CAR (2).png
输入AT指令:

AT+CGPS=1

5G GNSS CAR (3).png


返回值为OK即已打开GPS定位功能,通过串口调试助手查看NMEA串口,使用uSTAR软件打开串口进行GPS定位测试,选择NMEA串口设置好波特率确定打开串口。
5G GNSS CAR (4).png

5G GNSS CAR (5).png
GPS功能可以正常运行

手机APP编写

使用团队已经开源的app代码
打开VScode
创建目录打开终端输入以下内容下载源代码。

git clone https://gitee.com/dream_lan/yun-smart-mobile.git

打开目录如图所示:
5G GNSS CAR (6).png
终端输入npm i安装脚本,脚本安装成功运行脚本
5G GNSS CAR (7).png
在终端显示脚本运行状态,运行成功返回app前端页面,访问localhost:8080显示页面
5G GNSS CAR (8).png
5G GNSS CAR (9).png

通过MQTT协议建立系统

选择MQTT的服务器是自己的服务器,是我团队目前正在内测的物联网云平台,
5G GNSS CAR (10).png
首先添加设备
5G GNSS CAR (11).png
打开在线调试
5G GNSS CAR (12).png
查看到消息和控制调试接口收到信息成功。

树莓派设备端代码编写:

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打包

5G GNSS CAR (13).png
5G GNSS CAR (14).png

整体运行过程

SIM8200EA模块安装至树莓派上,打开SIM8200EA电源,运行树莓派
在树莓派运行设备端代码,获取到GPS信号之后传入手机app即可查看当时位置
5G GNSS CAR (1).jpg