我使用Arduino Mega和Sim900GSM/GPRS屏蔽来针对API发出请求。
在初始化请求期间,执行命令AT+SAPBR=1,1
。有时,当我执行屏蔽时,它返回OK
,有时屏蔽返回"Operation not allowed"
,但与工作代码相比,我什么都没改变。
#include <SoftwareSerial.h>
SoftwareSerial(18, 19);
void setup() {
Serial1.begin(19200);
delay(10000);
Serial1.print("AT+CPIN=1111r");
Serial1.flush();
Serial1.print("AT+SAPBR=3,1,"Contype","GPRS"r");
Serial1.flush();
Serial1.print("AT+SAPBR=3,1,"APN","my.apn.com"r");
Serial1.flush();
Serial1.print("AT+SAPBR=1,1r");
Serial1.flush();
// Here comes the error sometimes!
Serial1.print("AT+SAPBR=2,1r");
Serial1.flush();
Serial1.print("AT+HTTPINITr");
Serial1.flush();
Serial1.print("AT+HTTPPARA="CID",1r");
Serial1.flush();
Serial1.print("AT+HTTPPARA="URL","my-api.com/foo"r");
Serial1.flush();
Serial1.print("AT+HTTPPARA="CONTENT","application/json"r");
Serial1.flush();
Serial1.print("AT+HTTPACTION=0r");
Serial1.flush();
Serial1.print("AT+HTTPREADr");
Serial1.flush();
// READ the Response
}
void loop() {
}
谢谢!
作为介绍,我们可以说AT+SAPBR
命令,如SIM900 AT命令指南中所述,用于配置和激活PDP上下文(数据流量(。
特别是,AT+SAPBR=1,1
的含义是
<cmd_type>=1-打开承载
<cid>=1-承载配置文件标识符
来自您的代码
delay(10000);
Serial1.print("AT+CPIN=1111r");
Serial1.flush();
Serial1.print("AT+SAPBR=3,1,"Contype","GPRS"r");
Serial1.flush();
Serial1.print("AT+SAPBR=3,1,"APN","my.apn.com"r");
Serial1.flush();
Serial1.print("AT+SAPBR=1,1r");
我看到你只等了10秒(其他命令通常会立即返回。
因此,第一个解决方案是增加延迟(15秒就足够了(。
第二个解决方案涉及查询注册状态。这可以分别针对GSM网络(AT+CREG?
(和2G数据网络(AT+CGREG?
(来完成。
在这两种情况下,查询命令都会得到类似的答案
+CGREG: <n>,<stat>
(或+CREG: <n>,<stat>
(,其中
<n>是通过设置命令执行的设置。它用于启用未经请求的结果消息。因此,其值通常为0
<stat>是当前注册状态。它可以具有以下值
0-未注册。GPRS服务已禁用[…]
1-已注册,家庭网络[…]
2-未注册,但ME当前正在尝试连接或搜索要注册的运营商。GPRS服务已启用,但允许的[…]
3–注册被拒绝。GPRS服务已禁用[…]
4-未知
5–已注册,正在漫游
因此,如果您确定设备有足够的信号覆盖范围,您只需要每秒提供AT+CGREG?
命令,然后等待+CGREG=0,1
(如果您在漫游中工作,则等待+CGREG=0,5
(。