Автоматика и аппаратура связи Дистанционное и непосредственное управление исполнительными механизмами, сотовая, а также радиосвязь. |
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.RU
Регистрация: 13.03.2010
Сообщений: 2,897
Сказал спасибо: 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.RU
Регистрация: 13.03.2010
Сообщений: 2,897
Сказал спасибо: 498
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
|
Re: SIM900 в режиме PDU
Сообщение от DPANYTA
|
Дык это...
Там есть 08h. Оно вроде как и включает UCS2.
|
Оно только указывает устройству получателя, в какой кодировке получено сообщение. Ваш же модем надо переводить в юникод вышеуказанной командой, иначе юникодное тело сообщения он не примет.
Сообщение от DPANYTA
|
Добавил. Не помогло...
|
ща посмотрю, что у меня там ещё в процедуре отправки...
|
|
|
|
11.02.2020, 02:03
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.03.2010
Сообщений: 2,897
Сказал спасибо: 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.RU
Регистрация: 13.03.2010
Сообщений: 2,897
Сказал спасибо: 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.RU
Регистрация: 13.03.2010
Сообщений: 2,897
Сказал спасибо: 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.RU
Регистрация: 13.03.2010
Сообщений: 2,897
Сказал спасибо: 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, время: 02:56.
|
|