Kako poslati SMS putem SMPP API-ja koristeći Javascript/Node.js

Short Message Peer-to-Peer (SMPP) API je robustan i široko korišten protokol za slanje i primanje SMS poruka između Short Message Service Centara (SMSC) i External Short Messaging Entities (ESME). Za programere koji koriste JavaScript i Node.js, integracija SMPP API-ja s alatima poput Ozeki SMS Gateway-a omogućuje nesmetanu SMS komunikaciju. Ovaj vodič pruža korak-po-korak tutorial o postavljanju SMPP klijenta, upravljanju vezama, slanju SMS-a i rukovanju izvješćima o isporuci koristeći JavaScript i Node.js, zajedno s praktičnim primjerima koda.

Zašto koristiti SMPP API s JavaScript-om?

SMPP protokol je moćan izbor za SMS komunikaciju zbog svoje pouzdanosti, skalabilnosti i podrške za velike količine poruka. Korištenjem JavaScript-a i Node.js-a, programeri mogu stvoriti učinkovite, događajima vođene aplikacije koje se besprijekorno integriraju s SMPP API-jem. Paket smpp, dostupan putem npm-a, pojednostavljuje interakcije s niskorazinskim protokolom, omogućujući programerima da se usredotoče na izgradnju robusnih SMS aplikacija.

Postavljanje SMPP API klijenta u JavaScript-u (Node.js) za slanje SMS-a

Prije nego što možete slati SMS poruke koristeći SMPP API, morate konfigurirati SMPP korisnički račun i spojiti se na SMPP poslužitelj, kao što je onaj koji nudi Ozeki SMS Gateway. Ovaj odjeljak objašnjava kako postaviti okruženje i uspostaviti vezu koristeći JavaScript.

Korak 1: Instalirajte SMPP paket

Za interakciju s SMPP protokolom, instalirajte paket smpp iz npm-a, koji pruža jednostavno sučelje za operacije SMPP API-ja u JavaScript-u.

npm install smpp

Korak 2: Uspostavite vezu

Ispod je primjer kako se spojiti na SMPP poslužitelj koristeći Node.js i paket smpp. Zamijenite your.ozeki.server, your_username, i your_password svojim stvarnim podacima poslužitelja i vjerodajnicama.

const smpp = require('smpp');
const session = smpp.connect({
    host: 'your.ozeki.server',
    port: 2775
});

session.on('connect', () => {
    console.log('Spojeno na SMPP poslužitelj');
    
    session.bind_transceiver({
        system_id: 'your_username',
        password: 'your_password'
    }, (pdu) => {
        if (pdu.command_status === 0) {
            console.log('Uspješno povezano s SMPP poslužiteljem');
        } else {
            console.error('Povezivanje nije uspjelo:', pdu.command_status);
        }
    });
});

session.on('error', (error) => {
    console.error('Greška u SMPP vezi:', error);
});

Osigurajte da je vaš SMPP poslužitelj dostupan i da su vaše vjerodajnice točne kako biste izbjegli probleme s vezom. Metoda bind_transceiver uspostavlja dvosmjernu vezu za slanje i primanje SMS-a.

Upravljanje SMPP API vezama u Node.js-u za SMS poruke

Održavanje aktivne SMPP sesije zahtijeva slanje periodičnih keep-alive poruka koristeći enquire_link PDU. Ovo osigurava da veza ostane otvorena i responzivna, posebno za dugotrajne aplikacije.

const keepAliveInterval = setInterval(() => {
    session.enquire_link({}, (pdu) => {
        if (pdu.command_status !== 0) {
            console.error('Keep-alive nije uspio:', pdu.command_status);
        }
    });
}, 30000);

session.on('close', () => {
    clearInterval(keepAliveInterval);
    console.log('SMPP veza zatvorena');
});

Ovaj kod šalje enquire_link svakih 30 sekundi kako bi održao sesiju aktivnom i briše interval kada se veza zatvori.

Slanje SMS-a s JavaScript-om putem SMPP API-ja (Node.js primjer)

Nakon što ste spojeni, možete slati SMS poruke koristeći submit_sm PDU. Sljedeća JavaScript funkcija pokazuje kako poslati SMS s SMPP API-jem.

function sendSMS(from, to, message) {
    session.submit_sm({
        source_addr: from,
        destination_addr: to,
        short_message: message,
        data_coding: 0, // GSM 7-bit kodiranje
        source_addr_ton: 1, // Međunarodni format
        source_addr_npi: 1, // ISDN plan numeriranja
        dest_addr_ton: 1,  // Međunarodni format
        dest_addr_npi: 1    // ISDN plan numeriranja
    }, (pdu) => {
        if (pdu.command_status === 0) {
            console.log(`Poruka uspješno poslana, message_id: ${pdu.message_id}`);
        } else {
            console.error('Slanje poruke nije uspjelo:', pdu.command_status);
        }
    });
}

sendSMS('12345', '+1234567890', 'Pozdrav iz Node.js SMPP klijenta!');

Parametri data_coding, source_addr_ton i dest_addr_ton osiguravaju pravilno kodiranje poruke i formatiranje telefonskog broja. Prilagodite ove parametre prema svojim zahtjevima.

Rukovanje izvješćima o isporuci SMS-a u JavaScript-u koristeći SMPP API

SMPP API podržava izvješća o isporuci kako bi potvrdio je li SMS isporučen. Sljedeći kod obrađuje dolazne deliver_sm PDU-e kako bi obradio obavijesti o isporuci.

session.on('pdu', (pdu) => {
    if (pdu.command === 'deliver_sm') {
        const messageId = pdu.receipted_message_id;
        const status = pdu.message_state;
        
        console.log(`Izvješće o isporuci za ${messageId}: ${status}`);
        
        session.deliver_sm_resp({
            sequence_number: pdu.sequence_number
        });
    }
});

Ovaj kod bilježi status isporuke i odgovara poslužitelju kako bi potvrdio primljeno izvješće.

Kompletna implementacija SMPP API klijenta u JavaScriptu (Node.js) za slanje SMS-a

Za produkcijsko rješenje, sljedeća JavaScript klasa obuhvaća upravljanje vezom, slanje poruka i logiku ponovnog povezivanja za SMPP API.

const smpp = require('smpp');

class SMPPClient {
    constructor(config) {
        this.config = config;
        this.session = null;
        this.keepAliveInterval = null;
        this.connect();
    }

    connect() {
        this.session = smpp.connect(this.config);
        
        this.session.on('connect', () => {
            console.log('Povezan s SMPP serverom');
            this.bind();
        });

        this.session.on('error', (error) => {
            console.error('Greška u vezi:', error);
            this.reconnect();
        });

        this.session.on('close', () => {
            console.log('Veza zatvorena');
            this.cleanup();
            this.reconnect();
        });
    }

    bind() {
        this.session.bind_transceiver({
            system_id: this.config.system_id,
            password: this.config.password
        }, (pdu) => {
            if (pdu.command_status === 0) {
                console.log('Uspješno povezan s SMPP serverom');
                this.startKeepAlive();
            } else {
                console.error('Povezivanje nije uspjelo:', pdu.command_status);
                this.session.close();
            }
        });
    }

    startKeepAlive() {
        this.keepAliveInterval = setInterval(() => {
            this.session.enquire_link({}, (pdu) => {
                if (pdu.command_status !== 0) {
                    console.error('Keep-alive nije uspio:', pdu.command_status);
                }
            });
        }, 30000);
    }

    sendSMS(from, to, message) {
        return new Promise((resolve, reject) => {
            this.session.submit_sm({
                source_addr: from,
                destination_addr: to,
                short_message: message,
                data_coding: 0
            }, (pdu) => {
                if (pdu.command_status === 0) {
                    resolve(pdu.message_id);
                } else {
                    reject(new Error(`SMPP greška: ${pdu.command_status}`));
                }
            });
        });
    }

    cleanup() {
        if (this.keepAliveInterval) {
            clearInterval(this.keepAliveInterval);
            this.keepAliveInterval = null;
        }
    }

    reconnect() {
        this.cleanup();
        setTimeout(() => {
            console.log('Pokušaj ponovnog povezivanja...');
            this.connect();
        }, 5000);
    }
}

const client = new SMPPClient({
    host: 'your.ozeki.server',
    port: 2775,
    system_id: 'your_username',
    password: 'your_password'
});

client.sendSMS('12345', '+1234567890', 'Pozdrav iz kompletnog SMPP klijenta!')
    .then(messageId => console.log('ID poruke:', messageId))
    .catch(err => console.error('Greška:', err));

Ova implementacija uključuje rukovanje greškama, automatsko ponovno povezivanje i slanje poruka temeljeno na obećanjima, što je čini prikladnom za produkcijska okruženja.

Najbolje prakse za korištenje SMPP API-ja s JavaScriptom

  • Rukovanje greškama: Implementirajte robusno rukovanje greškama za upravljanje mrežnim problemima i greškama servera.
  • Async/Await: Koristite obećanja ili async/await za bolji tok upravljanja u asinkronim operacijama.
  • Red poruka: Za slanje velikog broja SMS-ova, implementirajte red za upravljanje propusnošću poruka.
  • Praćenje veze: Kontinuirano pratite stanje veze i implementirajte logiku automatskog ponovnog povezivanja.
  • Kodiranje znakova: Rukujte različitim kodiranjima znakova (npr. GSM 7-bit, UCS-2) kako biste podržali međunarodne SMS-ove.

Zaključak

Ovaj opsežan vodič pokazao je kako implementirati robustan SMPP klijent koristeći JavaScript i Node.js za interakciju s SMPP API-jem i Ozeki SMS Gatewayom. Od postavljanja veze do slanja SMS-ova i rukovanja izvješćima o isporuci, navedeni primjeri demonstriraju praktične primjene paketa smpp. Za napredne slučajeve korištenja, razmotrite istraživanje značajki kao što su spajanje poruka, napredne sheme kodiranja i bilježenje za aplikacije produkcijske razine.

Za dodatne pojedinosti o SMPP protokolu ili Ozeki SMS Gatewayu, posjetite službenu dokumentaciju ili kontaktirajte svog pružatelja SMS gateway usluga.

More information