8,367
edits
Changes
→Connect to Network via GSM
<br>
* OrangePi_2G_IOT_GSM_Demo.c
<br>
<div style="background:#fbfaf8;padding:20px;">
<nowiki>/*</nowiki><br>
<nowiki>* OrangePi 2G-IOT GSM Demo</nowiki><br>
<nowiki>* (C) Copyright 2017 OrangePi</nowiki><br>
<nowiki>*/</nowiki><br>
<nowiki>#include <stdio.h></nowiki><br>
<nowiki>#include <stdlib.h></nowiki><br>
<nowiki>#include <unistd.h></nowiki><br>
<nowiki>#include <fcntl.h></nowiki><br>
<nowiki>#include <string.h></nowiki><br>
<nowiki>#include <termios.h></nowiki><br>
<nowiki>#include <sys/types.h></nowiki><br>
<nowiki>#include <sys/stat.h></nowiki><br>
<br>
<nowiki>#define NR_CITY 30</nowiki><br>
<nowiki>#define MODEM_PATH "/dev/modem0"</nowiki><br>
<nowiki>#define VERSION "0.1.0"</nowiki><br>
<br>
struct Centry_number {<br>
char *city;<br>
char *number;<br>
} City_Number[NR_CITY] = {<br>
{ "ShenZhen", "13010888500" },<br>
{ "Beijing", "13010112500" },<br>
{ "Shanghai", "13010314500" },<br>
{ "Shandong", "13010171500" },<br>
{ "Jiangsu" , "13010341500" },<br>
{ "Zhejiang", "13010360500" },<br>
{ "Fujian", "13010380500" },<br>
{ "Sichuan", "13010811500" },<br>
{ "Chongqing", "13010831500" },<br>
{ "Hainan" , "13010501500" },<br>
{ "Heilongjiang", "13010980500" },<br>
{ "Jilin", "13010911500" },<br>
{ "Tianjin", "13010130500" },<br>
{ "Hebei", "13010180500" },<br>
{ "Inner Mongolia", "13010950500" },<br>
{ "Shanxi", "13010701500" },<br>
{ "Anhui", "13010305500" },<br>
{ "Xinjiang", "13010969500" },<br>
{ "Qinghai", "13010776500" },<br>
{ "Gansu", "13010879500" },<br>
{ "Ningxia", "13010796500" },<br>
{ "Guizhou", "13010788500" },<br>
{ "Yunnan", "13010868500" },<br>
{ "Hunan", "13010731500" },<br>
{ "Hubei", "13010710500" },<br>
{ "Guangdong", "13010200500" },<br>
{ "Guangxi", "13010591500" },<br>
{ "Henan", "13010761500" },<br>
{ "Jiangxi", "13010720500" },<br>
{ "Liaoning", "13010240500"},<br>
};<br>
<br>
<nowiki>/*</nowiki><br>
<nowiki>*</nowiki>Initialize serial<br>
<nowiki>*/</nowiki><br>
void serial_init(int fd)<br>
{<br>
struct termios options;<br>
<br>
tcgetattr(fd, &options);<br>
options.c_cflag |= (CLOCAL | CREAD);<br>
options.c_cflag &= ~CSIZE;<br>
options.c_cflag &= ~CRTSCTS;<br>
options.c_cflag |= CS8;<br>
options.c_cflag &= ~CSTOPB;<br>
options.c_iflag |= IGNPAR;<br>
options.c_oflag = 0;<br>
options.c_lflag = 0;<br>
cfsetispeed(&options, B9600);<br>
cfsetospeed(&options, B9600);<br>
tcsetattr(fd, TCSANOW, &options);<br>
}<br>
<br>
void display_message(int direction, const char *message)<br>
{<br>
if (direction) {<br>
printf("Send Message ------> %s\n", MODEM_PATH);<br>
printf(">> %s\n", message);<br>
} else {<br>
printf("Rece Message <------ %s\n", MODEM_PATH);<br>
printf("<< %s\n", message);<br>
}<br>
}<br>
<br>
void Send_AT(int fd, const char *str1, const char *str2, const char *str3)<br>
{<br>
char buff[128];<br>
char answer[128];<br>
<br>
memset(buff, 0, sizeof(buff));<br>
if (str1 != NULL)<br>
strcpy(buff, str1);<br>
if (str2 != NULL)<br>
strcat(buff, str2);<br>
if (str3 != NULL)<br>
strcat(buff, str3);<br>
write(fd, buff, strlen(buff));<br>
display_message(1, buff);<br>
<br>
memset(answer, 0, sizeof(answer));<br>
sleep(1);<br>
read(fd, answer, sizeof(answer));<br>
display_message(0, answer);<br>
<br>
}<br>
<br>
int send(int fd, char *cmgf, char *cmgs, char *csca, char *message)<br>
{<br>
/* AT Test */<br>
Send_AT(fd, "AT\r", NULL, NULL);<br>
/* Set Modem Full Function */<br>
Send_AT(fd, "AT +CFUN=", "1", "\r");<br>
/* Set CMGF */<br>
Send_AT(fd, "AT +CMGF=", cmgf, "\r");<br>
/* Set Message Centr Number */<br>
Send_AT(fd, "AT +CSCA=", csca, "\r");<br>
/* Set Receive Number */<br>
Send_AT(fd, "AT +CMGS=", cmgs, "\r");<br>
/* Send Message */<br>
Send_AT(fd, message, NULL, NULL);<br>
}<br>
<br>
int Send_Message(int fd)<br>
{<br>
char buff[128];<br>
char num1[64];<br>
char num2[64];<br>
int i;<br>
int choice;<br>
<br>
printf("********* City Select **********\n");<br>
for (i = 0; i < NR_CITY; i++)<br>
printf("[%2d] %s\n", i, City_Number[i].city);<br>
printf("Please select your City!\n");<br>
scanf("%d", &choice);<br>
do {<br>
memset(num1, 0, sizeof(num1));<br>
printf("\nPlease Entry Receive phone number:\n");<br>
scanf("%s", num1);<br>
} while (strlen(num1) != 11);<br>
<br>
sleep(1);<br>
memset(buff, 0, sizeof(buff));<br>
printf("Please input Meesage:\n");<br>
scanf("%s", buff);<br>
<br>
/* Restruct buff */<br>
i = strlen(buff);<br>
buff[i] = 0x1A;<br>
buff[i+1] = '\r';<br>
buff[i+2] = '\0';<br>
<br>
memset(num2, 0, sizeof(num2));<br>
strcpy(num2, "+86");<br>
strcat(num2, num1);<br>
<br>
memset(num1, 0, sizeof(num1));<br>
strcpy(num1, "+86");<br>
strcat(num1, City_Number[choice].number);<br>
<br>
send(fd, "1", num2, num1, buff);<br>
}<br>
<br>
<nowiki>/*</nowiki><br>
<nowiki>*</nowiki> Call Phone.<br>
<nowiki>*/</nowiki><br>
void Call_Phone(int fd)<br>
{<br>
char buff[128];<br>
char number[20];<br>
<br>
do {<br>
memset(number, 0, sizeof(number));<br>
printf("\nPlease input phone number:");<br>
scanf("%s", number);<br>
} while (strlen(number) != 11);<br>
<br>
memset(buff, 0, sizeof(buff));<br>
strcpy(buff, "+86");<br>
strcat(buff, number);<br>
strcat(buff, ";");<br>
<br>
/* AT Test */<br>
Send_AT(fd, "AT\r", NULL, NULL);<br>
/* Call */<br>
Send_AT(fd, "AT", " DT ", buff);<br>
}<br>
<br>
int main(int argc, char *argv[])<br>
{<br>
int fd;<br>
char choice;<br>
<br>
fd = open(MODEM_PATH, O_RDWR | O_NOCTTY | O_NDELAY);<br>
if (fd < 0) {<br>
printf("Can't open %s\n", MODEM_PATH);<br>
return -1;<br>
}<br>
<br>
/* Initialize /dev/modem0 */<br>
serial_init(fd);<br>
<br>
printf("************************************************\n");<br>
printf("\tWelcome to OrangePi 2G-IOT\n");<br>
printf("\tModem version %s\n", VERSION);<br>
printf("************************************************\n");<br>
printf("Entry your select:\n");<br>
printf("1. Send Message\n");<br>
printf("2. Call Phone\n");<br>
printf("3. Exit\n");<br>
choice = getchar();<br>
<br>
switch (choice) {<br>
case '1':<br>
Send_Message(fd);<br>
break;<br>
case '2':<br>
Call_Phone(fd);<br>
break;<br>
default:<br>
break;<br>
<br>
}<br>
close(fd);<br>
<br>
return 0;<br>
}<br>
</div>
<br>