Модем GSM A6 и USSD команды

Rext
Offline
Зарегистрирован: 03.12.2016

Добрый день!

Дано: модем GSM A6, Arduino UNO, SIM-карта МТС. Модем подключен к уно через SoftwareSerial на 9600. В библиотеке размер буфера увеличен. Модем успешно инициализируется. Все команды, необходимые для работы в скетче, проверялись первоначально через uart-usb + программка Terminal 1.9b. Скетч корректно принимает звонки/SMS, отправляет SMS. Но вот ussd команды из скетча не выполняются (((.

В проге Terminal для отправки ussd делал AT+CUSD=1, ##100##,15$0D (один символ ## интерпритируется прогой как код символа). Все отрабатывается корректно, баланс возвращается.

В скетче 

SoftwareSerial A6Serial (2, 3); // GSM модем
***
A6Serial.print("AT+CUSD=1,#100#,15\r"); //запрос баланса

 Результатом в мониторе является 

+CME ERROR:15790320

Изменение кода на A6Serial.println("AT+CUSD=1,#100#,15"); не влияет на ошибку.

Форум лопатил три дня - похожей проблемы не нашел... Может кто сталкивался или идеи есть? 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015
A6Serial.println("AT+CUSD=1,\"#100#\",15");

Спасёт отца русской демократии.

Rext
Offline
Зарегистрирован: 03.12.2016

Не спасет... Делал и так.

b707
Offline
Зарегистрирован: 26.05.2017

Rext пишет:

Изменение кода на A6Serial.println("AT+CUSD=1,#100#,15"); не влияет на ошибку.

 

Судя по длинному коду ошибки - это не ошибка синтаксиса, а проблемы при отсылке запроса и(или) получении ответа.

Синтаксис

A6Serial.println("AT+CUSD=1,#100#,15"); 

- правильный, у других пользователей работает.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

А если так, что будет?

AT+CSCS="HEX"
AT+CUSD=1,*100#,15

 

b707
Offline
Зарегистрирован: 26.05.2017

DIYMan пишет:

А если так, что будет?

AT+CSCS="HEX"
AT+CUSD=1,*100#,15

 

кстати да, установка формата может быть важной в данном случае.

Rext
Offline
Зарегистрирован: 03.12.2016

Спасибо, вечером попробую. По результату отпишу.

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

b707 пишет:

Rext пишет:

Изменение кода на A6Serial.println("AT+CUSD=1,#100#,15"); не влияет на ошибку.

 

Судя по длинному коду ошибки - это не ошибка синтаксиса, а проблемы при отсылке запроса и(или) получении ответа.

Синтаксис

A6Serial.println("AT+CUSD=1,#100#,15"); 

- правильный, у других пользователей работает.

синтаксис то правильный, и напрмер у меня то работает, но нифига баланс не выдает :(

так что не факт что у ТС заработают

ЗЫ. Кривые и глюченные они все таки эти модули А6, то зависают на какой то команде что еще какой фортель выкинет - зря я его купил, надо было SIM 900 брать :(

Rext
Offline
Зарегистрирован: 03.12.2016

Более внимательное рассмотрение показало, что ошибка возникала из-за двух последовательно идущих команд без задержки. Видно модему от этого плохело. 

А вообще действительно глючный: ussd уходят через раз, по непонятным причинам. Надо попробовать с другой библиотекой, вместо SoftwareSerial. 

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Rext пишет:

Более внимательное рассмотрение показало, что ошибка возникала из-за двух последовательно идущих команд без задержки. Видно модему от этого плохело. 

А вообще действительно глючный: ussd уходят через раз, по непонятным причинам. Надо попробовать с другой библиотекой, вместо SoftwareSerial. 

не поможет - я подцепил модем на аппаратный UART, а для отображения прикрутил LCD1602 - модем лучше работать не стал :(

b707
Offline
Зарегистрирован: 26.05.2017

andycat пишет:

не поможет - я подцепил модем на аппаратный UART, а для отображения прикрутил LCD1602 - модем лучше работать не стал :(

andycat, у меня все вполне устойчиво работает. У модема есть несколько особенностей, которые создают трудностии поначалу - в частности инициализация сериала или то, что модем при долгом простое засыпает... Но это именно особенности, которые можно учесть и обойти, а не глюки.

Зато в плане экономичности и неприхотливости к питанию А6 дает 100 очков вперед SIm800 Если в следующих проектах будет нужен GSM- буду снова брать А6

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

b707, возможно мне не повезло с моделькой (продавцом), или руки у меня кривые.

скиньте плиз ссылку где брали?

и еще вопрос: на USSD команду запроса баланса корректно отвечает?

по поводу засывпает при простое: у меня каждые 2 минуты опрос модема на наличие новых СМС это считается простоем? - и все равно он через часов 14 завис, перестал отвечать......

b707
Offline
Зарегистрирован: 26.05.2017

andycat пишет:

и еще вопрос: на USSD команду запроса баланса корректно отвечает?

по поводу засывпает при простое: у меня каждые 2 минуты опрос модема на наличие новых СМС это считается простоем? - и все равно он через часов 14 завис, перестал отвечать......

Баланс пробовал, отвечает. Но вообще я USSD запросы в своем проекте не использую, баланс карты в модеме проще на смартфоне контролировать.

Про зависание - у меня при отсуствии ответа 3 раза подряд модем хардварно ресетится через мосфет.

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

b707 пишет:

Баланс пробовал, ...........проще на смартфоне контролировать.

у меня тоже отвечает, только пустой строкой

+CUSD: 2, "" ,72

контролировать на смартфоне - через личный кабинет? оно то конечно проще для тех кто имеет ЛК, у меня масса знакомых которые даже тариф свой не знает не то что контролировать какую то левую карту через ЛК :(

ЗЫ. По поводу зависания - я сторонник правильных железок, в деревне температурная сигнализация - аптайм больше 15 дней (как я с празднования НГ уехал и ее включил) - никаких зависаний.

ЗЫЫ. И ссылку если есть на магазин/продавца выложите плиз.

b707
Offline
Зарегистрирован: 26.05.2017

andycat пишет:

[

у меня тоже отвечает, только пустой строкой

+CUSD: 2, "" ,72

нет, у меня нормально отвечал. Семибитную кодировку было лень декодировать, поэтому пробовал в HEX на  латинице. Вообще, ответы на запросы, ИМХО, куда больше зависят от оператора, чем от модема. Я ставил в модем 4 разных симки 3х разных операторов - и у каждого были свои особенности.

 

ССылку поищу. Я на Ибее брал

Добавка - судя по сообщению  +CUSD: 2, "" ,72 - ответ у вас приходит, вы просто его не видите на экране. там в конце идет цифра "72" - это длина ответа в символах, многовато для пустого сообщения. Вы в курсе, что ответы USSD приходят в особой кодировке, не в той. что СМС? ее отдельно декодировать надо

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

b707 пишет:

ению  +CUSD: 2, "" ,72 - ответ у вас приходит, вы просто его не видите на экране. там в конце идет цифра "72" - это длина ответа в символах, многовато для пустого сообщения. Вы в курсе, что ответы USSD приходят в особой кодировке, не в той. что СМС? ее отдельно декодировать надо

думал над этим, пробовал не сразу на экран/монитор/дисплей выводить и в разных кодировках (HEX/UCS2/GSM), а сначала смотреть что там от модема идет - реально пусто между кавычек.

где то на форумах (может и здесь) мелькала фраза что A6 модем не может отдавать длинный ответ на USSD - косяк прошивки :(

ЗЫ. Будет возможность/настроение - попробуйте пожалуйста на своем экземпляре получение баланса.

ЗЫЫ. На другие запросы USSD ответ короткий приходит ОК, проблема именно с запросом баланса.

Logik
Offline
Зарегистрирован: 05.08.2014

Скорей всего дело в софтсириале. Там непройдет и "отдавать длинный ответ " и две команды подряд. Еще электролит на питание добавляете пожырней. Ток потребления у А6 с очень большими короткими импульсами. 

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Logik пишет:

Скорей всего дело в софтсириале. Там непройдет и "отдавать длинный ответ " и две команды подряд. Еще электролит на питание добавляете пожырней. Ток потребления у А6 с очень большими короткими импульсами. 

Выше читайте внимательнее и фото посмотрите - аппаратный UART

b707
Offline
Зарегистрирован: 26.05.2017

andycat пишет:

ЗЫ. Будет возможность/настроение - попробуйте пожалуйста на своем экземпляре получение баланса.

 

Попробовал UUSD запрос

AT+CSCS="HEX"
OK

AT+CUSD=1,#100#,15
OK

+CUSD: 2, "D6F01C0D1287D961F71C14BBCD5C3018485E1
7BB40C2B7BB3ED781602E180C24AF8B5D20E21BFE66BB
D3F432FBE4CE9741E2303BEC9EE775A0510C661B01" ,15


Что в переводе означает

Vash balans 173.00 rub. Bonus: 0.00 rub. Dopolnitel'nye balansy: #106#
Length: 70

Сим-карта Билайн Москва

Версия прошивки V03.03.20161229019H03

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Ага, значит у меня реально проблема с модулем

Спасибо.

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

после команды ATOI

вывода номера версии модем наглухо зависает :(

Kingcom_Ltd
Kingcom_G16 Revision: G16_B5_R05_GOUYUN_A01_D170727
 
надо перепрошивать....
Logik
Offline
Зарегистрирован: 05.08.2014

andycat пишет:

Logik пишет:

Скорей всего дело в софтсириале. Там непройдет и "отдавать длинный ответ " и две команды подряд. Еще электролит на питание добавляете пожырней. Ток потребления у А6 с очень большими короткими импульсами. 

Выше читайте внимательнее и фото посмотрите - аппаратный UART

Сами читайте. У Rext именно софтовый. У Вас вероятно проблема с кривым софтом. Там типичная бага в  архитектуре - не учитывать что модем не только выдает ответы на команды, но и практически в любой момент может выдать сообщение. Ну и  электролит опять же отсутствует.

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

////////////

khav
Offline
Зарегистрирован: 09.02.2018
То же, осталось это чудо
Kingcom_Ltd
Kingcom_G16 Revision: G16_B5_R05_GOUYUN_A01_D170727
То же, после команды ATOI вывода номера версии модем наглухо зависает :(
То же, надо перепрошивать....
Но как? Чем? Где взять прошивку?
До кучи, еще и билайн не хочет регестрировать (в другом модеме симка работает). Может у кого есть идеи?
andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

khav пишет:

То же, осталось это чудо
Kingcom_Ltd
Kingcom_G16 Revision: G16_B5_R05_GOUYUN_A01_D170727
То же, после команды ATOI вывода номера версии модем наглухо зависает :(
То же, надо перепрошивать....
Но как? Чем? Где взять прошивку?
До кучи, еще и билайн не хочет регестрировать (в другом модеме симка работает). Может у кого есть идеи?

поищите по форуму, тут где то год назад кто то выкадывал ссылки на прошивалку.

насколько я помню по UART к другим пинам модема заливается новая версия, но та которая у вас вроде как и есть новая ( может просто я не нашел другой), возможно придется откатываться на более старую.

я плюнул, оставил версию как есть, не выдает длинный ответ на USSD, и зависает на команде ATOI, но стабильно работает с СМС - мне достаточно.

 

Leo51
Offline
Зарегистрирован: 27.09.2018

Здравствуйте!

Имею Goouuu Tech !IOT-GA6.

Управляю им с помощью Terminal v1.9b через Com1 компа и преобразователь логических уровней на Max232.

Основные команды выполняет исправно, звонит и принимает звонки, а вот отослать СМС не получается -

после ввода текста и CtrlZ пишет:+CMS ERROR:500 – Неизвестная ошибка.

Кто может помочь решить проблему?

 

b707
Offline
Зарегистрирован: 26.05.2017

Leo51 пишет:

Здравствуйте!

Имею Goouuu Tech !IOT-GA6.

Управляю им с помощью Terminal v1.9b через Com1 компа и преобразователь логических уровней на Max232.

Основные команды выполняет исправно, звонит и принимает звонки, а вот отослать СМС не получается -

после ввода текста и CtrlZ пишет:+CMS ERROR:500 – Неизвестная ошибка.

Кто может помочь решить проблему?

интересно, как вы символ CtrlZ вводите с терминала? Надеюсь не прямо так, как тут написали "CtrlZ" ?

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Гугл заблокировали?

По факту, этот код ошибки формируется при проблемах на самых разных стадиях отправки сообщения, поэтому может быть вызван разными причинами:

  • Модем не зарегистрирован в сети.
  • На счету недостаточно средств для передачи сообщения.
  • Сеть испытывает перегрузку и не может отправить сообщение в данный момент.
  • Задан неправильный номер центра обслуживания.
  • Задан неправильный номер абонента.
  • Программа некорректно работает с данным модемом.

И это форум про Arduino - подключите модем к МК, прогоните тестовый скетч отправки СМС - будет понятно где ошибка. И кстати не каждый терминал позволяет корректно отправлять CtrlZ  устройству.

Leo51
Offline
Зарегистрирован: 27.09.2018

andycat пишет:

Гугл заблокировали?

По факту, этот код ошибки формируется при проблемах на самых разных стадиях отправки сообщения, поэтому может быть вызван разными причинами:

  • Модем не зарегистрирован в сети.
  • На счету недостаточно средств для передачи сообщения.
  • Сеть испытывает перегрузку и не может отправить сообщение в данный момент.
  • Задан неправильный номер центра обслуживания.
  • Задан неправильный номер абонента.
  • Программа некорректно работает с данным модемом.

И это форум про Arduino - подключите модем к МК, прогоните тестовый скетч отправки СМС - будет понятно где ошибка. И кстати не каждый терминал позволяет корректно отправлять CtrlZ  устройству.

Leo51
Offline
Зарегистрирован: 27.09.2018

Спасибо за ответ!

По пунктам: 

Модем в сети регистрируется - видно по диагностике при звонках.

Средств на карте достаточно.

Перегрузка в сети - пробовал в разные моменты.

На запрос номера центра обслуживания ответ - ошибка, буду проверять.

Номер абонента правильный, проверено неоднократно.

Программа некорректно работает с данным модемом - непонятно, о какой программе речь?

это форум про Arduino - я через Ардуино модуль и гонял, пока не умер последовательный порт!

И по первому вопросу - Гугл лопачу не первый день!

Leo51
Offline
Зарегистрирован: 27.09.2018

Извиняюсь, ошибочка вышла: номер центра обслуживания правильный.

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

хм...так вы выше же писали что через комп отсылали команды....ничего не понял

впрочем не важно, ну вот например вам тестовый для А6 модема, только вс троке отправки исправьте телефон на свой в обратной записи - там подсказка есть - поймете

#define GSM_RX 3 // пин RX на модуле подключаем к указаному пину на Ардуино TX
#define GSM_TX 2 // пин TX на модуле подключаем к указаному пину на Ардуино RX
#include <SoftwareSerial.h>
SoftwareSerial SIM800(GSM_TX, GSM_RX); // установка контактовGSM_TX->RX и GSM_RX->TX для программного порта
#define _a6_power_pin 12
#define _a6_reset_pin 11

void setup() {
  pinMode(_a6_reset_pin, OUTPUT);
  pinMode(_a6_power_pin, OUTPUT);
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, LOW);
  digitalWrite(_a6_reset_pin, LOW);
  digitalWrite(_a6_power_pin, HIGH); // power on
  /*pinMode(10, OUTPUT);
    pinMode(7, OUTPUT);
    digitalWrite(10, HIGH);
    digitalWrite(7, HIGH);
    delay(1000);
    digitalWrite(7, LOW);
    delay(20);
    digitalWrite(7, HIGH);
    delay(3000);*/
  Serial.begin(9600);               // Скорость обмена данными с компьютером
  Serial.println("Start!");
  SIM800.begin(9600);               // Скорость обмена данными с модемом
  delay(500); SIM800.println("AT");             // Автонастройка скорости
  delay(500); SIM800.println("AT");             // Автонастройка скорости
  delay(500); SIM800.println("AT");             // Автонастройка скорости
  delay(500); SIM800.println("AT");             // Автонастройка скорости
  delay(500); SIM800.println("AT");             // Автонастройка скорости
  delay(500); SIM800.println("ATE0"); // echo off
  delay(500); SIM800.println("ATV1");
  delay(500); SIM800.println("AT+CMEE=2");
  delay(500); SIM800.println("AT+CLIP=1");
  delay(500); SIM800.println("ATS0=3");
  delay(500); SIM800.println("AT+CREG?");
  delay(500); SIM800.println("AT+CMGF=0"); // PDU mode SMS
  delay(500); SIM800.println("AT+CMGD=1,4");
  delay(500); SIM800.println("AT+COPS?");
  delay(500); SIM800.println("AT+CSQ");
  delay(500); SIM800.println("AT+CPMS?");
  delay(500); SIM800.println("AT+CNMI?");
  //delay(500); SIM800.println("AT+CPMS=\"SM\",\"SM\",\"SM\"");
  //delay(500); SIM800.println("AT+CNMI=0,1,0,0,0");
  // send sms
  delay(1000);SIM800.println("AT+CMGS=47");
  // sms for +79 20 63 19 94 6 -> 97 02 36 91 49 F6
  delay(500);SIM800.print("0001000B919702369149F6000822042204350441044200200444043E0440043C04300442043000200050004400550021");
  //test text delay(500);SIM800.print("0001000B91 8779103254F6 000822042204350441044200200444043E0440043C04300442043000200050004400550021");
  delay(500);SIM800.write(26);
}
unsigned long current_millis;
unsigned long timer_read_sms = 0;

void loop() {
  current_millis = millis();
  if ((current_millis - timer_read_sms) >= 20000UL) {
    timer_read_sms = current_millis;
    // read sms
    SIM800.println("AT+CMGL=4");
  }
  if (SIM800.available())           // Ожидаем прихода данных (ответа) от модема...
    while (SIM800.available()) {
      byte bb = SIM800.read();
      Serial.write(bb);    // ...и выводим их в Serial
      /*if ((bb < 0x20) || (bb >= 0x7F)) {
        Serial.print("0x"); Serial.println(bb, HEX);
        } else {
        Serial.write(bb);
        }*/
    }
  if (Serial.available())           // Ожидаем команды по Serial...
    while (Serial.available())
      SIM800.write(Serial.read());    // ...и отправляем полученную команду модему
}

 

Leo51
Offline
Зарегистрирован: 27.09.2018

Я,наверное, не очень внятно объяснил: померла моя Ардуинка, поэтому и взялся за комповый порт:(

Попробую показать, что отправляю и получаю

AT+CMGF=1

OK
AT+CSMP=17,167,0,0

OK
AT+CMGS="+79276118003"

> Test message + CtrlZ


+CMS ERROR:500 – Неизвестная ошибка

 

Leo51
Offline
Зарегистрирован: 27.09.2018

CtrlZ отправляю следующим образом:

в Notepad++ ввел символ Alt+026, получился маленький прямоугольничек с надписью SUB, вот его копирую и вставляю:)

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Было у меня что то подобное, не воспринимал часть команд и текст, сбрасывал в дефолтное заводское состояние, если не поможет - что то с настройками.

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

А без csmp команды пробовали?

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Да и вообще рекомендую в PDU формате и слать и читать - чтоб не путаться в кодировках

Leo51
Offline
Зарегистрирован: 27.09.2018

Да, и у меня такое впечатление сложилось, что "что-то с настройками". Вот только с какими и где?

Ладно, спасибо за участие, буду мучить настройки, а начну с проверки "без CSMP"...