Задать вопрос
@TSerge

Как общаться с модемом в CLI linux?

Добрый день,
есть linux (Raspbian, raspberry pi) и GSM модем, виден как /dev/ttyUSB0.

Задача подавать простые команды модему из CLI, принимать и обрабатывать
ответы на него.

Была найдена программа atinout, а также пробовал использовать:
echo "at+csq"| socat - /dev/ttyUSB0,crnl

В начале они работали, но в какой-то момент обе начали выдавать после ответа
кучу мусора (повтор команды, ответ, множество пустых строк итп).

Если после atinout и socat запустить старый добрый "minicom -D /dev/ttyUSB0",
то в начале пробежит тот же мусор, а потом можно будет ввести уже свою
AT команду. Такое впечатление, что "входной буфер" модема забит выводом ответа
от модема (ответ от запроса команды "echo AT | atinout - /dev/ttyUSB0 -" ).

Возможна неверная интерпретация ответа от модема и консоли (касаемо CRLF).

Пробовал
# echo AT | atinout - /dev/ttyUSB0 -
AT
OK
затем
# stty -F /dev/ttyUSB0 raw

и после
# echo AT | atinout - /dev/ttyUSB0 -
получаешь
^MAT^MATAT
ERROR
так как в "буфере" от предыдущего ответа что-то осталось.

Кто как решает вопрос общения с модемом из CLI и в чём может быть проблема
в вышеописанном методе? Спасибо.
  • Вопрос задан
  • 1338 просмотров
Подписаться 1 Средний Комментировать
Решения вопроса 1
@TSerge Автор вопроса
Как альтернатива вышенаписанному можно использовать простой скрипт
посылки команд в serial порт, с предв. очисткой буфера и приём ответа модема:

#!/usr/bin/env python
# coding: utf8

import sys
import serial
import time

modem_port = '/dev/gsmmodem'
modem_baudrates = [2400, 9600, 19200, 38400, 115200]
modem_bytesize = 8
modem_parity = serial.PARITY_NONE
modem_stopbits = 1

ser_modem = serial.Serial(modem_port, modem_baudrates[1], parity=modem_parity)

ser_modem.flushInput()
ser_modem.flushOutput()

try:
    command = sys.argv[1] + '\r'
except:
    command = 'AT' + '\r'

for i in command:
    ser_modem.write(i)
    time.sleep(0.1)

res = []
while ser_modem.inWaiting() > 0:
    res.append(ser_modem.readline())

ser_modem.close()

print (''.join(res))
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
leahch
@leahch Куратор тега Linux
3D специалист. Dолго, Dорого, Dерьмово.
Как старый олдскульник, когда работал с модемами использовал chat, expect, minicom, wvdial ну и python с модулем serial. Через последний написал кучу вещей по работе с модемами, ибо просто, быстро и красиво. Как пример, считывание статистики (с usb-модемов с несколькими tty), перезагрузки, посылки sms и прочей чуши - https://pyserial.readthedocs.io/en/latest/index.html

Ну и как минимум послать +++ первыми после подключения при открытии порта. Это универсальная эскейп-последовательность, подается без префикса AT.
Ответ написан
Комментировать
@MinamotoSoft
копай в сторону спецификации самого модема.
в начале подавай ему команду инициализации. Возможно, он не сбрасывается автоматом при перезагрузке. А мусор очень похож на тот, что получается при не соответствии скорости порта и бита четности.
Ответ написан
Комментировать
@Karpion
Смотрим, как называется /dev/файл COM-порта. Читаем по нему man - там, скорее всего, есть список программ для работы с COM-портом.

Или можно начать с программы getty. Ну и хорошо бы помнить про ioctl - настройка параметров работы порта.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы