GPRS-SIM900模块应用程序——发短信打电话

来源:互联网 发布:淘宝虾米vip兑换码激活 编辑:程序博客网 时间:2024/04/28 15:13

上次使用过microcom命令执行过打电话发短信之后。。就像写一个自己的C程序执行它。。

我的虚拟机是centos6.5。。开发板是fl2440跑的Linux3.0的内核。。模块是SIM900的GPRS模块。。sim卡是移动大卡

先看代码

#include<termios.h>      //save struct from serial_init tcgetattr
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<fcntl.h>
#include<string.h>
#include<sys/types.h>
#include<sys/stat.h>


#define len_number  16
#define len_message 128
#define len_swap    32


struct message_info{  //信息结构体。。包括号码和信息
    char cnnu[len_number];
    char phnu[len_number];
    char message[len_message];
};


struct pdu_info{ //转换号码的结构体。。中文短信用到
    char cnswap[len_swap];
    char phswap[len_swap];
};
  
void serial_init(int fd) //初始化串口
{
    struct termios options;
    tcgetattr(fd, &options);
    options.c_cflag |= (CLOCAL | CREAD);
    options.c_cflag &= ~CSIZE;
    options.c_cflag &= ~CRTSCTS;
    options.c_cflag |= CS8;
    options.c_cflag &= ~CSTOPB;
    options.c_iflag |= IGNPAR;
    options.c_oflag  = 0;
    options.c_lflag  = 0;


    cfsetispeed(&options, B115200); //根据自己的波特率进行相应更改
    cfsetospeed(&options, B115200);
    tcsetattr(fd, TCSANOW, &options);
}
 
void swap(char number[], char swap[]) //发送中文短信时用到的转换号码的函数
{
    char ch1[] = "86";
    char tmp[len_number];
    int i;


    memset(swap, 0, len_swap);
    memset(tmp, 0, len_number);
    strcpy(swap, number);
    strcat(swap, "f");    //our phnu is 11 less then 12 so add "f" in the end
    strcat(ch1, swap);
    strcpy(swap, ch1);


    for(i=0; i<strlen(swap)-1; i+=2)
    {
        tmp[i+1] = swap[i];
        tmp[i] = swap[i+1];
    }


    strcpy(swap, tmp);
}


int send(int fd, char *cmgf, char *cmgs, char *message) //发送函数
{
    int nread;
    int nwrite;
    char buff[len_message];
    char reply[len_message];


    memset(buff, 0, len_message); //输入“at+回车”。。并读取返回结果。。将其打印到屏幕上
    strcpy(buff, "at\r");
    nwrite = write(fd, buff, strlen(buff));
    printf("nwrite = %d,%s\n",nwrite, buff);


    memset(reply, 0, len_message);
    sleep(1);
    nread = read(fd, reply, sizeof(reply));
    printf("nread = %d,%s\n",nread, reply);


    memset(buff, 0, len_message);
    strcpy(buff, "AT+CMGF="); //输入"AT+CMGF="。。选择短消息格式。。
    strcat(buff, cmgf); //1对应文本格式。。不支持中文。。0对应PDU模式。。支持中文
    strcat(buff, "\r"); //并读取返回信息。。将其打印到屏幕上
    nwrite = write(fd, buff, strlen(buff));
    printf("nwrite = %d,%s\n", nwrite, buff);


    memset(reply, 0, len_message);
    sleep(1);
    nread = read(fd, reply, sizeof(reply));
    printf("nread = %d,%s\n", nread, reply);


    memset(buff, 0, len_message);
    strcpy(buff, "AT+CMGS="); //输入"AT+CMGS="。。设置字符格式为GSM 模式。。可不用
    strcat(buff, cmgs);
    strcat(buff, "\r");
    nwrite = write(fd, buff, strlen(buff));
    printf("nwrite = %d,%s\n",nwrite, buff);


    memset(reply, 0, len_message);
    sleep(1);
    nread = read(fd, reply, sizeof(reply));
    printf("nread = %d,%s\n",nread, reply);
    
    memset(buff, 0, len_message); //输入信息字符串。。
    strcpy(buff, message);
    nwrite = write(fd, buff, strlen(buff));
    printf("nwrite = %d,%s\n",nwrite, buff);


    memset(reply, 0, len_message);
    sleep(1);
    nread = read(fd, reply, sizeof(reply));
    printf("nread = %d,%s\n",nread, reply);
}


int call(int fd, char *atd) //打电话子函数
{
    int nread;
    int nwrite;
    char buff[len_message];
    char reply[len_message];


    memset(buff, 0, len_message); //发送“at+回车”
    strcpy(buff, "at\r");
    nwrite = write(fd, buff, strlen(buff));
    printf("nwrite = %d,%s\n", nwrite, buff);


    memset(reply, 0, len_message);
    sleep(1);
    nread = read(fd, reply, sizeof(reply));
    printf("nread = %d,%s\n" , nread, reply);


    memset(buff, 0, len_message); //发送“atd+处理好格式的号码字符串”
    strcpy(buff, "atd");
    strcat(buff, atd);
    strcat(buff, "\r");
    nwrite = write(fd, buff, strlen(buff));
    printf("nwrite = %d,%s\n" , nwrite, buff);


    memset(reply, 0, len_message);
    sleep(1);
    nread = read(fd, reply, sizeof(reply));
    printf("nread = %d,%s\n", nread, reply);
}


int call_phone(int fd, struct message_info info) //打电话函数
{
    int conter = 0;
    char atd[16] = {'\0'};
    
    getchar(); //吃掉回车
    printf("enter your phonenumber:\n");
    fgets(info.phnu, (len_message - 1), stdin); //对输入的电话号码进行处理
    while(strlen(info.phnu) != 12)
    {
        if(conter >= 3) //超过三次输入错误即退出
        {
            printf("conter out!\n");
            return -1;
        }
        printf("number should be --11-- bits, enter again:");
        fgets(info.phnu, (len_message - 1), stdin);
        conter++;
    }
    strcat(atd, info.phnu);
    atd[11] =(char){';'};


    call(fd, atd); //处理完号码之后调用打电话子函数
}


int send_en_message(int fd, struct message_info info) //发送英文短信
{
    getchar();
    char cmgf[] = "1";
    int conter = 0;
    char cmgs[16] = {'\0'};


    printf("enter your number:\n");
    fgets(info.phnu, (len_number - 1), stdin); //接受号码
    while(strlen(info.phnu) != 12)
    {
        if(conter == 3)
        {
            printf("contr out!\n");
            return -1;
        }
        printf("number should be --11-- bits ! enter again:");
        fgets(info.phnu, (len_number - 1), stdin);
        conter++;
    }
    printf("enter your message:\n");
    fgets(info.message, (len_message), stdin); //接受短信字符串
    strcat(info.message, "\x1a"); //at命令发送短信时。。输入短信字符串之后要求。。输入ctrl+z而不是回车。。所以这里不加“\r”而是加“\x1a”
    strcat(cmgs, "\""); //这里的电话号码也要用“”变形。。所以加入转意”
    strcat(cmgs, info.phnu);
    cmgs[12] =(char) {'\"'};


    send(fd, cmgf, cmgs, info.message);
}


int send_ch_message(int fd, struct message_info info) //发送中文短信
{
    char cmgf[] = "0";
    char cmgs[4] = {'\0'};
    char ch2[] = "0891";
    char ch3[] = "1100";
    char ch4[] = "000800";
    char ch5[] = "0d91";
    char final[128];
    char *message[3] = { //中文短信这里进行的转码。。本人没做详细实验仅仅是借鉴了网络。。这里需要根据自己输入的号码进行修改。。而不是这串数字固定不变
        "0a5bb691cc7740706bff01",
        "0a5bb691cc67098d3cff01",
        "1a676866539e4fff0c4f605988558a4f6056de5bb65403996dff01"
    };
    struct pdu_info pdu;
    int conter = 0;
    int flag, len,d;
    
    getchar();
    memset(final, 0, 80);


    printf("enter your centre phnumber:\n");
    fgets(info.cnnu, (len_number - 1), stdin);
    while(strlen(info.cnnu) != 11)
    {
        if(conter == 3)
        {
            printf("conter out!\n");
            return -1;
        }
        printf("number should be --11-- bits!enter again:\n");
        fgets(info.cnnu, (len_number - 1), stdin);
        conter++;
    }
   
    conter = 0;
    printf("enter your recever number:\n");
    fgets(info.phnu, (len_number - 1), stdin);
    while(strlen(info.phnu) != 11)
    {
        if(conter == 3)
        {
            printf("conter out!\n");
            return -1;
        }
        printf("number should be --11-- bits!enter again:\n");
        fgets(info.phnu, (len_number - 1), stdin);
        conter++;
    }


    printf("choice message:\n");
    printf("1.fire.\n");
    printf("2.theif.\n");
    printf("3.mother@home.\n");
    scanf("%d", &flag);
    swap(info.phnu, pdu.phswap);
    swap(info.cnnu, pdu.cnswap);


    strcpy(final, ch2);
    strcat(final, pdu.cnswap);
    strcat(final, ch3);
    strcat(final, ch5);
    strcat(final, pdu.cnswap);
    strcat(final, ch4);
    strcat(final, message[flag - 1]);
    strcat(final, "\x1a");


    len = strlen(ch3)+strlen(ch4)+strlen(ch5)+strlen(pdu.phswap)+strlen(message[flag - 1]);
    puts(final);
    sprintf(cmgs, "%d", len/2);
    puts(final);
    send(fd, cmgf, cmgs, final);
}


int main(int argc, char **argv) //main函数
{
    int fd;
    char choice;
    struct message_info info;
    
    fd = open ("/dev/ttyS1", O_RDWR|O_NOCTTY|O_NDELAY); //我的模块外接串口是ttyS1
    if (fd < 0)
    {
        perror("Can't open ttyS1!\n");
    }


    serial_init(fd); //初始化串口

    printf("enter your selete 1 is english, 2 is chinese, 3 is call:\n");
    choice = getchar();
    switch(choice) //功能选择
    {
        case '1':send_en_message(fd, info);
        break;
        case '2':send_ch_message(fd, info);
        break;
        case '3':call_phone(fd, info);
        break;
        case '4':break;
        default:break;
    }
    close (fd); //关闭文件描述符
    return 0;
}


这个就是对GPRS模块进行的发短信打电话的操作了。。中文短信没有尝试。。其中一些对串口的输入输出有问题可以参照我上一篇使用microcom对GPRS芯片 操作的博客。。

这里就不再进一步阐述整个的工作原理。。基本上就是打开文件描述符。。按照microcom操作的那样向串口里面写数据。。不同的是没有回车输入要响应换成ASCII值。。


0 0
原创粉丝点击