我有一个 SIM7080G 连接到 Arduino Mega,尝试使用 MQTTS 连接我的 AWS IoT Core 服务器。无论我尝试了多少种不同的方法,我都无法通过“AT+SMCONN”,因为每次都会返回错误。
我尝试过使用旧证书、更改为 TLS1.2、忽略 RTC 时间等等,但似乎无法取得任何进展。
芯片通过CAT-M网络连接。
此外,我什至无法通过公共经纪商的 1883 端口连接到他们。
任何帮助将不胜感激。
这是在 Mega 上运行的代码(已编辑的设备证书和密钥,以及 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("AT\r"));
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 AT\r"));
readSerial();
Serial1.print(F("AT\r"));
readSerial();
}
Serial.println("Connected");
Serial1.print(F("AT+CNACT=0,1\r"));
readSerial();
Serial1.print(F("AT+CCLK?\r"));
readSerial();
Serial1.print(F("AT+CNACT?\r"));
readSerial();
Serial1.print(F("AT+CFSINIT\r")); // get stream ready
readSerial();
// Root certificate
Serial1.print("AT+CFSWFILE=3,ca.crt,0,"+String(sizeof(caCert))+",5000\r"); // 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))+",5000\r"); // start stream
readSerial();
Serial1.print(deviceCert);
Serial1.print("\r");
readSerial();
Serial1.print("AT+CFSWFILE=3,\"myclient.key\",0,"+String(sizeof(privateKey))+",5000\r"); // start stream
readSerial();
Serial1.print(privateKey);
Serial1.print("\r");
readSerial();
// Finished
Serial1.print(F("AT+CFSTERM\r")); // clear stream
readSerial();
Serial1.print(F("AT+SMCONF=\"URL\",-ENDPOINT-.iot.ap-southeast-2.amazonaws.com,8883\r"));
readSerial();
Serial1.print(F("AT+SMCONF=\"KEEPTIME\",60\r"));
readSerial();
Serial1.print(F("AT+SMCONF=\"CLEANSS\",1\r"));
readSerial();
Serial1.print(F("AT+SMCONF=\"QOS\",1\r"));
readSerial();
Serial1.print(F("AT+SMCONF=\"CLIENTID\",\"simcom\"\r"));
readSerial();
Serial1.print(F("AT+CSSLCFG=\"SSLVERSION\",0,3\r"));
readSerial();
Serial1.print(F("AT+CSSLCFG=\"CONVERT\",2,ca.crt\r"));
readSerial();
Serial1.print(F("AT+CSSLCFG=\"CONVERT\",1,myclient.crt,myclient.key\r"));
readSerial();
Serial1.print(F("AT+SMSSL=1,ca.crt,myclient.crt\r"));
readSerial();
Serial1.print(F("AT+SMCONN\r"));
readSerial();
Serial.println("Manual commmand mode");
}
void loop() {
while(Serial1.available())
{
Serial.write(Serial1.read());
}
while(Serial.available())
{
Serial1.write(Serial.read());
}
delay(1);
}
这是输出:
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
策略(只是试图确保没有任何东西阻止任何连接尝试) 政策
抱歉,我没有答案给你。我也有同样的问题。你解决了吗?