Asi před 2 lety jsem v jednom projektu používal Waveshare SIM7000E připojenou na ESP32 (použita Vodafone NB IoT karta).
Pro ESP32 jsem k tomu nenašel žádnou knihovnu, takže jsem si musel všechno napsat ručně, ale žádný velký problém s tím pokud si pamatuju nebyl. Nejdřív jsem to odladil s AT Command Testerem a pak příslušné sekvence příkazů naťukal do kódu.
Tady je kousek kódu, kterým jsem to přes sériový port inicializoval, třeba při porovnávání té sekvence příkazů na něco přijdeš:
bool SIM7000E::initGsm(bool full){
gsmReady = false;
bool isReady = false;
cmd("AT");
if(status != "OK")return false;
if(full)initGsmOffOn();
if(full || (cmd("AT+CSQ").indexOf("99,99") != -1) || (cmd("AT+CGREG?").indexOf("0,5") == -1)){
for(int i = 0; i < 15; i++){
isReady = (cmd("AT+CSQ").indexOf("99,99") == -1);
if(isReady)break;
delay(1000);
}
if(!isReady)return false;
for(int i = 0; i < 5; i++){
isReady = (cmd("AT+CGREG?").indexOf("0,5") != -1);
if(isReady)break;
delay(1000);
}
if(!isReady)return false;
}
cmd("AT+CLTS=1");
if(status != "OK")return false;
cmd("AT+CAPNMODE=0");
if(status != "OK")return false;
cmd("AT+CNACT=1","+APP PDP: ACTIVE");
if(status != "OK")return false;
cmd("AT+CGATT=1");
if(status != "OK")return false;
cmd("AT+CIPSHUT","SHUT OK");
if(status != "OK")return false;
cmd("AT+CSTT=\"lpwa.vodafone.iot\"");
if(status != "OK")return false;
cmd("AT+CIICR");
if(status != "OK")return false;
cmd("AT+CIFSR");
cmd("AT+SAPBR=3,1,\"APN\",\"lpwa.vodafone.iot\"");
if(status != "OK")return false;
cmd("AT+SAPBR=1,1");
if(status != "OK")return false;
cmd("AT+SHCONF=\"URL\",\"http://iot.test.cz\"");
if(status != "OK")return false;
cmd("AT+SHCONF=\"HEADERLEN\",350");
if(status != "OK")return false;
cmd("AT+SHCONF=\"BODYLEN\",1024");
if(status != "OK")return false;
cmd("AT+SHCONF=\"TIMEOUT\",60");
if(status != "OK")return false;
cmd("AT+SHCONF=\"IPVER\",0");
if(status != "OK")return false;
gsmReady = true;
return true;
}
bool SIM7000E::initGsmOffOn(){
gsmReady = false;
cmd("AT");
if(status != "OK")return false;
cmd("AT+CFUN=0");
if(status != "OK")return false;
cmd("AT+CBANDCFG=\"NB-IOT\",20");
if(status != "OK")return false;
cmd("AT+CNMP=38");
if(status != "OK")return false;
cmd("AT+CMNB=2");
if(status != "OK")return false;
cmd("AT+CGDCONT=1,\"IP\",\"lpwa.vodafone.iot\"");
if(status != "OK")return false;
cmd("AT+CFUN=1");
if(status != "OK")return false;
}
String SIM7000E::cmd(String command){
return this->cmd(command, "OK", 1000);
}
String SIM7000E::cmd(String command, int timeout){
return this->cmd(command, "OK", timeout);
}
String SIM7000E::cmd(String command, String desiredReply){
return this->cmd(command, desiredReply, 1000);
}
String SIM7000E::cmd(String command, String desiredReply, int timeout){
while (Serial1.available() > 0)Serial1.read();
GsmDebugLog(" GSMDEBUG: command: " + command);
Serial1.println(command);
int start = millis();
String reply1 = "";
while(millis()-start <= timeout){
while (Serial1.available() > 0) {
char x = Serial1.read();
reply1 = reply1 + x;
start = millis();
if(reply1.indexOf("\r\n" + desiredReply + "\r\n") > -1){
reply1.replace("\r\n\r\n","\r\n");
status = "OK";
String logreply = reply1;
logreply.replace("\r\n"," || ");
GsmDebugLog(" GSMDEBUG: Reply: " + String(logreply));
return reply1;
}
}
}
status = "TIMEOUT";
GsmDebugLog(" GSMDEBUG: timeout: " + String(timeout));
GsmDebugLog(" GSMDEBUG: Desired reply: " + String(desiredReply));
GsmDebugLog(" GSMDEBUG: Real reply: " + String(reply1));
return reply1 + "\r\nTIMEOUT";
}