ARDUNOを使ってMQTTプロトコルでONENETを接続する(8266透過)


ARDUNOを使ってMQTTプロトコルでONENETを接続する(8266透過)
  • 接続方式
  • 実施形態
  • 具体的なコード
  • 接続モード
    ARDUNO-->8266(ソフトシリアル接続を使用して)デジタルポート8(RX)->TXデジタルポート9(TX)->RX 3 V 3-->VCC GND-->GND-->CHPD
    実装
    ARDUNOにMQTTを使ってONENETに接続したいのですが、一番簡単な方法はARDUNO IDEまたはMICROPYTHONマジコン8266を直接使用してARDUNOがソフトシリアルで8266の通信を傍受することです.今日は8266透伝の方式で、主に具体的なロジックを説明して、MQTTプロトコルの利点をよりよく理解するようにします.後のコードのロジックは以下の通りです.1、まずMQTTのプロトコル内容を配列形式で定義します.これは主に後の16進数方式でONENETサーバにデータを送信するためです.2、ARDUNOはソフトシリアルポートを通じて8266の透過モード3を開き、MQTTプロトコルを送信します.
    具体的なコード
    #include 
    SoftwareSerial mySerial(8, 9); // RX, TX
    
    void (* resetFunc) () = 0;
    
    int v_w_test=0;
    int v_w_cnt=0;
    int v_w_test_result=0;
    int v_w_transfer=0;
    int v_w_transfer_result=0;
    int v_s_c=0;
    int i=0;
    int j=0;
    int k=0;
    
    unsigned char uart_Receive_Buff [ 80 ]; //    buff 
    unsigned int uart_Receive_Index = 0; //           
    
    char Serial_val;  //         
    unsigned char Serial_val1;  //         
    String Serial_str="" ;   //         ,          
    
    unsigned char data[42] = {0x10,  //    
                              0x28,  //             
                              0x00,0x04,0x4D,0x51,0x54,0x54, //     MQTT  	
                              0x04,0xC2, //  
                              0x00,0x78, //    120 ,             
                              0x00,0x09,//  ID  
                              0x35,0x36,0x33,0x33,0x32,0x38,0x30,0x37,0x**,  //  ID
                              0x00,0x06, //  ID  
                              0x32,0x37,0x38,0x36,0x30,0x**,  //  ID 
                              0x00,0x09, //    
                              0x6D,0x71,0x74,0x74,0x62,0x31,0x30,0x32,0x** //  ID
                              };  //    
                              
    unsigned char data_1[2] = {0xC0,0x00 }; //  ,        
    
    unsigned char data_2[18] = {0x82,0x10, //           
                              0x00,0x0A,  //    
                              0x00,0x0B,  //    
                              0x6D,0x6D,0x6E,0x6E,0x5F,0x74,0x6F,0x70,0x69,0x63,0x31,//    mmnn_topic1
                              0x00 //    
                              };
    
    void setup()
    { Serial.begin(9600);        //      
      mySerial.begin(9600);      //      
      mySerial.print("+++");     //8266               
      while ( v_s_c != 5 ) 
            { delay(1000); Serial.print("*");  v_s_c++;}     //  5 8266    
      v_w_test_result=wifi_test();   //      
      if(v_w_test_result==5) 
            { v_w_transfer_result=wifi_transfer() ;}    //    
      if(v_w_transfer_result==5) 
            {Serial.println("INITIALIZATION COMPLETED;"); Serial.println("WIFI TRANSFER OPEN");}
      if(v_w_test_result!=5 || v_w_transfer_result!=5) {Serial.println("Resetting Arduino Programmatically"); resetFunc();}
    
          Serial.println("!!!");
    }
    
    void loop()
    {
         
          if (j<1) 
          {   
            for (int i = 0; i < 42; i++)
            {
                    mySerial.write(data[i]); 
            }  
            for (int i = 0; i < 18; i++)
            {
                    mySerial.write(data_2[i]); 
            }  
            j=1; 
          }
    
          uart_Receive_Index=0; 
          while (mySerial.available()>0)  //             (  )
                                                  {  
                                                    Serial_val1 = mySerial.read();   //       (  ) val  
                                                    uart_Receive_Buff [ uart_Receive_Index ] = Serial_val1;              //                ,            
                                                    uart_Receive_Index++;
                                                  }  
          for (int i=0; i<20; i++) {Serial.print(uart_Receive_Buff[i],HEX);}
          Serial.println();
          
          for (int i=0; i <5; i++ ) { delay(1000); Serial.print("*");}     //  5 8266     
    
          for (int i=0; i <20; i++ ) {uart_Receive_Buff[i]=0x00;}
    
          
          if(k == 60) {  for (int m = 0; m < 2; m++)   { mySerial.write(data_1[m]);  }  k=0;  }
          delay(1000);
          k++; 
       
    }
    
    int wifi_test()   //  WIFI    
    { v_w_test=1;  //      5     
            while (v_w_test !=5 )
                         { 
                           switch (v_w_test)
                           {  
                             case 1:   if(1==1)  
                                         { Serial_str=""; mySerial.println("AT+CWJAP?");                     v_w_test=2; }    break; 
                             case 2:   if( Serial_str.indexOf("No AP\r
    \r
    OK"
    )>0) { Serial_str=""; mySerial.println("AT+CWJAP=\"whowho\",\"***\""); v_w_test=3; } if( Serial_str.indexOf("+CWJAP:")>0) { v_w_test=3; } break; case 3: if( Serial_str.indexOf("OK")>0) { Serial_str=""; v_w_test=4; } break; case 4: delay(3000) ;v_w_test=5; break; default : break; } while (mySerial.available()>0) // ( ) { Serial_val = mySerial.read(); // ( ) val Serial_str += Serial_val; // , Serial.print(Serial_val); // val } if ( Serial_str.indexOf("FAIL")>0 || Serial_str.indexOf("busy")>0 ) {delay(1000) ; if (v_w_test!=9) {Serial_str=""; mySerial.println("AT+RST"); v_w_test=9;} } if ( v_w_test==9 ) {delay(1000) ; v_w_cnt++; if (Serial_str.indexOf("OK")>0) {Serial_str=""; v_w_test=1; v_w_cnt=0; } } if ( v_w_test==9 && v_w_cnt>=30) { if (1==1) {Serial_str=""; v_w_test=8; v_w_cnt=0; } } if (millis()>60000) {Serial.println("Resetting Arduino Programmatically"); resetFunc();} } Serial_str=""; return v_w_test; } int wifi_transfer() // { v_w_transfer=1; while (v_w_transfer !=5 ) { switch (v_w_transfer) { case 1: if(1==1) { Serial_str=""; mySerial.println("AT+CIPSTART=\"TCP\",\"183.230.40.39\",6002"); v_w_transfer=2; } break; case 2: if( Serial_str.indexOf("OK")>0 || Serial_str.indexOf("ALREADY CONNECTED")>0 ) { Serial_str=""; mySerial.println("AT+CIPMODE=1"); v_w_transfer=3; } break; case 3: if( Serial_str.indexOf("OK")>0) { Serial_str=""; mySerial.println("AT+CIPSEND"); v_w_transfer=4; } break; case 4: delay(3000); v_w_transfer=5; break; default : break; } while (mySerial.available()>0) // ( ) { Serial_val = mySerial.read(); // ( ) val Serial_str += Serial_val; // , Serial.print(Serial_val); // val } if (millis()>120000) {Serial.println("Resetting Arduino Programmatically"); resetFunc();} } Serial_str=""; return v_w_transfer; }