我想使用 MQTT 协议从我的 Arduino ATmega2560、SIM808 发送数据。通过执行我的代码,成功连接到代理但无法发布消息。
#include "Arduino.h"
int led = 13;
unsigned int Counter = 0;
unsigned long datalength, CheckSum, RLength;
unsigned short topiclength;
unsigned char topic[30];
char str[250];
unsigned char encodedByte;
int X;
unsigned short MQTTProtocolNameLength;
unsigned short MQTTClientIDLength;
unsigned short MQTTUsernameLength;
unsigned short MQTTPasswordLength;
const char MQTTHost[30] = "m14.cloudmqtt.com";
const char MQTTPort[10] = "12079";
const char MQTTClientID[20] = "bolod1";
const char MQTTTopic[30] = "iqbal - test/testiqbal";
const char MQTTProtocolName[10] = "MQIsdp";
const char MQTTLVL = 0x03;
const char MQTTFlags = 0xC2;
const unsigned int MQTTKeepAlive = 30;
const char MQTTUsername[30] = "username";
const char MQTTPassword[35] = "password";
const char MQTTQOS = 0x0001;
const char MQTTPacketID = 0x0001;
void setup()
{
pinMode(led, OUTPUT);
Serial.begin(9600);
Serial1.begin(9600);
Serial.println("Arduino MQTT Tutorial, Valetron Systems @www.raviyp.com ");
delay(3000);
}
void SendConnectPacket(void)
{
Serial.print("\r\nAT+CIPSEND\r\n");
delay(3000);
Serial1.write(0x10);
MQTTProtocolNameLength = strlen(MQTTProtocolName);
MQTTClientIDLength = strlen(MQTTClientID);
MQTTUsernameLength = strlen(MQTTUsername);
MQTTPasswordLength = strlen(MQTTPassword);
datalength = MQTTProtocolNameLength + 2 + 4 + MQTTClientIDLength + 2 + MQTTUsernameLength + 2 + MQTTPasswordLength + 2;
X = datalength;
do
{
encodedByte = X % 128;
X = X / 128;
if (X > 0)
{
encodedByte |= 128;
}
Serial1.write(encodedByte);
} while (X > 0);
Serial1.write(MQTTProtocolNameLength >> 8); delay(3000);
Serial1.write(MQTTProtocolNameLength & 0xFF); delay(3000);
Serial1.print(MQTTProtocolName); delay(3000);
Serial1.write(MQTTLVL); delay(3000);// LVL
Serial1.write(MQTTFlags); delay(3000); // Flags
Serial1.write(MQTTKeepAlive >> 8); delay(3000);
Serial1.write(MQTTKeepAlive & 0xFF); delay(3000);
Serial1.write(MQTTClientIDLength >> 8); delay(3000);
Serial1.write(MQTTClientIDLength & 0xFF); delay(3000);
Serial.print(MQTTClientID); delay(3000);
Serial1.write(MQTTUsernameLength >> 8); delay(3000);
Serial1.write(MQTTUsernameLength & 0xFF); delay(3000);
Serial.print(MQTTUsername); delay(3000);
Serial1.write(MQTTPasswordLength >> 8); delay(3000);
Serial1.write(MQTTPasswordLength & 0xFF); delay(3000);
Serial.print(MQTTPassword); Serial.write(0x1A); delay(3000);
}
void SendPublishPacket(void)
{
Serial.print("\r\nAT+CIPSEND\r\n");
delay(3000);
memset(str, 0, 250);
topiclength = sprintf((char*)topic, MQTTTopic);
datalength = sprintf((char*)str, "%s%u", topic, Counter);
delay(1000);
Serial1.write(0x30);
X = datalength + 2;
do
{
encodedByte = X % 128;
X = X / 128;
if (X > 0)
{
encodedByte |= 128;
}
Serial.write(encodedByte);
} while (X > 0);
Serial1.write(topiclength >> 8); delay(3000);
Serial1.write(topiclength & 0xFF); delay(3000);
Serial.print(str); delay(3000);
Serial1.write(0x1A); delay(3000);
}
void SendSubscribePacket(void)
{
Serial.print("\r\nAT+CIPSEND\r\n");
delay(3000);
memset(str, 0, 250);
topiclength = strlen(MQTTTopic);
datalength = 2 + 2 + topiclength + 1;
delay(1000);
Serial1.write(0x82);
X = datalength;
do
{
encodedByte = X % 128;
X = X / 128;
if (X > 0) {
encodedByte |= 128;
}
Serial.write(encodedByte);
} while (X > 0);
Serial1.write(MQTTPacketID >> 8); delay(3000);
Serial1.write(MQTTPacketID & 0xFF); delay(3000);
Serial1.write(topiclength >> 8); delay(3000);
Serial1.write(topiclength & 0xFF); delay(3000);
Serial.print(MQTTTopic); delay(3000);
Serial1.write(MQTTQOS); delay(3000);
Serial1.write(0x1A); delay(3000);
}
void loop()
{
Serial.print("AT+CSTT=\"APN\",\"blweb\",\"\"\r\n");
delay(1000);
Serial.print("AT+CIPMODE=0\r\n");
delay(1000);
Serial.print("AT+CIICR\r\n");
delay(5000);
Serial.print("AT+CIPSTART=\"TCP\",\"m14.cloudmqtt.com\",\"12079\"\r\n");
delay(4000);
SendConnectPacket();
delay(5000);
SendSubscribePacket();
while (1)
{
delay(5000);
SendPublishPacket();
Counter++;
}
}