| Автоматика и аппаратура связи Дистанционное и непосредственное управление исполнительными механизмами, сотовая, а также радиосвязь. |
SIM900 в режиме PDU
10.02.2020, 02:10
|
|
|
Прописка
Регистрация: 25.11.2008
Сообщений: 114
Сказал спасибо: 3
Сказали Спасибо 9 раз(а) в 9 сообщении(ях)
|
SIM900 в режиме PDU
Кто-нить работал с этим чудом китайпрома?
Всё делаю вот по этой статье: http://hardisoft.ru/soft/samodelkin-...-na-c-chast-1/
В текстовом режиме (AT+CMGF=1) всё ровно - отправляет.
А вот когда AT+CMGF=0, тут ERROR.
Делаю так:
Включаю питание.
Дожидаюсь, когда лампочка замигает: "я в сети".
Жму кнопку:
1. AT+CMGF=0 Переводим в PDU-режим
отвечает OK
2. AT+CMGS=31
отвечает ›
3. 07 91 9701879999F9 0100 0B 91 9721436587F9 00 08 12
041F04400438043204350442002100210021
(тут циферки из статьи, а у меня номера СМС центра и абонента свои конечно)
4. 26 (т.е. 0x1A)
отвечает ERROR
4й пункт делал и сразу вслед сообщению, и после паузы (до 10сек) - ERROR.
Если 4й пункт не делать (не давать команду на отправку 0x1A), то вааще тишина. Приходит только эхо переданного.
Что не так?
Статья про модемы. Мож SIM900 чем отличается...
|
|
|
|
11.02.2020, 01:28
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 13.03.2010
Сообщений: 2,896
Сказал спасибо: 498
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
|
Re: SIM900 в режиме PDU
Юникодовскую кодировку включить надобно.
AT+CSCS="UCS2"
|
|
|
|
11.02.2020, 01:48
|
|
|
Прописка
Регистрация: 25.11.2008
Сообщений: 114
Сказал спасибо: 3
Сказали Спасибо 9 раз(а) в 9 сообщении(ях)
|
Re: SIM900 в режиме PDU
Сообщение от AR_Favorit
|
Юникодовскую кодировку включить надобно.
AT+CSCS="UCS2"
|
Дык это...
Там есть 08h. Оно вроде как и включает UCS2.
Добавил. Не помогло...
Добавил поле "время действия SMS" (тут подглядел: http://www.edgemodem.ru/forum/viewtopic.php?f=8&t=901 )
Пофиг...
Последний раз редактировалось DPANYTA; 11.02.2020 в 01:53.
|
|
|
|
11.02.2020, 01:56
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 13.03.2010
Сообщений: 2,896
Сказал спасибо: 498
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
|
Re: SIM900 в режиме PDU
Сообщение от DPANYTA
|
Дык это...
Там есть 08h. Оно вроде как и включает UCS2.
|
Оно только указывает устройству получателя, в какой кодировке получено сообщение. Ваш же модем надо переводить в юникод вышеуказанной командой, иначе юникодное тело сообщения он не примет.
Сообщение от DPANYTA
|
|
Добавил. Не помогло...
|
ща посмотрю, что у меня там ещё в процедуре отправки...
|
|
|
|
11.02.2020, 02:03
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 13.03.2010
Сообщений: 2,896
Сказал спасибо: 498
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
|
Re: SIM900 в режиме PDU
|
PHP код:
|
void long_sms_compose(char* phone_number, uint8_t u8_ttl)
{
uint8_t u8_tmp_phone_number_position_index = 0;
uint8_t u8_tmp_phone_number_length = 0;
uint8_t u8_tmp_number_finished = 0;
uint16_t u16_sms_bytes_count = 0; //Счетчик байт в поле сообщения
uint16_t u16_tmp_length;
uint8_t u8_tmp_length_index = 0;
//Начинаем собирать пакет
u16_outcoming_long_sms_position_index = 0;
//Буфер начинается с 00 (номер SMS-центра не указан)
outcoming_sms[u16_outcoming_long_sms_position_index++] = '0';
outcoming_sms[u16_outcoming_long_sms_position_index++] = '0';
//PDU-type (простое или составное сообщение)
if (long_sms_current_wr_position_index › SHORT_SMS_MAX_LENGTH)
{
outcoming_sms[u16_outcoming_long_sms_position_index++] = '5'; //VPF = 0x10, относительный формат времени жизни СМС
outcoming_sms[u16_outcoming_long_sms_position_index++] = '1';
}
else
{
outcoming_sms[u16_outcoming_long_sms_position_index++] = '1'; //VPF = 0x10, относительный формат времени жизни СМС
outcoming_sms[u16_outcoming_long_sms_position_index++] = '1';
}
//TP-MR
add_u8hex_as_text (u8_TP_MR_field++);
//Подсчет длины телефонного номера
while (phone_number[u8_tmp_phone_number_position_index] !=0)
{
if ((phone_number[u8_tmp_phone_number_position_index] != '+')&&(phone_number[u8_tmp_phone_number_position_index] != '"')) u8_tmp_phone_number_length++;
u8_tmp_phone_number_position_index++;
}
add_u8hex_as_text (u8_tmp_phone_number_length);
//Тип номера - международный
outcoming_sms[u16_outcoming_long_sms_position_index++] = '9';
outcoming_sms[u16_outcoming_long_sms_position_index++] = '1';
//Номер помещается в буфер без знака "+"
u8_tmp_phone_number_position_index = 0;
if ((phone_number[u8_tmp_phone_number_position_index] == '+')||(phone_number[u8_tmp_phone_number_position_index] == '"')) u8_tmp_phone_number_position_index++;
//Помещаем номер в буфер с перестановкой и, при необходимости, дополнением "F"
while (u8_tmp_number_finished == 0)
{
if (phone_number[u8_tmp_phone_number_position_index] == '"')
{
u8_tmp_phone_number_position_index++;
}
else
{
if (phone_number[u8_tmp_phone_number_position_index] == 0)
{
u8_tmp_number_finished = 1;
}
else
{
outcoming_sms[u16_outcoming_long_sms_position_index + 1] = phone_number[u8_tmp_phone_number_position_index];
if (phone_number[u8_tmp_phone_number_position_index+1] ==0)
{
outcoming_sms[u16_outcoming_long_sms_position_index] = 'F';
u8_tmp_number_finished = 1;
}
else
{
outcoming_sms[u16_outcoming_long_sms_position_index] = phone_number[u8_tmp_phone_number_position_index+1];
}
u16_outcoming_long_sms_position_index += 2;
u8_tmp_phone_number_position_index += 2;
}
}
}
//Поле TP- PID=00, поле TP- DCS = 08 (кодировка UCS-2)
outcoming_sms[u16_outcoming_long_sms_position_index++] = '0';
outcoming_sms[u16_outcoming_long_sms_position_index++] = '0';
outcoming_sms[u16_outcoming_long_sms_position_index++] = '0';
outcoming_sms[u16_outcoming_long_sms_position_index++] = '8';
//ПОле VP - время жизни СМС
if (u8_ttl == 1)
{
outcoming_sms[u16_outcoming_long_sms_position_index++] = '0';
outcoming_sms[u16_outcoming_long_sms_position_index++] = '0';
}
else if (u8_ttl == 2)
{
outcoming_sms[u16_outcoming_long_sms_position_index++] = 'A';
outcoming_sms[u16_outcoming_long_sms_position_index++] = '7';
}
else
{
outcoming_sms[u16_outcoming_long_sms_position_index++] = 'C';
outcoming_sms[u16_outcoming_long_sms_position_index++] = '5';
}
//Поле TP- UDL - длина пользовательской чвасти сообщения в байтах, в шестнадцатеричном формате
if (long_sms_current_wr_position_index › SHORT_SMS_MAX_LENGTH) //Для фрагмента составного сообщения
{
if (long_sms_length ›= LONG_SMS_MAX_PART_LENGTH)
{
u16_sms_bytes_count = SHORT_SMS_MAX_LENGTH ›› 1;
}
else
{
u16_sms_bytes_count = (long_sms_length ›› 1)+6;
}
}
else //Для короткого сообщения
{
u16_sms_bytes_count = long_sms_length ›› 1;
}
add_u8hex_as_text((uint8_t)u16_sms_bytes_count);
//Теперь помещаем в буфер отправки скомпонованный текст короткого сообщения, либо UDH+текст очередного фрагмента составного сообщения
if (long_sms_current_wr_position_index › SHORT_SMS_MAX_LENGTH) //Для фрагмента составного сообщения
{
//Общая длина поля UDH 05, размер идентификатора 1 байт, длина данных инф. элемента 3 байта
outcoming_sms[u16_outcoming_long_sms_position_index++] = '0';
outcoming_sms[u16_outcoming_long_sms_position_index++] = '5';
outcoming_sms[u16_outcoming_long_sms_position_index++] = '0';
outcoming_sms[u16_outcoming_long_sms_position_index++] = '0';
outcoming_sms[u16_outcoming_long_sms_position_index++] = '0';
outcoming_sms[u16_outcoming_long_sms_position_index++] = '3';
// Идентификатор составного сообщения
add_u8hex_as_text(u8_refnum);
//Количество частей в сообщении
u8_total_parts = long_sms_current_wr_position_index / LONG_SMS_MAX_PART_LENGTH;
if (long_sms_current_wr_position_index % LONG_SMS_MAX_PART_LENGTH) u8_total_parts ++;
add_u8hex_as_text(u8_total_parts);
//Номер текущей части
u8_current_part_number++;
add_u8hex_as_text(u8_current_part_number);
if (long_sms_length ›= LONG_SMS_MAX_PART_LENGTH)
{
for (u16_sms_bytes_count = 0; u16_sms_bytes_count ‹ LONG_SMS_MAX_PART_LENGTH; u16_sms_bytes_count++)
{
outcoming_sms[u16_outcoming_long_sms_position_index++] = long_sms_buffer[long_sms_current_rd_position_index++];
}
long_sms_length -= LONG_SMS_MAX_PART_LENGTH;
}
else
{
for (u16_sms_bytes_count = 0; u16_sms_bytes_count ‹ long_sms_length; u16_sms_bytes_count++)
{
outcoming_sms[u16_outcoming_long_sms_position_index++] = long_sms_buffer[long_sms_current_rd_position_index++];
}
long_sms_length = 0;
}
}
else //Для простого сообщения
{
for (u16_sms_bytes_count = 0; u16_sms_bytes_count ‹ long_sms_length; u16_sms_bytes_count++)
{
outcoming_sms[u16_outcoming_long_sms_position_index++] = long_sms_buffer[u16_sms_bytes_count];
}
long_sms_length = 0;
}
//Подсчитываем общую длину пакета
u16_tmp_length = ((u16_outcoming_long_sms_position_index-2) ›› 1);
if (u16_tmp_length › 99)
{
ch_outcoming_sms_length_[u8_tmp_length_index++] = '0' + (u16_tmp_length / 100);
u16_tmp_length %= 100;
ch_outcoming_sms_length_[u8_tmp_length_index++] = '0' + (u16_tmp_length / 10);
}
else if (u16_tmp_length › 9)
{
ch_outcoming_sms_length_[u8_tmp_length_index++] = '0' + (u16_tmp_length / 10);
}
ch_outcoming_sms_length_[u8_tmp_length_index++] = '0' + u16_tmp_length%10;
ch_outcoming_sms_length_[u8_tmp_length_index] = 0;
outcoming_sms[u16_outcoming_long_sms_position_index++] = 0;
outcoming_sms[u16_outcoming_long_sms_position_index] = 0;
}
|
Последний раз редактировалось AR_Favorit; 11.02.2020 в 02:18.
|
|
|
|
11.02.2020, 02:08
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 13.03.2010
Сообщений: 2,896
Сказал спасибо: 498
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
|
Re: SIM900 в режиме PDU
СМС-центр не указываю
В настройке модема включается AT+CMGF=0 и AT+CSCS="UCS2"
в массиве outcoming_sms[] собирается весь текущий пакет
телефонный номер - в виде null-terminated строки символов phone_number[]
текст сообщения - преобразован заранее в юникод и записан в виде null-terminated строки символов long_sms_buffer[]
длина сообщения для команды AT+CMGS представлена в виде null-terminated строки символов ch_outcoming_sms_length_[]
Это процедура из рабочего устройства...
А вы в терминале модем пытаете или как?
Последний раз редактировалось AR_Favorit; 11.02.2020 в 02:25.
|
|
|
|
11.02.2020, 03:00
|
|
|
Прописка
Регистрация: 25.11.2008
Сообщений: 114
Сказал спасибо: 3
Сказали Спасибо 9 раз(а) в 9 сообщении(ях)
|
Re: SIM900 в режиме PDU
Или как.
Атмегой.
Уточните. Что вы называете модемом. SIM900 или что другое.
Этот код работает именно с SIM900 ?
Последний раз редактировалось DPANYTA; 11.02.2020 в 07:35.
|
|
|
|
11.02.2020, 09:42
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 13.03.2010
Сообщений: 2,896
Сказал спасибо: 498
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
|
Re: SIM900 в режиме PDU
Сообщение от DPANYTA
|
Или как.
Атмегой.
Уточните. Что вы называете модемом. SIM900 или что другое.
Этот код работает именно с SIM900 ?
|
Работает с SIM900, и с SIM800С...
Функция add_u8hex_as_text, вызываемая вышеприведённым кодом:
|
PHP код:
|
void add_u8hex_as_text (uint8_t u8_num)
{
if ((u8_num ›› 4) › 9 ) outcoming_sms[u16_outcoming_long_sms_position_index++] = 'A' + (u8_num ›› 4) - 10; else outcoming_sms[u16_outcoming_long_sms_position_index++] = '0' + (u8_num ›› 4);
if ((u8_num & 0x0F) › 9 ) outcoming_sms[u16_outcoming_long_sms_position_index++] = 'A' + (u8_num & 0x0F) - 10; else outcoming_sms[u16_outcoming_long_sms_position_index++] = '0' + (u8_num & 0x0F);
}
|
Последний раз редактировалось AR_Favorit; 11.02.2020 в 09:50.
|
|
|
|
11.02.2020, 10:43
|
|
|
Прописка
Регистрация: 25.11.2008
Сообщений: 114
Сказал спасибо: 3
Сказали Спасибо 9 раз(а) в 9 сообщении(ях)
|
Re: SIM900 в режиме PDU
А можно код отправки смс полностью ?
|
|
|
|
11.02.2020, 12:26
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 13.03.2010
Сообщений: 2,896
Сказал спасибо: 498
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
|
Re: SIM900 в режиме PDU
Увы. Это надо почти весь проект выложить, а он коммерческий...
но всё остальное по собственно отправке совсем просто
после формирования пакета в USART уходит
|
PHP код:
|
writestr ("AT+CMGS=");
writestr (ch_outcoming_sms_length_);
writestr ("\r");
|
после получения в ответ "›" отправляем в USART всё содержимое outcoming_sms[], и, когда весь пакет ушёл, туда же байт 0x1A
Последний раз редактировалось AR_Favorit; 11.02.2020 в 12:28.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 10:54.
|
|