Changes

Jump to: navigation, search

Orange Pi 2G-IoT

7,631 bytes added, 11:36, 28 June 2022
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>

Navigation menu