ДА!Есть! Я это конечно не сам придумал(тут взял, http://podrugomu.com/node/1379 код) я так подозреваю я пару Enter'ов не отправил. =))) 3.45 часа прошли не впустую!
#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3); // RX, TX
int i=0;
void setup() {
Serial.begin(9600); //Скорость порта для связи Arduino с компьютером
//Serial.println("Goodnight moon!");
mySerial.begin(9600); //Скорость порта для связи Arduino с GSM модулем
//mySerial.println("AT");
mySerial.print("AT+CMGF=1");
mySerial.print((char)13);
delay(100); // даём время на усваивание команды
mySerial.print("AT+CSCS=");
mySerial.print((char)34); // передача в порт символа "
mySerial.print("IRA");
mySerial.print((char)34); // передача в порт символа "
mySerial.print((char)13);
sendTextMessage();
}
void loop() {
if (mySerial.available())
Serial.write(mySerial.read());
if (Serial.available())
mySerial.write(Serial.read());
}
void sendTextMessage() {
delay(1500);
// Устанавливаем адресата: телефонный номер в международном формате
mySerial.print("AT+CMGS="); // send the SMS the number
mySerial.print((char)34); // передача в порт символа "
mySerial.print("+79111111111"); // передача номера телефона
mySerial.print((char)34); // передача в порт символа "
mySerial.print((char)13);
delay(1500);
// \" - это enter?
mySerial.println("Ura!!!"); // передача текста сообщения
Купил SIM800L, подключил через DC-DC, ток 0,8-1А, пробовал напряжение от 3,8V до 4,2V подавать. Часто мигает в Сети не регистрируется, SIM - карта живая, модуль видит Операторов.
СИМКАРТУ!! ставить срезом уголка наружу!! короче шиворот навыворот, обычно в симдержателях срезанный уголок внутрь вставляют, а у этих китайцев - наоборот.
Питание 4,2V это максимум, и не от ардуины!!! Общий минус (земля) для SIM800L и ардуины. В коде после команды AT или ATZ ставь delay(20000); - надо дать время соединиться с сетью. Если симка без пина, то все нормально, если теле2 с пином 0000, тогда
"If your SIM card is locked with a PIN code, you will need to enter the pin before you can connect to a network via the 'AT+CPIN' command. For example if the pin is 1234 you need to enter 'AT+CPIN=0000"."
ну и снова delay(немного); . Ниже рабочий код, собирал с нескольких источников:
#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); // RX, TX
void setup() {
Serial.begin(19200); //Скорость порта для связи Arduino с компьютером
Serial.println("Welcome"); // Вывести в апаратный порт "Arduino START OK"
Serial.println("Start 800L");
mySerial.begin(19200); //Скорость порта для связи Arduino с GSM модулем
mySerial.println("ATZ"); // АТ команда модему "ATZ" (програмный сброс)
//mySerial.println("AT");
delay(20000); // give time to log on to network!!!!
mySerial.println("AT+CMGDA=\"DEL ALL\""); // АТ команда модему , удалить все сообщения с sim карты
delay(500); // Пауза 0,5 секунды
mySerial.println("AT+CMGF=1\r"); // устанавливаем текстовый режим SMS (1 - включить, 0 - отключить)
delay(100);
mySerial.println("AT+CSCS=\"GSM\""); // selece TE character set - GMS 7-bit default alfabet
delay(100);
mySerial.println("AT+IFC=1,1"); //настройка SIM900 Serial bufer --- Контроль передачи данных, при "0", оключен обеими
delay(100);
mySerial.print("AT+CNMI=1,2,2,1,0");
//mySerial.println("AT+CNMI=1,2,0,0,0"); // Включить перехват SMS, перед этой командой должно быть "AT+CMGF=0" - Переход в PDU mode
delay(100);
Serial.println("Ready...");
smsa(String("System ready"),String("+7912XXXXXXX"));
mySerial.println("AT+CUSD=1,\"#100#\""); // запрос баланса
Serial.println("OK");
}
void loop() {
if (mySerial.available())
Serial.write(mySerial.read());
if (Serial.available())
mySerial.write(Serial.read());
}
void smsa(String text, String phone) {
mySerial.print("AT+CMGS=\"");
mySerial.print(phone);
mySerial.println("\"");
delay(1000);
mySerial.print(text);
delay(500);
mySerial.write(0x1A);
mySerial.write(0x0D);
mySerial.write(0x0A);
Serial.println("Ready3...");
}
void ballance() {
//mySerial.println("AT+CUSD=1,\"#100#\""); //так
mySerial.println("ATD#100#"); // или так
Serial.println("Ready2...");
}
кто сталкивался, вставил симку в sim800 от теле2 , сигнал не находит что ли (часто мигает светодиод), а когда мегафон воткнул, перестал быстро мигать. читал про питание симки,может быть это? и как проверить?
в том то и дело , что напруга не прыгает 4.1 вольта , использую бп от компа , 12 вольт, понижающий шилд до 3 ампер, вот только SIM800 припаял штырьки которые были в комплекте, а на платку припаял колодки как на ардуинке, вроди эстетично... но говорите не надежно?
Hibernator что именно у Вас не получается? в интернете видил примеры попадались по FTP, но мне не особо итересно поэтому их пропускал, если более подробно опишите проблему возможно смогу подсказать что знаю.
И если не секрет, как хотите использовать FTP?
Я снова подыму вопрос по оператору Теле2, кто что может подсказать (самый дешовый на мой взгляд тариф) и к сожалению не работает. Получилось ли у кого подключить теле2 к модулю SIM800-900 ?
Пробовал, все работает на мегафоне отлично, и если отправляю запрос на поиск всех доступных сетей то как раз теле2 там нет, хотя на мобилке антена полная. Вот и пробовал 2 симкарты от теле 2 (сеть не находит)
Для пробы всё же попробую эти датчики, по их "поведению" будем делать выводы . А пока хотел бы вернуться к sim800. Неожиданно возникла проблемка. После того, как начал пробовать массовую отправку смс, у кого -то из нас что-то с крышей...:-) . После отправки смс пропали ответы от модуля типа +CMGS: 23, хотя смс получатель принимает. Иногда появляется плюсик...
----------------------------------
Send test-SMS na nomer 0553332211 with text- TEST
AT+CMGS="0553332211"
> TEST
+
--------------------------------
Пробую в терминалке AT-команды - на все команды вроде исправно откликается. Пробую отправить смс. Ввожу номер телефона, после появления знака приглашения > ввожу текст, пытаюсь завершить CTRL+Z ,а ничего не происходит, т.е. "закончить" смс не получается, так на приглашении и висит. Выйти могу только RST. Что бы это значило?
> AT+CMGS="0553332211"
>
Здравствуйте! Подскажите, пожалуйста, как решили проблему отправки СМС из терминала? Как завершить сообщение (ctrl+z)?
Baks, в каком диапазоне работает модуль? Теле2 работает только в сетях выше 2G. Т.е. в простой телефон, типа нокии 3210 если симку вставить, то она в нем работаь не будет, ибо он поддерживает 1G-2G, но не выше. Смотрите спецификацию на модуль.
Я вроде по этому поводу отписался. Проблемы оказались в размере входного буфера для приема данных, вот данные каким то образом урезались , увеличил размер - и всё поехало...
Nestor Mahno пишет:
Здравствуйте! Подскажите, пожалуйста, как решили проблему отправки СМС из терминала? Как завершить сообщение (ctrl+z)?
Я вроде по этому поводу отписался. Проблемы оказались в размере входного буфера для приема данных, вот данные каким то образом урезались , увеличил размер - и всё поехало...
Nestor Mahno пишет:
Здравствуйте! Подскажите, пожалуйста, как решили проблему отправки СМС из терминала? Как завершить сообщение (ctrl+z)?
Я если честно не понял, что это относится к проблеме отправки СМС. У меня буфер на максимуме. И я не совсем понимаю, как отправить "ctrl+z" в терминал.
Пытаюсь получить запрос по балансу на своем модуле. Приходит СМС, но в буфере вместо текста и цифр вот такая строка 003100390033002E003900340440002E (при этом смс с телефона модуль корректно отрабатывает и корректно отсылает смс обратно).
Методом научного тыка выяснил, что это ничто иное, как кодировка символов.
0031 - цифра 1, 0039 - цифра 9, 0033 - цифра 3, 002E - точка и т.д., т.е. в принципе пришло что нужно, только почему-то в закодированном виде (т.е. баланс на момент получения этого смс был что-то порядка 193.95 р.) Теперь вот не пойму, то ли переводить это безобразие каким-то образом в читабельный вид, то ли копать, почему в буфере такая фигня.
Пытаюсь получить запрос по балансу на своем модуле. Приходит СМС, но в буфере вместо текста и цифр вот такая строка 003100390033002E003900340440002E (при этом смс с телефона модуль корректно отрабатывает и корректно отсылает смс обратно).
Методом научного тыка выяснил, что это ничто иное, как кодировка символов
Передача SMS может идти в символьном режиме (только латинские символы) или в PDU (все остальные языки).
В твоем ответе как раз используется кириллица, поэтому ответ получен в PDU формате (кодировка Unicode UCS2)
Пытаюсь получить запрос по балансу на своем модуле. Приходит СМС, но в буфере вместо текста и цифр вот такая строка 003100390033002E003900340440002E (при этом смс с телефона модуль корректно отрабатывает и корректно отсылает смс обратно).
Методом научного тыка выяснил, что это ничто иное, как кодировка символов.
А зачем применять "глубокие научные реории", если есть пдфы на эти модули и там все эти моменты описаны?
Научный тык занял 5 минут. ПДЭФЫ на эти модули на агнлийском и размером листов в 50 мелкого текста. Лопатить пдф это конечно прекрасно и достойно, однако форум для того и существует, чтобы поделиться с ближним проблемой и, если эту проблему уже кто-то решал, или, как минимум, с ней сталкивался, то получить совет или нужное направление. И совет и нужное направление получил. Теперь буду дальше ковыряться.
Может этот код поможет. Спер его тут на форуме. У меня на меге работает. На 6 пин вешаем кнопку, по нажатию уходит СМС. Максимально 70 символов.
Номер телефона только свой установите в 22 строке.
Думаю код еще можно причесать, но не до этого было. расшифровать тоже думаю будет не проблема, но мне это не надо, поэтому не писал алгоритм, я управлять с помощью DTMF планирую.
Перерыл сегодня весь интернет, насколько мог. Но не смог найти адекватный код именно для перевода строки 003100390033002E003900340440002E в символы.
В С++ я, честно говоря, не очень, ткните носом, какой метод / функция может преобразовывать из кода ASCII в символ?
Разобрать строку на коды по четыре символа не пролема, но вот как эти 4 символа (0031) преобразовать в символ 1 (ну и двлее в цикле все остальные), я никак не допетрю..
ну и? теперь поняли, что лучше латиницу передавать и не морочится с кирилицей, которая еще и не на всех телефонах нормально отображается? с латиницей вообще ноль проблем.
Да я как бы особо насчет кириллицы не парился никогда. Читайте внимательно проблему: такая строка приходит при запроса баланса. И мне нужно перевести эту строку в читабельный вид, чтобы извлечь из нее сумму остатка денег, проанализировать и при достижении определенного порога уведомить об этом меня.
Попробуйте в запросе USSD первый символ # . Есть 2 варианта запроса USSD, начиная со * или с # . При первом варианте ответ приходит на русском, во втором - латиница ( если оператор поддерживает такой запрос).
ну напишите вы, будет программа. и тут оператор "что-то" у себя поменяет, или нужно будет симкарту иного оператора вставить, и что тогда? опять переписывать софт? имхо софт должен быть универсален. И универсальность дефакто - с латинскими символами.
alfik777, я с GSM модуля через СМС запрос отправляю.
А можно увидеть текст этого СМС - запрос баланса ?
GSM модуль, подключенный к ардуино, отправляет на номер 000100 пустое СМС. (если на этот номер отправить пустое СМС, то придет ответное сообщение от оепартора с указанием баланса сим-карты).
Текста запроса нет. Почитайте внимательно. Мне не нужно отправлять смс в кириллице. Мне нужно преобразовать коды ASCII в символы.
От оператора приходит набор кодов 003100390033002E003900340440002E что в переводе на символы означает 193,94р.
Short Circuit, Вы сами-то понимаете, о чем пишете?
При чем тут оператор, при чем тут сим карта? СМС приходят в двух форматах, либо латиницей либо в кодах ASCII (т.н. SMS-PDU), если есть хоть один не латинский символ в смс. Латиницу модуль и так читает распрекрасно. Универсальность и заключается втом, чтобы программно расшифровать PDU. А Вы ахинею какую-то несете.
Неужели на C++ нет функции или процедуры дял перевода кода символа в символ? Свою что ли писать?
Переводов множество, но специально для PDU нету конечно. Там каждый символ кодируется 4мя байтами. Нужно написать свой несложный декодер, например так
String message = "003100390033002E003900340440002E";
void setup()
{
Serial.begin(9600);
Serial.println(message);
char key = 0;
char* letter = "";
String decode = "";
long int lchar;
for (int i = 0; i < message.length(); i= i+4)
{
key = message.charAt(i+1);
letter[0] = message[i + 2];
letter[1] = message[i + 3];
letter[2] = 0;
lchar = strtol(letter,NULL,16);
Serial.println(letter);
// если вотрой символ в 4ке символов 0 значит латиница
if (key == '0')
{
decode = decode + char(lchar);
}
else
{ // иначе значит кирилица
decode = decode + char((lchar+128));
}
}
Serial.println(decode);
}
// the loop routine runs over and over again forever:
void loop() {
}
ПисАл на коленке, но думаю направление понятно. Я в сях тоже не силен, может есть более оптимальный алгоритм. И еще, в принципе в терминал у меня русский не выводится, на LCD тоже, там только латиница и китайские иероглифы. Поэтому с выводом русского могу ошибаться.
Может я, конечно, чего-то не понимаю, но может проще не изобретать велосипед? Почему нельзя использовать нормальный USSD- запрос и получить адекватный ответ типа ".... Vash balans 193,94 r." ?
А вообще карточку-то видит, PIN- kod проглатывает? Уровень сигнала какой? Ну и вообще - AT+CGATT?
ДА!Есть! Я это конечно не сам придумал(тут взял, http://podrugomu.com/node/1379 код) я так подозреваю я пару Enter'ов не отправил. =))) 3.45 часа прошли не впустую!
А вообще карточку-то видит, PIN- kod проглатывает? Уровень сигнала какой? Ну и вообще - AT+CGATT?
Видит, Pina не было, Tele2 игнорирует, на мегафоне экспериментирую.
Спасибо за ответы!=)
Помогите советом, куда рыть?
Купил SIM800L, подключил через DC-DC, ток 0,8-1А, пробовал напряжение от 3,8V до 4,2V подавать. Часто мигает в Сети не регистрируется, SIM - карта живая, модуль видит Операторов.
Спасибо.
А антенна есть?
А антенна есть?
Да, что была в поставке, не внешняя.
У меня так было с Теле2, тоже не ловил сеть, с мегафона все поймал...
СИМКАРТУ!! ставить срезом уголка наружу!! короче шиворот навыворот, обычно в симдержателях срезанный уголок внутрь вставляют, а у этих китайцев - наоборот.
фото модуля ниже.
Питание 4,2V это максимум, и не от ардуины!!! Общий минус (земля) для SIM800L и ардуины. В коде после команды AT или ATZ ставь delay(20000); - надо дать время соединиться с сетью. Если симка без пина, то все нормально, если теле2 с пином 0000, тогда
"If your SIM card is locked with a PIN code, you will need to enter the pin before you can connect to a network via the 'AT+CPIN' command. For example if the pin is 1234 you need to enter 'AT+CPIN=0000"."
ну и снова delay(немного); . Ниже рабочий код, собирал с нескольких источников:
#include <SoftwareSerial.h> SoftwareSerial mySerial(10, 11); // RX, TX void setup() { Serial.begin(19200); //Скорость порта для связи Arduino с компьютером Serial.println("Welcome"); // Вывести в апаратный порт "Arduino START OK" Serial.println("Start 800L"); mySerial.begin(19200); //Скорость порта для связи Arduino с GSM модулем mySerial.println("ATZ"); // АТ команда модему "ATZ" (програмный сброс) //mySerial.println("AT"); delay(20000); // give time to log on to network!!!! mySerial.println("AT+CMGDA=\"DEL ALL\""); // АТ команда модему , удалить все сообщения с sim карты delay(500); // Пауза 0,5 секунды mySerial.println("AT+CMGF=1\r"); // устанавливаем текстовый режим SMS (1 - включить, 0 - отключить) delay(100); mySerial.println("AT+CSCS=\"GSM\""); // selece TE character set - GMS 7-bit default alfabet delay(100); mySerial.println("AT+IFC=1,1"); //настройка SIM900 Serial bufer --- Контроль передачи данных, при "0", оключен обеими delay(100); mySerial.print("AT+CNMI=1,2,2,1,0"); //mySerial.println("AT+CNMI=1,2,0,0,0"); // Включить перехват SMS, перед этой командой должно быть "AT+CMGF=0" - Переход в PDU mode delay(100); Serial.println("Ready..."); smsa(String("System ready"),String("+7912XXXXXXX")); mySerial.println("AT+CUSD=1,\"#100#\""); // запрос баланса Serial.println("OK"); } void loop() { if (mySerial.available()) Serial.write(mySerial.read()); if (Serial.available()) mySerial.write(Serial.read()); } void smsa(String text, String phone) { mySerial.print("AT+CMGS=\""); mySerial.print(phone); mySerial.println("\""); delay(1000); mySerial.print(text); delay(500); mySerial.write(0x1A); mySerial.write(0x0D); mySerial.write(0x0A); Serial.println("Ready3..."); } void ballance() { //mySerial.println("AT+CUSD=1,\"#100#\""); //так mySerial.println("ATD#100#"); // или так Serial.println("Ready2..."); }максимум - 4,5в питание, еще выдержит, но наверное будет ругаться.
я подаю 4в от своего импульсного источника питания.
кто сталкивался, вставил симку в sim800 от теле2 , сигнал не находит что ли (часто мигает светодиод), а когда мегафон воткнул, перестал быстро мигать. читал про питание симки,может быть это? и как проверить?
при звонке проседает с 4,2 на 3,9 ??? значит в импульсе еще больше падает!!
выбросьте свой БП или тонкие провода от него(конактами не соединять!! все толкоо паять!!) - на помойку..
в том то и дело , что напруга не прыгает 4.1 вольта , использую бп от компа , 12 вольт, понижающий шилд до 3 ампер, вот только SIM800 припаял штырьки которые были в комплекте, а на платку припаял колодки как на ардуинке, вроди эстетично... но говорите не надежно?
может всетаки дело в симкарте или в пинкоде?
симкарту впихнули правильно? абонент в зоне?
да , стороной правильно вставлял. на мобике овит tele2 хоrошо
Ни кто, случаем, не мучал SIM800L для FTP?
Сколько не пытаюсь, не получается, может кто поможет?
Hibernator что именно у Вас не получается? в интернете видил примеры попадались по FTP, но мне не особо итересно поэтому их пропускал, если более подробно опишите проблему возможно смогу подсказать что знаю.
И если не секрет, как хотите использовать FTP?
Я снова подыму вопрос по оператору Теле2, кто что может подсказать (самый дешовый на мой взгляд тариф) и к сожалению не работает. Получилось ли у кого подключить теле2 к модулю SIM800-900 ?
Пост #59 пробовали?
Пробовал, все работает на мегафоне отлично, и если отправляю запрос на поиск всех доступных сетей то как раз теле2 там нет, хотя на мобилке антена полная. Вот и пробовал 2 симкарты от теле 2 (сеть не находит)
В чем причина может быть?
Для пробы всё же попробую эти датчики, по их "поведению" будем делать выводы . А пока хотел бы вернуться к sim800. Неожиданно возникла проблемка. После того, как начал пробовать массовую отправку смс, у кого -то из нас что-то с крышей...:-) . После отправки смс пропали ответы от модуля типа +CMGS: 23, хотя смс получатель принимает. Иногда появляется плюсик...
----------------------------------
Send test-SMS na nomer 0553332211 with text- TEST
AT+CMGS="0553332211"
> TEST
+
--------------------------------
Пробую в терминалке AT-команды - на все команды вроде исправно откликается. Пробую отправить смс. Ввожу номер телефона, после появления знака приглашения > ввожу текст, пытаюсь завершить CTRL+Z ,а ничего не происходит, т.е. "закончить" смс не получается, так на приглашении и висит. Выйти могу только RST. Что бы это значило?
> AT+CMGS="0553332211"
>
Здравствуйте! Подскажите, пожалуйста, как решили проблему отправки СМС из терминала? Как завершить сообщение (ctrl+z)?
Baks, в каком диапазоне работает модуль? Теле2 работает только в сетях выше 2G. Т.е. в простой телефон, типа нокии 3210 если симку вставить, то она в нем работаь не будет, ибо он поддерживает 1G-2G, но не выше. Смотрите спецификацию на модуль.
del
Я вроде по этому поводу отписался. Проблемы оказались в размере входного буфера для приема данных, вот данные каким то образом урезались , увеличил размер - и всё поехало...
Здравствуйте! Подскажите, пожалуйста, как решили проблему отправки СМС из терминала? Как завершить сообщение (ctrl+z)?
как прописать в скетче строку? :
gsm.println("AT+CSCS="GSM"")компилятор чет ругается, не нравится ему два раза кавычки??
А так ?
gsm.println("AT+CSCS=\"GSM\"")как прописать в скетче строку? :
gsm.println("AT+CSCS="GSM"")компилятор чет ругается, не нравится ему два раза кавычки??
о, так похоже ОК, спасибо.
если еще кто подскажет - не могу второй день найти ат команду (мне казалось она есть)
чтобы при входящем звонке и записаным этим номером на симкарту - отображалось что номер есть на симкарте?
или ссылку с прмерами, может есть такая, еще раз спасибо.
Я вроде по этому поводу отписался. Проблемы оказались в размере входного буфера для приема данных, вот данные каким то образом урезались , увеличил размер - и всё поехало...
Здравствуйте! Подскажите, пожалуйста, как решили проблему отправки СМС из терминала? Как завершить сообщение (ctrl+z)?
Я если честно не понял, что это относится к проблеме отправки СМС. У меня буфер на максимуме. И я не совсем понимаю, как отправить "ctrl+z" в терминал.
Всем доброго дня!
Пользую бибилиотеку SIM900.
Пытаюсь получить запрос по балансу на своем модуле. Приходит СМС, но в буфере вместо текста и цифр вот такая строка 003100390033002E003900340440002E (при этом смс с телефона модуль корректно отрабатывает и корректно отсылает смс обратно).
Методом научного тыка выяснил, что это ничто иное, как кодировка символов.
0031 - цифра 1, 0039 - цифра 9, 0033 - цифра 3, 002E - точка и т.д., т.е. в принципе пришло что нужно, только почему-то в закодированном виде (т.е. баланс на момент получения этого смс был что-то порядка 193.95 р.) Теперь вот не пойму, то ли переводить это безобразие каким-то образом в читабельный вид, то ли копать, почему в буфере такая фигня.
Кто-нибудь сталкивался с такой ситуацией?
Пытаюсь получить запрос по балансу на своем модуле. Приходит СМС, но в буфере вместо текста и цифр вот такая строка 003100390033002E003900340440002E (при этом смс с телефона модуль корректно отрабатывает и корректно отсылает смс обратно).
Методом научного тыка выяснил, что это ничто иное, как кодировка символов
Передача SMS может идти в символьном режиме (только латинские символы) или в PDU (все остальные языки).
В твоем ответе как раз используется кириллица, поэтому ответ получен в PDU формате (кодировка Unicode UCS2)
Вот тут почитай теории:
http://hardisoft.ru/soft/samodelkin-soft/otpravka-sms-soobshhenij-v-formate-pdu-teoriya-s-primerami-na-c-chast-1/
Онлайн калькулятор PDU - http://smspdu.benjaminerhart.com/
Декодирует твой ответ "003100390033002E003900340440002E" как "193.94р."
Кто-нибудь сталкивался с такой ситуацией?
Да это именно PDU. Как только в тексте SMS попадется не латинский символ, SMS сразу кодится в PDU.
Отправка SMS с русскими символами тоже должна производится в PDU кодировке.
Выше все ссылки уже приведены. И на декодеры и на доку.
Skvo, спасибо, дружище!!!!
Получается, что если нужно отправлять и получать СМС в кириллице, то нужно для отправки закодировать, а при получении раскодировать. Так?
Всем доброго дня!
Пользую бибилиотеку SIM900.
Пытаюсь получить запрос по балансу на своем модуле. Приходит СМС, но в буфере вместо текста и цифр вот такая строка 003100390033002E003900340440002E (при этом смс с телефона модуль корректно отрабатывает и корректно отсылает смс обратно).
Методом научного тыка выяснил, что это ничто иное, как кодировка символов.
А зачем применять "глубокие научные реории", если есть пдфы на эти модули и там все эти моменты описаны?
Научный тык занял 5 минут. ПДЭФЫ на эти модули на агнлийском и размером листов в 50 мелкого текста. Лопатить пдф это конечно прекрасно и достойно, однако форум для того и существует, чтобы поделиться с ближним проблемой и, если эту проблему уже кто-то решал, или, как минимум, с ней сталкивался, то получить совет или нужное направление. И совет и нужное направление получил. Теперь буду дальше ковыряться.
Может этот код поможет. Спер его тут на форуме.
У меня на меге работает. На 6 пин вешаем кнопку, по нажатию уходит СМС. Максимально 70 символов.
Номер телефона только свой установите в 22 строке.
Думаю код еще можно причесать, но не до этого было. расшифровать тоже думаю будет не проблема, но мне это не надо, поэтому не писал алгоритм, я управлять с помощью DTMF планирую.
// на 6 пин вешаем кнопку одним контактом, другим контактом кнопку вешаем на землю. int btnPin = 6; boolean prevBtn = HIGH; void setup() { Serial.begin(115200); Serial1.begin(115200); delay(500); pinMode(btnPin, INPUT); digitalWrite(btnPin, HIGH); } void loop() { boolean currBtn = digitalRead(btnPin); if (prevBtn != currBtn && currBtn == LOW) { // МАКСИМАЛЬНО 70 СИМВОЛОВ SendPDUSMS("+7xxxxxxxxxx", "абвгдеёжзийклмнопрстуфхцчшщъыьэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвг"); } prevBtn = currBtn; delay(100); } String SendPDUSMS(String phone_nr, String message) { char commandPDU[32]; char dataPDU[320]; byte original_byte, newbyte; String SMSmessage, phone, preffix, newphone_nr, comm1, comm2 ; int pdu_length, counter, numlength; // не забываем при инциализации модема, сказать ему, что будем работать с PDU AT+CMGF=0 Serial1.print("AT+CMGF=0\r"); delay(200); Serial.print("Send message: "); Serial.print(message); Serial.print(" to number: "); Serial.println(phone_nr); numlength = phone_nr.length() - 1; if (numlength % 2 != 0 ) { phone_nr += "F"; } for (int x = 0; x < numlength; x = x + 2) { newphone_nr.concat(phone_nr.charAt(x + 2)); newphone_nr.concat(phone_nr.charAt(x + 1)); } int textlength = 0; for (int j = 0; j < message.length(); j++) { original_byte = message.charAt(j); if (bitRead(7, original_byte) == 0) { textlength++; } else { j++; textlength++; } textlength++; } if (numlength % 2 != 0) { pdu_length = (8 + (numlength + 1) / 2 + textlength); } else { pdu_length = (8 + numlength / 2 + textlength); } comm1 = String("AT+CMGS=") + int(pdu_length - 1); comm1.toCharArray(commandPDU, 32); Serial1.println(commandPDU); Serial.println(commandPDU); delay(1000); //Serial.println(commandPDU); //SerialTO(); int msgtmp = textlength; comm2 = String("0001000B"); comm2 = comm2 + String("91") + String(newphone_nr) + String("0008"); if (msgtmp < 16) { comm2 = comm2 + String("0"); } comm2 = comm2 + String(msgtmp, HEX); for (int j = 0; j < message.length(); j++) { original_byte = message.charAt(j); if (bitRead(7, original_byte) == 0) { preffix = "00"; newbyte = original_byte; } else { preffix = "04"; j++; original_byte = message.charAt(j); if ( original_byte < 144 ) { newbyte = original_byte - 64; } else { newbyte = original_byte - 128; } } comm2 = comm2 + String(preffix); if (newbyte < 16) { comm2 = comm2 + String("0"); } comm2 = comm2 + String(newbyte, HEX); } comm2.toUpperCase(); comm2.toCharArray(dataPDU, 320); Serial1.print(dataPDU); delay(200); Serial1.write((char)26); Serial.println(dataPDU); }Andrey12, спасибо за код.
Перерыл сегодня весь интернет, насколько мог. Но не смог найти адекватный код именно для перевода строки 003100390033002E003900340440002E в символы.
В С++ я, честно говоря, не очень, ткните носом, какой метод / функция может преобразовывать из кода ASCII в символ?
Разобрать строку на коды по четыре символа не пролема, но вот как эти 4 символа (0031) преобразовать в символ 1 (ну и двлее в цикле все остальные), я никак не допетрю..
ну и? теперь поняли, что лучше латиницу передавать и не морочится с кирилицей, которая еще и не на всех телефонах нормально отображается? с латиницей вообще ноль проблем.
Да я как бы особо насчет кириллицы не парился никогда. Читайте внимательно проблему: такая строка приходит при запроса баланса. И мне нужно перевести эту строку в читабельный вид, чтобы извлечь из нее сумму остатка денег, проанализировать и при достижении определенного порога уведомить об этом меня.
звоните оператору, и просите присылать ответ в латинице... и делов то.. или спрашиваете другой юссд код который отвечает в латинице.
скажите что ваш телефон видит в ответ кракозяблы..
Попробуйте в запросе USSD первый символ # . Есть 2 варианта запроса USSD, начиная со * или с # . При первом варианте ответ приходит на русском, во втором - латиница ( если оператор поддерживает такой запрос).
alfik777, я с GSM модуля через СМС запрос отправляю.
Неужели на C++ нет функции или процедуры дял перевода кода символа в символ? Свою что ли писать?
alfik777, я с GSM модуля через СМС запрос отправляю.
ну напишите вы, будет программа. и тут оператор "что-то" у себя поменяет, или нужно будет симкарту иного оператора вставить, и что тогда? опять переписывать софт? имхо софт должен быть универсален. И универсальность дефакто - с латинскими символами.
alfik777, я с GSM модуля через СМС запрос отправляю.
GSM модуль, подключенный к ардуино, отправляет на номер 000100 пустое СМС. (если на этот номер отправить пустое СМС, то придет ответное сообщение от оепартора с указанием баланса сим-карты).
Текста запроса нет. Почитайте внимательно. Мне не нужно отправлять смс в кириллице. Мне нужно преобразовать коды ASCII в символы.
От оператора приходит набор кодов 003100390033002E003900340440002E что в переводе на символы означает 193,94р.
Short Circuit, Вы сами-то понимаете, о чем пишете?
При чем тут оператор, при чем тут сим карта? СМС приходят в двух форматах, либо латиницей либо в кодах ASCII (т.н. SMS-PDU), если есть хоть один не латинский символ в смс. Латиницу модуль и так читает распрекрасно. Универсальность и заключается втом, чтобы программно расшифровать PDU. А Вы ахинею какую-то несете.
я знаю, что смс приходит в таких форматах.
нет, ну если вам так удобнее и интереснее - то я не против, делайте как считаете для себя нужным, нет проблем.
можно уточнить какие вы АТ команды модулю даете для принятия текстового формата ответа в смс, и какой модуль используете: 590й или 800й ?
См. пост #78
AT команды я вообще не использую.
AT команды я вообще не использую.
А как же Вы управляете модулем ,как отправляете СМС?
Я использую библиотеку SIM900.
отправка например происходит простой командой (с синтаксисом могу напутать, ардуино нет под рукой, но суть такова)
SMS.sendSMS ("номер телефона", "текст сообщения");
Неужели на C++ нет функции или процедуры дял перевода кода символа в символ? Свою что ли писать?
Переводов множество, но специально для PDU нету конечно. Там каждый символ кодируется 4мя байтами. Нужно написать свой несложный декодер, например так
String message = "003100390033002E003900340440002E"; void setup() { Serial.begin(9600); Serial.println(message); char key = 0; char* letter = ""; String decode = ""; long int lchar; for (int i = 0; i < message.length(); i= i+4) { key = message.charAt(i+1); letter[0] = message[i + 2]; letter[1] = message[i + 3]; letter[2] = 0; lchar = strtol(letter,NULL,16); Serial.println(letter); // если вотрой символ в 4ке символов 0 значит латиница if (key == '0') { decode = decode + char(lchar); } else { // иначе значит кирилица decode = decode + char((lchar+128)); } } Serial.println(decode); } // the loop routine runs over and over again forever: void loop() { }ПисАл на коленке, но думаю направление понятно. Я в сях тоже не силен, может есть более оптимальный алгоритм. И еще, в принципе в терминал у меня русский не выводится, на LCD тоже, там только латиница и китайские иероглифы. Поэтому с выводом русского могу ошибаться.
Может я, конечно, чего-то не понимаю, но может проще не изобретать велосипед? Почему нельзя использовать нормальный USSD- запрос и получить адекватный ответ типа ".... Vash balans 193,94 r." ?