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

10.11.18

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

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

Скачать файл

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

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

Я понимаю, что для массовой рассылки СМС лучше использовать какой нибудь сервис с готовым 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

См. также

SALE! 50%

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

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

600 300 руб.

07.04.2014    85145    47    193    

133

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

Решение реализовано в виде расширения. Заменяет отправку смс на отправку в WhatsApp через Green-api. Отправка чека картинкой.

7800 руб.

15.05.2024    967    2    4    

4

SMS рассылки Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Расширение для конфигураций 1С, позволяющее осуществлять подключение к сервису Bytehand и отправку СМС.

1 стартмани

27.09.2023    641    1    user1984097    0    

6

SMS рассылки Абонемент ($m)

Расширение предназначено для оправки СМС по списку телефонов. Является универсальным и подойдёт для любой конфигурации.

2 стартмани

14.09.2023    1721    4    Viki_push    3    

53

Статистика базы данных Внешние источники данных WEB-интеграция SMS рассылки Мобильная разработка Мониторинг Конфигурации 1cv8 Конфигурации 1cv7 Платные (руб)

Интеграция 1С и WhatsApp или Viber или Telegram - это прошлый век. Зачем это всё, когда можно получать сообщение прямо в сам телефон минуя мессенджер? Да ещё и уведомление с сигналом?! А может ли подобный интегратор перекинуть отчёт? Массив данных? - Представляем MIE! С MIE контроль задач станет простым и избавит вас от постоянных мыслей о работе. Где бы вы ни находились, благодаря связи с 1С, приложение вовремя донесет до вас нужную информацию путем уведомлений. Больше вы не пропустите важное событие, пользователи не застанут врасплох названивая и спрашивая "а что случилось, почему не работает система?" - Вы будете в курсе событий! Оповещение из 1С приходит на мобильное устройство в течении 5и минут. Вы сами решаете какие события из 1С должны прийти на телефон. 1й месяц работы программы - бесплатный.

1200 руб.

11.04.2023    3977    0    0    

3

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

Расширение конфигурации Розница 2.3 для включения автоматического формирования документа "Информационная рассылка" (SMS, E-Mail) при начислении бонусов регламентным заданием по правилу расчета бонусных баллов.

1 стартмани

05.12.2022    2440    1    Saipl    0    

0

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

Обработка формирует информационную рассылку клиентам (физическим лицам) на основании продаж по бонусам в течение дня.

2 стартмани

25.10.2022    2680    0    Andreyka2795    0    

2

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

Внешняя обработка формирует документ "Рассылка клиентам", заполняя списком партнеров и текстом смс, при назначении расписания на обработку можно получать необходимое количество документов, в зависимости от того, как часто происходит отправка.

1 стартмани

22.12.2021    3956    6    bob_    0    

2
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Barbos 12.11.18 09:16 Сейчас в теме
интерсно, возьму на заметку
2. user1201748 29.03.21 19:50 Сейчас в теме
3. heroinepta 1 08.04.22 09:25 Сейчас в теме
Огромное спасибо! На 1С 8.2 УТ10.3 работает без проблем!
4. heroinepta 1 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", Пароль)

результат не поменялся
Оставьте свое сообщение