打开主菜单

Wiki-Orange Pi β

更改

Orange Pi 2G-IoT

添加10,600字节, 2022年6月28日 (二) 11:39
无编辑摘要
然后设置 pin 脚的模式,可以为 INPUT 或 OUTPUT 模式,注意 pin 脚的编号因以wiringPi 定义的为依据。<br>
最后使用 digitalWrite() 和 digitalRead() 对 Pin 进行读写操作。<br><br>
 
=== 使用 GSM 上网,打电话和发短信 ===
目前官方 OrangePi 2G-IoT Linux 发行版支持 Ubuntu, Debian 和 Raspbian, 这些发新版已经支持 SMS 发短信功能,开发者请到官网(http://www.orangepi.cn/downloadresourcescn/) <br>
下载最新的 Linux 发行版镜像。在使用 SMS 功能之前,请自行准备一张移动或联通 SIM 卡,并确保激活可以使用。<br>
* SMS 前期准备<br>
准备一张中国联通或移动 SIM 卡,国外开发者可以根据频段选择对应的运用商 SIM 卡,OrangePi 2G-IoT 支持的频段如下:<br>
准好 SIM 卡之后,将其安装到 OrangePi 2G-IoT 卡槽中,注意,OrangePi2G-IoT SIM 卡槽支持 Micro 类型的卡。<br><br>
[[Image:2GIoT-22.png]]<br><br>
安装 SIM 卡,注意插入的方向,SIM 卡缺角方向在外侧<br><br>
[[Image:2GIoT-23.png]]<br><br>
* 登录 Linux<br>
插好卡之后,上电启动 Linux 系统,用户可以使用多种方式连接系统,其中包括串口方式连接,ssh 方式连接等。<br><br>
* 如果使用串口方式连接,波特率请设置为 921600。<br><br>
[[Image:2GIoT-24.png]]<br><br>
1)多种方式使用 SMS<br>
OrangePi 2G-IoT 的 Linux 发行版有多种方式可以使用 SMS 功能,本文重点介绍串口方式和 C 程序方式。<br><br>
'''a.串口方式'''<br>
该方式需要在 OrangePi 2G-IOT 上安装串口工具 minicom,开发者可以在OrangePi 2G-IoT 上进行安装,安装之前请确保 OrangePi 2G-IOT 已经连上wifi。<br>
开发者使用如下命令进行 minicom 的安装:<br>
sudo apt-get install minicom
OrangePi 中 AP 核与 Modem 之间通过串口进行通信,Linux 系统启动之后, 会在 /dev/ 目录下生成 modem0 节点。<br>
开发者可以使用串口工具连接到 /dev/modem0 节点上。其中推荐使用 minicom 进行连接,开发者也可以参照使用其他串口工具。<br>
开发者在使用 minicom 或其他串口工具进行连接时,请参考一下步骤:<br>
在 OrangePi 2G-IOT Linux 系统上使用 minicom 连接 /dev/modem0, 用户可以使用如下命令进行配置<br>
sudo minicmo -s
输入命令之后,进入配置界面,如下图,选择 "Serial port setup"<br><br>
[[Image:2GIoT-25.png]]<br><br>
按下 “A” 修改 '''Serial Device 为 /dev/modem0'''<br><br>
[[Image:2GIoT-26.png]]<br><br>
'''b.使用 AT 指令集进行短信的发送'''<br>
首先输入 AT 命令对 Modem 状态进行检查,如果 Modem 回复 OK,表示 Modem 连接正常。<br><br>
[[Image:2GIoT-27.png]]<br><br>
接着输入 AT +cfun=1 命令打开 Modem 的全功能, Modem 将返回命令执行的结果<br><br>
[[Image:2GIoT-28.png]]<br><br>
+CIEV 代表<br>
接着设置短信的明码或暗码方式,例子使用明码方式。<br>
使用 "AT +CMGF=1" 进行指定,设置成功后,Modem 将返回 OK。<br><br>
[[Image:2GIoT-29.png]]<br><br>
然后设置消息中心号码,这个设置很重要,如果这个设置不对,信息无法发送。每个城市有不同的消息中心号码,具体消息中心号码,请参考本文关于消息中心号码的介绍。<br>
例如,测试卡所在的城市是'''深圳''',深圳对应的消息中心号码为: '''8613010888500''' 或者 '''008613010888500'''<br>
开发者可以使用 “'''AT+CSCA?'''” 查询当前的消息中心号码,如果消息中心号码与本城市对应的消息中心号码不同,可以使用 '''AT +CSCA="+86xxxxx"''' 指定。<br><br>
[[Image:2GIoT-30.png]]<br><br>
最后使用命令 AT +CMGS 进行短信的发送,命令后面紧接要发送的号码,号码以 + 号开始,后接国家编号,具体国家编号可以执行 google,中国编号为 86, 在接上接收方号码。<br>
输入该命令之后,串口会打印 > 提示输出短信的内容,然后开发者输入要发送的内容。<br>
输入完之后,同时按下 Ctrl + Z 来进行短信的发送。<br><br>
[[Image:2GIoT-31.png]]<br><br>
'''c.C 程序方式发短信'''<br><br>
C 代码中发短信的流程与 AT 发端的流程一样,也使用串口和 Modem 进行通信,然后交换 AT 命令。具体流程如下:<br>
首先,初始化串口:<br>
[[Image:2GIoT-32.png]]<br><br>
发送 AT 命令函数<br><br>
[[Image:2GIoT-33.png]]<br><br>
AT 发短信流程<br><br>
[[Image:2GIoT-34.png]]<br><br>
完整程序见附录 “'''OrangePi_2G_IOT_GSM_Demo.c'''” <br>
运行 C 程序效果如下:<br><br>
[[Image:2GIoT-35.png]]<br><br>[[Image:2GIoT-36.png]]<br><br>[[Image:2GIoT-37.png]]<br><br>[[Image:2GIoT-38.png]]<br><br>[[Image:2GIoT-39.png]]<br><br>
最终,手机收到来自 OrangePi 2G-IOT 的短信。<br><br>
[[Image:2GIoT-40.png]]<br><br>
 
* OrangePi_2G_IOT_GSM_Demo.c<br>
{| class="wikitable" style="width:800px;"
|-
|
<nowiki>/*</nowiki><br>
<nowiki>*</nowiki>OrangePi 2G-IOT GSM Demo<br>
<nowiki>/*</nowiki> (C) Copyright 2017 OrangePi<br>
<nowiki>/*</nowiki><br>
<nowiki>#</nowiki>include <stdio.h><br>
<nowiki>#</nowiki>include <stdlib.h> <br>
<nowiki>#</nowiki>include <unistd.h> <br>
<nowiki>#</nowiki>include <fcntl.h> <br>
<nowiki>#</nowiki>include <string.h> <br>
<nowiki>#</nowiki>include <termios.h> <br>
<nowiki>#</nowiki>include <sys/types.h> <br>
<nowiki>#</nowiki>include <sys/stat.h><br><br>
 
<nowiki>#</nowiki>define NR_CITY 30<br>
<nowiki>#</nowiki>define MODEM_PATH "/dev/modem0" <br>
<nowiki>#</nowiki>define VERSION "0.1.0"<br>
struct Centry_number <br>
{ char *city;<br>
char *number;<br>
} <br><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); printf(">> %s\n", message);<br>
} else {<br>
printf("Rece Message <------ %s\n", MODEM_PATH); 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>
memset(buff, 0, sizeof(buff)); if (str1 != NULL)<br>
strcpy(buff, str1); if (str2 != NULL)<br>
strcat(buff, str2); if (str3 != NULL)<br>
strcat(buff, str3); write(fd, buff, strlen(buff)); display_message(1, buff);<br><br>
 
memset(answer, 0, sizeof(answer)); sleep(1);<br>
read(fd, answer, sizeof(answer)); 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 */ Send_AT(fd, "AT +CFUN=", "1", "\r");<br>
/* Set CMGF */<br>
Send_AT(fd, "AT +CMGF=", cmgf, "\r");<br>
/* Set Message Centr Number */ 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]; char num1[64]; char num2[64]; int i;<br>
int choice;<br><br>
printf("********* City Select **********\n"); for (i = 0; i < NR_CITY; i++)<br>
printf("[%2d] %s\n", i, City_Number[i].city); printf("Please select your City!\n"); scanf("%d", &choice);<br>
do {<br>
memset(num1, 0, sizeof(num1));<br>
printf("\nPlease Entry Receive phone number:\n"); scanf("%s", num1);<br>
} while (strlen(num1) != 11);<br><br>
 
sleep(1);<br>
memset(buff, 0, sizeof(buff)); printf("Please input Meesage:\n"); scanf("%s", buff);<br>
 
/* Restruct buff */ i = strlen(buff); buff[i] = 0x1A; buff[i+1] = '\r';<br>
buff[i+2] = '\0';<br><br>
 
memset(num2, 0, sizeof(num2));<br>
strcpy(num2, "+86"); 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);
}
 
 
<nowiki>/*</nowiki><br>
<nowiki>*</nowiki> Call Phone.<br>
<nowiki>/*</nowiki><br>
void Call_Phone(int fd)<br>
{<br>
char buff[128]; char number[20];<br>
 
do {<br>
memset(number, 0, sizeof(number)); printf("\nPlease input phone number:"); scanf("%s", number);<br>
} while (strlen(number) != 11);<br><br>
 
 
memset(buff, 0, sizeof(buff));<br>
strcpy(buff, "+86"); strcat(buff, number); 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; char choice;<br>
fd = open(MODEM_PATH, O_RDWR | O_NOCTTY | O_NDELAY);<br>
if (fd < 0) {<br>
printf("Can't open %s\n", MODEM_PATH); return -1;<br>
}<br><br>
 
 
/* Initialize /dev/modem0 */ serial_init(fd);<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) { case '1':<br>
Send_Message(fd); break;<br>
case '2':<br>
Call_Phone(fd); break;<br>
default:<br>
break;<br>
}<br>
close(fd);<br><br>
return 0;<br><br>
}<br>
|}
== Android 及 Linux 源码编译 ==
8,460
个编辑