可以通过短息的方式控制我们的设备。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <sys/types.h>
nbsp; #include <sys/stat.h>
#include <termios.h>
#include <unistd.h>
#define DEV_GPRS "/dev/ttyUSB0"
void gsm_serial_init(int fd);
int receive_message(int dev_fd);
//***********************************************************************
struct Message{
char size[4];
char which;
char size_tal[16];
char info[128];
}gprs_msg[] = {
{"16", 0, "AT+CMGS=37\r", "5F53524D6E7F5EA68D858FC78BBE5B9A4E0A9650FF01"},//当前湿度超过设定上限!
{"0e", 1, "AT+CMGS=29\r", "6709964C751F4EBA95EF5165FF01"}, //有陌生人闯入!
{"1a",2,"AT+CMGS=41\r","5F53524D514971675F3A5EA68D858FC78BBE5B9A4E0A9650FF01"},//当前光照超过设定上限!
{"16", 3, "AT+CMGS=37\r", "5F53524D6E295EA68D858FC78BBE5B9A4E0A9650FF01"}//当前温度超过设定上限!
};
/******************************主函数*************************************/
int main()
{
int fd;
if((fd = open(DEV_GPRS,O_RDWR | O_NOCTTY | O_NDELAY)) < 0)//可读写方式打开,不受干扰,无延迟;
{
printf("Fail to open DEV_GSM !\n");
return -1;
}
receive_message(fd);
close(fd);
return 0;
}
//*******************************************************************
void gsm_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, B9600);
cfsetospeed(&options, B9600);
tcsetattr(fd,TCSANOW, &options);
printf("init gprs over...\n");
return ;
}
//*******************************************************************
int receive_message(int dev_fd)
{
int message_all_number;//短信总数
int message_content;//短信内容
int nread;
int nwrite;
char send_buff[128];
char recv_buff[128];
gsm_serial_init(dev_fd);
//AT
memset(send_buff, 0, sizeof(send_buff));
strcpy(send_buff, "AT\r");
nwrite = write(dev_fd, send_buff, strlen(send_buff));
printf("Step1: %s\n", send_buff);
//waiting for AT's ACK
memset(recv_buff, 0, sizeof(recv_buff));
sleep(1);
nread = read(dev_fd, recv_buff, sizeof(recv_buff));
printf("return1: %s\n", recv_buff);
/*******************************************************/
//AT+CNMI=2,1,0,0
memset(send_buff, 0, sizeof(send_buff));
strcpy(send_buff, "AT+CNMI=2,1,0,0\r");
nwrite = write(dev_fd, send_buff, strlen(send_buff));
printf("Step2: %s\n", send_buff);
//waiting for AT+CNMI's ACK
memset(recv_buff, 0, sizeof(recv_buff));
sleep(1);
nread = read(dev_fd, recv_buff, sizeof(recv_buff));
printf("return2: %s\n", recv_buff);
memset(recv_buff, 0, sizeof(recv_buff));
/******************************************************/
/******************************************************/
while(1)
{
nread = read(dev_fd, recv_buff, sizeof(recv_buff));
if(recv_buff != 0)
{
if(strstr(recv_buff,"+") != NULL)
{
printf("the message is coming\n");
//AT+CMGR=1
memset(send_buff, 0, sizeof(send_buff));
strcpy(send_buff, "AT+CMGR=1\r");
&nnbsp; nwrite = write(dev_fd, send_buff, strlen(send_buff));
sleep(1);
memset(send_buff, 0, sizeof(send_buff));
// //AT+CMGL
// memset(send_buff, 0, sizeof(send_buff));
// strcpy(send_buff, "AT+CMGL\r");
// nwrite = write(dev_fd, send_buff, strlen(send_buff));
// printf("write order: %s\n", send_buff);
// sleep(1);
// memset(send_buff, 0, sizeof(send_buff));
 nbsp; //waiting for AT+CMGR=1's ACK
memset(recv_buff, 0, sizeof(recv_buff));
sleep(10);
nread = read(dev_fd, recv_buff, sizeof(recv_buff));
if(strstr(recv_buff,"+CMGL:") != NULL){ //字符串比较判断接受的字符里面是否有+CMGL
printf("the message content is 1_1: %s\n", recv_buff);
}
printf("the message content is: %s\n", recv_buff);
memset(recv_buff, 0, sizeof(recv_buff));
break;
nbsp; }
}
}
return 0;
}
我们可以通过strstr()函数实现字符串内容的比较,通过短息内容的判断,可以实现控制我们的远程设备的功能。