Если вы ранее управляли устройствами через Arduino и GSM-модуль SIM900L по SMS, то хорошей новостью будет то, что ту же логику можно перенести на Raspberry Pi. Это особенно полезно, если вы строите собственный IoT-хаб на базе Raspberry Pi с Zigbee, PHP и MySQL, и хотите добавить возможность управления через SMS.
SIM900L — это GSM/GPRS-модуль, который общается по UART (последовательному интерфейсу). Raspberry Pi имеет встроенный UART, но его нужно правильно настроить.
Важно: модуль SIM900L требует стабильного питания. Используйте внешний аккумулятор или блок питания. Питание от GPIO Raspberry Pi недостаточно!
sudo raspi-config → Interface Options → Serial Port → отключите вход в консоль, но оставьте UART включённым./boot/config.txt нет строки, отключающей UART. При необходимости добавьте: enable_uart=1После подключения вы можете общаться с модулем через последовательный порт, например, с помощью Python или даже через терминал:
sudo apt install minicom
minicom -b 9600 -o -D /dev/serial0
Пример базовых AT-команд:
AT — проверка связиAT+CMGF=1 — установка текстового режима SMSAT+CMGL="ALL" — чтение всех SMSAT+CMGD=1,4 — удаление всех SMSВы можете написать простой Python-скрипт, который будет периодически опрашивать модуль, читать новые SMS и выполнять действия в зависимости от содержимого сообщения.
Пример логики:
ON kitchen_lightЕсли вы используете собственную систему на PHP/MySQL, можно:
http://localhost/api/sms-commandОбязательно проверяйте номер отправителя SMS! Не выполняйте команды от неизвестных номеров. Храните список доверенных номеров в базе данных.
sudo apt update
sudo apt install python3-pip
pip3 install pyserial mysql-connector-python
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import serial
import time
import mysql.connector
import re
# === Настройки ===
SERIAL_PORT = '/dev/serial0'
BAUD_RATE = 9600
DB_CONFIG = {
'user': 'ваш_пользователь',
'password': 'ваш_пароль',
'host': 'localhost',
'database': 'ваша_база'
}
TRUSTED_NUMBERS = ['+79123456789', '+79876543210'] # замените на свои номера
# === Инициализация UART ===
try:
ser = serial.Serial(SERIAL_PORT, BAUD_RATE, timeout=3)
print("UART подключён")
except Exception as e:
print(f"Ошибка UART: {e}")
exit(1)
def send_at_command(cmd, wait=1):
"""Отправка AT-команды и получение ответа"""
ser.write((cmd + '\r\n').encode())
time.sleep(wait)
response = ''
while ser.in_waiting:
response += ser.read(ser.in_waiting).decode('utf-8', errors='ignore')
return response
def init_gsm():
"""Инициализация модуля SIM900L"""
print("Инициализация GSM...")
send_at_command('AT') # проверка связи
send_at_command('AT+CMGF=1') # текстовый режим SMS
send_at_command('AT+CNMI=2,2,0,0,0') # автоматическое уведомление о новых SMS (опционально)
print("GSM готов")
def parse_sms(sms_text, sender):
"""Парсинг SMS и запись в БД при совпадении"""
sms_text = sms_text.strip().upper()
# Проверка доверенного номера
if sender not in TRUSTED_NUMBERS:
print(f"Игнор: SMS от недоверенного номера {sender}")
return False
# Проверка команд
if 'ONROZETKA' in sms_text:
command = 'ON'
device = 'rozetka'
print(f"Команда: ВКЛЮЧИТЬ розетку от {sender}")
elif 'OFFROZETKA' in sms_text:
command = 'OFF'
device = 'rozetka'
print(f"Команда: ВЫКЛЮЧИТЬ розетку от {sender}")
else:
print("Неизвестная команда")
return False
# Запись в MySQL
try:
conn = mysql.connector.connect(**DB_CONFIG)
cursor = conn.cursor()
query = "INSERT INTO sms_commands (device, command, sender, processed) VALUES (%s, %s, %s, %s)"
cursor.execute(query, (device, command, sender, 0))
conn.commit()
cursor.close()
conn.close()
print("Команда сохранена в БД")
return True
except Exception as e:
print(f"Ошибка БД: {e}")
return False
def read_all_sms():
"""Чтение всех SMS и обработка новых"""
print("Чтение SMS...")
response = send_at_command('AT+CMGL="ALL"', wait=2)
# Пример строки SMS в ответе:
# +CMGL: 1,"REC UNREAD","+79123456789","","24/05/10,12:30:00+12"
# Текст сообщения...
lines = response.split('\n')
i = 0
while i < len(lines):
line = lines[i].strip()
if line.startswith('+CMGL:'):
# Извлекаем индекс SMS и номер отправителя
parts = line.split(',')
if len(parts) >= 3:
index = parts[0].split(':')[1].strip()
sender = parts[2].replace('"', '').strip()
# Следующая строка — тело SMS
if i + 1 < len(lines):
sms_body = lines[i + 1].strip()
if parse_sms(sms_body, sender):
# Удаляем SMS после обработки
send_at_command(f'AT+CMGD={index}', wait=1)
print(f"SMS {index} удалена")
i += 2
else:
i += 1
def main():
init_gsm()
while True:
read_all_sms()
time.sleep(10) # проверка каждые 10 секунд
if __name__ == '__main__':
main()
CREATE TABLE sms_commands (
id INT AUTO_INCREMENT PRIMARY KEY,
device VARCHAR(50) NOT NULL,
command VARCHAR(10) NOT NULL, -- 'ON' или 'OFF'
sender VARCHAR(20) NOT NULL,
processed TINYINT DEFAULT 0,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
chmod +x sms_parser.py
python3 sms_parser.py
Интеграция SIM900L с Raspberry Pi — это отличный способ добавить резервный или автономный канал управления вашим IoT-хабом. Даже при отсутствии интернета вы сможете управлять устройствами через обычные SMS. Это особенно полезно в частных домах, на дачах или в регионах с нестабильной сетью.
Удачи в вашем проекте!
Блог только запустил, все статьи генерирую через нейросеть т.к. лень, возможны ошибки. Просто чтобы вы знали и не запускали ядерный реактор по моим статьям ))
Если у вас есть вопросы, или Нашли неточность? пишите в коментах — вместе поправим и сделаем статью более качественной. Я лично объясню нюансы из практики.
Комментарии
Пока нет комментариев. Будьте первым!