树莓派Zero安装gammu-smsd后Gammu告警脚本无法运行排查
从你给出的错误信息和配置来看,核心问题是串口设备被gammu-smsd服务独占,同时还存在配置不匹配的小问题:
设备占用冲突:gammu-smsd启动后会持续占用它配置文件中指定的串口设备(默认是
/dev/ttyUSB0),当你的告警脚本尝试通过gammu.StateMachine()初始化并打开同一个设备时,就会因为设备被占用而抛出ERR_DEVICEOPENERROR(提示设备忙)。配置设备不匹配:从
gammu --identify的输出可以看到,实际可用的Modem设备是/dev/ttyUSB1,但你的/etc/gammurc和/etc/gammu-smsdrc默认配置的是/dev/ttyUSB0,这会导致gammu-smsd占用错误的设备,或者告警脚本连接到无效的设备。脚本小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),可以让两者分别使用不同的设备:
- 修改
/etc/gammu-smsdrc,让它使用/dev/ttyUSB0作为短信接收的设备(保持现有配置即可)。 - 修改告警脚本,手动指定使用
/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

