Внешняя компонента для отсылки СМС через телефон, подключенный к компьютеру




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2024-01-05 12:44:55

global $wpdb2;
global $failure;
global $file_hist;

/////  echo '<H2><b>Старт загрузки</b></H2><br>';

$failure=FALSE;
//подключаемся к базе
$wpdb2 = include_once 'connection.php'; ; // подключаемся к MySQL
// если не удалось подключиться, и нужно оборвать PHP с сообщением об этой ошибке
if (!empty($wpdb2->error))
{
/////   echo '<H2><b>Ошибка подключения к БД, завершение.</b></H2><br>';
$failure=TRUE;
wp_die( $wpdb2->error );
}

$m_size_file=0;
$m_mtime_file=0;
$m_comment='';
/////проверка существования файлов выгрузки из 1С
////файл выгрузки сервисных книжек
$file_hist = ABSPATH.'/_1c_alfa_exchange/AA_hist.csv';
if (!file_exists($file_hist))
{
/////   echo '<H2><b>Файл обмена с сервисными книжками не существует.</b></H2><br>';
$m_comment='Файл обмена с сервисными книжками не существует';
$failure=TRUE;
}

/////инициируем таблицу лога
/////если не существует файла то возврат и ничего не делаем
if ($failure){
///включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo']
/////   echo '<H2><b>Попытка вставить запись в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>$m_comment));
wp_die();
/////    echo '<H2><b>Возврат в начало.</b></H2><br>';
return $failure;
}
/////проверка лога загрузки, что бы не загружать тоже самое
$masiv_data_file=stat($file_hist);   ////передаем в массив свойство файла
$m_size_file=$masiv_data_file[7];    ////получаем размер файла
$m_mtime_file=$masiv_data_file[9];   ////получаем дату модификации файла
////создаем запрос на получение последней удачной загрузки
////выбираем по штампу времени создания (редактирования) файла загрузки AA_hist.csv, $m_mtime_file

/////   echo '<H2><b>Размер файла: '.$m_size_file.'</b></H2><br>';
/////   echo '<H2><b>Штамп времени файла: '.$m_mtime_file.'</b></H2><br>';
/////   echo '<H2><b>Формирование запроса на выборку из лога</b></H2><br>';
////препарируем запрос
$text_zaprosa=$wpdb2->prepare("SELECT * FROM `vin_logs` WHERE `last_mtime_upload` = %s", $m_mtime_file);
$results=$wpdb2->get_results($text_zaprosa);

if ($results)
{   foreach ( $results as $r)
{
////если штамп времени и размер файла совпадают, возврат
if (($r->last_mtime_upload==$m_mtime_file) && ($r->last_size_upload==$m_size_file))
{////echo '<H2><b>Возврат в начало, т.к. найдена запись в логе.</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>'Загрузка отменена, новых данных нет, т.к. найдена запись в логе.'));
wp_die();
return $failure;
}
}
}
////если данные новые, пишем в лог запись о начале загрузки
/////echo '<H2><b>Попытка вставить запись о начале загрузки в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>0, 'last_size_upload'=>$m_size_file, 'comment'=>'Начало загрузки'));

////очищаем таблицу
$clear_tbl_zap=$wpdb2->prepare("TRUNCATE TABLE %s", 'vin_history');
$clear_tbl_zap_repl=str_replace("'","`",$clear_tbl_zap);
$results=$wpdb2->query($clear_tbl_zap_repl);
/////   echo '<H2><b>Очистка таблицы сервисных книжек</b></H2><br>';
if (empty($results))
{
/////   echo '<H2><b>Ошибка очистки таблицы книжек, завершение.</b></H2><br>';
//// если очистка не удалась, возврат
$failure=TRUE;
wp_die();
return $failure;
}

////загружаем данные
$table='vin_history';         // Имя таблицы для импорта
//$file_hist Имя CSV файла, откуда берется информация     // (путь от корня web-сервера)
$delim=';';          // Разделитель полей в CSV файле
$enclosed='"';      // Кавычки для содержимого полей
$escaped='\

42 Comments

  1. mini_root

    Маленький совет: добавь в текст код с примером использования и опиши как функционирует компонента и чего требует.

    Reply
  2. mini_root

    Исходников, как я понимаю, не будет?

    Reply
  3. dance000

    Странная компонента, у меня вырубился комп при попытке протестировать ее! ((

    Reply
  4. rockford

    (3) Тестировалось на WinXp Sp2 вроде все нормально. Опишите подробней

    Reply
  5. Serj1C

    regsrv32 AddInSendSMS.dll

    8.1:

    {Форма.Форма(3)}: Ошибка при вызове конструктора (COMОбъект): Интерфейс не поддерживается

    AddinSendSMS=новый COMОбъект(«AddIn.SendSMS»);

    по причине:

    Интерфейс не поддерживается

    Или как надо объект создать?

    Reply
  6. rockford

    (5) Пример для 8.х добавил в описание

    Reply
  7. Serj1C

    (6) неа, не канает…

    {Форма.Форма(4)}: Тип не определен (AddIn.SendSMS)

    AddinSendSMS=Новый («AddIn.SendSMS»);

    Вот, добавил еще в начало:

    ПодключитьВнешнююКомпоненту(«AddIn.SendSMS»);

    вроде пошло дальше, но Рез = 0 пока…

    Reply
  8. Serj1C

    точнее результат -2.

    А что значат параметры 1 и 0 в SendSMS ??

    Reply
  9. mini_root

    автору: лучше заведи в компоненте метод через который можно получить текстовое описание ошибки, а то -2 как -29345345 ни о чем не говорят

    Reply
  10. mini_root

    или бросай исключение(из COIM компонента на шарпе в 8.x вполне нормально перехватываются)

    Reply
  11. mini_root

    (10) опечатка: COIM -> COM

    Reply
  12. rockford

    (8,9) добавил описание метода SendSMS и кодов ошибок

    Reply
  13. mini_root

    еще одна тонкость: здесь не очень хороший редактор в плане вставки кода — воспользуйся внешней обработкой «Разукрашка» http://infostart.ru/projects/4014/ (она сгенерит тебе HTML, который можно вставить в режиме прямого редактирования HTML в здешнем редакторе).

    Reply
  14. mini_root

    0 и 1 для задания кодировки лучше заменить на свойство, тогда будет:

    …..

    x.UseUnicode=1;

    …..

    Reply
  15. boy13

    Интересно узнать, как надо подключать телефон к компьютеру и что за телефон должен быть. (Смарт/Комунникатор/Обычный). Интересно было бы узнать принцип действия и поглядеть исходный код. Но за разработку — однозначно плюс!

    Reply
  16. Душелов

    (15) Любой телефон, подключенный через компорт/эмулятор компорта. Работа с телефоном осуществляется обычной передачей АТ-команд. Ничего сложного.

    Reply
  17. kalinovsky

    (14) на мой взгляд не логично… а если при каждом отправлении кодировка меняется?… каждый раз свойство менять?… а с точки зрения прграммирования ВК — это не один вызов функций…

    Reply
  18. mini_root

    (17) Зато унифицированно

    Reply
  19. CheBurator

    неинтересно.. если бы была отправка СМС без мобилы….

    Reply
  20. Душелов

    (20) Через Google Calendar можно 😉

    Reply
  21. JohnyDeath

    (20) уже заждались компоненты по этой теме! ))

    Reply
  22. Душелов
  23. Invaa

    Присоединил коммуникатор с использованием ActiveSync’a и bluetooth, COM-порт 8. В параметрах демонстрационной обработки изменил только порт (т.к. оператор как и в примере Киевстар). При попытке отправки выдает результат «-1». В чем может быть проблема?

    Reply
  24. rockford

    (23) Возможно ActiveSync и виноват. Попробуйте его выключить

    Reply
  25. Invaa

    (24) Попробовал, тот же результат, для коммуникатора недоступен сервис «Bluetooth Serial Port». Попробую через usb.

    Reply
  26. pupkinSana

    Хорошая вещь в теории, но у меня все настроено как описано и телефон все поддерживает, а не отправляет никак пишет ошибку -4. А у себя на фирме давно прикрутил утилитку с сайта simplesms.ru для пакетной отправки уведомлений клиентам из 1С 77. Хоть 1000 штук отправляй, правда 2-3 сек. на одну смс приходится…

    Reply
  27. rockford

    (26) Попробуйте увеличить таймаут

    Reply
  28. pupkinSana

    (27) Увеличивал и уменьшал таймаут и скорость — бесполезно.

    Reply
  29. Sabron

    Что включает в себя «-4 Ошибка при передаче сообщения» и как с ней бороться?

    Reply
  30. pizhenkov

    Выходит Ошибка при посылке сообщения абоненту

    -4 Ошибка при передаче сообщения

    И что делать куда рыть не знаю 😮

    Reply
  31. olegbushev

    смотрю коменты тут старенькие — как она ведет себя после изменения правил набора, я из Украины и у нас теперь номера набираются без 8 впереди…………

    Reply
  32. rockford

    (31) номер набирается в международном формате, а в нем никто 8 не отменял.

    Reply
  33. olegbushev

    не работает……………………….

    Ошибка при посылке сообщения абоненту :

    Reply
  34. urb

    постоянно ошибка -4. Если текст сообщения оставлять пустым, что пишет, что сообщение отправлено. Реально ничего не приходит. Автор, отзовитесь. На двух телефонах провобовал

    Reply
  35. dmitrytop

    Если номер получателя состоит из 11 цифр(в России), а не из 12, то ошибка -4

    Reply
  36. NSerget

    Обработка работает отлично. Есть только одно: При превышениии длины 70 символов, то выдает ошибку -4. В то время как на латинице отсылает длинные смс.

    формат номера получателя для Украины 38ХХХ ХХ ХХ ХХХ (12 символов)

    Хотя ошибался — не получаться отправить смс длиной больше 62 символа 😮

    У Киевстара смс центр «380672021111»

    Reply
  37. olegbushev

    (36) У меня отправляется намного больше символов (сопряженное сообщение из трех). Только я пишу в латинице

    отправляю тоже с киевстара и с такого же смс центра

    да, вспомнил почему у меня такая трабла была — если отправляешь цифры, то преобразуй их в строку, символ разделения разрядов не поддерживается тут (т.е. надо отправлять не 10 000, а 10000)

    Reply
  38. olegbushev

    отправляю тоже с киевстара и с такого же смс центра

    да, вспомнил почему у меня такая трабла была — если отправляешь цифры, то преобразуй их в строку, символ разделения разрядов не поддерживается тут (т.е. надо отправлять не 10 000, а 10000)

    Reply
  39. konstantin-semichev

    Идея супер, реализация недоделана, поскольку на сервере

    ЗагрузитьВнешнююКомпоненту(«AddInSendSMS.dll»)

    не рабоает, то ипользовать не очень удобно, хочетья чтобы сервер смски отправлял, а для этого надо сом объектделать (панель упр>админ>Службы компонентов.), а тут засада. новое СОМ приложение создать не удается,

    Пишет «Часть компонентов установить не удалось: AddInConnection Ошибка DllRegisterService при установке компонента.

    ❓ развитие темы есть ?

    Windows XP Sp3

    Reply
  40. olegbushev

    у меня компонента работает на 2003 сервере, работала и на висте в свое время…

    Reply
  41. mimos

    попробовал на модемчике wavecom fastrack — смс не отправляет.

    Reply
  42. sergfox

    Добрый день

    а подтверждение получения СМС планируется реализовать, и работа с входящими СМС?

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *