linux gsm中文短信,linux下GSM短信接发送源代码

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include"gsm.h"

#define DEBUG 1

//int main()

int gsm(char * phone_num,char * msg)

{

int ret =

0;

#if 0

char

phone_num[14];

char

msg[256];

memset(phone_num,0,14);

memset(msg,0,256);

gprs_init();

strcpy(phone_num,"18785474001");

strcpy(msg,"你好");

gprs_init();

#endif

printf("%-5d%-5s%-5sphone_num:%-5s msg:%-5s\n",__LINE__, __FILE__,

__func__, phone_num, msg);

ret =

send_pdu (phone_num,msg);

if (0

> ret)

{

return -1;

}

else

{

return 0;

}

}

int gprs_init(void)

{

struct

termios opt;

gsmfd =

open("/dev/ttyUSB0", O_RDWR);

if (gsmfd

< 0)

{

perror("open ttyUSB0");

return -1;

}

tcgetattr(gsmfd, &opt);

cfsetispeed(&opt, B115200);

cfsetospeed(&opt, B115200);

opt.c_cflag &= ~CSIZE;

opt.c_cflag

|=

CS8; //数据位 8

opt.c_cflag

&= ~PARENB; //无校验 NONE

opt.c_cflag

&= ~CSTOPB; //停止位 1

opt.c_cflag

|= (CLOCAL | CREAD);

opt.c_iflag

&= ~(INPCK | BRKINT | ICRNL | ISTRIP | IXON | IXOFF | IXANY);

//无流控

opt.c_oflag

|= OPOST; //输出使能

opt.c_lflag

&= ~(ECHO | ICANON | ISIG | IEXTEN);

tcflush

(gsmfd, TCIOFLUSH);

if

(tcsetattr (gsmfd, TCSANOW, &opt) != 0)

{

perror("Steup Serial");

return -1;

}

return

gsmfd;

}

int send_pdu(char *phone_num, char *msg)

{

char

text[1024];

char

buf[1024];

char

phone[13];

unsigned

char c;

int ret =

0;

memset

(phone, 0, sizeof(phone));

strcpy (

phone, phone_num);

nenum_change

(phone);

#if DEBUG

printf("%s\n",phone);

#endif

ret =

ToUnicodeStr (buf, msg);//转好装入buf

if (ret ==

-1)

{

printf("utf to unicode error!\n");

return -1;

}

#if

DEBUG

printf("%s %d\n", buf, strlen(buf));

#endif

char str1[]

= "0891683108801505F011000D9168";

char str2[]

= "000800";

sprintf (

text, "%s%s%sX%s", str1, phone, str2, strlen(buf)/2, buf);

#if

DEBUG

printf("%s\n", text);

#endif

int length =

strlen(text) - 18;

memset(buf,

0, sizeof(buf));

strcpy(buf,

"AT\r\n");

ret =

write(gsmfd, buf, strlen(buf));

if (ret <

0)

{

perror("write");

return -1;

}

sleep(1);

memset(buf, 0, sizeof(buf));

ret =

read(gsmfd, buf, sizeof(buf));

if (ret <

0)

{

perror("read");

return -1;

}

#if DEBUG

printf("%s\n", buf);

#endif

memset(buf, 0, sizeof(buf));

strcpy(buf, "AT+CMGF=0\r\n"); //设置为PDU模式

ret = write(gsmfd, buf, strlen(buf));

if (ret < 0)

{

perror("write");

return -1;

}

sleep(1);

memset(buf, 0, sizeof(buf));

ret = read(gsmfd, buf, sizeof(buf));

if (ret < 0)

{

perror("read");

return -1;

}

#if DEBUG

printf("%s\n", buf);

#endif

memset(buf, 0, sizeof(buf));

strcpy(buf, "AT+CSCS="GSM"\r\n");

//设置GSM字符集,这种可以发送140个字节,

ret = write(gsmfd, buf, strlen(buf));

if (ret < 0)

{

perror("write");

return -1;

}

sleep(1);

memset(buf, 0, sizeof(buf));

ret = read(gsmfd, buf, sizeof(buf));

if (ret < 0)

{

perror("read");

return

-1;

}

#if DEBUG

printf("%s\n", buf);

#endif

memset(buf, 0, sizeof(buf));

strcpy(buf, "AT+CSMP=17,167,0,8\r\n"); //设置模式参数,8表示unicode编码

ret = write(gsmfd, buf, strlen(buf));

if (ret < 0)

{

perror("write");

return

-1;

}

sleep(1);

memset(buf, 0,

sizeof(buf));

ret = read(gsmfd, buf,

sizeof(buf));

if (ret < 0)

{

perror("read");

return -1;

}

#if DEBUG

printf("%s\n", buf);

#endif

memset(buf, 0, sizeof(buf));

sprintf(buf, "%s%d%s", "AT+CMGS=", length/2,

"\r\n"); //信息长度,不算信息中心

ret = write(gsmfd, buf, strlen(buf));

if (ret < 0)

{

perror("write");

return -1;

}

sleep(1);

memset(buf, 0,

sizeof(buf));

ret = read(gsmfd, buf,

sizeof(buf));

if (ret < 0)

{

perror("read");

return -1;

}

#if DEBUG

printf("%s\n", buf);

#endif

ret = write(gsmfd, text,

strlen(text)); //信息内容,已经转为unicode编码

if (ret < 0)

{

perror("write");

return -1;

}

sleep(1);

memset(buf,0,sizeof(buf));

ret = read(gsmfd, buf,

sizeof(buf));

if (ret < 0)

{

perror("read");

return -1;

}

#if DEBUG

printf("%s\n", buf);

#endif

c =

0x1A; //结束字符

ret = write(gsmfd, &c,

1);

if (ret < 0)

{

perror("write");

return -1;

}

memset(buf,0,sizeof(buf));

while(1)

{

sleep(1);

ret = read(gsmfd, buf, sizeof(buf));

if (ret < 0)

{

perror("read");

return -1;

}

if (strstr(buf, "OK")!=NULL)

{

printf("发送成功!!\n");

return 1;

}

}

#if DEBUG

printf("%s\n", buf);

#endif

return 0;

}

void nenum_change (char *pnum)

{

int i =

0;

char

temp;

pnum[11]='F';

while(i <

11)

{

temp = pnum[i];

pnum[i] = pnum[i+1];

pnum[i+1] = temp;

i = i + 2;

}

#if DEBUG

printf("neum

change seccss\n");

#endif

}

void toUnicode (wchar_t *pWstring, char *pResult)

{

unsigned int

i;

for(i = 0; i

< wcslen(pWstring);++i)

{

sprintf(pResult,"X",pWstring[i]);

pResult += 4;

}

}

int Unicode (char* utf, char* dest) //转换结果保存值dest

{

if(!setlocale(LC_ALL,"zh_CN.UTF-8"))

{

printf("locale failed!\n");

return -1;

} memset(dest,0,256);

strcpy(dest,utf);//转码内容

wchar_t

wbuf[256];

size_t rc =

mbstowcs(wbuf,dest,sizeof(wbuf)/sizeof(wbuf[0]-1));

if(rc >=

0)

{

wbuf[rc] = L'\0';

memset(dest,0x00,256);

toUnicode(wbuf,dest);

}

#if DEBUG

printf("to

unicode sccess\n");

#endif

return

0;

}

int send_test (char *phone_num, char

*msg)

{

char buf[1024];

int ret;

memset(buf,0,sizeof(buf));

strcpy(buf,"AT+CMGF=1\r\n");

ret = write(gsmfd,buf,sizeof(buf));

if(ret == -1){

perror("write");

return -1;

}

sleep(1);

memset(buf,0,sizeof(buf));

ret = read(gsmfd,buf,sizeof(buf));

if(ret == -1){

perror("read");

return -1;

}

#if DEBUG

printf("%s\n",buf);

#endif

strcpy(buf,"AT+CSCS="GSM"r\n");

ret = write(gsmfd,buf,sizeof(buf));

if(ret < 0)

{

perror("write");

return -1;

}

memset(buf,0,sizeof(buf));

sleep(1);

ret = read(gsmfd,buf,sizeof(buf));

if(ret < 0)

{

perror("read");

return -1;

}

#if DEBUG

printf("%s\n",buf);

#endif

memset(buf,0,sizeof(buf));

strcpy(buf,"AT+CSMP=17,167,0,0\r\n");

ret = write(gsmfd,buf,sizeof(gsmfd));

if(ret < 0){

perror("write");

return -1;

}

sleep(1);

memset(buf,0,sizeof(buf));

ret =

read(gsmfd,buf,sizeof(buf));

if(ret <

0){

perror("read");

return -1;

}

#if DEBUG

printf("%s",buf);

#endif

sprintf(buf,"%s%s%s","AT+CMGS=",phone_num,"\r\n");

ret =

write(gsmfd,buf,sizeof(buf));

if(ret <

0)

{

perror("write");

return -1;

}

memset(buf,0,sizeof(buf));

sleep(1);

ret =

read(gsmfd,buf,sizeof(buf));

if(ret <

0){

perror("read");

return -1;

}

#if DEBUG

printf("%s\n",buf);

#endif

memset(buf,0,sizeof(buf));

strcpy(buf,msg);

ret =

write(gsmfd,buf,sizeof(buf));

if(ret <

0){

perror("write");

return -1;

}

sleep(1);

memset(buf,0,sizeof(buf));

ret =

read(gsmfd,buf,sizeof(buf));

if(ret <

0){

perror("read");

return -1;

}

#if DEBUG

printf("%s\n",buf);

#endif

ret =

write(gsmfd,"0x1A",1);

memset(buf,0,sizeof(buf));

ret =

read(gsmfd,buf,sizeof(buf));

if(ret <

0){

perror("read");

return -1;

}

ret =

read(gsmfd,buf,sizeof(buf));

if(ret <

0){

perror("read");

return -1;

}

#if DEBUG

printf("%s\n",buf);

#endif

return

0;

}

int utf8_to_unicode (const char* pInput, char** ppOutput)

{

int

outputSize = 0;

//记录转换后的Unicode字符串的字节数 *ppOutput =

(char *)malloc(strlen(pInput) * 2); //为输出字符串分配足够大的内存空间

memset(*ppOutput, 0, strlen(pInput) * 2);

char *tmp =

*ppOutput; //临时变量,用于遍历输出字符串

while

(*pInput)

{

if (*pInput > 0x00 && *pInput <= 0x7F)

//处理单字节UTF8字符(英文字母、数字)

{

*tmp = *pInput;

tmp++;

*tmp = 0; //小端法表示,在高地址填补0

}

else if (((*pInput) & 0xE0) == 0xC0) //处理双字节UTF8字符

{

char high = *pInput;

pInput++;

char low =

*pInput;

if ((low & 0xC0) != 0x80) //检查是否为合法的UTF8字符表示

{

return -1; //如果不是则报错

}

*tmp = (high << 6) + (low & 0x3F);

tmp++;

*tmp = (high >> 2) & 0x07;

}

else if (((*pInput) & 0xF0) == 0xE0) //处理三字节UTF8字符

{

char high = *pInput;

pInput++;

char middle = *pInput;

pInput++;

char low =

*pInput;

if (((middle & 0xC0) != 0x80) || ((low & 0xC0) !=

0x80))

{

return -1;

} *tmp = (middle << 6) + (low & 0x7F);

tmp++;

*tmp = (high << 4) + ((middle >> 2) & 0x0F);

}

else //对于其他字节数的UTF8字符不进行处理

{

return -1;

} pInput++;

tmp++;

outputSize += 2;

} *tmp = 0;

tmp++;

*tmp = 0;

return

outputSize;

} //一个调用示例

// unicode to string

int ToUnicodeStr (char *out, char *str)

{ int i =

0;

char

buf[1024] = {0};

//char str[]

= "你好,hello";

char* uni =

NULL;

int num =

utf8_to_unicode (str, &uni);

if (num ==

-1)

{

printf("Error!\n");

return num;

}

else

{

char* p = uni;

#if 1

char temp;

for (i = 0; i < num; i = i+2)

{

temp = p[i];

p[i] = p[i+1];

p[i+1] = temp;

}

#endif

for (i = 0; i < num; i++)

{

// printf("X", *p);

sprintf(buf, "%sX", buf, *p); //16进制格式化成字符串

p++;

}

strcpy(out, buf);

}

free(uni);

//释放内存 return

0;

}

基于linux下实现GSM短信发送源代码,经历一周时间终于实现成功发送短信,睡觉

a4c26d1e5885305701be709a3d33442f.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值