2 Stimmen

Php Funktion zum Senden von SMS über Kannel

Ich kann jetzt eine SMS über Kannel senden. Dies geschieht jedoch über Header, z.B.:

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

Ich möchte eine SMS über eine PHP-Funktion senden und habe den folgenden Code online gefunden, aber es funktioniert nicht. (Das Kannel smsbox-Protokoll zeigt keine Anfrage):

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);

}

Gibt es etwas falsch? Ich habe versucht, CONFIG_KANNEL_USER_NAME und den Rest mit den tatsächlichen Werten zu ersetzen, aber es funktioniert immer noch nicht. Offen für Vorschläge.

4voto

MaxI Punkte 763

Ich habe cURL verwendet und es funktioniert zu 100% gut. file_get_contents funktioniert für mich nicht, weil ich Variablen an die Kannel-URL übergeben möchte und file_get_contents Variablen nicht verarbeitet, weil es darauf besteht, einfache Anführungszeichen zu verwenden (PHP behandelt es als Zeichenfolgenwert) anstelle von doppelten Anführungszeichen (PHP wird die Zeichenfolge analysieren und nach Variablen usw. überprüfen). Hier ist, was ich derzeit mache, vorausgesetzt, dass Sie Ihre Variablen bereits irgendwo initialisiert haben:

$textmsg = "Hallo Stackoverflow-Benutzer!";

$handynummer = "+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);

Dies funktioniert für die einfache Aufgabe, Kannel mitzuteilen, eine SMS an eine Nummer zu senden. Ich habe eine Weile gebraucht, um zu erkennen, dass cURL keine Leerzeichen und Sonderzeichen erkennt :-).

1voto

Charles Punkte 11

Mein Freund und ich aus Ndola, Sambia, verwenden ubuntu 11.04, um kannel_1.4.3 auszuführen. Es funktioniert perfekt beim Senden und Empfangen von SMS. Der folgende Code musste bearbeitet werden, damit er mehr als 70 Zeichen senden kann. Mein Freund und ich kämpften, um herauszufinden, dass es einen kleinen Fehler in der Zeile '&charset=UCS-2&coding=2' gab. Die korrekte Zeile sollte '&charset=UCS-2&encoding=2' lauten. Also sollte der Code wie folgt aussehen:

 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));

1voto

James Punkte 11

Mit curl verwenden:

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");

Ersetzen Sie die verschiedenen Variablen/Parameter durch Ihre Werte wie:

$gw_host=127.0.0.1
$gw_port=13xx3

usw.

0voto

John Parker Punkte 53226

Wenn Sie versuchen, das Laden einer URL im Hintergrund auszulösen (anstelle den Benutzer zur URL umzuleiten), müssen Sie etwas wie cURL oder vielleicht sogar file_get_contents verwenden.

Zum Beispiel, wenn Ihre Konfiguration fopen URL Wrapper aktiviert hat, könnten Sie einfach verwenden:

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

Unabhängig davon, ist es schwer zu sagen, warum die von Ihnen gefundene Funktion nicht funktioniert, ohne zusätzliche Debug-Informationen. (Wenn CONFIG_KANNEL_HOST als "localhost" definiert ist und CONFIG_KANNEL_PORT als 13013 definiert ist, dann macht es effektiv das gleiche, wenn auch mit zusätzlichen Zeichensatzoperationen.)

0voto

token47 Punkte 1

Um pouco de história, mas para a posteridade e outros que procuram a mesma coisa:

    [root@sat2 tools]# cat kannel-send.php 
     "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 == "";

    }

    ?>

E você pode ter este outro para receber SMS e armazená-lo no mysql:

    [root@sat2 tools]# cat kannel-receive.php 
    Evento de recebimento de sms do Kannel:\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 = 'confirmado',
                                    dataConfirmacao = '{$_GET['timesent']}'
                            WHERE idnotificacao = {$_GET['msgid']}";
                    break;
            case "8":
                    $sql = "UPDATE notificacao SET 
                                    situacao = 'enviado',
                                    device = '{$_GET['smsc']}',
                                    dataEvento = '{$_GET['timesent']}'
                            WHERE idnotificacao = {$_GET['msgid']}";
                    break;
            case "16":
                    $sql = "UPDATE notificacao SET 
                                    situacao = 'falhou',
                                    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";
    }

    ?>

Este serve como receptor de SMS e receptor de notificações de entrega de SMS (nesse caso, atualiza um registro no banco de dados que foi inserido ao enviar o SMS, para confirmar que foi recebido).

É usado para DLR porque envio a URL para isso ao enviar o SMS (e defino a máscara de DLR pedindo confirmação), mas para SMS recebido você precisa configurar o kannel.conf para usá-lo (você pode ter muitos serviços de SMS, este é apenas um exemplo de um genérico):

    [...]
    group = sms-service
    keyword = default
    get-url = "http://localhost/tools/kannel-receive.php?type=inbsms&text=%a×ent=%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
    [...]

Desculpe por alguns textos em português, mas você consegue entender a ideia.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X