I’ve been having issues with devices behind unpredictable network connections not receiving messages. I modified res_pjsip_messaging.c to report status via AMI so I could be sure a message was delivered, or queue it if it wasn’t.
Disclaimer: I’m a raw beginner, so any suggestions would be very much welcome.
static void pjsip_message_response_cb(void *token, pjsip_event *event)
{
const char *x_message_id = token ? (const char *)token : "";
if (event->body.tsx_state.src.rdata) {
pjsip_msg *msg = event->body.tsx_state.src.rdata->msg_info.msg;
if (msg && msg->type == PJSIP_RESPONSE_MSG) {
int code = msg->line.status.code;
const pj_str_t *reason = &msg->line.status.reason;
char to_buf[256] = "";
pjsip_hdr *to = pjsip_msg_find_hdr(msg, PJSIP_H_TO, NULL);
if (to) pjsip_hdr_print_on(to, to_buf, sizeof(to_buf)); else pj_ansi_strcpy(to_buf, "To:");
char from_buf[256] = "";
pjsip_hdr *from = pjsip_msg_find_hdr(msg, PJSIP_H_FROM, NULL);
if (from) pjsip_hdr_print_on(from, from_buf, sizeof(from_buf)); else pj_ansi_strcpy(from_buf, "From:");
ast_debug(3, "%d %.*s | %s | %s | X-Message-Id: %s\n",
code, (int)reason->slen, reason->ptr, to_buf, from_buf, x_message_id
);
manager_event(EVENT_FLAG_MESSAGE,
"PJSIPMessageResponse", "ResponseCode: %d\nResponseReason: %.*s\n%s\n%s\nX-Message-Id: %s\n",
code, (int)reason->slen, reason->ptr, to_buf, from_buf, x_message_id
);
ast_free(token);
return;
}
}
ast_debug(3, "Message with id '%s' timed out.", x_message_id);
manager_event(EVENT_FLAG_MESSAGE,
"PJSIPMessageResponse", "ResponseCode: 0\nResponseReason: Timed out\nX-Message-Id: %s\n",
x_message_id
);
ast_free(token);
}
Then a slight modification at the bottom of msg_send:
/*
* If the X-Message-Id header has been set, pass it through
* to the callback function so that we can determine which
* response is related to which message.
*/
static const pj_str_t x_message_id = { "X-Message-Id", 12 };
pjsip_hdr *message_id_hdr = pjsip_msg_find_hdr_by_name(tdata->msg, &x_message_id, NULL);
pjsip_generic_string_hdr *str_message_id_hdr = (pjsip_generic_string_hdr *)message_id_hdr;
char *token = NULL;
if (str_message_id_hdr) {
ast_assert(pj_strlen(&str_message_id_hdr->hvalue) >= str_message_id_hdr->hvalue.slen);
token = ast_strndup(pj_strbuf(&str_message_id_hdr->hvalue), str_message_id_hdr->hvalue.slen);
ast_debug(3, "X-Message-Id header found; set token to: %.*s", (int)str_message_id_hdr->hvalue.slen, str_message_id_hdr->hvalue.ptr);
}
ast_debug(1, "Sending message to '%s' (via endpoint %s) from '%s'\n",
uri, ast_sorcery_object_get_id(endpoint), mdata->from);
if (ast_sip_send_request(tdata, NULL, endpoint, token, pjsip_message_response_cb)) {
ast_log(LOG_ERROR, "PJSIP MESSAGE - Could not send request\n");
return -1;
}