如何使用 mqtt 协议从 arduino、sim808 向代理发送数据

物联网 MQTT 阿杜伊诺
2021-06-27 12:41:34

我想使用 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++;
    }
}
0个回答
没有发现任何回复~