Protocollo SMPP
SMPP (Short Message Peer-to-Peer Protocol) è un protocollo binario progettato per connessioni persistenti affidabili per inviare SMS su larga scala con tracciamento della consegna. Scegli SMPP quando hai bisogno di connessioni persistenti per messaggistica ad alto volume, notifiche di consegna in tempo reale o integrazione con infrastruttura telecom esistente.
Modalità di Connessione
Il server SMPP di Agile Telecom supporta tre modalità di connessione. Scegli quella che si adatta al tuo caso d'uso:
- Transmitter (TX) – Invia solo messaggi. Usa questo se origini solo SMS e non hai bisogno di rapporti di consegna.
- Receiver (RX) – Ricevi notifiche di consegna solo. Usa questo per monitoraggio dedicato dei rapporti da connessioni TX altrove.
- Transceiver (TRX) – Invia messaggi e ricevi notifiche sulla stessa connessione. Ideale per messaggistica bidirezionale con meno slot di connessione.
Per impostazione predefinita, il tuo account consente fino a 4 connessioni attive — combina le modalità come necessario (es. 4 TX + 4 RX, o 4 TRX). Contatta il supporto se hai bisogno di capacità aggiuntiva.
Dettagli Connessione
| Parametro | Valore |
|---|---|
| HOST | smpp.agiletelecom.com |
| PORT | 2776 (TLS) |
| SYSTEM ID | Il tuo nome utente account |
| PASSWORD | La tua password account |
| MODE | TX, RX, o TRX |
| Login-AddrRange | Lascia vuoto |
| Login-SystemType | Lascia vuoto |
| Login-TON | 1 |
| Login-NPI | 1 |
| Login-DCS | 0 |
Invia un pacchetto ENQUIRE_LINK almeno ogni 30 secondi. Se non ricevi risposta entro 5 minuti, la connessione sarà chiusa. La maggior parte delle librerie SMPP lo gestisce automaticamente.
Esempi di Codice
- Python
- Node.js
- Java
Installa la libreria smpplib:
pip install smpplib
Connettiti e invia un SMS:
```python
import smpplib
import smpplib.gsm
import smpplib.consts
# Crea un client
client = smpplib.client.Client("smpp.agiletelecom.com", 2776, allow_unknown_opt_params=True)
# Connettiti con TLS
client.connect()
# Esegui il bind come Transceiver (modalità TRX)
client.bind(
smpplib.consts.SMPP_BIND_TX,
system_id="YOUR_USERNAME",
password="YOUR_PASSWORD",
)
# Invia SMS
parts, encoding_flag, msg_type_flag = smpplib.gsm.make_parts("Hello World!")
for part in parts:
pdu = client.send_message(
source_addr_ton=smpplib.consts.SMPP_TON_INTL,
source_addr="12345",
dest_addr_ton=smpplib.consts.SMPP_TON_INTL,
destination_addr="+391234567890",
short_message=part,
)
print(f"Message ID: \{pdu.message_id\}")
# Mantieni la connessione attiva
import time
while True:
client.listen()
time.sleep(1)
client.unbind()
client.disconnect()
Installa la libreria smpp:
npm install smpp
Connettiti e invia un SMS:
const smpp = require("smpp");
const client = new smpp.Session(\{
host: "smpp.agiletelecom.com",
port: 2776,
tls: true,
logger: "bunyan",
\});
client.on("error", (err) => \{
console.error("Client error:", err);
\});
client.on("connect", () => \{
console.log("Connected to SMPP server");
// Esegui il bind come Transceiver
client.bind_transceiver(
\{
system_id: "YOUR_USERNAME",
password: "YOUR_PASSWORD",
\},
(pdu) => \{
if (pdu.command_status === 0) \{
console.log("Successfully bound");
// Invia SMS
client.submit_sm(
\{
source_addr_ton: 1,
source_addr: "12345",
dest_addr_ton: 1,
destination_addr: "+391234567890",
short_message: "Hello World!",
\},
(pdu) => \{
console.log(`Message ID: $\{pdu.message_id\}`);
client.unbind();
client.close();
\}
);
\}
\}
);
\});
client.connect();
Aggiungi dipendenza (usando Maven):
<dependency>
<groupId>com.cloudhopper</groupId>
<artifactId>ch-smpp</artifactId>
<version>6.0.0</version>
</dependency>
Connettiti e invia:
import com.cloudhopper.smpp.SmppSession;
import com.cloudhopper.smpp.SmppSessionConfiguration;
import com.cloudhopper.smpp.impl.DefaultSmppSessionFactory;
import com.cloudhopper.smpp.pdu.PduAsyncResponse;
import com.cloudhopper.smpp.pdu.SubmitSm;
import com.cloudhopper.smpp.pdu.SubmitSmResp;
SmppSessionConfiguration config = new SmppSessionConfiguration();
config.setWindowSize(1);
config.setName("Agile Telecom");
config.setType(SmppSessionConfiguration.TYPE_TRANSCEIVER);
config.setHost("smpp.agiletelecom.com");
config.setPort(2776);
config.setConnectTimeout(5000);
config.setBindTimeout(5000);
config.setSystemId("YOUR_USERNAME");
config.setPassword("YOUR_PASSWORD");
config.setUsingSSL(true);
DefaultSmppSessionFactory factory = new DefaultSmppSessionFactory();
SmppSession session = factory.createSmppSession(config);
session.rebind();
SubmitSm pdu = new SubmitSm();
pdu.setSourceAddress("12345");
pdu.setDestinationAddress("+391234567890");
pdu.setShortMessage("Hello World!".getBytes());
PduAsyncResponse asyncResponse = session.submitSmAsync(pdu);
SubmitSmResp response = (SubmitSmResp) asyncResponse.getResponse();
System.out.println("Message ID: " + response.getMessageId());
session.unbindAndClose();
## Gestione Errori
Quando la tua connessione fallisce o un messaggio non si sottomette, controlla questi codici di errore per capire cosa è successo e come risolverlo.
### Errori di Bind & Autenticazione
| Codice di Errore | Hex | Descrizione |
|-----------|-----|-------------|
| 4 | 0x04 | **Bind non ancora completato** — Invia la richiesta di bind prima di sottomettere messaggi |
| 5 | 0x05 | **Utente già sottoposto a bind** — Hai raggiunto il tuo limite di connessione (default: 4). Chiudi le connessioni inutilizzate o richiedi limiti più alti |
| 13 | 0x0E | **Credenziali non valide** — Controlla il tuo SYSTEM ID e password |
| 8 | 0x08 | **Errore del sistema** — Riprova dopo alcuni secondi |
| 10 | 0x0A | **Indirizzo mittente non valido** — L'ID mittente deve essere numerico (max 16 caratteri) o alfanumerico (max 11 caratteri). Vedi regole ID mittente sottostanti |
## Supporto
Per assistenza tecnica, contatta [help@agiletelecom.com](mailto:help@agiletelecom.com).
## Qual è il Prossimo?
- [SMS in Ingresso](inbound-sms) – Ricevi SMS sul tuo numero dedicato
- [Verifica Crediti](credit-check) – Monitora il saldo del tuo account
- [MNP Lookup](mnp) – Interroga informazioni sulla rete mobile