Если вы ранее управляли устройствами через Arduino и GSM-модуль SIM900L по SMS, то хорошей новостью будет то, что ту же логику можно перенести на Raspberry Pi. Это особенно полезно, если вы строите собственный IoT-хаб на базе Raspberry Pi с Zigbee, PHP и MySQL, и хотите добавить возможность управления через SMS.
Подключение SIM900L к Raspberry Pi
SIM900L — это GSM/GPRS-модуль, который общается по UART (последовательному интерфейсу). Raspberry Pi имеет встроенный UART, но его нужно правильно настроить.
Аппаратное подключение
- SIM900L TX → Raspberry Pi RX (GPIO15)
- SIM900L RX → Raspberry Pi TX (GPIO14)
- GND → общий земляной контакт
- VCC → внешний источник питания 3.7–4.2 В (не питайте от GPIO! SIM900L потребляет до 2 А при передаче)
Важно: модуль SIM900L требует стабильного питания. Используйте внешний аккумулятор или блок питания. Питание от GPIO Raspberry Pi недостаточно!
Настройка UART в Raspberry Pi
- Отключите консоль по UART: выполните
sudo raspi-config→ Interface Options → Serial Port → отключите вход в консоль, но оставьте UART включённым. - Убедитесь, что в файле
/boot/config.txtнет строки, отключающей UART. При необходимости добавьте:enable_uart=1 - Перезагрузите Raspberry Pi.
Чтение SMS через AT-команды
После подключения вы можете общаться с модулем через последовательный порт, например, с помощью 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
Парсинг SMS в своём IoT-хабе
Вы можете написать простой Python-скрипт, который будет периодически опрашивать модуль, читать новые SMS и выполнять действия в зависимости от содержимого сообщения.
Пример логики:
- Получено SMS:
ON kitchen_light - Скрипт парсит команду и отправляет запрос в вашу PHP-систему (например, через HTTP или напрямую в MySQL)
- PHP-часть обновляет состояние устройства в базе и отправляет команду Zigbee-координатору
Интеграция с Home Assistant или самописным хабом
Если вы используете собственную систему на PHP/MySQL, можно:
- Запускать Python-скрипт как демон (через systemd или cron)
- При получении SMS — отправлять POST-запрос на ваш локальный API:
http://localhost/api/sms-command - В PHP обрабатывать команду, проверять номер отправителя (для безопасности), и выполнять нужное действие
Безопасность
Обязательно проверяйте номер отправителя SMS! Не выполняйте команды от неизвестных номеров. Храните список доверенных номеров в базе данных.
скрипт для парсинга
sudo apt update
sudo apt install python3-pip
pip3 install pyserial mysql-connector-python
скрипт sms_parser.py
#!/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()
🗄️ Структура таблицы в MySQL
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
Примечания
- Убедитесь, что SIM-карта вставлена и имеет сигнал.
- Номера в TRUSTED_NUMBERS должны быть в том же формате, в каком их присылает модем (обычно с + и кодом страны).
- Команды чувствительны к регистру в коде, но мы приводим всё к .upper(), так что onrozetka, ONROZETKA, OnRozetka — всё сработает.
- После записи в БД ваш PHP-скрипт может периодически проверять таблицу sms_commands, выполнять действия (например, отправлять Zigbee-команду), и ставить флаг processed = 1.
Заключение
Интеграция SIM900L с Raspberry Pi — это отличный способ добавить резервный или автономный канал управления вашим IoT-хабом. Даже при отсутствии интернета вы сможете управлять устройствами через обычные SMS. Это особенно полезно в частных домах, на дачах или в регионах с нестабильной сетью.
Удачи в вашем проекте!
Комментарии
Пока нет комментариев. Будьте первым!