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プロトコルを送信します.
具体的なコード
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;
}