I have a SIM7080G connected to an Arduino Mega, attempting to connect with my AWS IoT Core server using MQTTS. No matter how many different methods I have tried, I cannot get past “AT+SMCONN” as an error is returned every time.
I have tried using legacy certificates, changing to TLS1.2, ignoring RTC time, and many more but cannot seem to make any progress.
The chip is connected via CAT-M network.
Also, I cannot even connect to a public broker through their 1883 port.
Any help would be much appreciated.
This is the code running on the Mega (device cert and key redacted, as well as part of URL):
String _buffer;
#define BUFFER_RESERVE_MEMORY 500
#define TIME_OUT_READ_SERIAL 5000
char caCert[] = R"EOF(
-----BEGIN CERTIFICATE-----
MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsF
ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6
b24gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTEL
MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv
b3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJ4gHHKeNXj
ca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgHFzZM
9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qw
IFAGbHrQgLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6
VOujw5H5SNz/0egwLX0tdHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L
93FcXmn/6pUCyziKrlA4b9v7LWIbxcceVOF34GfID5yHI9Y/QCB/IIDEgEw+OyQm
jgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
AYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3DQEBCwUA
A4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDI
U5PMCCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUs
N+gDS63pYaACbvXy8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vv
o/ufQJVtMVT8QtPHRh8jrdkPSHCa2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU
5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2xJNDd2ZhwLnoQdeXeGADbkpy
rqXRfboQnoZsG4q5WTP468SQvvG5
-----END CERTIFICATE-----
)EOF";
char deviceCert[] = R"EOF(
-----BEGIN CERTIFICATE-----
--
-----END CERTIFICATE-----
)EOF";
char privateKey[] = R"EOF(
-----BEGIN RSA PRIVATE KEY-----
--
-----END RSA PRIVATE KEY-----
)EOF";
int BOARD_MODEM_PWR_PIN = 5;
void readSerial()
{
_buffer = "";
uint64_t timeOld = millis();
while (!Serial1.available() && !(millis() > timeOld + TIME_OUT_READ_SERIAL)) { ; }
if(Serial1.available()) { _buffer = Serial1.readString(); }
Serial.println(_buffer);
}
bool atCheck()
{
Serial1.print(F("ATr"));
readSerial();
if(_buffer.indexOf(F("OK")) != -1)
{
return true;
}
else
{
return false;
}
}
void setup() {
Serial.begin(9600);
Serial1.begin(9600);
_buffer.reserve(BUFFER_RESERVE_MEMORY);
pinMode(BOARD_MODEM_PWR_PIN, OUTPUT);
// Check connection
while(!atCheck())
{
Serial.println("Failed connection, trying again...");
delay(100);
digitalWrite(BOARD_MODEM_PWR_PIN, LOW);
delay(100);
digitalWrite(BOARD_MODEM_PWR_PIN, HIGH);
delay(1000);
digitalWrite(BOARD_MODEM_PWR_PIN, LOW);
Serial1.print(F("AT AT AT AT AT ATr"));
readSerial();
Serial1.print(F("ATr"));
readSerial();
}
Serial.println("Connected");
Serial1.print(F("AT+CNACT=0,1r"));
readSerial();
Serial1.print(F("AT+CCLK?r"));
readSerial();
Serial1.print(F("AT+CNACT?r"));
readSerial();
Serial1.print(F("AT+CFSINITr")); // get stream ready
readSerial();
// Root certificate
Serial1.print("AT+CFSWFILE=3,ca.crt,0,"+String(sizeof(caCert))+",5000r"); // start stream
readSerial();
Serial1.print(caCert);
Serial1.print("r");
readSerial();
// Device certificate and device key
Serial1.print("AT+CFSWFILE=3,myclient.crt,0,"+String(sizeof(deviceCert))+",5000r"); // start stream
readSerial();
Serial1.print(deviceCert);
Serial1.print("r");
readSerial();
Serial1.print("AT+CFSWFILE=3,"myclient.key",0,"+String(sizeof(privateKey))+",5000r"); // start stream
readSerial();
Serial1.print(privateKey);
Serial1.print("r");
readSerial();
// Finished
Serial1.print(F("AT+CFSTERMr")); // clear stream
readSerial();
Serial1.print(F("AT+SMCONF="URL",-ENDPOINT-.iot.ap-southeast-2.amazonaws.com,8883r"));
readSerial();
Serial1.print(F("AT+SMCONF="KEEPTIME",60r"));
readSerial();
Serial1.print(F("AT+SMCONF="CLEANSS",1r"));
readSerial();
Serial1.print(F("AT+SMCONF="QOS",1r"));
readSerial();
Serial1.print(F("AT+SMCONF="CLIENTID","simcom"r"));
readSerial();
Serial1.print(F("AT+CSSLCFG="SSLVERSION",0,3r"));
readSerial();
Serial1.print(F("AT+CSSLCFG="CONVERT",2,ca.crtr"));
readSerial();
Serial1.print(F("AT+CSSLCFG="CONVERT",1,myclient.crt,myclient.keyr"));
readSerial();
Serial1.print(F("AT+SMSSL=1,ca.crt,myclient.crtr"));
readSerial();
Serial1.print(F("AT+SMCONNr"));
readSerial();
Serial.println("Manual commmand mode");
}
void loop() {
while(Serial1.available())
{
Serial.write(Serial1.read());
}
while(Serial.available())
{
Serial1.write(Serial.read());
}
delay(1);
}
This is the output:
Connected
AT+CNACT=0,1
OK
AT+CCLK?
+CCLK: "24/09/05,01:21:44+48"
OK
AT+CNACT?
+CNACT: 0,1,"100.91.252.95"
+CNACT: 1,0,"0.0.0.0"
+CNACT: 2,0,"0.0.0.0"
+CNACT: 3,0,"0.0.0.0"
OK
AT+CFSINIT
OK
AT+CFSWFILE=3,ca.crt,0,1296,5000
DOWNLOAD
OK
AT+CFSWFILE=3,myclient.crt,0,1225,5000
DOWNLOAD
OK
AT+CFSWFILE=3,"myclient.key",0,1677,5000
DOWNLOAD
OK
AT+CFSTERM
OK
AT+SMCONF="URL",XXXXXXXX,8883
OK
AT+SMCONF="KEEPTIME",60
OK
AT+SMCONF="CLEANSS",1
OK
AT+SMCONF="QOS",1
OK
AT+SMCONF="CLIENTID","simcom"
OK
AT+CSSLCFG="SSLVERSION",0,3
OK
AT+CSSLCFG="CONVERT",2,ca.crt
OK
AT+CSSLCFG="CONVERT",1,myclient.crt,myclient.key
OK
AT+SMSSL=1,ca.crt,myclient.crt
OK
AT+SMCONN
+CME ERROR: operation not allowed
Manual commmand mode
Policies (just tried to make sure nothing was blocking any connection attempt)
Policies