树莓派R800C HAT GSM/GPRS通信实战:从AT指令到物联网报警系统

📅 2026/8/2 12:03:00 👁️ 阅读次数 📝 编程学习
树莓派R800C HAT GSM/GPRS通信实战:从AT指令到物联网报警系统

1. 项目概述:让树莓派“开口说话”的R800C HAT

如果你手头有一个树莓派,想让它摆脱Wi-Fi的束缚,实现真正的移动网络通信——比如在野外采集数据后自动发短信报警,或者做一个不依赖本地网络的远程监控终端——那么,R800C GSM/GPRS HAT可能就是你在找的那个关键模块。这不仅仅是一个简单的扩展板,它是一个完整的2G通信解决方案,能让你的树莓派项目获得“千里传音”的能力。我最初接触它,是为了一个农业大棚的环境监测项目,需要在没有宽带和稳定Wi-Fi的偏远地区,让树莓派定时将温湿度数据发送到云端,R800C完美地解决了这个核心痛点。

简单来说,R800C HAT是一个专为树莓派设计的硬件扩展板,它集成了SIM800C这颗经典的GSM/GPRS通信芯片。通过它,你的树莓派就能像一部老式功能手机一样,使用2G网络进行语音通话、收发短信,以及通过GPRS传输数据。虽然现在5G时代已经来临,但2G网络因其覆盖极广、功耗相对较低、模块成本低廉的优势,在物联网(IoT)、远程监控、资产追踪等大量低数据速率、高可靠性的场景中,依然有着不可替代的地位。R800C HAT将复杂的射频电路、SIM卡座、天线接口甚至音频接口都集成在了一块板子上,你只需要像叠罗汉一样把它插在树莓派的GPIO排针上,接上天线和SIM卡,就完成了硬件连接,极大地降低了开发门槛。

2. 核心硬件解析与选型考量

2.1 R800C HAT的硬件构成与接口

拿到一块R800C HAT,你会发现它的设计非常紧凑且功能明确。板子的核心无疑是SIM800C模块,这是一颗经过市场长期验证的GSM/GPRS芯片,支持四频(850/900/1800/1900MHz),兼容全球绝大多数地区的2G网络。围绕这颗芯片,板载了必要的电源管理电路、SIM卡座(通常是标准的Micro-SIM或Nano-SIM卡座,需要根据具体版本确认)、一个3.5mm耳机麦克风二合一接口用于语音功能,以及一个至关重要的SMA天线接口。

对于树莓派开发者而言,最友好的设计是其“HAT”形态。它直接通过40Pin的GPIO排针与树莓派连接,不仅完成了供电(通常从树莓派的5V或3.3V取电),还建立了串口通信链路。SIM800C模块与树莓派的主控芯片(如Broadcom BCM2711)通过UART串口进行AT指令交互。这意味着,在软件层面,你操作R800C就像操作一个串口设备一样简单,发送特定的文本指令(AT命令),模块就会返回对应的响应。

这里有一个关键的硬件细节需要注意:电源。SIM800C在发射信号时,瞬时电流可能高达2A,这对电源的瞬态响应能力提出了很高要求。质量不佳的电源或USB线可能导致模块启动失败或运行时突然重启。因此,务必为树莓派配备一个足额5V/2.5A以上的优质电源适配器。有些R800C HAT板载了大的储能电容和稳压电路来缓解这个问题,但源头供电稳定是基础。

2.2 为何在2024年仍考虑GSM/GPRS?

在NB-IoT、4G Cat.1甚至5G RedCap等物联网技术蓬勃发展的今天,为一个新项目选择2G模块似乎有些“复古”。但这恰恰是工程实践中需要权衡的地方。选择R800C这类GSM/GPRS方案,主要基于以下几点现实考量:

  1. 覆盖与成本:2G网络经过数十年的建设,其地面覆盖的广度和深度是任何新一代网络在短期内难以比拟的,尤其是在偏远山区、地下停车场等场景。模块本身的采购成本也极具优势。
  2. 功耗与复杂度:对于只需每天发送几条状态信息(如“设备正常”、“温度超限”)的应用,GPRS数据传输的功耗和成本效益比很高。其协议栈相对简单,开发调试门槛低。
  3. 项目需求匹配:如果你的项目核心需求是“发短信”或“打语音电话”,那么GSM是直接、可靠的方案。例如,一个仓库防盗报警器,在检测到入侵时直接拨打管理员电话,比通过互联网中转更直接、延迟更低。
  4. 生命周期与备选:需要关注的是,全球多个地区的运营商已陆续公布2G/3G退网计划。在项目选型时,必须调研项目部署地区的2G网络生命周期。如果项目周期长或对网络未来有要求,可能需要将NB-IoT或4G Cat.1作为备选方案。但对于短期、特定区域或作为原型验证,R800C依然是快速实现移动通信功能的优秀选择。

3. 软件环境搭建与基础通信测试

3.1 系统准备与串口配置

硬件连接妥当后,软件层面的第一步是确保树莓派能与R800C HAT正常“对话”。由于通信基于串口,我们需要在树莓派操作系统(如Raspberry Pi OS)中启用并配置正确的串口。

首先,通过SSH或直接连接显示器登录到你的树莓派。运行sudo raspi-config进入配置工具。在Interface Options中,找到Serial Port。这里会遇到一个关键选择:

  • 当询问 “Would you like a login shell to be accessible over serial?” 时,选择No。我们不需要串口登录功能。
  • 当询问 “Would you like the serial port hardware to be enabled?” 时,选择Yes。这将启用硬件串口。

这个步骤的目的是将硬件串口(/dev/ttyAMA0)从控制台释放出来,供我们自由使用。配置完成后重启树莓派。

重启后,验证串口设备是否存在:ls -l /dev/ttyAMA0。你应该能看到类似crw-rw---- 1 root dialout 204, 64的输出。注意,普通用户(如pi)需要加入dialout组才有权限读写该设备:sudo usermod -a -G dialout $USER,然后注销重新登录使组生效。

注意:不同版本的树莓派和OS,默认的串口设备名可能略有不同(如/dev/serial0,它是一个指向真实硬件的软链接)。最稳妥的方式是使用ls -l /dev/serial*查看。通常,/dev/serial0会链接到ttyAMA0(树莓派3B+及更新型号)或ttyS0(旧型号)。在我们的上下文中,使用/dev/serial0是兼容性更好的选择。

3.2 使用Minicom进行AT指令手动测试

在编写Python脚本之前,强烈建议使用一个终端工具进行手动测试,这能帮你快速判断硬件连接和模块状态是否正常。minicom是一个经典的选择。

安装minicom:sudo apt install minicom。 然后以配置模式启动它,连接到R800C的串口:sudo minicom -D /dev/serial0 -b 115200。这里的-b 115200指定了波特率,SIM800C模块的默认波特率通常是115200。

如果一切正常,你会在minicom窗口中看到一个空白光标。此时,尝试输入最基本的AT指令:AT,然后按回车。如果模块正常,它会立即回复OK。这个简单的回应,标志着你的树莓派和R800C已经成功握手。

接下来可以进行一系列基础测试:

  • AT+CSQ:查询信号强度。返回如+CSQ: 24,0,第一个数字(24)是信号强度,范围0-31,越大越好,99表示未知或不可用。第二个数字是误码率,0通常最好。
  • AT+CCID:读取SIM卡的ICCID号。这可以验证SIM卡是否被正确识别。
  • AT+CREG?:查询网络注册状态。返回+CREG: 0,1+CREG: 0,5表示已注册到本地网络或已注册且处于漫游状态。

手动测试阶段,如果输入AT无任何反应,请按以下顺序排查:1) 检查天线是否接好;2) 确认电源是否充足;3) 检查/dev/serial0的权限;4) 尝试不同的波特率(如9600);5) 检查硬件连接是否松动。

4. 使用Python实现核心通信功能

手动测试通过后,我们就可以用Python脚本自动化所有操作了。Python的pyserial库是操作串口的利器。

4.1 建立稳定的串口通信类

首先安装依赖:pip install pyserial

然后,我们可以创建一个封装好的类来处理与R800C的通信。这个类的核心是处理AT指令的发送、接收和超时重试。

import serial import time import logging class SIM800CController: def __init__(self, port='/dev/serial0', baudrate=115200, timeout=1): self.port = port self.baudrate = baudrate self.timeout = timeout self.ser = None self.logger = logging.getLogger(__name__) def connect(self): """打开串口连接""" try: self.ser = serial.Serial( port=self.port, baudrate=self.baudrate, timeout=self.timeout ) # 发送一个初始AT命令清空缓冲区并测试连接 self.send_at_command('AT') self.logger.info(f"Connected to SIM800C on {self.port}") return True except serial.SerialException as e: self.logger.error(f"Failed to open serial port: {e}") return False def send_at_command(self, command, expected_response='OK', timeout=5, retries=3): """发送AT命令并检查预期响应""" for attempt in range(retries): try: self.ser.write((command + '\r\n').encode()) self.logger.debug(f"Sent: {command}") start_time = time.time() response_lines = [] while (time.time() - start_time) < timeout: if self.ser.in_waiting: line = self.ser.readline().decode('utf-8', errors='ignore').strip() if line: response_lines.append(line) self.logger.debug(f"Received: {line}") if expected_response in line: return True, response_lines time.sleep(0.1) self.logger.warning(f"Attempt {attempt+1} failed for command: {command}. Response: {response_lines}") time.sleep(1) # 重试前等待 except Exception as e: self.logger.error(f"Error during communication: {e}") return False, response_lines def close(self): """关闭串口连接""" if self.ser and self.ser.is_open: self.ser.close() self.logger.info("Serial port closed")

这个SIM800CController类提供了基础的连接和命令发送框架。send_at_command方法实现了带重试机制的指令发送,这对于不稳定的移动网络环境非常有用。

4.2 实现短信收发功能

短信是GSM模块最基础也是最实用的功能。发送短信需要遵循PDU模式或文本模式。文本模式更简单直观,适合发送英文和数字,而PDU模式支持中文(Unicode编码)。这里以发送英文短信为例:

class SIM800CController(SIM800CController): # 继承上面的类 def send_sms_textmode(self, phone_number, message): """使用文本模式发送英文短信""" # 1. 设置短信为文本模式 success, _ = self.send_at_command('AT+CMGF=1') if not success: self.logger.error("Failed to set text mode") return False # 2. 设置目标号码 success, _ = self.send_at_command(f'AT+CMGS="{phone_number}"') if not success: self.logger.error("Failed to set recipient number") return False # 3. 发送消息内容并以Ctrl+Z结束 (ASCII 26) time.sleep(0.5) # 给模块一个准备接收消息的短暂间隔 self.ser.write((message + chr(26)).encode()) # 4. 等待发送确认 start_time = time.time() while (time.time() - start_time) < 10: # 等待10秒超时 if self.ser.in_waiting: line = self.ser.readline().decode('utf-8', errors='ignore').strip() if '+CMGS:' in line: # 发送成功会返回+CMGS: <消息编号> self.logger.info(f"SMS sent successfully. Response: {line}") return True if 'ERROR' in line: self.logger.error(f"SMS sending failed. Response: {line}") return False time.sleep(0.1) self.logger.error("SMS sending timeout") return False def read_sms(self, index=1): """读取指定索引的短信(文本模式)""" success, _ = self.send_at_command('AT+CMGF=1') if not success: return None success, responses = self.send_at_command(f'AT+CMGR={index}') if success: # 解析响应,通常包含状态、发送方号码、时间戳和消息内容 for line in responses: if '+CMGR:' in line: # 可以在这里解析详细信息 pass elif line and not line.startswith('AT') and not line.startswith('OK'): # 这行很可能是消息正文 return line return None

实操心得:发送短信时,在输入号码命令AT+CMGS="号码"后,模块会返回一个>提示符,等待你输入正文。此时不要等待OK,而是直接输入消息内容,然后以Ctrl+Z(ASCII码26)结束。在Python中,用chr(26)表示。另外,短信发送有延迟,等待+CMGS:响应比等待OK更准确。

4.3 实现GPRS数据通信(HTTP GET示例)

通过GPRS传输数据是物联网项目的核心。这需要先附着GPRS网络,然后建立TCP/IP连接。以下是一个通过HTTP GET请求获取网页内容的简化示例:

class SIM800CController(SIM800CController): # 继续继承 def setup_gprs(self, apn, apn_user='', apn_pass=''): """配置GPRS接入点""" # 1. 附着GPRS服务 success, _ = self.send_at_command('AT+CGATT=1') if not success: self.logger.error("Failed to attach GPRS") return False # 2. 设置承载上下文(APN) # 对于中国移动:apn='cmnet', 联通:'3gnet', 电信:'ctnet' at_command = f'AT+CSTT="{apn}","{apn_user}","{apn_pass}"' success, _ = self.send_at_command(at_command) if not success: self.logger.error("Failed to set APN") return False # 3. 启动无线连接 success, _ = self.send_at_command('AT+CIICR') if not success: self.logger.error("Failed to bring up wireless connection") return False time.sleep(3) # 等待连接建立,这个时间可能因网络而异 # 4. 获取本地IP地址 success, responses = self.send_at_command('AT+CIFSR') if success: for line in responses: if '.' in line: # 简单的IP地址判断 self.logger.info(f"GPRS connected. Local IP: {line}") return True return False def http_get_via_gprs(self, url): """通过GPRS执行HTTP GET请求(使用内置HTTP服务)""" # 注意:SIM800C支持AT+HTTPXXX指令进行HTTP操作,但这里展示更通用的TCP连接方式 # 1. 启动TCP连接 (这里以连接到一个测试服务器为例) # 首先,解析URL获取主机和端口(简化处理) # 假设 url = "http://httpbin.org/get" host = "httpbin.org" port = 80 success, _ = self.send_at_command('AT+CIPSTART="TCP","{host}",{port}'.format(host=host, port=port)) if not success: self.logger.error("TCP connection failed") return None time.sleep(2) # 等待连接稳定 # 2. 发送HTTP GET请求 request = f"GET /get HTTP/1.1\r\nHost: {host}\r\nConnection: close\r\n\r\n" # 设置发送模式 self.send_at_command('AT+CIPSEND') time.sleep(0.5) # 输入数据长度 self.ser.write((str(len(request)) + '\r\n').encode()) time.sleep(0.5) # 发送实际数据 self.ser.write(request.encode()) # 3. 接收响应(简化,实际需要更复杂的解析和超时处理) time.sleep(3) response = b'' while self.ser.in_waiting: response += self.ser.read(self.ser.in_waiting) time.sleep(0.1) # 4. 关闭TCP连接 self.send_at_command('AT+CIPCLOSE') return response.decode('utf-8', errors='ignore')[:500] # 返回前500字符 def deactivate_gprs(self): """断开GPRS连接""" self.send_at_command('AT+CGATT=0') # 分离GPRS self.logger.info("GPRS deactivated")

重要提示:上述GPRS示例是概念性代码。在实际项目中,强烈建议使用更稳定、封装更好的方法,例如:

  1. 使用SIM800C内置的HTTP AT命令AT+HTTPINIT,AT+HTTPPARA,AT+HTTPACTION等),这比手动管理TCP连接更简单可靠。
  2. 使用专门的物联网协议:对于数据传输,考虑使用MQTT over TCP。你可以使用AT+CIPSTART建立到MQTT代理(如公共的test.mosquitto.org)的TCP连接,然后手动拼接MQTT协议包发送,或者寻找支持串口透传的轻量级MQTT客户端库。
  3. 超时与错误处理:移动网络不稳定,所有网络操作都必须有充分的超时和重试机制。

5. 实战项目:构建一个远程温湿度短信报警器

让我们将上述知识整合到一个实际项目中:一个基于树莓派、DHT22温湿度传感器和R800C HAT的远程报警系统。当温度超过阈值时,系统自动发送报警短信。

5.1 硬件连接与项目架构

所需硬件:

  • 树莓派(任何型号,建议3B及以上)
  • R800C GSM/GPRS HAT
  • DHT22温湿度传感器
  • 面包板、杜邦线若干
  • 一张已开通短信功能的物联网SIM卡或普通手机卡

连接方式:

  1. R800C HAT直接堆叠在树莓派GPIO上。
  2. DHT22传感器连接树莓派GPIO:
    • VCC -> 3.3V (Pin 1)
    • GND -> GND (Pin 6)
    • DATA -> GPIO4 (Pin 7)

项目工作流程:

  1. 树莓派上电,初始化R800C模块,注册网络。
  2. 循环读取DHT22传感器的温湿度数据。
  3. 如果温度连续3次超过设定阈值(例如30°C),则调用短信发送函数,向预设手机号发送报警信息。
  4. 为了省电和避免短信轰炸,设置一个静默期(例如1小时内不再重复发送)。

5.2 核心代码实现

import time import logging from sim800c_controller import SIM800CController # 假设我们将之前的类保存为此文件 # 配置日志 logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s') # 报警阈值和配置 TEMP_THRESHOLD = 30.0 # 摄氏度 ALERT_PHONE_NUMBER = "+8613800138000" # 替换为你的手机号,国际格式 CHECK_INTERVAL = 60 # 检查间隔,秒 ALERT_COOLDOWN = 3600 # 报警冷却时间,秒(1小时内不重复报警) last_alert_time = 0 # 上次报警时间戳 high_temp_count = 0 # 连续高温计数 def read_dht22(): """模拟读取DHT22传感器数据,实际项目中需使用Adafruit_DHT库""" # 此处为模拟数据,实际使用请安装库并调用 # import Adafruit_DHT # humidity, temperature = Adafruit_DHT.read_retry(Adafruit_DHT.DHT22, 4) import random temperature = 25.0 + random.uniform(-2, 5) # 模拟温度在23-30度波动 humidity = 50.0 + random.uniform(-10, 10) return temperature, humidity def main(): global last_alert_time, high_temp_count # 初始化GSM控制器 gsm = SIM800CController(port='/dev/serial0') if not gsm.connect(): logging.error("无法连接GSM模块,程序退出") return # 等待模块注册网络 logging.info("等待网络注册...") time.sleep(10) # 检查网络信号 success, responses = gsm.send_at_command('AT+CSQ') if success: for resp in responses: if '+CSQ:' in resp: logging.info(f"信号强度: {resp}") logging.info("远程温湿度监控报警器启动...") try: while True: # 1. 读取传感器数据 temp, humidity = read_dht22() logging.info(f"当前温度: {temp:.1f}°C, 湿度: {humidity:.1f}%") current_time = time.time() # 2. 判断是否触发报警条件 if temp > TEMP_THRESHOLD: high_temp_count += 1 logging.warning(f"温度超标!连续计数: {high_temp_count}") else: high_temp_count = 0 # 温度恢复正常,重置计数 # 3. 满足连续超标且不在冷却期,则发送报警短信 if high_temp_count >= 3 and (current_time - last_alert_time) > ALERT_COOLDOWN: alert_msg = f"[警报] 环境温度持续过高!当前温度: {temp:.1f}°C, 湿度: {humidity:.1f}%。请及时处理。" logging.critical(f"触发报警条件,准备发送短信: {alert_msg}") if gsm.send_sms_textmode(ALERT_PHONE_NUMBER, alert_msg): logging.info("报警短信发送成功!") last_alert_time = current_time high_temp_count = 0 # 发送后重置计数 else: logging.error("报警短信发送失败,稍后重试") # 4. 等待下一个检查周期 time.sleep(CHECK_INTERVAL) except KeyboardInterrupt: logging.info("程序被用户中断") finally: gsm.close() logging.info("清理完成,程序退出") if __name__ == '__main__': main()

这个示例项目展示了如何将R800C HAT与树莓派的其他功能(GPIO读取传感器)结合,构建一个完整的、可独立工作的物联网终端。在实际部署中,你还需要考虑更多因素,比如加入看门狗机制防止程序卡死、将报警记录写入本地文件、通过GPRS将常态数据上传到云平台等。

6. 常见问题排查与性能优化技巧

在实际使用R800C HAT的过程中,你几乎一定会遇到各种问题。下面是我在多个项目中总结出的常见问题及其解决方法。

6.1 硬件与连接类问题

问题1:模块无响应,发送AT命令无任何回复。

  • 检查电源:这是最常见的问题。使用万用表测量树莓派GPIO的5V和GND引脚之间的电压,在模块启动瞬间,电压不应有大幅跌落(低于4.7V)。强烈建议使用官方电源或知名品牌的5V/2.5A以上电源适配器。
  • 检查串口配置:确认已禁用串口控制台(sudo raspi-config中设置正确),并使用正确的设备文件(/dev/serial0)。
  • 检查波特率:尝试不同的波特率,如9600, 115200。有些模块固件默认可能是9600。
  • 检查天线:务必接上天线!GSM模块在没有天线或天线接触不良时,可能无法正常工作甚至损坏。
  • 检查SIM卡:确保SIM卡已正确插入卡槽,并且没有欠费、已开通数据业务(如果需要GPRS)。

问题2:网络注册失败(AT+CREG? 返回0,0或0,2)。

  • 信号强度:用AT+CSQ检查信号。如果值小于10,说明信号很弱。尝试更换天线位置或使用外置吸盘天线。
  • SIM卡状态:使用AT+CPIN?检查是否需要PIN码。如果需要,使用AT+CPIN="1234"输入(1234替换为你的PIN)。
  • 手动选择运营商:使用AT+COPS=?查询可用网络,然后用AT+COPS=1,2,"运营商代码"手动注册。运营商代码可以通过查询返回结果获得。

6.2 软件与通信类问题

问题3:发送短信失败,返回ERROR或长时间无响应。

  • 短信中心号码:确保短信中心号码设置正确。可以使用AT+CSCA?查询,用AT+CSCA="+861380xxxx500"设置(号码请咨询你的运营商)。
  • 短信格式:确认使用的是文本模式(AT+CMGF=1)。发送中文需要使用PDU模式,复杂度较高。
  • 号码格式:确保接收号码是国际格式,例如中国号码为+86138xxxxxxxx
  • 网络延迟:发送短信后,等待+CMGS:响应可能需要几秒到十几秒,适当增加超时时间。

问题4:GPRS连接失败,无法获取IP(AT+CIFSR返回空)。

  • APN设置:这是关键。确认APN、用户名和密码是否正确。不同运营商、甚至不同SIM卡套餐的APN都可能不同。中国移动通常为cmnet,用户密码为空。
  • 承载激活:确保执行了AT+CIICR后等待足够长时间(3-5秒),并用AT+CIFSR检查IP。可以尝试重复执行AT+CIICR
  • 网络环境:有些地区2G数据业务可能已被运营商限制或关闭。尝试用手机(关闭4G/5G,强制2G)测试是否能上网。
  • 使用内置HTTP功能:如果手动TCP连接困难,优先尝试使用AT+HTTPINIT等内置指令,成功率更高。

6.3 稳定性与性能优化

优化1:增加电源稳定性

  • 在树莓派5V和GND引脚之间并联一个低ESR的1000μF电解电容,可以极大改善模块发射时的电压跌落问题。
  • 如果条件允许,可以考虑为R800C HAT提供独立的5V电源,并通过共地方式与树莓派连接。

优化2:实现软件看门狗

  • 移动网络环境复杂,模块可能偶尔死机。可以实现一个“软件看门狗”线程,定时发送AT命令检查模块心跳。如果连续多次无响应,则通过树莓派GPIO控制一个连接到模块复位引脚(如果有)的电路,或者直接循环树莓派上给模块供电的GPIO引脚(如果设计允许),实现软复位。

优化3:通信协议优化

  • 对于GPRS数据传输,尽量使用二进制协议或高度压缩的文本协议(如MessagePack),减少数据量。
  • 实现数据本地缓存和断点续传。在网络不佳时先保存数据到SD卡,网络恢复后批量上传。
  • 将需要发送的短信内容先存入队列,由一个单独的发送线程管理,避免主程序阻塞。

优化4:降低功耗

  • 对于电池供电的项目,不需要通信时,可以使用AT+CFUN=0命令将模块设置为最小功能模式(相当于关机但保持部分逻辑),或者使用AT+CFUN=4设置飞行模式。需要时再唤醒。
  • 调整网络注册频度:AT+CREG=2可以设置模块在网络注册状态变化时主动上报,避免频繁查询。

R800C GSM/GPRS HAT是一个将树莓派带入移动通信世界的经典桥梁。虽然技术本身并非最新,但其体现的“在约束条件下解决问题”的工程思想,以及从硬件连接到软件协议栈的完整实践,对于理解物联网终端开发的全链路有着不可替代的价值。从点亮第一个OK响应,到成功收到自己项目发来的第一条短信或第一个数据包,这种成就感是驱动我们不断探索的动力。在实际项目中,多考虑一步异常处理,多测试一种边界情况,项目的鲁棒性就会提升一分。最后,记得在项目原型验证成功后,根据实际部署环境的网络状况(2G信号质量、运营商政策)和项目长期需求,再评估是否需要升级到更现代的通信模组。