⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 example.c

📁 移动短信API-v1.1,短信接入源代码
💻 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(&timestamp);	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 + -