|
Последовательное вычитывание СМС с SIM900R |
|
|
|
Feb 26 2015, 13:58
|
Частый гость
 
Группа: Свой
Сообщений: 187
Регистрация: 22-06-05
Из: Минск, Беларусь
Пользователь №: 6 213

|
Возможно этот вопрос уже поднимался, я сегодня пролистал 15 страниц, упарился искать ...  Задача: вычитывать СМС,обрабатывать их и удалять. Ограничения: Входной буфер для работы с SIM900R небольшой (около 1 кБ) Обычная моя работа с SIM - это отправка запроса о ожидание необходимых ответов, типа OK, ERROR или CMS ERROR. После получения ОК, происходит разбор всего принятого пакета. Для вычитывания СМС вижу 2 команды: 1) CGMR - очень удобная команда, но чтобы ей воспользоваться, необходимо знать индекс СМС сообщения, а они могут быть не все по порядку. Признака, типа вернуть первое доступное СМС сообщение у нее вроде нет. 2) CGML - умеет возвращать все имеющиеся сообщения, однако при наличии большого числа СМС, может просто не хватить моего входного буфера. Ограничить количество возвращаемых за один раз сообщений, типа вернуть только одно сообщений у нее вроде нет. Конечно можно предположить, что СМС сообщения будут приходить с большим интервалом и команда CGML будет возвращать 1-2-3 сообщения, которые поместяться у меня во входном буфере. Однако практика показывает, что в жизни бывает всякое и надо быть готовым к худшему случаю. Кто как с такими задачами справляется или есть еще способ работы с СМС сообщениями, который я проглядел.
|
|
|
|
|
 |
Ответов
|
Feb 26 2015, 15:02
|

Профессионал
    
Группа: Свой
Сообщений: 1 080
Регистрация: 16-11-04
Из: СПб
Пользователь №: 1 143

|
вариант 3: Использовать Flow Control на UART и подать соответсвующую команду на модем вариант 4: в телитах можно настроить at+cnmi=2,1,0,0,0 чтобы было сообщение о каждом пришедшем СМС, и эти сообщения парсить ( +CMTI: "SM",2\r\n +CMTI: "SM",34\r\n +CMTI: "SM",125\r\n ) и складировать в очередь, чтобы потом извлекать уже нужные номера СМС ( может что подобное в симкоме есть )
--------------------
Марс - единственная планета, полностью населенная роботами (около 7 штук).
|
|
|
|
|
Feb 26 2015, 17:00
|
Частый гость
 
Группа: Свой
Сообщений: 187
Регистрация: 22-06-05
Из: Минск, Беларусь
Пользователь №: 6 213

|
Цитата(megajohn @ Feb 26 2015, 18:02)  вариант 3: Использовать Flow Control на UART и подать соответсвующую команду на модем вариант 4: в телитах можно настроить at+cnmi=2,1,0,0,0 чтобы было сообщение о каждом пришедшем СМС, и эти сообщения парсить ( +CMTI: "SM",2\r\n +CMTI: "SM",34\r\n +CMTI: "SM",125\r\n ) и складировать в очередь, чтобы потом извлекать уже нужные номера СМС ( может что подобное в симкоме есть ) насчет варианта 3 не понял. Если вы предлагаете с помощью RTC и CTS останавливать передачу данных от SIM, то такой вариант плох тем, что "ОК" ждаь нельзя, так как его не будет в первых пакетах. Во-вторых обработка всех сразу СМС в цикле, подвесит модуль, пока все СМС сообщения не будут обработаны. С этим конечно можно побороться, с помощью каких-то там флагов, запоминанием текущего состояния и прочего, но очень сильно усложнит прозрачность кода и как следствие, большую вероятность появления ошибки. А самое гланое, оно напрочь поломает всю ту структуру взаимодействия между микроконтроллером и SIM. Хотя как вариант, возможен. Отсавлю его на самый последний вариант, если других не останется. Я уже думал в плане использования листинга, собирать на лету только ID СМС, а потом по одному уже работать с ними. В таком случае ломать мне меньше. Но тут другая проьблема вылазит - это количество СМС, которые могут находиться в памяти, чтобы выделить для их хранения память. Есть тут какие-то цифры или нет!? Сколько например может быть СМС или каков максимальный индекс? Вариант 4 симпатичен, но не решает вопрос первого запуска, когда в карточке могут уже находиться какие-либо сообщения. Хотя, врядли это будут нужные сообщения и их можно просто по включению удалить, но все таки!
|
|
|
|
|
Mar 2 2015, 10:39
|
Профессионал
    
Группа: Свой
Сообщений: 1 241
Регистрация: 15-11-05
Из: Челябинск
Пользователь №: 10 882

|
Цитата(Yaumen @ Feb 26 2015, 22:00)  насчет варианта 3 не понял. Если вы предлагаете с помощью RTC и CTS останавливать передачу данных от SIM, то такой вариант плох тем, что "ОК" ждаь нельзя, так как его не будет в первых пакетах. Во-вторых обработка всех сразу СМС в цикле, подвесит модуль, пока все СМС сообщения не будут обработаны. А никто не заставляет сразу в цикле обрабатывать. 1. Используем +CMGL чтобы узнать индекс первой необработанной СМС 2. Обязательно ждем конца листинга (OK) 3. В свободное время делаем +CMGR наденного индекса.
|
|
|
|
|
Mar 3 2015, 10:05
|
Частый гость
 
Группа: Свой
Сообщений: 187
Регистрация: 22-06-05
Из: Минск, Беларусь
Пользователь №: 6 213

|
Цитата(Alechek @ Mar 2 2015, 13:39)  А никто не заставляет сразу в цикле обрабатывать. 1. Используем +CMGL чтобы узнать индекс первой необработанной СМС 2. Обязательно ждем конца листинга (OK) 3. В свободное время делаем +CMGR наденного индекса. Этот алгоритм сложнее для меня. Во-первых, надо ли иметь достаточное количество памяти буфера для приема сообщения, чтобы поймав "ОК", найти первое "+CMGL:" и отпределеить его индекс. Либо налету сначала отлавливать первый "+CMGL:", определеять индекс сообщения, а затем ждать "ОК". Во-вторых. В любом случае, приходится принимать большой фрагмент ненужного "мусора", так как все остальные принятые сообщения одновременно не будут обрабатываться, а в следующем цикле придется все повторять по новому: посылать команду CMGL и принимать повторно "мусор" только для того, чтобы узнать индекс следующего сообщения. Либо, чтобы повторно не выполнять команду CMGL, придется под нее выделить достаточно большо буфер, чтобы в ней хранился весь последний запрос, а затем его потихоньку разбирать. А это накладно для меня. В идеале было бы здорово, если была бы команда, позволяющая вернуть индекс первого доступного сообщения или хотя бы возможность управлять командой CMGL, указывая ей, сколько сообщений я готов принять одновременно. Но таких команд вроде бы нет. Поэтому алгоритм, предложенный Baser для меня предпочтительнее. Хотя в моем случае придется перебирать 30 ячеек с SMS (такая симка попалась), для поиска не обработанного сообщения.
|
|
|
|
Сообщений в этой теме
Yaumen Последовательное вычитывание СМС с SIM900R Feb 26 2015, 13:58  Baser Цитата(Yaumen @ Feb 26 2015, 19:00) Но ту... Feb 26 2015, 21:09   Yaumen Baser,
Отличный алгоритм, спасибо. А можно ли как-... Feb 27 2015, 05:11    Baser Цитата(Yaumen @ Feb 27 2015, 07:11) А мож... Feb 27 2015, 11:03     Yaumen Цитата(Baser @ Feb 27 2015, 14:03) Не пон... Feb 27 2015, 11:18 andrey videoplus у меня похожий принцип работы: мк по прерыванию от... Feb 26 2015, 23:48 RadikX Имейте в виду, встречал прошивки, где на команду A... Mar 6 2015, 09:01
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|