Развитие отправки СМС через SMPP

Опубликовал Евгений Парфенов (deminded) в раздел Обмен - SMS рассылки

Обработка поможет разобраться в настройке отправки СМС через протокол SMPP.
В основе взята обработка этой публикации: http://infostart.ru/public/380146/

Обработка адаптировалась к собственной конфигурации и не привязана к объектам конкретной конфигурации (хотя оставлен код для примера).

1) Сделан вывод всех входящих и исходящих пакетов

2) Возможность вручную отправить СМС или несколько СМС и увидеть статус доставки

3) Макет соответствия кодов для кодификации русского текста заменен на расчет

 

Порядок использования для автоматической отправки СМС выполнен следующим образом:

1) СМС-ки на отправку хранятся в отдельном документе.

2) В регламентное задание добавлено задание, которое раз в 3 минуты смотрит дату последнего пакета ящика коротких сообщений. Если эта дата старше 5 минут, процедура принудительно запускает приложение 1С с параметром запуска SMS_SMPP (это происходит на сервере).

Если ВыбЯщик.ПоследнийПакет < ТекущаяДата() - 300 Тогда
	СтруктураПараметровБазы = Новый Структура("Srvr, Ref");
	СтрокаСоединения = СтрокаСоединенияИнформационнойБазы();
	ПараметрыСоединения = РаботаСоСтроками.СтрРазбитьПоРазделителю2(СтрокаСоединения, ";");
	Для Каждого ТекПараметр Из ПараметрыСоединения Цикл
		Если НЕ ЗначениеЗаполнено(ТекПараметр.Значение) Тогда
			Продолжить;
		КонецЕсли;
		ПозицияРавно = Найти(ТекПараметр.Значение, "=");
		СтруктураПараметровБазы.Вставить(Лев(ТекПараметр.Значение, ПозицияРавно-1), СтрЗаменить(Сред(ТекПараметр.Значение, ПозицияРавно+1), """", ""));
	КонецЦикла;
	СтрокаСоединения = """"+СтруктураПараметровБазы.Srvr+"\"+СтруктураПараметровБазы.Ref+"""";
	СтрокаЗапуска = КаталогПрограммы()+"1cv8s.exe ENTERPRISE /S" + СтрокаСоединения + " /N"""+Константы.АдминистраторЛогин.Получить()+""" /P"""+Константы.АдминистраторПароль.Получить()+""" /CSMS_SMPP";
	СтрокаЗапуска = СтрЗаменить(СтрокаЗапуска, "\Program Files\", "\Program Files (x86)\");
	//ВызватьИсключение СтрокаЗапуска;
	ЗапуститьПриложение(СтрокаЗапуска);
КонецЕсли;

3) В модуль обычного приложения в обработчик ПриНачалеРаботыСистемы добавлена обработка специфического параметра запуска. Если получен параметр запуска SMS_SMPP, то открывается указанная обработка, заполняется ящик коротких сообщений и запускается отправка смс в автоматическом режиме. Обмен пакетами обновляет реквизит "дата последнего пакета" для ящика коротких сообщений.

Пример: 

НовОбр.Значение = Обработки.ОтправкаКороткихСообщенийSMPP.Создать();
НовОбр.Значение.Ящик = ВыбЯщик.Ссылка;
НовОбр.Значение.ПодключитьSMPPP();
 

upd: Обновлена обработка: добавлена функция разрезания полученных "склеенных" пакетов

Скачать файлы

Наименование Файл Версия Размер
Обработка
.epf 22,40Kb
09.12.15
35
.epf 22,40Kb 35 Скачать

См. также

Добавить вознаграждение
Комментарии
1. Алексей Мальцев (Prooa) 57 10.11.15 05:58 Сейчас в теме
А можно код процедуры СобратьПакет_Query_SM, очень нужно
2. Евгений Парфенов (deminded) 3 10.11.15 12:16 Сейчас в теме
(1) Prooa,

Функция СобратьПакет_Query_SM(НомерПакета, ИдентификаторСМС)
	Сообщить("Начато: СобратьПакет_Query_SM");
	
	ОтправительСМС = Ящик.ОтправительПоУмолчанию;
	//ОтправительСМС = "";
	
	ДлинаИдентификатора 	= СтрДлина(ИдентификаторСМС);
	Сообщить("-"+ИдентификаторСМС+"-");
	ДлинаИмениОтправителя 	= СтрДлина(СокрЛП(ОтправительСМС));
	ДлинаПакета 			= 20 + ДлинаИдентификатора + ДлинаИмениОтправителя;	
	
	МатрицаДанных 			= Новый COMSafeArray("VT_UI1",ДлинаПакета);
	
	//Заголовок
	МатрицаДанных.SetValue(0,	0);
	МатрицаДанных.SetValue(1,	0);
	МатрицаДанных.SetValue(2,	0);
	МатрицаДанных.SetValue(3,	ДлинаПакета);  //общая длина пакета command_length
	
	МатрицаДанных.SetValue(4,	0);
	МатрицаДанных.SetValue(5,	0);
	МатрицаДанных.SetValue(6,	0);
	МатрицаДанных.SetValue(7,	3);  //command_id 3=query_sm
	
	МатрицаДанных.SetValue(8,	0);
	МатрицаДанных.SetValue(9,	0);
	МатрицаДанных.SetValue(10,	0);
	МатрицаДанных.SetValue(11,	0);  //command_status
	
	МатрицаДанных.SetValue(12,	0);
	МатрицаДанных.SetValue(13,	0);
	МатрицаДанных.SetValue(14,	0);
	МатрицаДанных.SetValue(15,	НомерПакета); //номер пакета
	//мНомерПакета = мНомерПакета + 1;
	
	//message_id	
	Индекс = 16;
	Для Сч = 1 По ДлинаИдентификатора Цикл
		МатрицаДанных.SetValue(Индекс,	КодСимвола(ИдентификаторСМС, Сч));
		Индекс = Индекс + 1;
	КонецЦикла;
	МатрицаДанных.SetValue(Индекс,	0); Индекс = Индекс + 1; 
	//message_id
	
	МатрицаДанных.SetValue(Индекс,	0); Индекс = Индекс + 1;  //source_addr_ton (5 - буквенно-алфавитный)
	МатрицаДанных.SetValue(Индекс,	0); Индекс = Индекс + 1; //source_addr_npi 
	
	//source_addr
	Для НомерСимвола = 1 По ДлинаИмениОтправителя Цикл
		МатрицаДанных.SetValue(Индекс, КодСимвола(ОтправительСМС, НомерСимвола));
		Индекс = Индекс+1;
	КонецЦикла;
	МатрицаДанных.SetValue(Индекс,	0); Индекс = Индекс+1;
	//source_addr
	
	Сообщить( "Окончено: СобратьПакет_Query_SM");
	Возврат МатрицаДанных;
КонецФункции // СобратьПакет_Query_SM()

Процедура ОбработатьПакет_Query_sm_resp(ВходящийПакет)
	//Сообщить("Начато: ОбработатьПакет_Query_sm_resp");
	
	РазмерПакета = ВходящийПакет.GetValue(3);
	КодСтатуса = ВходящийПакет.GetValue(РазмерПакета-2);	
	Индекс = 16;
	
	message_id = "";
	Пока Индекс < РазмерПакета Цикл
		ТекЗначение = ВходящийПакет.GetValue(Индекс);
		Если ТекЗначение = 0 Тогда
			Индекс = Индекс + 1;
			Прервать;
		КонецЕсли;
		message_id = message_id + Символ(ВходящийПакет.GetValue(Индекс));
		Индекс = Индекс + 1;
	КонецЦикла;
	final_date = "";
	Пока Индекс < РазмерПакета Цикл
		ТекЗначение = ВходящийПакет.GetValue(Индекс);
		Если ТекЗначение = 0 Тогда
			Индекс = Индекс + 1;
			Прервать;
		КонецЕсли;
		final_date = final_date + Символ(ВходящийПакет.GetValue(Индекс));
		Индекс = Индекс + 1;
	КонецЦикла;
	
	message_state = ВходящийПакет.GetValue(Индекс); Индекс = Индекс + 1;
	error_code = ВходящийПакет.GetValue(Индекс);
КонецПроцедуры
...Показать Скрыть
3. Дмитрий Голованов (flesh611) 25.12.15 11:19 Сейчас в теме
Очень нужная вещь. А где можно узнать какие коды ошибок каким ошибкам соответствуют при обработке пакета submit_sm_resp? Возникают 2 ошибки с кодом 10 и 100, не пойму в чем дело
4. Евгений Парфенов (deminded) 3 25.12.15 14:47 Сейчас в теме
(3) flesh611, все коды ошибок есть в спецификации (Спецификация Протокола SMPP v.3.4 )
Например, https://alphasms.ua/storage/files/SMPP-v3.4.rus.pdf
5. Stanislav Korablin (Tanis) 07.01.17 16:58 Сейчас в теме
Доброго времени суток!

В публикации не указано, или не увидел. Чей логин и пароль используются? эти смс уходят через какие шлюзы или какие компании по доставке смсок?

Спасибо!
6. Евгений Парфенов (deminded) 3 09.01.17 09:05 Сейчас в теме
(5) Добрый день. Мы использовали обработку для общения со шлюза tele2. Никакие промежуточные компании доставки смс-ок не используются, это их собственный, "родной" smpp-интерфейс http://bsms.tele2.ru/
Логин, пароль и адрес были выданы нам провайдером.