GSM
телефон отправлять и принимать
SMS
дозвон AT-commands
AT команды
Как связать микроконтроллер
с компьютером или с мобильным телефоном
и как передавать и принимать данные по
USART читайте
тут и
тут
Учтите что в телефоне питание
не превышает 3.6 вольт !
Значит выход USART МК питаемого +5 вольт
(ножка TxD в
AVR) нужно подключать к
входу
телефона через делитель напряжения - т.е. через
резистор 10 КОм и вход телефона зашунтировать
на землю резистором 15 КОм. А вот выход телефона можно напрямую соединить
с входом
USART - в AVR это ножка
RxD.
Назначение выводов разъемов сотовых телефонов ищите на PINOUTS.ru
Вы можете записать обмен данными с вашим телефоном
управляющей программы на ПК. Для Сименсов это например SiMoCo.
Программы для лога обмена по COM-порту
тут.
Управление GSM телефоном рассматривается в АпНоуте AVR - список апноутов внизу страницы
Общение с GSM телефоном Nokia смотрите в апноуте компилятора BASCOM AVR
Документация по SMS
АТ-комманды
Кодировка
Для отсылки SMS и дозвона через Siemens готовые решения на WinAVR
Книга Компел по АТ-командам на РУССКОМ языке
http://rapidshare.com/files/7135971/AT_Command.rar
Я использую прогу для закачки с рапидшары - USDownloader - dimonius.ru
http://www.compel.ru/info/doc/Wavecom/WAVECOM-AT.pdf
Siemens x65 ATMEGA16 gsm сигнализация нюансы схемотехники -------------------- http://kazus.ru/forums/showthread.php?t=15785&page=4 MasterMushi 2010-01-06 Как раз недавно завершил проект сигнализации на сименсе 65м. Итакс - выводы 3 и 4 это универсальный USART + USB. стабильно работает на скорости 19200. В ходе отладки выявились следующие ньюансы: 1 - На линии TX (тоесть провод на четвертый контакт у сименса) от контроллера к мабиле нужно ставить последовательно по шине резистор 150ом а сразу же за ним стабилитрон V3.3 (катод на сигнальный анод на общий) для того чтобы уберечь схему внутри мабилы от высокого логического напряжения а также для надежного распознавания сигнала. 2 - На шине RX контроллера (2й вывод у сименса) нужно поставить резистор 330 ом для развязки. Если ставить без него то 60я серия сименсов при включении схемы выпадает в ресет или выключается. 3 - На разьеме сименса нужно 2ю и 5ю ноги коротнуть. ТОЛЬКО ЭТИ ДВЕ для принудительного определения кабеля. На схеме топик стартера там три подряд на общий закорочено. Это можно но не нужно. Только лишний гемор 4 - ВСЕ команды ОБЯЗАТЕЛЬНО требуют символа CR (0х0D). Точку с запятой при прямом дозвоне лучше не ставить. 5 - Лучше использовать дозвон не по комманде ATD а по доступу к сим карте. На сим карте стираются все телефоны после чего создаются номера, по которым нужно звонить. Команда доступа к номерам простая: atd>SMx; тут х - это порядковый номер нужного телефона на сим карте. К примеру: atd>SM1; Так код занимает меньше места и времени на передачу. 6 - после отправки AT комманд нужно делать паузу на 5-10 миллисекунд. 7 - перед работой с АТ командами нужно 2 раза вызвать функцию ATE0 Казалось бы - бесполезно и зачем? А вот нет, очень полезно и нужно для того чтобы потом прерывания по приходу данных не давали ложных срабатываний от тех же символов которые мы отправляем. 8 - питать и схему и мабилу от одной зарядки это верный способ создания нерабочей схемы. Тока не хватает у зарядки тянуть обе схемы. Как результат падение напряжения глюкает наш контроллер. Если надо мини устройство, питайте отдельно мабилу от одной зарядки и отдельно схему от второй. Вроде все....три недели опытов прошли не даром )))) |
Супер-пупер и экстра проект
Охранно-коммуникационный контроллер с использованием GSM модема.
Все для самостоятельного изготовления !
Микроконтроллер msp430 вам пришлет бесплатно Ti.com схема простого программатора для msp430 в статье.
Терминальная программа для работы с GSM/GPRS модемами Wavecom
Программа работает под ОС Windows XP.
Цитата из интернета:
в телефон надо отправлять следующее:
AT+AAA=xxx,xxx<CR><LF>
где ААА - сама команда, ххх - ее параметры
символы <CR> (код 0х0D) <LF> (код 0x0A) в конце каждой строки ОБЯЗАТЕЛЬНЫ, без
них телефон будет молчать.
Телефон ответит не сразу, потому в коде должна быть обработка задержки.
Ответ будет такой:
AT+AAA=xxx,xxx<CR><LF> (если включено эхо команды)
+AAA=xxx<CR><LF> (собствено ответ телефона)
ОК<CR><LF> (типа что команда выполнена успешно)
или
ERROR<CR><LF> (в случае неверной команды)
<CTRL-Z> это число 0х1А
Исходники ATcommand на Си для CVAVR и ATmega
Можно ли на Siemens через AT+CMSS отправить сообщение, находящееся в памяти входящих сообщений? (Проблемы мобильной связи)Задача ретранслировать входящее сообщение. Или тоько через AT+CMGR? Хм, а если память входящих то же что и исходящих? --- _IgorM_ 02.02.2005 в 12:16, 255 байт Разве нельзя таким образом отправлять?
Если бы было все так просто --- Igor_C
04.02.2005 в 20:22, 408 байт
Фрмат CPMS:
Проверил на вейвкоме - все работает ---
_IgorM_ 09.02.2005 в 12:32, 241 байт
at+cmgl="ALL" |
|
|
|
|
|
|
|
printf("AT+CSQ\r");//запрос
уровня сигнала GSM
if(!strncmp(BUFFER,"+CSQ",4))//обработка
этого запроса avr123.nm.ru/z5.htm |
Маленький рабочий проект на AVR для управления по SMS
Tiny Planet: a planet-wide, wireless I/O port GSM SMS AVR
|
Выключенный телефон не принимает АТ-команд. Однако, в сети Вы без труда найдете "волшебную" последовательность из пяти байт, которая приведет к включению выключенного телефона. Вот эти пять байт:
<05> <02> <07> <06> <0C>
В угловых скобках записаны шестнадцатеричные значения каждого байта. Эта "волшебная" последовательность - BFB-команда. BFB-команды (и ответы телефона на них) передаются на скорости 57600 бод. BFB-команды принимаются телефоном даже в выключенном состоянии, если подано напряжение заряда батареи телефона. Но, не все просто... Если телефоны М35 и С45 всегда принимают BFB-команды (было бы подано напряжение заряда батареи), то телефон МЕ45 принимает BFB-команды только в течении первых пятнадцати секунд после подачи напряжения заряда батареи.
Теперь немного о BFB-командах и о "волшебной" последовательности. Первые три байта - это заголовок:
Четвертый байт со значением 06 - и есть собственно команда (называется она - "KeyPress"), за которой следует один аргумент: код клавиши, нажатие на которую мы имитируем с помощью команды. Клавишам с цифрами и клавишам с символами "*" и "#" присвоены коды, совпадающие с кодами ASCII соответствующих символов; остальным клавишам присвоены коды от 01h до 0Fh. Шестнадцатеричное значение 0C соответствует в телефоне красной кнопке, которую мы нажимаем пальцем для того, чтобы включить выключенный телефон. Вот, волшебство и рассеялось...
Итак. Для включения телефона необходимо: настроить устройство последовательного обмена, к которому подключен телефон, на скорость 57600 бод; подать на телефон напряжение заряда батареи; в течении первых пятнадцати секунд после этого передать BFB-команду KeyPress: <05> <02> <07> <06> <0C>.
Телефон в ответ на команду возвращает последовательность из четырех байт: <05> <01> <04> <06>, означающую, что команда принята к исполнению (Вы, надеюсь, уже догадались, что первые три байта - это заголовок, а четвертый байт - код принятой к исполнению команды). Ответ телефоном передается все на той же скорости в 57600 бод. И вот, наконец, телефон включается и переходит в режим приема АТ-команд. Следует предостеречь от слишком быстрого снятия напряжения заряда аккумуляторной батареи: если это напряжение снять сразу же, как только получен ответ от телефона об исполнении BFB-команды KeyPress - телефон М35 не включится; следует ввести некоторую задержку перед снятием напряжения заряда.
Телефон включен и готов к приему АТ-команд... Тут не забыть бы, что работали мы с телефоном на скорости 57600, а вот АТ-команды не все телефоны способны принимать на этой скорости (телефон МЕ45 принимает АТ-команды как на скорости 19200, так и на 57600, но телефоны М35 и С45 принимают АТ-команды только на скорости 19200 бод), поэтому скорость обмена снижаем до 19200.
И вот тут-то нас и поджидает "засада" с телефонами 45-ой серии: при включении эти телефоны требуют подтверждения включения, иначе, примерно, через 30 секунд, не дождавшись подтверждения включения, телефон выключится! Ну, не нажимать же на кнопку телефона пальцем, подтверждая включение... Не солидно как-то... А, почему бы не воспользоваться BFB-командой KeyPress? Хорошая мысль, вот только мы работаем с телефоном уже в АТ-режиме. Как из АТ-режима перейти в режим BFB? Для этого есть недокументированная команда AT^SQWE=x, параметр команды (х), обозначает режим работы телефона, в который он переводится этой командой:
AT^SQWE=0 | AT-режим (эта команда потребуется для возврата из режима BFB) |
AT^SQWE=1 | BFB-режим (это - то, что нам сейчас требуется) |
AT^SQWE=2 | BFC-режим (это - для владельцев телефонов серии выше 45-ой) |
AT^SQWE=3 | OBEX (это - для людей знающих, что сие означает) |
Итак, переводим телефон в режим BFB и получаем ответ:
AT^SQWE=1<0D>
<0D><0A>OK<0D><0A>
Теперь телефон снова работает в режиме BFB (не забыть бы установить скорость обмена на 57600 бод). Снова воспользуемся командой KeyPress, изменив в "волшебной" последовательности последний байт на код клавиши подтверждения включения. В телефонах С45 и МЕ45 эта клавиша имеет один и тот же код - 01. Осталось разобраться со временем подачи этой команды: с одной стороны - телефону необходимо некоторое время для выхода на ожидание подтверждение включения, с другой стороны - если сильно затянуть с подачей команды, то телефон выключится не дождавшись подтверждения включения. Телефоны С45 и МЕ45 в течение 10 секунд после включения питания выходят на ожидание подтверждения включения, и еще 20 секунд ожидают подтверждение - вот во время этих двадцати секунд и необходимо выдать команду подтверждения включения телефона:
<05> <02> <07> <06> <01>
Получаем от телефона ответ о принятии команды на исполнение (<05> <01> <04> <06>) - телефон включен! Телефон-то включен, но необходимо вернуться в АТ-режим... В BFB-режиме, оказывается, можно управлять телефоном и АТ-командами: для этого используются команды BFB с типом команд 6 - заголовок BFB-команды просто предваряет АТ-команду (впрочем, как и ответ телефона). Т.е. для того, чтобы вернуться в АТ-режим, необходимо передать следующую последовательность байт:
<06><0A><0C>AT^SQWE=0<0D>
и получить (если проделали все правильно и без ошибок) следующий ответ:
<06><06><00><0D><0A>OK<0D><0A>
Не забывайте, что все это происходит на скоростях обмена 57600, и, только, приняв последний ответ телефона, можно переключиться на скорость 19200.
Все! Телефон включен и ожидает АТ-команду!
Речь пойдет о речевом соединении. Что же здесь обсуждать? Есть АТ-команда "Набор номера", формат ее предельно ясен - передай в телефон
ATDномер;<0D>
Номер телефона в команде - это тот же номер, что набирается на телефоне кнопочками, после номера необходимо поставить "точку с запятой" - соединение речевое, ну и стандартный символ окончания АТ-команды. Чего уж проще? И я так думал... А как определить, что вызываемый абонент ответил? Читаем документацию от Siemens "Интерфейс АТ-команд. Набор номера с носимого телефона", ответ телефона на команду ATD: "При успешном речевом соединении: ОК".
Пробуем... Ответ телефона "ОК" получаем сразу же, как только телефон получил команду ATD! Далее слушаем некоторое время в телефоне гудки вызова, и вот вызываемый абонент ответил на наш вызов, а на линии последовательного интерфейса - тишина. Абонент разорвал связь - ответ телефона "NO CARRIER".
Пробуем еще раз, но звоним на другой номер... Также получаем "ОК" на команду ATD, слушаем в трубке приятный женский голос, который на двух языках вещает нам: "Абонент временно недоступен...", затем голос умолкает, и на экране дисплея телефона мы наблюдаем, что вызов уже не производится (можно попробовать позвонить еще кому-нибудь), а на линии последовательного интерфейса - тишина.
Вывод: ответ телефона "ОК" на команду ATD - есть факт того, что телефон воспринял команду и начинает ее выполнять, а вовсе не факт соединения с вызываемым абонентом. Можно ли получить дополнительную информацию о нашей попытке соединения? Да, можно: если абонент не желает с Вами разговаривать (нажимает клавишу "Отклонить") - получаем ответ телефона "BUSY"; если абонент ответил на вызов, а затем прервал разговор - "NO CARRIER"; иногда можно получить ответ "NO DIAL TONE" - наверное, при перегрузке соты; еще - "ERROR" - ну, это - отдельная песня. Да, уж - не много... Главное - ответа на вопрос - "ответил ли абонент?" - так и не получили.
Для определения установления связи с вызываемым абонентом я использую команду AT+CLCC которая называется "Список текущих соединений оконечного устройства". Телефон этот список возвращает в ответ на команду в виде строк:
+CLCC: <id>,<dir>,<stat>,<mode>,<mpty>[,<number>,<type>[,<alpha>]]
Последовательность строк заканчивается строкой
ОК
Нас интересует параметр <stat>. Он принимает следующие значения
0 | Соединение активно |
1 | Соединение удерживается |
2 | Осуществляется набор |
3 | Вызывается абонент |
4 | Входящее соединение |
5 | Ожидающее входящее соединение |
Итак. Когда абонент ответит на наш звонок, параметр stat примет значение 0. Факт ответа на вызов зафиксирован. Осталось определиться с недоступным абонентом. К сожалению, когда девушка в трубке бубнит свое: "Абонент временно недоступен...", параметр stat имеет значение 3 - т.е. отличить от нормального вызова бубнение в трубке не представляется возможным с помощью этой команды. Но, девушка в трубке бубнит не вечно - у меня около 30 секунд (возможно, это время зависит от оператора сотовой связи), и, вот, когда она умолкла и можно набирать другой номер - в ответ на команду AT+CLCC мы получаем от телефона ответ ОК, без всяких там строк, начинающихся на +CLCC (в документации об этом записано так: "Если команда была выполнена, но соединений нет, то ответ не передается").
Теперь представим, что мы пытаемся соединиться с абонентом, но он занят, недоступен или просто не желает с нами разговаривать и нажимает клавишу "Отклонить" при нашем звонке. Но, мы очень желаем до него дозвониться и, снова и снова, набираем его номер. Естественно, что поручили эту работу компьютеру. Довольно скоро на команду ATDномер; телефон выдаст ответ ERROR, хотя еще недавно выдавал ОК. Почему? Потому, что набранный нами номер оказался в "черном списке" ("black list"). Его там даже можно увидеть - достаточно прочитать телефонный справочник с именем "BL". По какой причине нужно было его туда помещать? Ответ знает только Siemens. Как удалить запись из black list'а? Увы, я не знаю. Обычные команды удаления записей из справочника не действуют на справочник "BL".
Что же делать, если такое произошло и номер оказался блокирован? Смиренно выждать две минуты и повторить попытку установления соединения. Скорее всего Siemens Вам это милостиво разрешит. Еже ли Вы будите упорствовать в своих попытках установить соединение, то очень скоро номер будет блокирован напрочь! На одном из форумов нашел упоминание, что блокировку может снять либо внешний звонок, либо нажатие на любую кнопку телефона. Ну уж кнопки по проводам мы нажимать умеем! Опять нам пригодились BFB-команды... Пробуем. И что получилось? М-да... До глухой блокировки номера теперь дело не доходит, но, вот, со снятием двухминутной блокировки - в каких-то телефонах проходит, в каких-то со второго раза на третий, а, в каких-то - ну, никак... В чем хитрость? Может, я пошел не тем путем? Или, может, есть другое решение этой проблемы?
Начнем с того, что прием и передача SMS осуществляется в двух режимах: текстовом режиме и в режиме PDU. Передача SMS в режиме PDU сложнее в реализации, однако режим PDU позволяет задать некоторые параметры передачи SMS, недоступные в текстовом режиме. И еще один довод в пользу режима PDU - текстовый режим реализован не во всех телефонах. Будем передавать SMS в режиме PDU (текстового режима в моих телефонах - просто нет). Задается этот режим командой:
AT+CMGF=0
Передача сообщения SMS осуществляется командой
AT+CMGS=<length>
а, затем, в ответ на приглашение "> " передается PDU по два символа на байт (октет), признаком окончания передачи PDU служит байт со значением 1Аh (при вводе с терминала - "Ctrl-Z"). И, если все правильно проделать, телефон подтвердит принятие PDU сообщением "ОК". Тонкость здесь в значении <length> команды AT+CMGS. Распространенная ошибка - указать в качестве значения <length> длину PDU в октетах. Документация говорит нам, что <length> - "длина фактического элемента данных TP в октетах". Эта фраза означает, что октеты адреса CS не включаются в длину, а, поскольку адрес CS обычно задается по-умолчанию, т.е. имеет длину в один октет (два первых символа "00", которые вводятся первыми в ответ на приглашения ввода SMS), то для определения <length> из длины PDU нужно вычесть единицу.
После изучения документации по этому вопросу, было решено воспользоваться возможностями команды AT+CNMI "Индикация новых полученных сообщений". Эта команда позволяет настроить телефон так, что при поступлении SMS, телефон в последовательный канал выдает строку:
+CMTI: <mem>,<index>
в которой сообщает в компьютер память и номер ячейки в ней, в которую помещено поступившее сообщение. Далее выбираем память командой AT+CPMS=<mem> и читаем в режиме PDU командой AT+CMGR=<index>. Последняя команда порождает ответ телефона в три строки:
+CMGR: <stat>,[<alpha>],<length>
<pdu>
OK
Как в случае передачи SMS, так и при приеме - параметр <length> - "длина фактического элемента данных TP в октетах", т.е. адрес сервисного центра все также не включен в длину, однако при приеме адрес SMCS обычно занимает восемь октетов (первый октет адреса SMCS - длина адреса SMCS, т.е. число следующих за ним октетов адреса).
Такой режим приема SMS мне очень даже понравился: телефон принимает SMS и сообщает об этом компьютеру, который считывает SMS из памяти телефона, а, затем, освобождает память (стирает SMS) - довольно стройно и ничего лишнего. Все это хорошо работало. Но, только на телефонах 45-ой серии... Телефон М35, несмотря на то, что он прекрасно принимал команду AT+CNMI, но при получении новых SMS выдавать индикацию в виде "+CMTI: <mem>,<index>" отказывался напрочь. Я так не не смог заставить его это делать... Пришлось периодически сканировать память на наличие принятых и непрочитанных сообщений командой AT+CMGL, которая в режиме PDU для каждого принятого и непрочитанного SMS формировало две строки
+CMGL: <index>,<stat>,<length>
<pdu>
Весь список сообщений завершала строка ОК. Длина <length> определяется по приведенным выше правилам.
Но и здесь нас поджидает засада... В телефонах, в которых принятые SMS помещаются только в память карточки SIM (память "SM"), все это работает хорошо. В телефонах, в которых принятые SMS могут помещаться как в память карточки SIM, так и память телефона (память"МЕ"), казалось бы, необходимо установить одну какую-либо память (например карточки SIM) в качестве памяти, в которую помещаются принятые сообщения, и, в качестве памяти, из которой читаются и удаляются сообщения. Например, так
AT+CPMS= "SM","SM","SM"
Так и делаем. И что мы видим? Вроде бы - работает, но на телефонах 45-ой серии, иногда, по какой-то неведомой мне причине, принятое сообщение вдруг помещается в память телефона (память "МЕ"), и, конечно же остается непрочитанным! Поскольку, в телефонах 35-ой серии не работает первый метод, а в телефонах 45-ой серии криво работает второй метод, то для работы программы с телефонами обеих серий придется объединить оба метода приема SMS: настроить телефон на индикацию новых полученных сообщений посредством "+CMTI: <mem>,<index>", а также периодически сканировать память на наличие принятых и непрочитанных сообщений. При попадании принятого SMS "не в ту" память (память телефона) получим строку:
+CMTI: "ME",<index>
и считываем его первым методом: выбираем память командой AT+CPMS="МЕ" и читаем командой AT+CMGR=<index> (не забыть бы выбранную для чтения память установить снова на память карточки SIM (AT+CPMS= "SM"). Приходящие уведомления о получении новых сообщений вида "+CMTI: "SM",<index>" можно игнорировать, поскольку они будут прочитаны периодически выдаваемой командой AT+CMGL.
И осталось только напомнить, что память для помещения принятых SMS не бесконечна - не забывайте ее освобождать для новых SMS.
Зарядка аккумулятора проверяется командой "AT+CBC". Не могу точно сказать, как определяется степень заряда аккумулятора телефоном. Наверное, по значению напряжения на клеммах аккумулятора. При подаче напряжения заряда - напряжение на клеммах аккумулятора, по-видимому, повышается. Вот, отсюда, наверное, и значения оставшегося заряда величиною более 100%, при подаче команды "AT+CBC" при заряде аккумулятора.
Вывод: желаете узнать заряд аккумулятора - снимите прежде напряжение заряда.