开发板资料
· 开发板文档
° 规格书
° 原理图
° 丝印图
° 资源介绍与使用指导
开发工具
固件包
版本:8915DM_cat1_open_EC200UEUAAR05A01M08_TEST0222_merge
下载固件
实验源码
-
版本:v2.0.1
-
从 Github 仓库获取源代码步骤如下:
硬件准备
Windows电脑一台,建议 Win10 系统。
一套EC200U-EU Quecpython 标准开发板(含天线,Type-C数据线)
一张能够正常使用的SIM卡
环境搭建
硬件连接
按照下图硬件连接:


-
将天线连接至标识有 LTE 字样的天线连接座上。
-
在图示位置SIM1卡槽插入可用的 Nano SIM 卡。
-
使用 Type-C 数据线连接开发板和电脑。
设备开发
完成硬件连接工作后,当PWR,SCK1亮起或电脑设备管理器的端口列表出现包含Quectel USB字样的COM口,表示开机成功

参考此章节,烧录固件包至开发板。
1.参考此章节,将源码目录下的code文件夹中的所有文件按原目录结构导入到模组文件系统中,如下图所示

2.参考此章节,执行主程序文件_main.py
3.参考此章节,停止程序运行。
业务调试
程序启动
执行_main.py脚本后,程序开始运行,会打印拨号信息,包括拨号状态、IP地址、DNS服务器地址,设备号等

🚩 Warning
未插入SIM卡时,SCK1灯不会亮起,并且无法打印设备信息,插入SIM卡并重启设备后即可正常运行。

数据检测
开始运行后每1s会打印一次检测到的温度1,湿度,气压,温度2,颜色的三原色的数据,

数据更新
当检测以上4种的任一数据产生大于1或者原色产生大于150的变化时就会尝试上传云端更新数据,当上传成功时返回“send ret:True”,并且会提示是哪些数据发生了变化,APP读取云端最新数据进行数据更新。

如果数据没有大于1的变化就会只在pqcom中打印当前检测的数据,不会发起上传云端。

位置定位更新,当模组位移超过50米时,云端会刷新定位信息,app读取最新定位信息。

主动刷新APP数据,通过点击APP右上角刷新按键,APP会向服务器发起主动读取数据的指令,用于主动更新面板数据

温度,湿度,气压,颜色,Lbs数据被获取成功

软件框架
-
软件设计图

-
业务启动流程

代码讲解
数据管理
common.py的Storage 类是一个基于 Python 内置 dict 类的扩展,用于提供线程安全的字典存储,并支持从 JSON 文件加载和保存数据。
服务模块#
1.Lbs_Service:提供Lbs数据定位服务
2.gnss_service:提供gnss数据定位服务
3.Sensor_service:提供传感器数据检测服务
4.Qth_client:提供数据上传和回调服务
各个service和client的关系图如下:

传感器数据采集
SensorService.py的SensorService 类是一个用于管理传感器数据采集和更新的服务类,主要负责初始化 I2C 通道和多个传感器(SHTC3、LPS22HB 和 TCS34725),并持续从这些传感器中读取温度、湿度、气压和 RGB 颜色值。它还负责将这些数据发送到指定的QTH 客户端。
QTH平台客户端
QthClient 类是一个用于与 QTH(Quantum Technology Hub)平台进行通信的客户端类。它负责初始化、启动和管理与 QTH 平台的连接,并处理来自平台的各种事件和回调。
logger = getLogger(__name__)
class QthClient(object):
def __init__(self, app=None):
self.opt_lock = Lock()
if app:
self.init_app(app)
def __enter__(self):
self.opt_lock.acquire()
return self
def __exit__(self, *args, **kwargs):
self.opt_lock.release()
def init_app(self, app):
"""
初始化应用程序与Qth服务器的连接。
该方法将当前实例注册到应用程序中,并根据应用程序的配置信息初始化Qth客户端。
它设置了产品信息、服务器地址以及事件回调函数,以确保与Qth服务器的正确通信。
参数:
- app: 应用程序实例,必须包含正确配置的Qth产品密钥、产品密钥和服务器地址。
返回值:
无
"""
app.register("qth_client", self)
Qth.init()
Qth.setProductInfo(app.config["QTH_PRODUCT_KEY"], app.config["QTH_PRODUCT_SECRET"])
Qth.setServer(app.config["QTH_SERVER"])
Qth.setEventCb(
{
"devEvent": self.eventCallback,
"recvTrans": self.recvTransCallback,
"recvTsl": self.recvTslCallback,
"readTsl": self.readTslCallback,
"readTslServer": self.recvTslServerCallback,
"ota": {
"otaPlan":self.otaPlanCallback,
"fotaResult":self.fotaResultCallback
}
}
)
def load(self):
self.start()
def start(self):
Qth.start()
def stop(self):
Qth.stop()
def sendTsl(self, mode, value):
return Qth.sendTsl(mode, value)
def isStatusOk(self):
return Qth.state()
def sendLbs(self, lbs_data):
return Qth.sendOutsideLocation(lbs_data)
def sendGnss(self, nmea_data):
return Qth.sendOutsideLocation(nmea_data)
def eventCallback(self, event, result):
logger.info("dev event:{} result:{}".format(event, result))
if(2== event and 0 == result):
Qth.otaRequest()
def recvTransCallback(self, value):
ret = Qth.sendTrans(1, value)
logger.info("recvTrans value:{} ret:{}".format(value, ret))
def recvTslCallback(self, value):
logger.info("recvTsl:{}".format(value))
for cmdId, val in value.items():
logger.info("recvTsl {}:{}".format(cmdId, val))
def readTslCallback(self, ids, pkgId):
logger.info("readTsl ids:{} pkgId:{}".format(ids, pkgId))
value=dict()
temp1, humi =CurrentApp().sensor_service.get_temp1_and_humi()
press, temp2 = CurrentApp().sensor_service.get_press_and_temp2()
r,g,b = CurrentApp().sensor_service.get_rgb888()
value={
3:temp1,
4:humi,
5:temp2,
6:press,
7:{1:r, 2:g, 3:b},
}
lbs=lbs_service.LbsService()
lbs.put_lbs()
for id in ids:
if 3 == id:
value[3]=temp1
elif 4 == id:
value[4]=humi
elif 5 == id:
value[5]=temp2
elif 6 == id:
value[6]=press
elif 7 == id:
value[7]={1:r, 2:g, 3:b}
Qth.ackTsl(1, value, pkgId)
def recvTslServerCallback(self, serverId, value, pkgId):
logger.info("recvTslServer serverId:{} value:{} pkgId:{}".format(serverId, value, pkgId))
Qth.ackTslServer(1, serverId, value, pkgId)
def otaPlanCallback(self, plans):
logger.info("otaPlan:{}".format(plans))
Qth.otaAction(1)
def fotaResultCallback(self, comp_no, result):
logger.info("fotaResult comp_no:{} result:{}".format(comp_no, result))
def sotaInfoCallback(self, comp_no, version, url, md5, crc):
logger.info("sotaInfo comp_no:{} version:{} url:{} md5:{} crc:{}".format(comp_no, version, url, md5, crc))
Qth.setMcuVer("MCU1", "V1.0.0", self.sotaInfoCallback, self.sotaResultCallback)
def sotaResultCallback(comp_no, result):
logger.info("sotaResult comp_no:{} result:{}".format(comp_no, result))
APP管理
__ init __.py的Application 是一个用于管理应用程序及其扩展的类,提供了初始化、注册扩展、加载扩展以及运行时打印设备信息的功能。