📄 example.c
字号:
#include <stdio.h>#include <stdlib.h>#include <time.h>#include "api.h"#define TRAND(limit,n) {struct timeval t;gettimeofday(&t,(void*)NULL);\ (n)=rand_r((unsigned *)&t.tv_usec)%limit;}void print_submit_packet(cmpp30icp_submit *pk){ int i; printf("DDD 1 msg_id : %I64x\n",pk->msg_id); printf("DDD 2 pk_total: %d\n",pk->pk_total); printf("DDD 3 pk_number: %d\n",pk->pk_number); printf("DDD 4 registered: %d\n",pk->registered_delivery); printf("DDD 5 msg_level: %d\n",pk->msg_level); printf("DDD 6 svc_type: %s\n",pk->svc_type); printf("DDD 7 fee_utype: %d\n",pk->fee_utype); printf("DDD 8 fee_user: %s\n",pk->fee_user); printf("DDD 9 fee_user_type: %d\n", pk->fee_user_type); printf("DDD 9 tp_pid : %d\n",pk->tp_pid); printf("DDD 10 tp_udhi : %d\n",pk->tp_udhi); printf("DDD 11 data_coding: %d\n",pk->data_coding); printf("DDD 12 icp_id : %s\n",pk->icp_id); printf("DDD 13 fee_type: %s\n",pk->fee_type); printf("DDD 14 fee_code: %s\n",pk->fee_code); printf("DDD 15 validate: %s\n",pk->validate); printf("DDD 16 schedule: %s\n",pk->schedule); printf("DDD 17 src_id : %s\n",pk->src_term_id); printf("DDD 18 du_count: %d\n",pk->du_count); for(i=0; i<pk->du_count; i++) { printf("DDD 19 dst_id[%d]: %s\n", i, pk->dst_addr+i*CMPP30_MAX_PSEUDO_LEN); } printf("DDD 20 dst_usr_type: %d\n", pk->dst_user_type); printf("DDD 21 sm_len : %d\n",pk->sm_len); printf("DDD 22 short_msg %s\n",pk->short_msg); printf("DDD 23 link_id : %s\n", pk->link_id); }void print_deliver_packet(cmpp30icp_deliver *pk){ cmpp30icp_status_report report; int len = 0; char base64_out[50]; memset(&report, 0, sizeof(cmpp30icp_status_report)); memset(base64_out, 0, sizeof(base64_out)); printf("DDD 1 msg_id : %I64x\n",pk->msg_id); printf("DDD 2 dst_addr: %s\n",pk->dst_addr); printf("DDD 3 svc_type: %s\n",pk->svc_type); printf("DDD 4 tp_pid: %u\n",pk->tp_pid); printf("DDD 5 tp_udhi: %u\n",pk->tp_udhi); printf("DDD 6 data_coding: %u\n",pk->data_coding); printf("DDD 7 src_addr: %s\n",pk->src_addr); printf("DDD 7 src_user_type: %d\n",pk->src_user_type); printf("DDD 8 registered_delivery: %u\n",pk->registered_delivery); printf("DDD 9 sm_len: %u\n",pk->sm_len); printf("DDD 10 link_id : %s\n",pk->link_id); if(!pk->registered_delivery){//收到的是mo消息 printf("DDD 11 short_msg: %s\n",pk->short_msg); }else{//收到的是状态报告 memcpy(&report.msg_id , pk->short_msg, sizeof(dpl_uint64_t)); printf("DDD 12 the report_msg_id is %I64x\n", ntohll(report.msg_id)); len += sizeof(dpl_uint64_t); memcpy(&report.stat, pk->short_msg+len, 7); printf("DDD 13 stat: %s\n",report.stat);//状态报告中的状态 len += 7; memcpy(&report.submit_date, pk->short_msg+len, CMPP30_DATE_TIME_LEN); printf("DDD 14 submit_date: %s\n",report.submit_date); len += CMPP30_DATE_TIME_LEN; memcpy(&report.final_date, pk->short_msg+len, CMPP30_DATE_TIME_LEN); printf("DDD 15 final_date: %s\n",report.final_date); len += CMPP30_DATE_TIME_LEN; memcpy(&report.dest_id, pk->short_msg+len, CMPP30_MAX_PSEUDO_LEN); printf("DDD 16 dest_id: %s\n",report.dest_id); if(pk->src_user_type){//源用户是伪码 (void)cmpp30icp_convert_src_addr_to_base64(base64_out, \ report.dest_id); printf("the base64_out is %s\n", base64_out); } len += CMPP30_MAX_PSEUDO_LEN; memcpy(&report.cdr_msg_id, pk->short_msg+len, sizeof(dpl_uint32_t)); }}dpl_status_t login_value_set(cmpp30icp_login *cl){ dpl_status_t stat; time_t timestamp; time(×tamp); strncpy(cl->icp_id,"908888", sizeof(cl->icp_id)); strncpy(cl->icp_auth,"908888", sizeof(cl->icp_auth)); cl->if_version = 0x12; cl->icp_timestamp = timestamp; return DPL_SUCCESS;}dpl_status_t submit_value_set(cmpp30icp_submit *cs){ dpl_status_t stat; /* 具体每个域的值和含义见submit消息体 */ (void)cmpp30icp_submit_init(cs); (void)cmpp30icp_submit_set_pk_total(cs, 1); (void)cmpp30icp_submit_set_pk_number(cs, 1); (void)cmpp30icp_submit_set_registered_delivery(cs, 1); (void)cmpp30icp_submit_set_msg_level(cs, 1); (void)cmpp30icp_submit_set_svc_type(cs, "tq"); (void)cmpp30icp_submit_set_fee_utype(cs, 2); (void)cmpp30icp_submit_set_fee_user(cs, "AAAk//+RMSP///8BO///wmMAhhyPWp9Il+cr1YUMWc=", 1); (void)cmpp30icp_submit_set_tp_pid(cs, 0); (void)cmpp30icp_submit_set_tp_udhi(cs, 0); (void)cmpp30icp_submit_set_data_coding(cs, 1); (void)cmpp30icp_submit_set_icp_id(cs, "908888"); (void)cmpp30icp_submit_set_fee_type(cs, "02"); (void)cmpp30icp_submit_set_fee_code(cs, "12"); strcpy(cs->validate, ""); strcpy(cs->schedule, ""); (void)cmpp30icp_submit_set_validate(cs, ""); (void)cmpp30icp_submit_set_schedule(cs, ""); (void)cmpp30icp_submit_set_src_term_id(cs, "8888"); (void)cmpp30icp_submit_set_du_count(cs,1); cs->dst_addr = (char *)malloc(32*cs->du_count); memset(cs->dst_addr, 0, 32*cs->du_count); (void)cmpp30icp_submit_set_dst_addr(cs, "AAAk//+RMSP///8BO///wmMAhhyPWp9Il+cr1YUMWc=", 1, 1); (void)cmpp30icp_submit_set_short_msg(cs, "test", 4); (void)cmpp30icp_submit_set_link_id(cs, "12345678901234567890"); (void)print_submit_packet(cs); return DPL_SUCCESS;}main(int argc, char ** argv){ dpl_status_t stat; cmpp30_icp_trans conn; cmpp30icp_submit cs; cmpp30icp_login cl; cmpp30_icp_packet icp_packet; cmpp30icp_deliver_rsp deliver_rsp; dpl_uint32_t status = 0; int type,seq; dpl_uint8_t result; memset(&cs,0,sizeof(cmpp30icp_submit)); memset(&cl,0,sizeof(cmpp30icp_login)); memset(&conn,0,sizeof(conn)); memset(&icp_packet, 0, sizeof(cmpp30_icp_packet)); stat = cmpp30_connect_to_ismg("10.46.10.15",7891,&conn);//与网关建立socket连接 if(stat != DPL_SUCCESS){ printf("cmpp30_connect_to_ismg stat is %d\n", stat); goto finished; } login_value_set(&cl);//填充login包 stat = cmpp30icp_login_send(&conn,&cl);//向网关发送login包 if(stat != DPL_SUCCESS){ printf("cmpp30icp_login_send stat is %d\n", stat); goto finished; } stat = cmpp30icp_read_packet(&conn,&icp_packet,&status);//读取来自网关的消息包 if(stat != DPL_SUCCESS){ printf("cmpp30icp_read_packet stat is %d\n", stat); goto finished; } if(status != 0){ printf("cmpp30icp_read_packet status is %d\n", status); goto finished; } type = icp_packet.pk_cmd; seq = icp_packet.pk_seq; result = icp_packet.pk_data.login_resp_body.status;//login_resp printf("<login_resp>[type=%08x][seq=%08x][result=%02x]\n",\ type,seq,result); if(result != 0){ printf("cmpp30 conect smg error result is %d\n", result); goto finished; } while(1){ memset(&cs,0,sizeof(cmpp30icp_submit)); submit_value_set(&cs);//填充submit包 stat = cmpp30icp_submit_send(&conn, &cs);//向网关发送submit包 if(stat != DPL_SUCCESS){ printf("cmpp30icp_submit_send stat is %d\n", stat); goto finished; } free(cs.dst_addr);//释放填充目的地址时申请的内存read_packet: memset(&icp_packet, 0, sizeof(cmpp30_icp_packet)); stat = cmpp30icp_read_packet(&conn,&icp_packet,&status); if(stat != DPL_SUCCESS){ printf("cmpp30icp_read_packet stat is %d!\n", stat); goto finished; } type = icp_packet.pk_cmd; seq = icp_packet.pk_seq; result = icp_packet.pk_data.submit_resp_body.result; if(type == 0x5){//收到mo消息 printf("=====================deliver packet===============================\n"); (void)print_deliver_packet(&icp_packet.pk_data.deliver_body); type = icp_packet.pk_cmd; seq = icp_packet.pk_seq; printf("<deliver>[type=%08x][seq=%08x]\n",\ type,seq); deliver_rsp.msg_id = icp_packet.pk_data.deliver_body.msg_id; deliver_rsp.result = 0; stat = cmpp30icp_deliver_resp_send(&conn, &deliver_rsp, seq);//向网关发送deliver应答包 if(stat != DPL_SUCCESS){ printf("cmpp30icp_deliver_resp_send stat is %d\n", stat); goto finished; } printf("=====================deliver packet===============================\n"); goto read_packet; } if(type == 0x8){//收到active包 printf("=====================active packet===============================\n"); type = icp_packet.pk_cmd; seq = icp_packet.pk_seq; printf("<active>[type=%08x][seq=%08x]\n",\ type,seq); stat = cmpp30icp_active_rsp(&conn, 0, seq);//向网关发送active应答包 if(stat != DPL_SUCCESS){ printf("cmpp30icp_active_rsp stat is %d\n", stat); goto finished; } printf("=====================active packet===============================\n"); goto read_packet; } //submit_resp if(type == 0x80000004) printf("<submit_resp>[type=%08x][seq=%08x][result=%02x]\n",\ type,seq,result); _sleep(2000); }finished: cmpp30icp_logout_send(&conn); (void)cmpp30_disconnect_from_ismg(&conn);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -