Arduino Sim900 AT+SAPBR=1,1 --> 不允许操作



我使用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(。

相关内容

  • 没有找到相关文章

最新更新