gifts2017

Развитие отправки СМС через 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
31
.epf 22,40Kb 31 Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Алексей Мальцев (Prooa) 10.11.15 05:58
А можно код процедуры СобратьПакет_Query_SM, очень нужно
2. Евгений Парфенов (deminded) 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) 25.12.15 14:47
(3) flesh611, все коды ошибок есть в спецификации (Спецификация Протокола SMPP v.3.4 )
Например, https://alphasms.ua/storage/files/SMPP-v3.4.rus.pdf
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа