You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

树莓派Zero安装gammu-smsd后Gammu告警脚本无法运行排查

问题原因分析

从你给出的错误信息和配置来看,核心问题是串口设备被gammu-smsd服务独占,同时还存在配置不匹配的小问题:

  1. 设备占用冲突:gammu-smsd启动后会持续占用它配置文件中指定的串口设备(默认是/dev/ttyUSB0),当你的告警脚本尝试通过gammu.StateMachine()初始化并打开同一个设备时,就会因为设备被占用而抛出ERR_DEVICEOPENERROR(提示设备忙)。

  2. 配置设备不匹配:从gammu --identify的输出可以看到,实际可用的Modem设备是/dev/ttyUSB1,但你的/etc/gammurc和/etc/gammu-smsdrc默认配置的是/dev/ttyUSB0,这会导致gammu-smsd占用错误的设备,或者告警脚本连接到无效的设备。

  3. 脚本小bug:你的告警脚本里定义了message1变量,但发送时写的是sm.SendSMS(message),这会导致另一个错误(未定义message),不过当前被设备错误掩盖了。


解决方案(按推荐程度排序)

方案1:复用gammu-smsd发送短信(最推荐)

既然gammu-smsd已经在管理串口设备,直接用它提供的能力发送短信,避免重复初始化串口连接。修改告警脚本中的短信发送部分:

替换原来的:

sm.SendSMS(message)

为:

import subprocess

# 构造短信内容
sms_text = f'Time is:{time.strftime("%H:%M:%S")}| Temperature Fridge 1 above -10°C!! . If still above the limit, another sms will be sent in 30min'
# 调用gammu命令发送短信
subprocess.run(
    ['gammu', 'sendsms', 'TEXT', '+Myphonenumber', '-text', sms_text],
    check=True
)

同时,你可以删除脚本中所有和gammu.StateMachine相关的代码(从import gammu到sm.Init()的部分),这样就完全避免了设备冲突问题。

方案2:让告警脚本和gammu-smsd使用不同的串口设备

从gammu-detect的输出看,你的Modem提供了4个串口设备(ttyUSB0-ttyUSB3),可以让两者分别使用不同的设备:

  1. 修改/etc/gammu-smsdrc,让它使用/dev/ttyUSB0作为短信接收的设备(保持现有配置即可)。
  2. 修改告警脚本,手动指定使用/dev/ttyUSB1(gammu识别的有效Modem设备):
import gammu
import sys
import time

# 创建状态机对象
sm = gammu.StateMachine()
# 手动配置设备,避免读取默认配置的ttyUSB0
sm.SetConfig(0, {
    'Device': '/dev/ttyUSB1',
    'Connection': 'at',
    'Name': 'Phone on USB serial port Qualcomm__Incorporated Qualcomm_CDMA_Technologies_MSM'
})
# 连接设备
sm.Init()

# 后续温度读取和逻辑保持不变,注意修复message1的拼写错误
if temperature1 > -10:
    message1 = {
        'Text': f'Time is:{time.strftime("%H:%M:%S")}| Temperature Fridge 1 above -10°C!! . If still above the limit, another sms will be sent in 30min',
        'SMSC': {'Location': 1},
        'Number': '+Myphonenumber',
        'Validity': 'Max',
    }
    sm.SendSMS(message1)  # 这里要改成message1,之前的message是笔误
    time.sleep(1800)
else:
    time.sleep(60)

方案3:补充权限检查

确保你的pi用户对串口设备有读写权限,执行以下命令:

sudo usermod -aG dialout pi

执行后重新登录或重启树莓派,确保权限生效。


内容的提问来源于stack exchange,提问作者user1401141

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:52:02