2017-02-06 1 views
0

Я взял sample_app из smppcxx библиотеки и изменил настройки для:Почему smppcxx sample_app не работает и возвращает «Ошибка SMPP: Недопустимая команда_length» и сбой?

const std::string ipaddr = "194.228.174.1"; 
const Smpp::Uint16 port = 9111; 
const Smpp::SystemId sysid("MaxiTipSMPP"); 
const Smpp::Password pass(<actual_password>); 
const Smpp::SystemType systype(""); 
const Smpp::Uint8 infver = 0x34; 
const Smpp::ServiceType servtype(""); 
const Smpp::Address srcaddr("234567"); 
const Smpp::Address dstaddr("420606752839"); 
const std::string msgtext = "Hello smsc"; 

Код называется это:

Socket sd; 
    sd.connect(ipaddr.c_str(), port); 
    send_bind(sd); 
    read_bind_resp(sd); 
    //send_enquire_link(sd); 
    //read_enquire_link_resp(sd); 
    send_submit_sm(sd); 
    read_submit_sm_resp(sd); 
    Smpp::Uint32 seqnum = read_deliver_sm(sd); 
    send_deliver_sm_resp(sd, seqnum); 
    //send_data_sm(sd); 
    //read_data_sm_resp(sd); 
    //seqnum = read_deliver_sm(sd); 
    //send_deliver_sm_resp(sd, seqnum); 
    send_unbind(sd); 
    read_unbind_resp(sd); 

и проблема происходит в read_submit_sm_resp (SD) (или в read_enquire_link_resp (сд), если раскомментировать):

Buffer buf; 
    buf = read_smpp_pdu(sd, buf); 
    std::cout << "\nRead a submit sm resp\n"; 
    Smpp::hex_dump(&buf[0], buf.size(), std::cout); 
    Smpp::SubmitSmResp pdu; 
    std::cout << "read_submit_sm_resp buf.size() is " << buf.size() << std::endl; 
    pdu.decode(&buf[0]); 
    std::string sid = pdu.message_id(); 
    printf("response message_id: \"%s\"\n", sid.c_str()); 

на линии

pdu.decode(&buf[0]); 

, почему? Приложение аварийно завершает работу. Я ожидал, что код будет работать так, как есть, но это просто не так.

Существует выход:

Sending a bind transceiver 
00 00 00 2a 00 00 00 09 00 00 00 00 00 00 00 01 ...*............ 
4d 61 78 69 54 69 70 53 4d 50 50 00    MaxiTipSMPP.password 

Read a bind response 
00 00 00 15 80 00 00 09 00 00 00 00 00 00 00 01 ................ 
53 4d 53 43 00          SMSC. 
read_bind_resp buf.size() is 21 
response system_id: "SMSC" 

Sending a submit sm 
00 00 00 3d 00 00 00 04 00 00 00 00 00 00 00 01 ...=............ 
00 00 00 32 33 34 35 36 37 00 01 01 34 32 30 36 ...234567...4206 
30 36 37 35 32 38 33 39 00 00 00 00 00 00 01 00 06752839........ 
00 00 0a 48 65 6c 6c 6f 20 73 6d 73 63    ...Hello smsc 

Read a submit sm resp 
00 00 00 a4 00 00 00 05 00 00 00 00 00 00 00 01 ................ 
00 01 01 39 39 39 30 33 30 00 01 01 34 32 30 36 ...999030...4206 
30 36 37 35 32 38 33 39 00 04 00 00 00 00 00 00 06752839........ 
00 00 47 69 64 3a 66 62 32 37 37 66 62 34 33 66 ..Gid:fb277fb43f 
63 31 34 36 66 30 39 61 39 31 37 37 32 63 37 63 c146f09a91772c7c 
31 33 64 65 35 62 20 64 6f 6e 65 20 64 61 74 65 13de5b done date 
3a 31 37 30 32 30 36 30 35 30 37 30 34 20 73 74 :170206050704 st 
61 74 3a 55 4e 44 45 4c 49 56 00 1e 00 21 66 62 at:UNDELIV...!fb 
32 37 37 66 62 34 33 66 63 31 34 36 66 30 39 61 277fb43fc146f09a 
39 31 37 37 32 63 37 63 31 33 64 65 35 62 00 04 91772c7c13de5b.. 
27 00 01 05          '... 
read_submit_sm_resp buf.size() is 164 
SMPP error: Invalid command_length 

Я добавил выход, и он говорит, что размер 164 и я вижу 164 байт и в ответ связывания, который работает без проблем, есть размер 21 и я вижу 21 байты, нужно как-то исправить функцию декодирования?

Smpp::SubmitSmResp::decode(const Smpp::Uint8* buff) 
{ 
    Response::decode(buff); 

    Smpp::Uint32 len = Response::command_length(); 
    Smpp::Uint32 offset = 16; 
    const char* err = "Bad length in submit_sm_resp"; 
    if(len < offset) 
     throw Error(err); 

    const Smpp::Char* sptr = reinterpret_cast<const Smpp::Char*>(buff); 
    message_id_ = &sptr[offset]; 
    offset += message_id_.length() + 1; 

    if(len < offset) 
     throw Error(err); 

    Header::decode_tlvs(buff + offset, len - offset); 
} 

Я все еще считаю, что библиотека должна работать так, как есть, поэтому я предполагаю, что, возможно, мне нужно изменить какую-то настройку или что-то в этом роде. У кого-то была такая же проблема? Любая идея, что делать? Единственное, что я хочу, это отправить sms, о max 100 в день ...

ответ

0

Мне удалось это исправить.

1) Имейте только одно открытое соединение вместо того, чтобы открывать новое соединение для отправки всех смс. Поставщик запретил мне из-за слишком большого количества отверстий для подключения.

2) Поток не отправляет-> читать-> отправлять-> читать -> .., но чтение ответов должно выполняться асинхронно, и поэтому клиент должен анализировать ответы, чтобы понять, какой тип ответа был получен.

3) Соединение должно поддерживаться с помощью send_enquire_link.

Я предполагаю, что программирование этого шлюза для отправки sms было далеко за пределы 1 мандалы для такого человека, как я, который ничего не знал о smpp. Я закончил задачу примерно за 3 дня с довольно большой работой за одну ночь. Почему я добавляю это? Потому что основной проблемой был мой подход из-за назначенного времени => Я думал, что должно быть простое решение для одной задачи мандата ...

Смежные вопросы