Возникли проблемы при сборке MQTT-клиента для работы на модеме SIM800L - PullRequest
0 голосов
/ 04 октября 2018

Я пытаюсь создать клиентскую библиотеку 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..

Хотелось бы узнать, что я здесь не так делаю?

Пожалуйста, помогите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...