【问题标题】:Arduino UNO & Modem Sim800L Can't write setup commands to send data to serverArduino UNO 和调制解调器 Sim800L 无法编写设置命令将数据发送到服务器
【发布时间】:2020-05-02 11:08:36
【问题描述】:

我正在使用带有调制解调器 sim800l 的 arduino UNO 板。我想用它向服务器发送数据,但问题是我无法编写设置命令。

我做错了什么?这不是用于 sim800l 的正确命令吗? 我试过不同的命令,输出是一样的。

#include <SoftwareSerial.h>

//Create software serial object to communicate with SIM800L
SoftwareSerial mySerial(3, 2); //SIM800L Tx & Rx is connected to Arduino #3 & #2

void setup()
{
  //Begin serial communication with Arduino and Arduino IDE (Serial Monitor)
  Serial.begin(9600);

  //Begin serial communication with Arduino and SIM800L
  mySerial.begin(9600);

  Serial.println("Initializing..."); 
  delay(100);
  delay(1000);

  mySerial.println("AT+CMEE=2"); // Error mode 
  delay(100);
  updateSerial();

  mySerial.println("AT"); //Once the handshake test is successful, i t will back to OK
  delay(100);
  updateSerial();

  mySerial.println("AT+CFUN=1"); //Level "full functionality" 
  delay(100);
  updateSerial();

  mySerial.println("AT+CGATT?"); //attach or detach from GPRS service 
  delay(100);
  updateSerial();

  mySerial.println("AT+CSTT=\"net\",\"\",\"\""); //AT+CSTT AT command sets up the apn, user name and password for the PDP context.
  delay(2000);
  updateSerial();

  mySerial.println("AT+CSTT?"); //AT+CSTT show apn
  delay(2000);
  updateSerial();

  mySerial.println("AT+CIICR"); //  Brings up wireless connection
  delay(2000);
  updateSerial();

  mySerial.println("AT+CIFSR"); //  Get local IP address if connected
  delay(2000);
  updateSerial();
}

这是 Arduino IDE 控制台的输出:

Initializing... 
AT+CHEE=2 
OK 
AT 
OK 
AT+CFUN=1 
OK 
AT+CGAIT? 
+CGATT: 1 
OK 
AT+CSTT="net","","" 
+CME ERROR: operation not allowed 
AT+CSTT? 
+CSTT: "CMNET","","" 

OK 
AT+CIICR 
+CME ERROR: operation not allowed 
AT+CIFSR 
+CME ERROR: operation not allowed 

【问题讨论】:

  • 请勿发布代码、数据、错误消息等的图片 - 将文本复制或输入到问题中。 How to Ask

标签: tcp arduino gsm sim800 sim800l


【解决方案1】:

你有我的同情,我花了几个星期才让我的 Arduino 与网络通话。我认为您的问题发生在包含“CSTT”的行上,我认为 SIM800L 无法识别。

试试下面的设置,用“SAPBR”代替:

SoftwareSerial gprsSerial(7, 8); // working here with Arduino ports 7 and 8
void setup() {
  gprsSerial.begin(19200);
  Serial.begin(19200);
  Serial.println("connect to GPRS");
  gprsSerial.println("AT");
  toSerial();
  gprsSerial.println("AT+CREG?");  
  toSerial();
  gprsSerial.println("AT+CGATT?");
  toSerial();
  gprsSerial.println("AT+CSQ ");
  toSerial();
  gprsSerial.println("AT+SAPBR=3,1,\"Contype\",\"GPRS\"");
  delay(2000);
  toSerial();
  gprsSerial.println("AT+SAPBR=3,1,\"APN\",\"" + String(APN) + "\"");
  delay(300);
  gprsSerial.println("AT+SAPBR=3,1,\"USER\",\"" + String(USER) + "\"");
  delay(300);
  gprsSerial.println("AT+SAPBR=3,1,\"PWD\",\"" + String(PWD) + "\"");
  delay(1000);
  toSerial();
  gprsSerial.println("AT+SAPBR=1,1");
  delay(2000);
  toSerial();
  gprsSerial.println("AT+SAPBR=2,1");
  delay(2000);
  toSerial();
}

你的运行循环:

void loop(){
// Do your stuff
}

还有你的 toSerial 函数:

void toSerial()
{
  delay(200);
  if(gprsSerial.available()>0){
    textMessage = gprsSerial.readString();
    delay(100);
    Serial.print(textMessage);    
  }
}

你的呼叫服务器函数应该是这样的:

void callServer() {
  Serial.println("Calling server");
  gprsSerial.println("AT+CCLK?");
  toSerial();
  gprsSerial.println("AT+HTTPINIT");
  toSerial();
  gprsSerial.println("AT+HTTPPARA=\"CID\",1");
  toSerial();
  gprsSerial.println("AT+HTTPPARA=\"URL\",\"http:[YOURURL]") // NOTE: NOT HTTPS!
  delay(1000);
  toSerial();
  gprsSerial.println("AT+HTTPACTION=0");
  delay(3000);
  toSerial();
  gprsSerial.println("AT+HTTPREAD");
  delay(3000);
  toSerial();
}

【讨论】:

  • 这种情况下的承载可能是打开的,在这种情况下 A) 没关系 - 它不会破坏任何东西 B) 如果你真的想要,你可以在此之前关闭承载! "gprsSerial.println("AT+SAPBR=0,1");"然后再次打开它:“gprsSerial.println("AT+SAPBR=1,1");"基本上我认为您可以忽略该错误并继续连接过程。
  • 这些命令适用于我的模块。但是我好像收不到IP:我现在的输出是: AT+SAPBR=2,1 +SAPBR: 1,3,"0.0.0.0" OK AT+HTTPINIT OK AT+HTTPPARA="URL"," google.com" OK AT+HTTPACTION=0 OK +HTTPACTION: 0,601,0 我用过#define APN "everywhere" #define USER "eesecure" #define PWD "secure" 我的提供者是Orange -> teamknowhow.com/discover/discover/orange-apn-settings跨度>
  • 据我所知,sim800L 无法发出 HTTPS 请求(至少我只能让我使用 HTTP)。如果我没记错的话,601 错误是尝试调用 HTTPS 域的结果。使用您知道是 HTTP 的域尝试相同的命令。
  • 好的 - 我已经添加了我必须使用的命令序列,以使我的命令能够发出 HTTP 请求。确保您使用的是 HTTP 端点,而不是 HTTPS。有用吗?
  • 最后一点:我不信任该页面 - teamknowhow.com/discover/discover/orange-apn-settings - 我的橙色卡无法使用这些设置。最好将 sim 卡放入手机中,然后查看设置后自动生成的设置。然后复制这些。
【解决方案2】:

建立 TCP/IP 连接的发送命令序列:

//Check the registration status
AT+CREG?

//Check attach status
AT+CGACT?

//Attach to the network
AT+CGATT=1

//Wait for Attach
WAIT=7

//Start task ans set the APN. Check your carrier APN
AT+CSTT="bluevia.movistar.es" // Here you havve net which I guess is not a NetworkAPN you have to use the APN from your provider (= sim card)

//Bring up the wireless connection
AT+CIICR

//Wait for bringup
WAIT=6

//Get the local IP address
AT+CIFSR

//Start a TCP connection to remote address. Port 80 is TCP.
AT+CIPSTART="TCP","74.124.194.252","80"

//Set prompt of '>' when module sends data
AT+CIPSPRT=1

//Send the TCP data
AT+CIPSEND

如果您想快速测试稳定的设置,请使用此7 days free to use tool for SIM800, SIM900,然后将成功的过程复制到代码中。

【讨论】:

  • 我的防病毒软件在档案库中检测到木马并自动删除它。我也试过下载工具
  • 我有它,里面没有木马(我猜是误报)获取更好的防病毒软件 ;-) 我用 Avast 最新版本进行了测试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多