Функция Php для отправки SMS через Kannel

Теперь я могу отправить смс через канал. Однако это делается с помощью заголовков, например:

header("Location:http://localhost:13013/cgi-bin/sendsms?username=xxxx&password=xxxx&to=$in_number&text=$in_msg");  

Я хочу отправить смс через функцию php, и я получил код ниже, но он не работает. (Журнал Kannel smsbox показывает отсутствие запроса):

  function sendSmsMessage($in_number, $in_msg)
 {
 $url = '/cgi-bin/sendsms?username=' . CONFIG_KANNEL_USER_NAME
 . '&password=' . CONFIG_KANNEL_PASSWORD    
 . '&charset=UCS-2&coding=2'
 . "&to={$in_number}"
 . '&text=' . urlencode(iconv('utf-8', 'ucs-2', $in_msg));



$results = file('http://'  
                 . CONFIG_KANNEL_HOST . ':'
                 . CONFIG_KANNEL_PORT . $url);

}

Что-то не так? Я попытался заменить CONFIG_KANNEL_USER_NAME и остальные значения фактическими значениями, но это все равно не работает. Открыт для предложений.

6 ответов

Решение

Я использовал cURL, и он работает на 100% хорошо. file_get_contents не работает для меня, потому что я хочу передать переменные в URL-адрес канала, а file_get_contents не обрабатывает переменные, потому что он настаивает на использовании одинарных кавычек (php обрабатывает его как строковое значение) вместо двойных кавычек (php проанализирует проверку строки для переменные и т. д.). Вот что я сейчас делаю, если вы уже где-то инициализировали свои переменные:

$ textmsg = "Привет, пользователи Stackru!";

$ cellphone_number = "+ 254xxxxxxx"

$ Encmsg= UrlEncode($textmsg);

$ch= curl_init();
curl_setopt($ch, "http://localhost:13013/cgi-bin/sendsms?username=xxxxx&password=xxxxx&to=$cellphone_number&text=$encmsg");
curl_exec($ch);
curl_close($ch);

Это сработает для простой задачи - сказать kannel, что нужно отправить смс на номер. Мне потребовалось время, чтобы понять, что curl не распознает пробелы и специальные символы:-).

Использование curl:

curl_init("http://$gw_host:$gw_port/cgi-bin/sendsms?username=$gw_user&password=$gw_pass&to=$to&from=$shortcode&smsc=$smsc&dlr-mask=$dlrmask&binfo=$shortcode&text=$message");

Замените различные переменные / параметры вашими значениями, такими как:

$gw_host=127.0.0.1
$gw_port=13xx3

и т.п.

Мой друг и я из Ндолы, Замбия, используем Ubuntu 11.04 для запуска kannel_1.4.3. Отлично работает при отправке и получении смс. Код ниже должен быть отредактирован, чтобы он отправлял более 70 символов. Мы с другом изо всех сил пытались выяснить, что в строке '&charset=UCS-2&coding=2' была небольшая ошибка. Правильная строка должна быть "&charset=UCS-2&encoding=2". Поэтому код должен выглядеть так:

 function sendSmsMessage($in_number, $in_msg)
 {
 $url = '/cgi-bin/sendsms?username=' . CONFIG_KANNEL_USER_NAME
 . '&password=' . CONFIG_KANNEL_PASSWORD    
 . '&charset=UCS-2&encoding=2'
 . "&to={$in_number}"
 . '&text=' . urlencode(iconv('utf-8', 'ucs-2', $in_msg));

//php код файла с именем test2.php. перед этим вы должны установить php5-curl на ubuntu14

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

    [root@sat2 tools]# cat kannel-send.php 
    <?php

    function send_sms($msgid, $numto, $msgtext, $smsc = "smsc-default", $dlrmask = 63)
    {

            $sendsmsurl_prefix = "http://localhost:13013/cgi-bin/sendsms";
            $dlrurl_prefix = "http://localhost/tools/kannel-receive.php";
            $username = "user";
            $password = "pass";

            # fix number to what carriers expect
            $numto = preg_replace('/^0/', '', $numto);
            $numto = preg_replace('/^\+55/', '', $numto);
            $numto = "0" . $numto;

            if (!$msgid) $dlrmask = 0;

            $dlrurl_params = array(
                    "type" => "dlr",
                    "timesent" => "%t",
                    "smsc" => "%i",
                    "uuid" => "%I",
                    "fid" => "%F",
                    "dlr-cod" => "%d",
                    "reply" => "%A",
                    "msgid" => $msgid,
                    "text" => "%a",
                    "to" => "%P",
                    "from" => "%p",
                    "origsmsc" => "%f",
            );

            $dlrurl = $dlrurl_prefix . "?" . urldecode(http_build_query($dlrurl_params));

            $sendsmsurl_params = array(
                    "username" => $username,
                    "password" => $password,
                    "to" => $numto,
                    "dlr-mask" => $dlrmask,
                    "dlr-url" => $dlrurl,
                    "smsc"=> $smsc,
                    "text" => $msgtext,
            );

            $sendsmsurl = $sendsmsurl_prefix . "?" . http_build_query($sendsmsurl_params);

            $ch = curl_init();
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_URL, $sendsmsurl);
            $bogus = curl_exec($ch);
            $ret = curl_error($ch);
            curl_close($ch);

            return $ret == "";

    }

    ?>

И у вас мог бы быть этот другой, чтобы получить смс и сохранить это к mysql:

    [root@sat2 tools]# cat kannel-receive.php 
    <?php

    $debug = false;

    $link = null;

    function dbconnect()
    {
            global $link, $debug;

            if ($link && mysql_ping($link))
                    return;

            if ($debug) echo "Conectando ao banco de dados\n";
            // TODO: criar um usuario de banco especifico pra isso
            $host = 'localhost';
            $user = 'user';
            $pass = 'pass';
            $db = 'dbname';
            $link = mysql_connect($host, $user, $pass, true);
            if (!$link){ 
                    if ($debug) echo "Can't connect to mysql: " . mysql_error() . "\n";
            } else {
                    mysql_select_db($db, $link);
            }
            return;
    }

    function esc($str)
    {
            global $link;
            return mysql_real_escape_string($str, $link);
    }

    if ($debug) {
            echo "<br>Kannel inbound sms event:<br>\n";
            var_dump($_GET);
    }

    dbconnect();

    if ($_GET['type'] == "inbsms") {

            $_GET['from'] = preg_replace('/^(\+55|0)/', '', $_GET['from']);
            $sql = "INSERT INTO notificacao (tipo, endereco, mensagem, device,
                            dataEvento, situacao)
                    VALUES ('%s', '%s','%s','%s','%s','%s')";
            $sql = sprintf($sql, 'sms', esc($_GET['from']), esc($_GET['text']),
                    esc($_GET['smsc']), esc($_GET['timesent']), "received");

    } elseif ($_GET['type'] == "dlr") {

            switch (esc($_GET['dlr-cod'])) {
            case "1":
                    $sql = "UPDATE notificacao SET 
                                    situacao = 'confirmed',
                                    dataConfirmacao = '{$_GET['timesent']}'
                            WHERE idnotificacao = {$_GET['msgid']}";
                    break;
            case "8":
                    $sql = "UPDATE notificacao SET 
                                    situacao = 'sent',
                                    device = '{$_GET['smsc']}',
                                    dataEvento = '{$_GET['timesent']}'
                            WHERE idnotificacao = {$_GET['msgid']}";
                    break;
            case "16":
                    $sql = "UPDATE notificacao SET 
                                    situacao = 'failed',
                                    device = '{$_GET['smsc']}',
                                    razaofalha = '{$_GET['reply']}',
                                    dataEvento = '{$_GET['timesent']}'
                            WHERE idnotificacao = {$_GET['msgid']}";
                    break;
            }

    }

    if ($debug) echo "sql: $sql\n";

    $result = mysql_query($sql, $link);
    if (!$result) {
            if ($debug) echo "Erro sql: " . mysql_error() . "\n";
    }

    ?>

Он также является получателем SMS и получателем SMS-доставки-уведомления (в этом случае он обновляет запись в базе данных, которая была помещена туда при отправке SMS-сообщения, чтобы подтвердить ее получение).

Он используется для DLR, потому что я отправляю URL для этого при отправке SMS (и устанавливаю маску DLR, запрашивающую подтверждение), но для входящих SMS вы должны настроить свой kannel.conf для его использования (у вас может быть много sms-сервисов, это всего лишь пример всеобъемлющего:

    [...]
    group = sms-service
    keyword = default
    get-url = "http://localhost/tools/kannel-receive.php?type=inbsms&text=%a&timesent=%t&from=%p&to=%P&smsc=%i&uuid=%I&delivery=%d&service=%n&encoding=%c&class=%m&mwi=%M&charset=%C&udh=%u&dcs=%O&origsmsc=%f"
    catch-all = yes
    max-messages = 0
    accept-x-kannel-headers = true
    concatenation = yes
    omit-empty = yes
    [...]

Извините за некоторые тексты на португальском языке, но вы можете получить картину.

Если вы пытаетесь инициировать загрузку URL в фоновом режиме (а не перенаправлять пользователя на URL), вам нужно использовать что-то вроде cURL или, возможно, даже file_get_contents.

Например, если в вашей настройке активированы обёртки URL-адресов, вы можете просто использовать:

$response = file_get_contents("http://localhost:13013/cgi-bin/sendsms?username=xxxx&password=xxxx&to=$in_number&text=$in_msg");

Независимо от этого, трудно понять, почему найденная функция не будет работать без дополнительной отладочной информации. (Если CONFIG_KANNEL_HOST определен как "localhost", а CONFIG_KANNEL_PORT определен как 13013, то он фактически делает то же самое, хотя и с дополнительными операциями набора символов.)

Другие вопросы по тегам