Я пытаюсь создать клиентскую библиотеку MQTT, которая может работать на модеме GPRS SIM800L.
Ниже приведен мой код для открытия TCP-соединения с SIM800L:
void initModem(){
int startTime=0;
switch(modemStatus){
case 0:
Serial1.print("AT\r\n");
delay(2000);
modemStatus = 1;
break;
case 1:
Serial1.print("AT+CFUN?\r\n");
delay(2000);
modemStatus = 2;
break;
case 2:
Serial1.print("AT+CSTT=\"portalnmms\",\"\",\"\"\r\n");
delay(2000);
modemStatus = 3;
break;
case 3:
Serial1.print("AT+CIICR\r\n");
delay(2000);
modemStatus = 4;
break;
case 4:
Serial1.print("AT+CIFSR\r\n");
delay(2000);
modemStatus = 5;
break;
case 5:
//Serial1.print("AT+CIPSTART=\"TCP\",\"broker.mqttdashboard.com\",\"1883\"\r\n");
Serial1.print("AT+CIPSTART=\"TCP\",\"broker.hivemq.com\",\"1883\"\r\n");
startTime = millis();
while(1){
if((millis()-startTime)>8000) break;
if (Serial1.available()){
Serial.print((char)Serial1.read());
}
}
modemStatus = 6;
break;
case 6:
Serial.println("");
Serial.println("Sending Connect Packet");
static const char connectPacket[14] = {
0x10, //Control Byte - 4Bits(MSB) for Control Type & 4Bits(LSB) Control Flag
12, //Length of Packet
0, //Protocol Name Length (MSB)
6, //Protocol Name Length (LSB)
'M', // Protocol Name 1st Byte
'Q', // Protocol Name 2nd Byte
'I', // Protocol Name 3rd Byte
's', // Protocol Name 4th Byte
'd', // Protocol Name 5th Byte
'p', // Protocol Name 6th Byte
3, // Protocol Level/Version (3.1.1 in this case)
0x02, // Connect Flags
0x00, // Keep Alive in Seconds (MSB)
60, // Keep Alive in Seconds (LSB)
//0, // Client Identifier Length (MSB)
//1, // Client Identifier Length (LSB)
//'M',
};
Serial1.write(connectPacket);
Serial1.flush();
startTime = millis();
while(1){
if((millis()-startTime)>5000) break;
if (Serial1.available()){
Serial.println(Serial1.read(),BIN);
}
}
modemStatus=7;
break;
case 7:
//PUBLISH A MESSAGE
static const char publishPacket =
break;
default:
Serial.println("Invalid Modem Status");
break;
}
}
Приведенный выше код отправляетПакет по TCP ниже - это структура пакета:
static const char connectPacket[14] = {
0x10, //Control Byte - 4Bits(MSB) for Control Type & 4Bits(LSB) Control Flag
12, //Length of Packet
0, //Protocol Name Length (MSB)
6, //Protocol Name Length (LSB)
'M', // Protocol Name 1st Byte
'Q', // Protocol Name 2nd Byte
'I', // Protocol Name 3rd Byte
's', // Protocol Name 4th Byte
'd', // Protocol Name 5th Byte
'p', // Protocol Name 6th Byte
3, // Protocol Level/Version (3.1.1 in this case)
0x02, // Connect Flags
0x00, // Keep Alive in Seconds (MSB)
60, // Keep Alive in Seconds (LSB)
//0, // Client Identifier Length (MSB)
//1, // Client Identifier Length (LSB)
//'M',
};
Как только этот пакет отправлен по TCP: я получаю следующий ответ в двоичном виде:
10000
1100
10000
1100
MSB здесь непокажите 10
здесь, который является типом управления пакета CONNECTACK.
Кроме того, 2-й (1100) и 4-й байт (1100) зависят от длины и изменяются по мере того, как я изменяю длину пакета CONNECT..
Хотелось бы узнать, что я здесь не так делаю?
Пожалуйста, помогите.