Для чего в составе телефона gsm используется генератор dtmf
В этой статье цикла будет описана работа с DTMF-сигналами, а именно корректный парсинг DTMF-сигналов, возможности работы с ними и организация управления на базе DTMF. В качестве бонуса в статье будет продемонстрирована возможность внедрения трехуровневой системы безопасности, в которой 2 уровня будет обеспечивать функционал по работе с DTMF.
Для полноценной работы с GSM/GPRS-модулем SIM800L понадобится официальный справочник по AT-командам — SIM800 Series_AT Command Manual_V1.10.pdf (4,01 MB) .Работа с тональными кодами кнопок — DTMF
В ряде задач может возникнуть необходимость осуществлять управление модулем во время отвеченного вызова, при помощи нажатия цифровых клавиш телефона. Аналогичное управление организовано по меню помощи сотовых операторов.
В модуле SIM800L также есть возможность декодирования сигнала DTMF в конкретные коды. Для использования этой возможности необходимо включить режим распознавания DTMF командой AT+DDET=1. Команда и её параметры подробно описаны в таблице:
Описание | Команда, описание параметров | Ответы | Незапрашиваемый ответ |
Включение режима DTMF | AT+DDET=<mode>[,<interval>][,<reportMode>][,<ssdet>] <mode> — управление режимом: |
1 — код нажатой кнопки и время удержания нажатия, в мс
Если <reportMode>=1, то:
+DTMF: <key>,<last time>
Теперь, зная, как включить этот режим, можно посмотреть на незапрашиваемые ответы отправляемые модулем в качестве реакции на нажатия разных кнопок:
12
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47 _response = sendATCommand( "AT+DDET=1" , true ); // Включаем DTMF > String sendATCommand( String cmd, bool waiting) < String _resp = "" ; // Переменная для хранения результата Serial.println(cmd); // Дублируем команду в монитор порта SIM800.println(cmd); // Отправляем команду модулю if (waiting) < // Если необходимо дождаться ответа. _resp = waitResponse(); // . ждем, когда будет передан ответ // Если Echo Mode выключен (ATE0), то эти 3 строки можно закомментировать if (_resp.startsWith(cmd)) < // Убираем из ответа дублирующуюся команду _resp = _resp.substring(_resp.indexOf( "\r\n" , cmd.length()) + 2); >Serial.println(_resp); // Дублируем ответ в монитор порта > return _resp; // Возвращаем результат. Пусто, если проблема > String waitResponse() < // Функция ожидания ответа и возврата полученного результата String _resp = "" ; // Переменная для хранения результата long _timeout = millis () + 10000; // Переменная для отслеживания таймаута (10 секунд) while (!SIM800.available() && millis () < _timeout) <>; // Ждем ответа 10 секунд, если пришел ответ или наступил таймаут, то. if (SIM800.available()) < // Если есть, что считывать. _resp = SIM800.readString(); // . считываем и запоминаем >else < // Если пришел таймаут, то. Serial.println( "Timeout. " ); // . оповещаем об этом и. >return _resp; // . возвращаем результат. Пусто, если проблема > void loop () < if (SIM800.available()) // Ожидаем прихода данных (ответа) от модема. Serial.write(SIM800.read()); // . и выводим их в Serial if (Serial.available()) // Ожидаем команды по Serial. SIM800.write(Serial.read()); // . и отправляем полученную команду модему >
Теперь основной задачей является корректно распарсить нажатия, для их дальнейшей обработки. Для этого изменим процедуру loop() следующим образом:
12
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 // . void loop () < if (SIM800.available()) < // Ожидаем прихода данных (ответа) от модема. _response = waitResponse(); // Получаем ответ от модема для анализа _response.trim(); Serial.println( ">" + _response); // . и дублируем их в Serial с пометкой ">" // Теперь с данными можно работать if (_response.startsWith( "+DTMF:" )) < // Если ответ начинается с "+DTMF:" тогда: // Парсим полученный ответ. // Мы знаем, что после этой команды будет пробел и один символ (нажатая клавиша), // а значит можно сразу его "выдергивать": String symbol = _response.substring(7, 8); // Выдергиваем символ с 7 позиции длиной 1 (по 8) Serial.println( "Key: " + symbol); // Добавляем логику для полученных символов //if (symbol=="") < // . // >> else if (_response.startsWith( "RING" )) < // При входящем звонке. sendATCommand( "ATA" , true ); // . отвечаем (поднимаем трубку) >> if (Serial.available()) < // Ожидаем команды по Serial. SIM800.write(Serial.read()); // . и отправляем полученную команду модему >; >
После запуска скетча, казалось бы все работает, если кнопки нажимать редко. Но если быстро нажать несколько кнопок подряд, то станет видно, что что-то не так — МК обработает только первую из полученных команд, а остальные пропустит:
Во время этого таймаута, продолжают приходить прочие нажатия, таким образом формируется пачка уведомлений. Существует 2 способа взять под контроль такое поведение.
. void setup () < . SIM800.begin(9600); // Скорость обмена данными с модемом SIM800.setTimeout(100); // Устанавливаем меньшее значение таймаутаПри таком значении таймаута прочие уведомления не будут успевать приходить, и модуль корректно будет отрабатывать каждое уведомление.
12
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
Проверяем и убеждаемся, что все работает отлично:
- отправка цифровых комбинаций для проверки безопасности, например, кодовых замков;
- отправка адресных команд в цифровом виде.
Приведем примеры реализации обоих вариантов. Используемая схема подключения:
Резисторы для подключения светодиодов 100 Ом, для подключения модуля — 10 КОмО там как правильно подключать светодиоды и каких ошибок следует избегать при их подключении написано в статье Как правильно подключать светодиоды
В первом примере, светодиоды будут использоваться в качестве индикатора отпирания. В случае набора заданной комбинации цифр, все светодиоды включатся на 1 секунду, обозначив отпирание замка.
В качестве цифрового пароля можно указывать не только знакомую комбинацию цифр, но и любое слово. Так, например, в скетче используется пароль 263487 , получаемый путем набора на телефонной клавиатуре слова codius. 12
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
Использование DTMF — уровень МАГ
Дополнительные параметры позволяют превратить такую простую вещь как DTMF в достаточно мощный инструмент управления. В совокупности с получением данных о длительности нажатия каждой клавиши, можно реализовывать механизмы с повышенной степенью защищенности. Например, кодовый замок, помимо цифровой комбинации, можно запрограммировать на, специфичные по длительности, удержания каждой из цифр. Таким образом получится удвоить уровень безопасности. Для этого необходимо включить режим DTMF с параметром reportMode=1 — AT+DDET=1,0,1. Теперь, помимо декодированного значения нажатой кнопки, ответ будет содержать через запятую, длительность нажатия в миллисекундах.
Всем привет.
Хотите управлять чем-нибудь по сотовому телефону, да еще и без всяких заумных микроконтроллеров? Если да, добро пожаловать под кат.
В последнее время на Муське было несколько обзоров GSM-модулей, типа SIM800, используя которые, можно управлять чем угодно по сотовой сети. Но вот беда, все они требуют подключения к микроконтроллеру, написания прошивки и прочих сложных для непосвященного человека вещей. Другая крайность это: «а я к вибромоторчику телефона реле припаял, у меня все работает» :)) Так тоже можно, но не стоит удивляться, если вашу теплицу будет пытаться поливать насос водой из замерзшего колодца, после прихода СМС-ки «С Новым Годом!» от неизвестного отправителя :)))
В общем, я решил заполнить пробел между этими двумя решениями, и предложить своё.
Сегодня речь пойдет о декодере DTMF сигнала, или если по-простому, тональный сигнал.
Любопытные могут почитать Википедию
Технология достаточно устаревшая, но до сих пор поддерживается всеми телефонами.
Собственно, именно тоновый набор вы используете, когда звоните в какое-нибудь учереждение, а вам автоответчик говорит: «если вы знаете номер абонента, нажмите „1“, если вы хотите узнать о наших новых предложениях, нажмите „2“ и так далее. Нажимая кнопку с нужной цифрой на телефоне, вы отправляете по голосовому каналу сигнал определенной тональности. Каждому символу на клавиатуре телефона соответствует своя „мелодия“. Именно этот звук и расшифровывает декодер DTMF, превращая его в сигналы на своих выходах.
Плата собрана на микросхеме MT8870, питается от 5 Вольт и имеет следующие выводы: Q1-Q4-дискретные выходы, StQ/StQ инверсное-выходы, которые срабатывают при каждом правильном распознавании сигнала. IN-вход для аудиосигнала, если вы не хотите использовать распаянный на плате 3.5 мм разъем. GND/VCC питание, 5 Вольт.
Выходы Q1-Q4 срабатывают в соответствии с таблицей:
Например, сейчас у меня на плате горят два средних светодиода, сработали выходы Q2 и Q3 смотрим таблицу-это соответствует нажатой клавише „6“. Если я нажму клавишу „1“, то сработает выход Q1, если „2“, то Q2. Если „3“, то „зажгутся“ выходы Q1 и Q2 одновременно. И так далее.
В общем, это 4-битный код. Если его дешифровать специальной микросхемой, то можно получить 16 выходов.
Кстати, на Али продается плата уже с дешифратором, но стоит дороже. Вариант для продвинутых-подключить все это к микроконтроллеру, я так делал, можно даже пароль задать-позвонил набрал пароль, получил доступ к управлению…
Но это уже не в рамках моей статьи, т.к. в начале статьи я обещал, что все будет просто.
И так, берем транзистор КТ815, резистор на 1.1 кОм, или около того, реле на 12 В, стабилизатор LM7805. Остальные детали (защитный диод 1N4007 на катушке реле, желтенькие керамические конденсаторы 0.1 мкф и электролитический на 1000 мкф) желательны, но работает и без них. В качестве нагрузки к реле подключена „пищалка“.
Схему рисовать не буду, монтаж навесной, на фото все видно:
С другой стороны:
Общее питание конструкции 12 В, т.к. этого требует реле, но для платы оно понижается стабилизатором до 5 В.
3.5 мм разъем на плате соединяем шнуром с выходом наушников телефона, настраиваем автоподнятие трубки и все готово. Теперь, если позвонить на телефон, подключенный к плате, дождавшись снятия трубки, нажать „1“, реле сработает, зуммер начнет пищать. Если нажать „2“, все выключится. Кстати, независимо от того, чем вы планируете управлять, зуммер я бы рекомендовал оставить. Это удобно-ведь его слышно по телефону, и таким образом можно получать некую обратную связь: позвонил, слышишь пищание, значит, нагрузка включена :)
Снял небольшой видеоролик, как все это работает
- 21.11.2019Мобильные сотрудники и унифицированные коммуникации как элементы формулы успеха
- 14.11.201911 причин, по которым IT-специалисты выбирают IP-АТС Yeastar серии S
- 12.11.2019Как убедить босса обновить устаревшую телефонную систему
- 15.10.20196 заблуждений о сложности обновления устаревшей телефонной системы
- 08.10.2019Выбор IP-АТС: закрытый или открытый стандарт?
- 29.09.2019DECT-IP-телефоны Yealink W53P | W53H и аксессуары
- 27.09.2019IP-АТС Yeastar как альтернатива АТС Samsung
- 27.09.2019Бизнес-телефон Yealink SIP-T53W
- 26.09.2019Бизнес-телефон Yealink SIP-T54W
- 25.09.2019Бизнес-телефон Yealink SIP-T57W
- 21.09.2019Портативный спикерфон Yealink CP900: работа в гармонии с собой
- 20.09.2019Компания Yealink представляет Yealink W80B — микросотовую IP-DECT-систему нового поколения
- 17.09.2019Аудио-конференц-телефон Yealink CP930W
- 13.09.2019Консольный IP-телефон Fanvil X210i с функцией визуализации собеседника
- 12.09.2019Базовая станция Yealink W60B
- 11.09.2019Бюджетный IP-телефон для колл-центров Fanvil X2CP
- 03.09.2019Комплект DECT-устройств Yealink CP930W-Base
- 16.08.2019Panasonic выводит на российский рынок новую серию IP-телефонов KX-NT
- 14.08.2019Обновленная версия VoIP-шлюза Yeastar TA1610 V3 FXO
- 26.02.2019WiFi-адаптер Yealink WF50: теперь доступны диапазоны 2,4 ГГц и 5,0 ГГц
- 28.11.2018Компания АйПиМатика объявляет о глобальном запуске нового DECT-конференц-телефона Yealink CP930W
Передача DTMF сигналов
DTMF (Dual-Tone Multi-Frequency) сигналы или тоны передаются при нажатии кнопок на номеронабирателе и используются, как правило, для [до]набора внутреннего номера абонента офисной АТС или для навигации по голосовому меню (IVR).
На практике используются 3 способа передачи DTMF-сигналов::
- inband - передача в голосовом канале
- rfc2833 / rfc4733 - передача отдельно от голосового канала
- info - передача посредством SIP-сигнализации, SIP method INFO
inband: тоны передаются синусоидами определенных частот, что требует использования кодеков без компрессии, т.е. G.711 (PCM). Название метода подсказывает, что DTMF передаётся внутри звукового канала или канала тональной частоты (КТЧ) - 0,3 — 3,4 кГц. Если будет использоваться кодек, отличный от G.711, тогда тональные посылки будут искажены алгоритмами компрессии аудиосигнала и их невозможно будет декодировать.
rfc2833: DTMF передаётся отдельно от голосового потока. Каждый аудиопоток в протоколе RTP идентифицируется значением Payload Type. Поэтому, голос, например, передается с Payload Type=0, а тоны DTMF с Payload Type=101.
ПрофТелеком - Передача DTMF сигналов. rfc2833 | inband | info
- 21.11.2019Мобильные сотрудники и унифицированные коммуникации как элементы формулы успеха
- 14.11.201911 причин, по которым IT-специалисты выбирают IP-АТС Yeastar серии S
- 12.11.2019Как убедить босса обновить устаревшую телефонную систему
- 15.10.20196 заблуждений о сложности обновления устаревшей телефонной системы
- 08.10.2019Выбор IP-АТС: закрытый или открытый стандарт?
- 29.09.2019DECT-IP-телефоны Yealink W53P | W53H и аксессуары
- 27.09.2019IP-АТС Yeastar как альтернатива АТС Samsung
- 27.09.2019Бизнес-телефон Yealink SIP-T53W
- 26.09.2019Бизнес-телефон Yealink SIP-T54W
- 25.09.2019Бизнес-телефон Yealink SIP-T57W
- 21.09.2019Портативный спикерфон Yealink CP900: работа в гармонии с собой
- 20.09.2019Компания Yealink представляет Yealink W80B — микросотовую IP-DECT-систему нового поколения
- 17.09.2019Аудио-конференц-телефон Yealink CP930W
- 13.09.2019Консольный IP-телефон Fanvil X210i с функцией визуализации собеседника
- 12.09.2019Базовая станция Yealink W60B
- 11.09.2019Бюджетный IP-телефон для колл-центров Fanvil X2CP
- 03.09.2019Комплект DECT-устройств Yealink CP930W-Base
- 16.08.2019Panasonic выводит на российский рынок новую серию IP-телефонов KX-NT
- 14.08.2019Обновленная версия VoIP-шлюза Yeastar TA1610 V3 FXO
- 26.02.2019WiFi-адаптер Yealink WF50: теперь доступны диапазоны 2,4 ГГц и 5,0 ГГц
- 28.11.2018Компания АйПиМатика объявляет о глобальном запуске нового DECT-конференц-телефона Yealink CP930W
Передача DTMF сигналов
DTMF (Dual-Tone Multi-Frequency) сигналы или тоны передаются при нажатии кнопок на номеронабирателе и используются, как правило, для [до]набора внутреннего номера абонента офисной АТС или для навигации по голосовому меню (IVR).
На практике используются 3 способа передачи DTMF-сигналов::
- inband - передача в голосовом канале
- rfc2833 / rfc4733 - передача отдельно от голосового канала
- info - передача посредством SIP-сигнализации, SIP method INFO
inband: тоны передаются синусоидами определенных частот, что требует использования кодеков без компрессии, т.е. G.711 (PCM). Название метода подсказывает, что DTMF передаётся внутри звукового канала или канала тональной частоты (КТЧ) - 0,3 — 3,4 кГц. Если будет использоваться кодек, отличный от G.711, тогда тональные посылки будут искажены алгоритмами компрессии аудиосигнала и их невозможно будет декодировать.
rfc2833: DTMF передаётся отдельно от голосового потока. Каждый аудиопоток в протоколе RTP идентифицируется значением Payload Type. Поэтому, голос, например, передается с Payload Type=0, а тоны DTMF с Payload Type=101.
ПрофТелеком - Передача DTMF сигналов. rfc2833 | inband | info
Читайте также: