在 Arduino Uno 上使用 SIM7000 调制解调器设置 CIPSERVER 时遇到问题

问题描述 投票:0回答:1

我已经拼命地做了好几天了,但我似乎不知道我做错了什么。我在网上搜索,但我能找到的信息很少是来自调制解调器的传出数据。我想监听来自 webhook 的传入数据。如果可以的话请帮忙。

我有一个连接到全息网络的 Botletics SIM7000 扩展板。我已确认网络访问,并且可以将其预先打包的消息发布到 dweet.io(在 LTE_Demo.ino 中)

我是 C++ 编程新手,我认为这让我很困惑。我的经验在于 HTML/CSS/PHP。这是我的精简代码,它定义了引脚、打开调制解调器、配置它并启用数据。我不知道我是否正确启用了 CIPSERVER 或者我是否正在处理传入的数据。我得到:

"
server set
Data received:


Data received:

E
Data received:
RRO
Data received:"

这绝对不是正确的结果。当我通过全息图仪表板发送数据时,它永远不会出现。

#include "BotleticsSIM7000.h" // https://github.com/botletics/Botletics-SIM7000/tree/main/src

#define SIMCOM_7000
// For botletics SIM7000/7070 shield
#define BOTLETICS_PWRKEY 6
#define RST 7 // No RST pin for SIM7070
#define TX 10 // Microcontroller RX
#define RX 11 // Microcontroller TX
#include <SoftwareSerial.h>
SoftwareSerial modemSS = SoftwareSerial(TX, RX);
SoftwareSerial *modemSerial = &modemSS;

Botletics_modem_LTE modem = Botletics_modem_LTE();

char incomingDataBuffer[256];

void setup() {

  pinMode(RST, OUTPUT);
  digitalWrite(RST, HIGH); // Default state
  
  modem.powerOn(BOTLETICS_PWRKEY);

  Serial.begin(9600);
  Serial.println(F("please merciful electricity let my data pass"));
  modemSS.begin(115200); // Default SIM7000 shield baud rate

  Serial.println(F("Configuring to 9600 baud"));
  modemSS.println("AT+IPR=9600"); // Set baud rate
  delay(100); // Short pause to let the command run
  modemSS.begin(9600);
  if (! modem.begin(modemSS)) {
    Serial.println(F("Couldn't find modem"));
    while (1); // Don't proceed if it couldn't find the device
  }

  // Set modem to full functionality
  modem.setFunctionality(1); // AT+CFUN=1
  modem.setNetworkSettings(F("hologram")); // For Hologram SIM card
  if (!modem.enableGPRS(true)) {
      Serial.println(F("Failed to turn on"));
  }

Serial.println("Before pause");
  delay(5000);
  Serial.println("After pause"); // let the device register and get settled(???)
  modemSS.println("AT+CIPSERVER=1,80");
  Serial.println("server set");
}

void readModemData() {
  int index = 0;
  while (modemSerial->available() > 0) {
    char incomingByte = modemSerial->read();
    incomingDataBuffer[index++] = incomingByte;

    // Check if buffer size is exceeded
    if (index >= sizeof(incomingDataBuffer)) {
      index = 0;
      break;
    }
  }

  // Null-terminate the string
  if (index > 0) {
    incomingDataBuffer[index] = '\0';
    Serial.println("Data received:");
    Serial.println(incomingDataBuffer);
  }
}

void loop() {
  if (modemSerial->available()) {
    readModemData();
  }
}
c++ serialization arduino iot at-command
1个回答
0
投票

很明显AT+CIPSERVER设置失败。
要解决这个问题,首先对代码进行如下修改,以便能够输入AT命令并查看执行结果。

// comment this line in setup()
//modemSS.println("AT+CIPSERVER=1,80");

void loop()
{
    while (modemSerial->available()) {
        Serial.write(modemSerial->read());
    }
    while (Serial.available()) {
        modemSerial->write(Serial.read());
    }
}

您应在控制台中输入的命令序列描述SIM7000_Series_TCPIP_Application_Note_V1.01.pdf
毕竟,手动输入 AT 命令可以正常工作,您应该将所有命令包装到 C 函数中(我相信并非所有命令都在 Botletics-SIM7000 库中实现)。
在向 SIM7000 发送 AT 命令后,在代码中要小心,您应该读取并解析它的所有响应,只有在此之后才能发送下一个 AT 命令。
对于 AT 命令预期的多行响应,您可以使用:

uint8_t Botletics_modem::readline(uint16_t timeout, boolean multiline); //  multiline true

查看另一个处理 SIM7000 的库的来源 小GSM

© www.soinside.com 2019 - 2024. All rights reserved.