#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短信发送源代码,经历一周时间终于实现成功发送短信,睡觉