void unregister_account(pjsua_acc_id acc_id) { pj_status_t status = !PJ_SUCCESS; if (is_registered) { const int u_resolution = 100000; const int retries = (10 * 1000000) / u_resolution; int reconnect_count = 0; pj_status_t status = !PJ_SUCCESS; status = pjsua_acc_set_registration (acc_id, PJ_FALSE); if (status != PJ_SUCCESS) { error_exit("Error in unregister_account()", status); } pjsua_acc_info account_info; pjsua_acc_get_info(acc_id, &account_info); while (account_info.expires >= 0) { pjsua_acc_get_info(acc_id, &account_info); if(usleep(u_resolution) < 0 || reconnect_count > retries) { or_status (OR_ERROR, "ACCOUNT_TIMEOUT"); exit(1); } reconnect_count++; } is_registered = false; } or_status (OR_OK, "Unregistered account "); }
static void ui_register(char menuin[]) { switch (menuin[1]) { case 'r': /* * Re-Register. */ pjsua_acc_set_registration(current_acc, PJ_TRUE); break; case 'u': /* * Unregister */ pjsua_acc_set_registration(current_acc, PJ_FALSE); break; } }
/** * \fn _ics_set_registration() * \brief Tuy chinh che do registration * \param agr1: ics_t *data * agr2: int renew(1= re-register, 0= un-register) */ static void _ics_set_registration(ics_t *data, int renew) { PJ_UNUSED_ARG(data); if (renew == 1 || renew == 0) pjsua_acc_set_registration(data->acc_id, renew); else SHOW_LOG(3, "Invalid input"); }
/** * \fn _ics_add_account() * \brief Them mot tai khoan, neu tai khoan da duoc config se tien hanh register * \param agr1: ics_t *data * agr2: char * server ip * agr3: char * username * agr4: char * password */ static void _ics_add_account(ics_t *data,char *s_ip, char *username, char*password) { pj_status_t status; pjsua_acc_config_default(&data->acfg); pj_str_t server_ip; pj_str_t uri; pj_str_t passwd; char s[50],s1[50]; sprintf(s, "sip:%s@%s", username, s_ip); sprintf(s1, "sip:%s",s_ip); pj_strdup2(data->pool, &server_ip, s); pj_strdup2(data->pool, &uri, s1); pj_strdup2(data->pool, &passwd, password); data->acfg.id = server_ip; data->acfg.reg_uri = uri; data->acfg.cred_count = 1; data->acfg.cred_info[0].realm = pj_str("asterisk"); data->acfg.cred_info[0].scheme = pj_str("digest"); data->acfg.cred_info[0].username = pj_str(username); data->acfg.cred_info[0].data_type = PJSIP_CRED_DATA_PLAIN_PASSWD; data->acfg.cred_info[0].data = passwd; data->acfg.user_data = (void *)data; data->acfg.reg_timeout = 5; if(data->f_account_added) { status = pjsua_acc_modify(data->acc_id, &data->acfg); ICS_RETURN_IF_TRUE(status != PJ_SUCCESS, "Cannot update account"); pjsua_acc_set_registration(data->acc_id, 1); } else { status = pjsua_acc_add(&data->acfg, PJ_TRUE, &data->acc_id); ICS_RETURN_IF_TRUE(status != PJ_SUCCESS, "Cannot register account"); data->f_account_added = 1; } }
int main() { /* system variables */ pj_status_t status; pjsua_config ua_cfg; pjsua_acc_config acc_cfg; pjsua_logging_config log_cfg; pjsua_media_config media_cfg; pjsua_transport_config udp_cfg; pjsua_transport_id transport_id; pjsua_acc_id local_aid; pjsua_acc_id user_aid; // used to send message pj_str_t to; pj_str_t mime_type; pj_str_t content; bShutdown = 0; pthread_cond_init(&_cond, NULL); pthread_mutex_init(&_mutex, NULL); if ( signal( SIGINT, signalHandler ) == SIG_ERR ) { exit( -1 ); } if ( signal( SIGTERM, signalHandler ) == SIG_ERR ) { exit( -1 ); } /** * create pjsua first */ status = pjsua_create(); if(status != PJ_SUCCESS) { pjsua_perror(THIS_FILE, "Error initializing pjsua", status); return status; } /** * init pjsua framework */ /* configuration of ua */ pjsua_config_default(&(ua_cfg)); /** * init callback * set callback functions you need * all the prototype of call are declared in pjsua.h */ // /* call related handle */ // ua_cfg.cb.on_call_state = on_call_state; // ua_cfg.cb.on_incoming_call = on_incoming_call; // ua_cfg.cb.on_call_tsx_state = on_call_tsx_state; // ua_cfg.cb.on_call_media_state = on_call_media_state; // ua_cfg.cb.on_call_sdp_created = on_call_sdp_created; // ua_cfg.cb.on_stream_created = on_stream_created; // ua_cfg.cb.on_stream_destroyed = on_stream_destroyed; // ua_cfg.cb.on_dtmf_digit = on_dtmf_digit; // ua_cfg.cb.on_call_transfer_request = on_call_transfer_request; // ua_cfg.cb.on_call_transfer_request2 = on_call_transfer_request2; // ua_cfg.cb.on_call_transfer_status = on_call_transfer_status; // ua_cfg.cb.on_call_replace_request = on_call_replace_request; // ua_cfg.cb.on_call_replace_request2 = on_call_replace_request2; // ua_cfg.cb.on_call_replaced = on_call_replaced; // ua_cfg.cb.on_call_rx_offer = on_call_rx_offer; // /* register handle */ ua_cfg.cb.on_reg_started = on_reg_started; ua_cfg.cb.on_reg_state = on_reg_state; ua_cfg.cb.on_reg_state2 = on_reg_state2; // /* subscirbe handle */ // ua_cfg.cb.on_incoming_subscribe = on_incoming_subscribe; // ua_cfg.cb.on_srv_subscribe_state = on_srv_subscribe_state; // ua_cfg.cb.on_buddy_state = on_buddy_state; // ua_cfg.cb.on_buddy_evsub_state = on_buddy_evsub_state; // /* message handle */ // ua_cfg.cb.on_pager = on_pager; ua_cfg.cb.on_pager2 = on_pager2; // ua_cfg.cb.on_pager_status = on_pager_status; // ua_cfg.cb.on_pager_status2 = on_pager_status2; // ua_cfg.cb.on_typing = on_typing; // ua_cfg.cb.on_typing2 = on_typing2; // /* network handle */ // ua_cfg.cb.on_nat_detect = on_nat_detect; ua_cfg.cb.on_call_redirected = on_call_redirected; // ua_cfg.cb.on_mwi_state = on_mwi_state; // ua_cfg.cb.on_mwi_info = on_mwi_info; // ua_cfg.cb.on_transport_state = on_transport_state; // ua_cfg.cb.on_call_media_transport_state = on_call_media_transport_state; // ua_cfg.cb.on_ice_transport_error = on_ice_transport_error; // ua_cfg.cb.on_snd_dev_operation = on_snd_dev_operation; // /* media module handle */ // ua_cfg.cb.on_call_media_event = on_call_media_event; // ua_cfg.cb.on_create_media_transport = on_create_media_transport; /* configure logging */ pjsua_logging_config_default(&(log_cfg)); log_cfg.msg_logging = PJ_FALSE; /* configure media */ pjsua_media_config_default(&(media_cfg)); status = pjsua_init(&(ua_cfg), &(log_cfg), NULL); // &(media_cfg)); if(status != PJ_SUCCESS) { pjsua_perror(THIS_FILE, "Error initializing pjsua", status); return status; } status = pjsua_start(); if(status != PJ_SUCCESS) { pjsua_perror(THIS_FILE, "Error starting pjsua", status); return status; } /** * Setup transport */ pjsua_transport_config_default(&udp_cfg); udp_cfg.port = 5091; status = pjsua_transport_create(PJSIP_TRANSPORT_UDP, &udp_cfg, &transport_id); if(status != PJ_SUCCESS) return -1; /** * add local account (sip:domain) which handle sip messages that don't matches any * other accounts */ pjsua_acc_add_local(transport_id, PJ_TRUE, &local_aid); /** * add user account and set it to default account */ pjsua_acc_config_default(&acc_cfg); acc_cfg.id = pj_str("sip:[email protected]"); acc_cfg.reg_uri = pj_str("sip:192.168.1.197"); acc_cfg.reg_timeout = 300; acc_cfg.cred_count = 1; acc_cfg.cred_info[0].realm = pj_str("192.168.1.197"); acc_cfg.cred_info[0].scheme = pj_str("digest"); acc_cfg.cred_info[0].username = pj_str("Server_301007"); acc_cfg.cred_info[0].data_type = PJSIP_CRED_DATA_PLAIN_PASSWD; acc_cfg.cred_info[0].data = pj_str("Server"); acc_cfg.proxy_cnt = 1; acc_cfg.proxy[0] = pj_str("sip:192.168.1.197;lr"); /** * register_on_acc_add is true by default, add: * * acc_cfg.register_on_acc_add = PJ_FALSE; * * to disable register on add.add later you can call the following * code to send a REGISTER. * * pjsua_acc_set_registration(id_of_the_account, PJ_TRUE); * */ status = pjsua_acc_add(&acc_cfg, PJ_TRUE, &user_aid); sleep(2); /** * unregister account before exit */ to = pj_str("sip:[email protected]"); to = pj_str("sip:[email protected]"); mime_type = pj_str("text/plain"); content = pj_str("<?xml version=\"1.0\" encoding=\"UTF-8\"?>" "<SIP_XML EventType=\"TimeSync\">" "<Item operation=\"query\" time=\"0-0-0 0:0:0\"/>" "</SIP_XML>"); content = pj_str("<?xml version=\"1.0\" encoding=\"UTF-8\"?>" "<SIP_XML EventType=\"MediaPlay\">" "<User uri=\"sip:[email protected]\"/>" "<Media type=\"1\" id=\"000001-001\"/>" "</SIP_XML>"); content = pj_str("<?xml version=\"1.0\" encoding=\"UTF-8\"?>" "<SIP_XML EventType=\"MediaTeardown\">" "<User uri=\"sip:[email protected]\"/>" "<Media type=\"1\" id=\"000001-001\"/>" "</SIP_XML>"); { pthread_t tid; // pthread_create(&tid, NULL, test_thread, &user_aid); } pjsua_im_send(user_aid, &to, &mime_type, &content, NULL, NULL); sleep(1); printf("*******************************\n"); printf("pjsua_im_send ok @ main\n"); printf("*******************************\n"); pthread_mutex_lock(&_mutex); pthread_cond_signal(&_cond); pthread_mutex_unlock(&_mutex); // pjsua_call_setting setting; // pjsua_call_setting_default(&setting); // setting.aud_cnt = 0; // setting.vid_cnt = 0; // pjsua_call_id cid; // pjsua_msg_data msg_data; // pjsua_msg_data_init(&msg_data); // msg_data.content_type = pj_str("application/sdp"); // msg_data.msg_body = pj_str( // "v=0\r\n" // "o=adapter 0 0 IN IP4 0.0.0.0\r\n" // "s=-\r\n" // "c=IN IP4 192.168.1.147\r\n" // "t=1371053400 1371057000\r\n" // "m=video 6000 TCP 96\r\n" // "a=rtpmap:98 L16/16000/2\r\n" // "a=ResID:301002-0005\r\n" // "a=WndIndex:1\r\n" // "a=recvonly\r\n"); // sleep(2); // if(pjsua_call_make_call(user_aid, &to, &setting, NULL, NULL, &cid) != PJ_SUCCESS) // PJ_LOG(1, (__FILE__, "failed to make call\n")); while(!bShutdown) { sleep(1); } pjsua_acc_set_registration(user_aid, PJ_FALSE); sleep(1); return status; }
/** * \fn _ics_core_set_registration() * \brief Tuy chinh che do registration * \param agr1: ics_t *data * agr2: int renew(1= re-register, 0= un-register) */ static void _ics_core_set_registration(ics_t *data, int renew) { if (renew == 1 || renew == 0) pjsua_acc_set_registration(data->acc_id, renew); else printf("Invalid input"); }