Категории

Интеграция SIM900L с Raspberry Pi для управления IoT по SMS

25.09.2025 10:47 | коды из категории: IOT умный дом

про Интеграция SIM900L с Raspberry Pi для управления IoT по SMS

Если вы ранее управляли устройствами через Arduino и GSM-модуль SIM900L по SMS, то хорошей новостью будет то, что ту же логику можно перенести на Raspberry Pi. Это особенно полезно, если вы строите собственный IoT-хаб на базе Raspberry Pi с Zigbee, PHP и MySQL, и хотите добавить возможность управления через SMS.

Подключение SIM900L к Raspberry Pi

SIM900L — это GSM/GPRS-модуль, который общается по UART (последовательному интерфейсу). Raspberry Pi имеет встроенный UART, но его нужно правильно настроить.

Аппаратное подключение

Важно: модуль SIM900L требует стабильного питания. Используйте внешний аккумулятор или блок питания. Питание от GPIO Raspberry Pi недостаточно!

Настройка UART в Raspberry Pi

  1. Отключите консоль по UART: выполните sudo raspi-config → Interface Options → Serial Port → отключите вход в консоль, но оставьте UART включённым.
  2. Убедитесь, что в файле /boot/config.txt нет строки, отключающей UART. При необходимости добавьте: enable_uart=1
  3. Перезагрузите Raspberry Pi.

Чтение SMS через AT-команды

После подключения вы можете общаться с модулем через последовательный порт, например, с помощью Python или даже через терминал:


sudo apt install minicom
minicom -b 9600 -o -D /dev/serial0

    

Пример базовых AT-команд:

Парсинг SMS в своём IoT-хабе

Вы можете написать простой Python-скрипт, который будет периодически опрашивать модуль, читать новые SMS и выполнять действия в зависимости от содержимого сообщения.

Пример логики:

Интеграция с Home Assistant или самописным хабом

Если вы используете собственную систему на PHP/MySQL, можно:

  1. Запускать Python-скрипт как демон (через systemd или cron)
  2. При получении SMS — отправлять POST-запрос на ваш локальный API: http://localhost/api/sms-command
  3. В 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

Примечания

Заключение

Интеграция SIM900L с Raspberry Pi — это отличный способ добавить резервный или автономный канал управления вашим IoT-хабом. Даже при отсутствии интернета вы сможете управлять устройствами через обычные SMS. Это особенно полезно в частных домах, на дачах или в регионах с нестабильной сетью.

Удачи в вашем проекте!

Комментарии

Пока нет комментариев. Будьте первым!

Оставить комментарий

← Назад к списку

Важно: Блог-эксперимент

Блог только запустил, все статьи генерирую через нейросеть т.к. лень, возможны ошибки. Просто чтобы вы знали и не запускали ядерный реактор по моим статьям ))
Если у вас есть вопросы, или Нашли неточность? пишите в коментах — вместе поправим и сделаем статью более качественной. Я лично объясню нюансы из практики.

Посетителей сегодня: 0


кто я | книга | контакты без контактов

© Digital Specialist | Не являемся сотрудниками Google, Яндекса и NASA