Использование объекта "HTTPСоединение" для отправки и получения SMS сообщений через модем Huawei с прошивкой HiLink (Возможности на 8.3.11.3034)

10.11.18

Интеграция - SMS рассылки

В данной статье я бы хотел поделиться опытом работы с GSM модемом. Точнее, опытом отправки SMS сообщений, используя обращения к модему Huawei с прошивкой HiLink, через встроенные механизмы платформы 1С:Предприятие 8.3.

Файлы

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование Скачано Купить файл
(только для физ. лиц)
Пример использования (проверялась на 8.3.11.3034)
.epf 7,62Kb
18 1 850 руб. Купить

Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний

Оформите подписку на компанию для решения рабочих задач

Оформить подписку и скачать решение со скидкой

Я понимаю, что для массовой рассылки СМС лучше использовать какой нибудь сервис с готовым API. Однако, в моем случае в офисе для обеспечения резервного интернет-канала используется usb LTE-модем, подключенный напрямую  к маршрутизатору Mikrotik. Почему бы и не использовать оплаченный пакет смс для рассылки сообщений сотрудникам. 

После небольших поисков в сети выяснилось, что прошивка LTE-модема HiLink имеет встроенный API и, для отправки/чтения сообщений, достаточно применять  HTTP-запрос с передачей xml строки методом POST.

Для обращения к модему используем HTTPСоединение:

Соединение = Новый HTTPСоединение(АдресIP, 80);

АдресIP по умолчанию 192.168.8.1

Кроме этого, для каждого действия необходимо получать токен . Это действие проще вывести в отдельную функцию:

Функция ПолучитьТокенИСессию(Соединение)
	Запрос = Новый HTTPЗапрос("/api/webserver/SesTokInfo");
 
    Результат = Соединение.Получить(Запрос);
	Если Результат.КодСостояния<>200 Тогда
		Возврат Неопределено;
	КонецЕсли;
	
	ЧтениеXML=Новый ЧтениеXML;
	ЧтениеXML.УстановитьСтроку(Результат.ПолучитьТелоКакСтроку());
	РезXDTO=ФабрикаXDTO.ПрочитатьXML(ЧтениеXML);
	Токен=РезXDTO.TokInfo;
	СессияID=РезXDTO.SesInfo;
	
	
	Заголовки=Новый Соответствие;
	Заголовки.Вставить("Cookie" , СессияID);
	Запрос = Новый HTTPЗапрос("/html/smsinbox.html",Заголовки);
 
    Результат = Соединение.Получить(Запрос);
	Если Результат.КодСостояния<>200 Тогда
		Возврат Неопределено;
	КонецЕсли;
	
	ЧтениеHTML=Новый ЧтениеHTML;
	ЧтениеHTML.УстановитьСтроку(Результат.ПолучитьТелоКакСтроку());
	ПостроительDOM = Новый ПостроительDOM;
    ДокументHTML = ПостроительDOM.Прочитать(ЧтениеHTML);
    
	Токен=ДокументHTML.ПолучитьЭлементыПоИмени("*","meta")[1].Содержание;

	Возврат Новый Структура("СессияID,Токен",СессияID,Токен);
	
КонецФункции

Хочу обратить внимание на предпоследнюю строку. Почему-то для вызова какого-нибудь метода API признается токен, который указан в HTML заголовке формы smsinbox.

Отправка сообщения: 

//функция возвращает Истина при успешной отправки, ЛОЖЬ при возникновении ошибок
Функция ОтправитьSMSHuaweiHiLink(АдресIP,Телефон,Сообщение)
	
	/// Формируем запрос
	ЗаписьXML=Новый ЗаписьXML;
	ЗаписьXML.УстановитьСтроку("UTF-8");
	ЗаписьXML.ЗаписатьОбъявлениеXML();
	ЗаписьXML.ЗаписатьНачалоЭлемента("request");
	
		ЗаписьXML.ЗаписатьНачалоЭлемента("Index");	
			ЗаписьXML.ЗаписатьТекст("-1");
		ЗаписьXML.ЗаписатьКонецЭлемента();
		
		ЗаписьXML.ЗаписатьНачалоЭлемента("Phones");	
			ЗаписьXML.ЗаписатьНачалоЭлемента("Phone");	
				ЗаписьXML.ЗаписатьТекст(Телефон);
			ЗаписьXML.ЗаписатьКонецЭлемента();
		ЗаписьXML.ЗаписатьКонецЭлемента();
			
		ЗаписьXML.ЗаписатьНачалоЭлемента("Sca");	
		ЗаписьXML.ЗаписатьКонецЭлемента();
		
		ЗаписьXML.ЗаписатьНачалоЭлемента("Content");	
			ЗаписьXML.ЗаписатьТекст(Сообщение);
		ЗаписьXML.ЗаписатьКонецЭлемента();
		
		ЗаписьXML.ЗаписатьНачалоЭлемента("Length");	
			ЗаписьXML.ЗаписатьТекст(Формат(СтрДлина(Сообщение),"ЧРГ=0"));
		ЗаписьXML.ЗаписатьКонецЭлемента();

		ЗаписьXML.ЗаписатьНачалоЭлемента("Reserved");	
			ЗаписьXML.ЗаписатьТекст("1");
		ЗаписьXML.ЗаписатьКонецЭлемента();
		
		ЗаписьXML.ЗаписатьНачалоЭлемента("Date");	
			ЗаписьXML.ЗаписатьТекст(Формат(ТекущаяДата(),"ДФ='yyyy-MM-dd HH:mm:ss'"));
		ЗаписьXML.ЗаписатьКонецЭлемента();
		
	ЗаписьXML.ЗаписатьКонецЭлемента();	
	СтрокаЗапроса=ЗаписьXML.Закрыть();
	
	
	Соединение = Новый HTTPСоединение(
                                      АдресIP, // сервер (хост)
                                      80);
	

	
   ТокенИСессия=ПолучитьТокенИСессию(Соединение);
   Если ТокенИСессия=Неопределено Тогда
		Возврат Ложь;
	КонецЕсли;

	
	//Создаём запрос на отправку
	Заголовки=Новый Соответствие;
	Заголовки.Вставить("Origin" , "http://"+АдресIP);
	Заголовки.Вставить("Referer" , "http://"+АдресIP+"/html/smsinbox.html");
	Заголовки.Вставить("Content-Type" , "text/xml");
    Заголовки.Вставить("X-Requested-With" , "XMLHttpRequest");
	Заголовки.Вставить("__RequestVerificationToken" , ТокенИСессия.Токен);
	Заголовки.Вставить("Cookie" , ТокенИСессия.СессияID);
			
	Запрос = Новый HTTPЗапрос("/api/sms/send-sms",Заголовки);
	Запрос.УстановитьТелоИзСтроки(СтрокаЗапроса);
 
    Результат = Соединение.ОтправитьДляОбработки(Запрос);
	Если Результат.КодСостояния<>200 Тогда
		Возврат Ложь;
	КонецЕсли; 
	
	Возврат Найти(Результат.ПолучитьТелоКакСтроку(),"<response>OK</response>")>0;	

Чтение полученных сообщений

//возвращает структуру 
//count - количество сообщений
//data массив сообщений
Функция ПрочитатьSMSHuaweiHiLink(АдресIP, boxType = 1, page = 1, count = 20, unreadPreferred = false)
	
	/// Формируем запрос
	ЗаписьXML=Новый ЗаписьXML;
	ЗаписьXML.УстановитьСтроку("UTF-8");
	ЗаписьXML.ЗаписатьОбъявлениеXML();
	ЗаписьXML.ЗаписатьНачалоЭлемента("request");
	
		ЗаписьXML.ЗаписатьНачалоЭлемента("PageIndex");	
			ЗаписьXML.ЗаписатьТекст(строка(page));
		ЗаписьXML.ЗаписатьКонецЭлемента();
		
		ЗаписьXML.ЗаписатьНачалоЭлемента("ReadCount");	
			ЗаписьXML.ЗаписатьТекст(строка(count));
		ЗаписьXML.ЗаписатьКонецЭлемента();
		
		ЗаписьXML.ЗаписатьНачалоЭлемента("BoxType");	
			ЗаписьXML.ЗаписатьТекст(строка(boxType));
		ЗаписьXML.ЗаписатьКонецЭлемента();
		
		ЗаписьXML.ЗаписатьНачалоЭлемента("SortType");	
			ЗаписьXML.ЗаписатьТекст("0");
		ЗаписьXML.ЗаписатьКонецЭлемента();

		ЗаписьXML.ЗаписатьНачалоЭлемента("Ascending");	
			ЗаписьXML.ЗаписатьТекст("0");
		ЗаписьXML.ЗаписатьКонецЭлемента();
		
		ЗаписьXML.ЗаписатьНачалоЭлемента("UnreadPreferred");	
			ЗаписьXML.ЗаписатьТекст(?(unreadPreferred,"1","0"));
		ЗаписьXML.ЗаписатьКонецЭлемента();
		
	ЗаписьXML.ЗаписатьКонецЭлемента();	
	СтрокаЗапроса=ЗаписьXML.Закрыть();
	
	
	Соединение = Новый HTTPСоединение(
                                     АдресIP, // сервер (хост)
                                     80);
	

	ТокенИСессия=ПолучитьТокенИСессию(Соединение);
	Если ТокенИСессия=Неопределено Тогда
		Возврат Новый Структура("Count",-1);
	КонецЕсли; 
	
	
	//Создаём запрос на отправку
	Заголовки=Новый Соответствие;
	Заголовки.Вставить("Origin" , "http://"+АдресIP);
	Заголовки.Вставить("Referer" , "http://"+АдресIP+"/html/smsinbox.html");
	Заголовки.Вставить("Content-Type" , "text/xml");
	Заголовки.Вставить("X-Requested-With" , "XMLHttpRequest");
	Заголовки.Вставить("__RequestVerificationToken" , ТокенИСессия.Токен);
	Заголовки.Вставить("Cookie" , ТокенИСессия.СессияID);

			
	Запрос = Новый HTTPЗапрос("/api/sms/sms-list",Заголовки);
	Запрос.УстановитьТелоИзСтроки(СтрокаЗапроса);
 
    Результат = Соединение.ОтправитьДляОбработки(Запрос);
	Если Результат.КодСостояния<>200 Тогда
		Возврат Новый Структура("Count",-1);
	КонецЕсли; 
	
	ЧтениеXML=Новый ЧтениеXML;
	ЧтениеXML.УстановитьСтроку(Результат.ПолучитьТелоКакСтроку());
	РезXDTO=ФабрикаXDTO.ПрочитатьXML(ЧтениеXML);
	Рез=Новый Структура("Count,Data",Число(РезXDTO.Count),Новый Массив);

	Если РезXDTO.Count<>"0" Тогда
		Мас=РезXDTO.Messages.Message;
		Если ТипЗнч(РезXDTO.Messages.Message)=Тип("ОбъектXDTO") Тогда
			Мас=Новый Массив;
			Мас.Добавить(РезXDTO.Messages.Message);
		КонецЕсли;
		
		
		
		Для каждого Стр из Мас Цикл
			Рез.Data.Добавить(Новый Структура("Content,Date,Index,Phone",
			Стр.Content,
			Дата(СтрЗаменить(СтрЗаменить(СтрЗаменить(Стр.Date,"-","")," ",""),":","")),
			Стр.Index,
			Стр.Phone
			)
			)
		КонецЦикла;
	КонецЕсли;
		
	

	Возврат Рез;

КонецФункции

Удаление сообщений

индекс сообщения берем из предыдущей процедуры

Функция УдалитьSMSHuaweiHiLink(АдресIP,Индес)
	
	
	
	/// Формируем запрос
	ЗаписьXML=Новый ЗаписьXML;
	ЗаписьXML.УстановитьСтроку("UTF-8");
	ЗаписьXML.ЗаписатьОбъявлениеXML();
	ЗаписьXML.ЗаписатьНачалоЭлемента("request");
	
		ЗаписьXML.ЗаписатьНачалоЭлемента("Index");	
			ЗаписьXML.ЗаписатьТекст(строка(Индес));
		ЗаписьXML.ЗаписатьКонецЭлемента();
				
	ЗаписьXML.ЗаписатьКонецЭлемента();	
	СтрокаЗапроса=ЗаписьXML.Закрыть();
	
	
	Соединение = Новый HTTPСоединение(
        АдресIP, // сервер (хост)
        80 );
	

	
    

	ТокенИСессия=ПолучитьТокенИСессию(Соединение);
	Если ТокенИСессия=Неопределено Тогда
		Возврат Ложь;
	КонецЕсли;
		
	
	
	//Создаём запрос на отправку
	Заголовки=Новый Соответствие;
	Заголовки.Вставить("Origin" , "http://"+АдресIP);
	Заголовки.Вставить("Referer" , "http://"+АдресIP+"/html/smsinbox.html");
	Заголовки.Вставить("Content-Type" , "text/xml");
	Заголовки.Вставить("X-Requested-With" , "XMLHttpRequest");
	Заголовки.Вставить("__RequestVerificationToken" , ТокенИСессия.Токен);
	Заголовки.Вставить("Cookie" , ТокенИСессия.СессияID);

			
	Запрос = Новый HTTPЗапрос("/api/sms/delete-sms",Заголовки);
	Запрос.УстановитьТелоИзСтроки(СтрокаЗапроса);
 
    Результат = Соединение.ОтправитьДляОбработки(Запрос);
	Если Результат.КодСостояния<>200 Тогда
		Возврат Ложь;
	КонецЕсли; 
	
	Возврат Истина;
	
	
КонецФункции

Собственно все. 

P.S. При разработке использовалась информация с ресурсов:

https://stackoverrun.com/ru/q/10478644

https://github.com/if0xx/Huawei-Hilink-API/blob/master/src/if0xx/HuaweiHilinkApi/Router.php

Вступайте в нашу телеграмм-группу Инфостарт

См. также

Управление взаимоотношениями с клиентами (CRM) Мессенджеры и боты SMS рассылки Email рассылки Пользователь 1С v8.3 1C:Бухгалтерия 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Управленческий учет Платные (руб)

Расширение 1С с полным набором инструментов для качественных транзакционных, триггерных и маркетинговых рассылок Email, SMS, WhatsApp, Telegram. Даже простые уведомления об оплате счетов способны существенно упростить сбор дебиторской задолженности. Применение всех возможностей прямого маркетинга выводит коммуникацию с клиентами, уровень сервиса и лояльность на новый уровень.

4800 руб.

07.04.2014    89173    61    199    

146

SALE! 50%

Взаиморасчеты SMS рассылки Email рассылки Создание на основании Бухгалтер 1С v8.3 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Платные (руб)

Расширение Директ Маркетинг для 1С:Бухгалтерия с триггерами и роботами для автоматического создания документов, полным набором инструментов для качественных транзакционных, триггерных и маркетинговых рассылок Email, SMS, WhatsApp, Telegram.

4800 2400 руб.

15.04.2025    1257    7    7    

9

SMS рассылки Email рассылки Мессенджеры и боты 1С v8.3 1С:Управление торговлей 11 Россия Платные (руб)

Решение, позволяющее автоматически отправлять отчеты по заданным показателям из 1С прямо в ваш Telegram.<br/> Получайте отчеты на смартфоне или компьютере в привычном мессенджере;<br/> Вы сами определяете, какие данные и с какой периодичностью должны поступать;<br/> Доработка легко интегрируется с вашей системой 1С, не требуя сложных настроек;<br/> Экономия времени - все необходимое на расстоянии одного клика.<br/>

3600 руб.

01.08.2025    403    0    0    

0

SMS рассылки Пользователь 1С v8.3 Оперативный учет 1С:Управление торговлей 11 Управленческий учет Абонемент ($m)

Помощник формирования документа "Рассылка клиентам". Позволяет заполнить список клиентов на определённый день рождения. При заполнении можно учитывать наличие продаж на определённую сумму за период. Текст сообщения оформляется в самой обработке. Для поздравления своих клиентов с днем рождения.

4 стартмани

11.07.2025    350    1    plkt2    3    

0

SMS рассылки Пользователь 1С v8.3 1С:Управление торговлей 10 Беларусь Россия Абонемент ($m)

Внешняя обработка, с открытым программным кодом, для создания автоматизации рассылок.

2 стартмани

29.11.2024    708    1    IvanovAV    0    

0

SMS рассылки Программист Бухгалтер Пользователь 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Бесплатно (free)

Бесплатное расширение, предназначенное для отправки SMS-рассылок из 1С по событиям проведения платежных документов, по кнопке из "Заказа клиента", а так же рассылки сообщений о задолженности контактным лицам партнеров (контрагентов) с использованием сервиса рассылки смс - SMS.RU. Шаблоны сообщений хранятся в справочнике. Для работы необходимо подключение расширения с отключенным безопасным режимом.

03.09.2024    1565    42    zhuravlev_as    2    

4

SMS рассылки 1С v8.3 1С:Розница 3.0 Россия Абонемент ($m)

Внешняя обработка на управляемых формах для отправки SMS-сообщений через сервис Bytehand

1 стартмани

26.08.2024    773    0    b2bro    0    

3
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Barbos 12.11.18 09:16 Сейчас в теме
интерсно, возьму на заметку
2. user1201748 29.03.21 19:50 Сейчас в теме
3. heroinepta 2 08.04.22 09:25 Сейчас в теме
Огромное спасибо! На 1С 8.2 УТ10.3 работает без проблем!
4. heroinepta 2 12.04.22 10:53 Сейчас в теме
(3) Разбираюсь с получением и удалением ... )
5. Hawk_sib 30 05.09.22 13:16 Сейчас в теме
Здравствуйте, при отправке запроса "/html/smsinbox.html" всё время приходи код состояния 307 с заголовком LOCATION "/html/index.html", при отправке запроса на указанный ресурс ответ приходит со статусом 200, но не получается выполнить запрос "/api/sms/sms-list", ответ приходит вот такой: <?xml version="1.0" encoding="UTF-8"?>
<error>
100003

<message/>
</error>

ссылка https://stackoverrun.com/ru/q/10478644 у меня почему-то не открывается, а в поиске не смог найти ответ почему не работает получение токена у меня правильно и само api, может быть подскажите что нужно поправить?
6. Hawk_sib 30 06.09.22 09:08 Сейчас в теме
(5) продолжаю изучать вопрос, никак не могу получить правильный токен. возникла такая мысль: если меня перенаправляет на начальную страницу (html/index.html), может быть пароль нужно указывать при создании http соединения. Но как его указать, если он отличается от стандартного (менять мне его нельзя)?
указывал

HTTPСоединение("192.168.8.1", 80, , Пароль) - ни имя пользователя, ни пароль не передаются при получении объекта
HTTPСоединение("192.168.8.1", 80, Пароль, Пароль),
HTTPСоединение("192.168.8.1", 80, "admin", Пароль)

результат не поменялся
7. user2028945 01.05.25 16:11 Сейчас в теме
Добрый день. Возможна доработка этого решения под наши нужды?
Оставьте свое сообщение