公网对讲机方案基于 EC600MCNLE QuecPython 标准开发板实现,具有以下特性:
Windows 电脑一台,建议?Win10?系统。
两套?EC600MCNLE QuecPython 标准开发板?(每一套均含天线、Type-C 数据线等)。
??Tips
一套用于主叫设备演示,一套用于被叫设备演示。
两张可正常使用的 Nano SIM 卡。
两个型号为 ST7789、分辨率为 240*240 的 LCD 屏幕。
两个 2-5 W 功率的喇叭。
下载并安装 EC600M 系列模组驱动:QuecPython_USB_Driver_Win10_ASR。
下载并安装?VSCode。
下载并解压 QPYcom?工具到电脑的合适位置。
下载固件包。
下载实验源码。
申请伯纳德芯平台测试账号。
根据下图所示步骤获取 IMEI 号,将其提供给移远销售人员,即可申请对讲机测试账号。

??Tips
- 非商业测试,请联系移远销售人员( li.bao@quectel.com ),申请伯纳德芯平台测试账号。
- 商业应用请走商务流程。
按照下图进行硬件连接:

SPK+?和?SPK-?的排针上。LCD?字样的排针上。LTE?字样的天线连接座上。完成硬件连接的工作后,长按开发板上标识为PWK的按键,直到网络灯闪烁,或电脑设备管理器的端口列表中出现包含?Quectel USB?字样的 COM?口,表示开机成功。
参考此章节,烧录固件包?EC600MCNLER06A01M08_POC_XBND_OCPU_QPY_BETA0117.zip?至开发板。
code?文件夹中的所有文件导入到模组文件系统,如下图所示:
执行?poc_main.py?脚本后,程序开始运行,进入到?WelcomeScreen?界面,同时获取 SIM 卡状态和当前账号,并通过 TTS 语音播报当前登录用户及其加入的群组信息。

??Warning
未插入 SIM 卡时不会进入到主界面,插入 SIM 卡并重启设备后即可正常运行。
主界面包含多个选项列表(用户可参考?软件设计讲解 - 界面??自行添加、修改),每个选项对应一个新的界面。
key2?键,选中框往下滚动。key2?键,进入所选中的界面。key2?键,返回上一级界面。
进入群组管理界面可以查询到当前账号所加入的群组列表,并且消息提示框会提示当前群组,如下图:

进入成员列表界面可以查询到当前所在群组的所有成员,如下图:

key1?键,可以与同一群组内的成员进行对讲,菜单栏显示?麦克风?图标。key1?键,结束对讲功能。听筒?图标。主动呼叫图示:

对方呼叫图示:



有关 POC 库的 API 函数可参考POC-公网对讲机说明文档。
通过注册?poc.login()?回调函数,监听登录状态,并根据登录结果执行相应的操作。
具体功能如下:
poc.login()?注册回调函数,监听登录状态(param?参数表示登录成功或失败)。param == 1),更新网络状态为正常,并根据平台类型(标准平台或其他平台)清理或存储安全数据。WelcomeScreen)更新登录状态,并查询群组信息。该功能?槿繁I璞改芄徽返锹 POC 平台,并在登录失败时自动尝试重新连接。
通过注册?poc.register_join_group_cb()?回调函数,监听设备入组事件,并根据入组状态更新界面和播放提示音。
具体功能如下:
poc.register_join_group_cb()?注册回调函数,监听设备是否成功进入群组。poc.group_getbyid()?查询当前群组的详细信息。该功能?槿繁S没г诮肴鹤槭蹦芄患笆笔盏接镆籼崾荆⒄反砣鹤榍谢缓妥刺。
通过调用 POC 接口获取群组和成员数据,并将数据返回给界面层进行渲染。
具体功能如下:
poc.get_groupcount()?获取当前账号加入的群组数量,并通过?poc.get_grouplist()?获取群组列表数据。poc.group_getbyid()?获取当前群组信息,然后使用?poc.get_membercount()?和?poc.get_memberlist()?获取成员数量和成员列表数据。该功能?槲鹤楣芾砗统稍绷斜斫缑嫣峁┝耸葜С,确保用户能够查看和操作群组及成员信息。
此部分是解决方案的核心功能?椋涸鸫矶越沧刺墓芾、网络状态检查以及界面提示的更新。
具体功能如下:
讲话中...提示框,并更新状态栏的对讲图标。该功能?槿繁A硕越补δ艿奈榷ㄐ院陀没逖榈牧鞒┬。
通过注册?poc.register_audio_cb()?回调函数,监听对方的呼叫信息,并根据呼叫状态更新设备状态和界面提示。
具体功能如下:
注册音频回调:通过?poc.register_audio_cb()?注册回调函数,监听对方的呼叫信息(params?参数包含语音状态、用户 ID、用户名和打断标志)。
呼叫状态处理:
params[0] == self.BAND_CALL),更新设备状态为“主动呼叫”。params[0] == self.BND_LISTEN_START),更新设备状态为“呼叫结束”,并根据打断标志设置发言权限。params[0] == self.BND_LISTEN_STOP?或?params[0] == self.BND_SPEAK_STOP),处理打断逻辑并更新设备状态。界面更新:在对方呼叫时,显示消息提示框,唤醒 LCD 屏幕,并更新状态栏的对讲图标。
状态管理:根据呼叫状态更新设备的主叫状态、发言状态和会话信息,确保设备状态与呼叫信息同步。
该功能?槿繁I璞改芄徽反矶苑降暮艚行畔,并实时更新界面和状态。
MenuBar 类通过绑定、发送事件更新状态栏中的各个组件,确保用户能够实时查看设备的关键信息。
具体功能如下:
状态栏的大小为 240 × 40 px,位于 LCD 屏幕的上方。
PromptBox 类通过弹窗的形式展示消息内容,并支持动态更新和关闭弹窗。
具体功能如下:
msg)和元数据(meta),创建一个弹窗并居中显示在屏幕上。弹窗的大小为 180 × 90 px,消息内容支持自动换行,并居中显示。
以 MemberScreen 为例介绍。
MemberScreen 类继承自?Screen,用于在 LCD 屏幕上显示成员信息,大小为 240 × 200 px,与状态栏共同构成完整的 LCD 显示区域。
具体功能如下:
该类的设计实现了成员列表的动态加载和交互管理,确保用户能够方便地查看和操作成员信息。
PocUI 类通过事件驱动的方式加载指定的屏幕,并处理屏幕切换时的资源管理和状态更新。
具体功能如下:
msg["screen"]),从屏幕列表中找到对应的屏幕并加载。WelcomeScreen),则显示状态栏。load_before()、load()?和?load_after()?方法,确保屏幕的初始化逻辑正确执行。该类是 UI 屏幕加载的核心逻辑,确保界面切换的流畅性和资源的高效管理。
通过按键实现屏幕的滚动、选择,以及开启对讲服务。
EventMap 类通过维护一个事件映射表(__event_map),实现事件的发送和绑定,支持同步和异步两种消息发送模式。
具体功能如下:
事件绑定:通过?bind()?方法将事件名称与回调函数关联,存储在?__event_map?中。
事件解绑:通过?unbind()?方法移除指定事件的回调函数。
事件发送:
MODE_SYNC):在当前线程中直接执行回调函数,并返回执行结果。MODE_ASYNC):在新线程中执行回调函数,不阻塞当前线程。错误处理:在执行回调函数时捕获异常,并记录错误日志(如果启用了日志功能)。
日志记录:支持记录事件的执行信息,便于调试和问题排查。
该功能?槭窍低持懈鞲瞿?橹渫ㄐ诺暮诵,确保事件能够高效、可靠地传递和处理。
APP 类采用?榛杓疲ü骋坏墓芾斫涌谑迪指髯榧的动态加载和生命周期管理。
具体功能如下:
核心组件管理:
set_ui())、按键?椋add_key())、状态栏(add_bar())、消息框(add_msgbox())和屏幕(add_screen())服务管理:
add_service()?添加后台服务(如网络服务、音频服务)instance_after()?进行初始化,维护服务列表(__service_list)应用启动:
exec()?方法中依次启动 UI 组件(__ui.start())和所有服务lv.task_handler())维持 GUI 运行该类的设计实现了应用程序的模块化架构,为大型嵌入式 GUI 应用提供了可扩展的框架基础。
services.py?定义了多个?service,用于提供各种服务。这些?servies?继承?AbstractLoad?抽象加载基类,便于在加载过程中提供各类服务事项。
BatteryManger:提供电池电量管理DevInfoService:提供设备信息服务MediaService:提供音频服务NetService:提供网络服务PocService:提供 Poc 对讲服务各?service?之间的关系如下图:

如用户需添加?
service,可参考已有?service?样式进行添加,并添加到?poc_main.py?中对应的位置即可。
在?ui.py?中,定义了多个 UI 界面,如:
PocUI:主 UI,提供?MenuBar、PromptBox?和?Screen?的管理以及按键事件的响应处理MenuBar:菜单栏(用于显示网络状态、时间、电量以及其他图标,一直显示在屏幕上方,大小为 240×20 px)PromptBox:消息提示框(用于消息提示,显示在当前 UI 界面之上)Screen:UI 屏幕,也可以理解为 UI 界面,用于展示给用户看的各种界面。如?GroupScreen、WelcomeScreen?和?MemberScreen?等各 UI 界面之间的关系如下图:

如用户需添加?
Screen,可参考已有?Screen?样式进行添加,并添加到?poc_main.py?中对应的位置即可。