Так что это не работало при попытке подключиться к серверу cloudMQTT, но когда я подключился к своему серверу MQTT или тестовому серверу MQTT, это сработало. Должна быть проблема, связанная с протоколом, который использует облачный mqttServer (MQIsdp), в отличие от стандартного протокола MQTT, который используется обычным сервером MQTT. Я внес изменение в пакет подключения так, чтобы он указывал протокол MQTT и указал TCP-соединение с тестовым сервером (test.mosquitto.org), и теперь я могу успешно подключиться и подключиться sh.
Для тех, кто только начинает пытаться связать Arduino с таким модулем, как SIM900 (модуль GPRS / GSM), с сервером MQTT, я предлагаю вам gr asp полное понимание стандартных AT-команд (Чтобы установить sh a solid TCP-соединение с сервером), как скомпилировать пакеты, которые будут отправлены через модуль GPRS из Arduino, и, наконец, я предлагаю не использовать какой-либо код, который вы не написали для достижения этой цели. Узнайте, как установить sh соединение TCP с AT-командами, затем узнайте, как скомпилировать и отправить пакет подключения, скомпилировав байтовый массив и отправив его. Как только вы поймете пакеты и связь между клиентом и сервером, мир MQTT станет вашей устрицей.
Вы можете использовать этот код в качестве руководства, но, пожалуйста, попробуйте написать как можно больше своих собственных:
#include <SoftwareSerial.h>
SoftwareSerial SoftSerial( 9, 10 );
// Go Look up the structure of MQTT packets and from there you will learn how to compile these
byte connectPacket[ 19 ] =
{
0x10, 0x11, 0x00, 0x04, 0x4D, 0x51, 0x54, 0x54, 0x04, 0x02, 0x00, 0x3C, 0x00, 0x05, 0x54, 0x32, 0x54, 0x49, 0x44
};
byte publishPacket[ 26 ] =
{
0x30, 0x18, 0x00, 0x0E, 0x54, 0x32, 0x54, 0x5F, 0x54, 0x6F, 0x70, 0x69, 0x63, 0x5F, 0x44, 0x65, 0x6D, 0x6F, 0x54, 0x65, 0x6D, 0x70, 0x3A, 0x20, 0x33, 0x30
};
unsigned char buffer[ 64 ];
int counter = 0;
// Simple function to send an AT command and see its response
void sendAtCommandWithResponse( char message[] )
{
SoftSerial.write( message );
delay(3000);
while ( SoftSerial.available() > 0 )
{
buffer[ counter++ ] = SoftSerial.read();
if( counter == 64 ) break;
}
Serial.write( buffer, counter );
for( int i = 0; i < counter; i++ )
{
buffer[ i ] = NULL;
}
counter = 0;
}
void setup()
{
Serial.begin( 19200 );
SoftSerial.begin( 19200 );
delay(10000);
// -- Configure the SIM900 and establish the TCP connection to the server
sendAtCommandWithResponse( "\r\nAT\r\n" );
delay(2000);
//-----
sendAtCommandWithResponse( "\r\nAT+CIPSHUT\r\n" );
delay(2000);
//-----
sendAtCommandWithResponse( "\r\nAT+CIPMUX=0\r\n" );
delay(2000);
//-----
sendAtCommandWithResponse( "\r\nAT+CGATT=1\r\n" );
delay(2000);
//-----
sendAtCommandWithResponse( "\r\nAT+CSTT=\"myMTN\", \"\", \"\"\r\n" );
delay(2000);
//-----
sendAtCommandWithResponse( "\r\nAT+CIICR\r\n" );
delay(2000);
//-----
sendAtCommandWithResponse( "\r\nAT+CIFSR\r\n" );
delay(2000);
//-----
SoftSerial.write( "\r\nAT+CIPSTART=\"TCP\", \"test.mosquitto.org\", \"1883\"\r\n" );
delay(10000);
//-----
while ( SoftSerial.available() > 0 )
{
buffer[ counter++ ] = SoftSerial.read();
if( counter == 64 ) break;
}
Serial.write( buffer, counter );
for( int i = 0; i < counter; i++ )
{
buffer[ i ] = NULL;
}
counter = 0;
delay(2000);
//-----
// -- Send the connect packet
sendAtCommandWithResponse( "\r\nAT+CIPSEND\r\n" );
delay(3000);
SoftSerial.write( connectPacket, sizeof( connectPacket ) );
// This tells the SIM900 to send the packet
SoftSerial.write(0x1A);
delay(3000);
// -- Send the publish packet
sendAtCommandWithResponse( "\r\nAT+CIPSEND\r\n" );
delay(3000);
SoftSerial.write( publishPacket, sizeof( publishPacket ) );
// This tells the SIM900 to send the packet
SoftSerial.write(0x1A);
}
void loop()
{
while ( SoftSerial.available() > 0 )
{
buffer[ counter++ ] = SoftSerial.read();
if( counter == 64 ) break;
}
Serial.write( buffer, counter );
for( int i = 0; i < counter; i++ )
{
buffer[ i ] = NULL;
}
counter = 0;
}