在HTTPREAD之后将值存储在变量中

时间:2017-09-05 19:46:23

标签: arduino http-get gsm at-command sim900

我正在使用GSM SIM900和Arduino Uno。我正在为SIM900使用AT命令。我成功地从GET请求获取数据并在串行监视器上显示,但在AT+HTTPREAD命令之后我想将数据存储到变量中。我怎样才能做到这一点?我从Web服务器获取一个JSON对象,我想从该对象获取Status属性并将其保存到变量中。

#include <SoftwareSerial.h>
SoftwareSerial gprsSerial(2,3);

void setup() {
  gprsSerial.begin(9600);
  Serial.begin(9600);
  Serial.println("Con");
  delay(2000);
  Serial.println("Done!...");
  gprsSerial.flush();
  Serial.flush();
  // See if the SIM900 is ready
  gprsSerial.println("AT");
  delay(1000);
  toSerial();
  // SIM card inserted and unlocked?
  gprsSerial.println("AT+CPIN?");
  delay(1000);
  toSerial();
  // Is the SIM card registered?
  gprsSerial.println("AT+CREG?");
  delay(1000);
  toSerial();
  // Is GPRS attached?
  gprsSerial.println("AT+CGATT?");
  delay(1000);
  toSerial();
  // Check signal strength
  gprsSerial.println("AT+CSQ ");
  delay(1000);
  toSerial();
  // Set connection type to GPRS
  gprsSerial.println("AT+SAPBR=3,1,\"Contype\",\"GPRS\"");
  delay(2000);
  toSerial();
  // Set the APN
  gprsSerial.println("AT+SAPBR=3,1,\"APN\",\"wap.mobilinkworld.com\"");
  delay(2000);
  toSerial();
  // Enable GPRS
  gprsSerial.println("AT+SAPBR=1,1");
  delay(10000);
  toSerial();
  // Check to see if connection is correct and get your IP address
  gprsSerial.println("AT+SAPBR=2,1");
  delay(2000);
  toSerial();
}

void loop() {
  // initialize http service
  gprsSerial.println("AT+HTTPINIT");
  delay(2000); 
  toSerial();
  // set http param value
  // ToDO : send dynamic value
  gprsSerial.println("AT+HTTPPARA=\"URL\",\"http://smockfyp.azurewebsites.net/api/Device/GetStatus?did=1\"");
  delay(4000);
  toSerial();
  // set http action type 0 = GET, 1 = POST, 2 = HEAD
  gprsSerial.println("AT+HTTPACTION=0");
  delay(6000);
  toSerial();
  // read server response
  gprsSerial.println("AT+HTTPREAD");
  delay(1000);
  toSerial();
  gprsSerial.println("AT+HTTPTERM");
  toSerial();
  delay(300);
  gprsSerial.println("");
  delay(10000);
}

void toSerial() {
  while(gprsSerial.available()!=0) {
    Serial.write(gprsSerial.read());
  }
}

这是我想要存储在变量中的输出:

AT+HTTPINIT

OK
AT+HTTPPARA="URL","http://smockfyp.azurewebsites.net/api/DeviceAT+HTTPACTION=0

OK

+HTTPACTION: 0,200,17
AT+HTTPREAD

+HTTPREAD: 17
[{"Status":true}]
OK

2 个答案:

答案 0 :(得分:4)

首先获取一张A3大纸,找一支红笔并写1000次

  

我永远不会使用delay代替来自调制解调器的阅读解析响应。

     

我永远不会使用delay代替来自调制解调器的阅读解析响应。

     

我永远不会使用delay代替来自调制解调器的阅读解析响应。

     

我永远不会使用delay代替来自调制解调器的阅读解析响应。

     

我绝不会使用delay代替来自调制解调器的阅读解析响应。

     

...

然后按照有关V.250 的说明阅读this answer。当你正确地从答案中消化了所有信息时(可能需要一些时间让所有信息都沉入其中),然后点击下面评论中的另一个答案的链接(其中包含捕获响应内容的信息)。

当然第一部分意味着很有趣,但我对其余部分已经认真了;你有一些巨大的AT命令知识&#34; hole&#34;你必须填写。在您这样做之前,您将无法获得任何信息。这应该不是很困难,但需要付出一些努力。

答案 1 :(得分:1)

首先,您应初始化名为 [HttpGet("{id}")] public async Task<IActionResult> GetPatReg([FromRoute] long id) { if (!ModelState.IsValid) { return BadRequest(ModelState); } var patReg = await _context.PatReg .Where(m => m.FileId == id) .ToListAsync(); var patpar = await _context.PatPar.Select(m => new PatParDto { RecId = m.RecId, FileId = m.FileId, ParFileId = m.ParFileId, SDate = m.SDate, EDate = m.EDate, }).ToListAsync(); for (int i = 0; i < patpar.Count; i++) { patpar[i].FullName = (from a in _context.PatReg where (a.FileId == patpar[i].ParFileId) select new { a.fullname } ).Single().fullname; or patpar[i].FullName = _context.PatReg.Where(a => a.FileId == patpar[i].ParFileId) .Select(t=>new {t.fullname }) .Single().fullname; } if (patReg == null) { return NotFound(); } var DataRes = new { sdata = patReg, test= patpar }; return Ok(DataRes); } 的char数组以存储值,并声明变量a

然后按如下方式修改int flag=0;功能:

toSerial()