我已经拼命地做了好几天了,但我似乎不知道我做错了什么。我在网上搜索,但我能找到的信息很少是来自调制解调器的传出数据。我想监听来自 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();
}
}
很明显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