【发布时间】:2022-11-12 08:57:12
【问题描述】:
我有一个连接到 io.adafruit MQTT 并在有新数据可用时发布到我的提要的应用程序,没问题。
我正在使用 ESP8266-01 上的 Arduino 编程。
我通过设置连接并在我的标题中发布信息来做到这一点? ( void setup() 之前的空格,如下所示:
#define AIO_SERVER "io.adafruit.com"
#define AIO_SERVERPORT 1883
#define AIO_USERNAME "xxxxxxxx"
#define AIO_KEY "xxxxxxxxxxxxxxxxxxxxxxx"
WiFiClient client;
Adafruit_MQTT_Client mqtt(&client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);
Adafruit_MQTT_Publish temperature = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/temperature");
Adafruit_MQTT_Publish level = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/level");
Adafruit_MQTT_Publish level2 = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/level2");
Adafruit_MQTT_Publish battery = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/battery");
Adafruit_MQTT_Publish date = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/date");
Adafruit_MQTT_Publish trip = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/trip");
Adafruit_MQTT_Publish video1 = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/video");
我想这样做,以便在应用程序首次启动并且用户输入他们的 WiFi 名称和密码时添加 AIO_USERNAME 和 AIO_KEY。
我已将其设置为将用户名和密钥保存到 eprom 并从那里读取。
我什至在从 eprom 检索到 AIO_USERNAME 和 AIO_KEY 后重新定义了它们。
void setup(){
WiFiManagerParameter customAPIKey("authorizationKey", "Authorization Code",authorizationKey, 32);
WiFiManagerParameter customAPIKey2("apiKey", "Time Zone #", apiKey, 3);
WiFiManagerParameter customAPIKey3("userNameKey", "User Name",userNameKey, 29);
wifiManager.addParameter(&customAPIKey);
wifiManager.addParameter(&customAPIKey2);
wifiManager.addParameter(&customAPIKey3);
strcpy(authorizationKey, customAPIKey.getValue());
strcpy(apiKey, customAPIKey2.getValue());
strcpy(userNameKey, customAPIKey3.getValue());
//write to eeprom
EEPROM.begin(512); //Initialize EEPROM
EEPROM.write(addr, 'A'); //Write character A
addr++; //Increment address
EEPROM.write(addr, 'B'); //Write character A
addr++; //Increment address
EEPROM.write(addr, 'C'); //Write character A
addr++; //Increment address
EEPROM.write(addr, 'D'); //Write character A
//Write string to eeprom
String uuu = authorizationKey;
Serial.print("uuu");
Serial.print(uuu);
String www = apiKey;//Homenetwork + uuu;
Serial.print("www");
Serial.print(www);
String yyy = userNameKey;
String vvv = String(www)+String(yyy)+String(",");
Serial.print("vvv");
Serial.print(vvv);
for(int i=0;i<uuu.length();i++) //loop upto string lenght www.length() returns length of string
{
EEPROM.write(0x0F+i,uuu[i]); //Write one by one with starting address of 0x0F
}
for(int i=0;i<vvv.length();i++) //loop upto string lenght www.length() returns length of string
{
EEPROM.write(0x0+i,vvv[i]); //Write one by one with starting address of 0x0F
}
EEPROM.commit(); //Store data to EEPROM
//this is where I retrieve the info from the eeprom
void loop {
EEPROM.begin(512);
Serial.println(""); //Goto next line, as ESP sends some garbage when you reset it
Serial.print(char(EEPROM.read(addr))); //Read from address 0x00
addr++; //Increment address
Serial.print(char(EEPROM.read(addr))); //Read from address 0x01
addr++; //Increment address
Serial.println(char(EEPROM.read(addr))); //Read from address 0x02
addr++; //Increment address
Serial.println(char(EEPROM.read(addr))); //Read from address 0x03
//addr++; //Increment address
//Serial.println(char(EEPROM.read(addr))); //Read from address 0x04
//Read string from eeprom
String www;
//Here we dont know how many bytes to read it is better practice to use some terminating character
//Lets do it manually www.circuits4you.com total length is 20 characters
for(int i=0;i<32;i++)
{
www = www + char(EEPROM.read(0x0F+i)); //Read one by one with starting address of 0x0F
}
String zzz;
String uuu;
for(int i=0;i<3;i++)
{uuu = uuu + char(EEPROM.read(0x0+i));
}
String yyy = userNameKey;
String vvv;
for(int i=3;i<29;i++)
{vvv = vvv + char(EEPROM.read(0x0+i));
}
www.toCharArray(auth,33);
#define AIO_KEY auth
Serial.println("KEY");
Serial.print(AIO_KEY);
Serial.println("this");
Serial.print(www); //Print the text on serial monitor
Serial.println("that");
Serial.print(uuu);
Serial.println("those");
Serial.print(vvv);
int firstCommaIndex = vvv.indexOf(',');
String wstemp = vvv.substring(0, firstCommaIndex);
Serial.println("some");
Serial.print(wstemp);
int len = firstCommaIndex;
wstemp.toCharArray(user,len+1);
#define AIO_USERNAME user
Serial.println("userr");
Serial.print(AIO_USERNAME);
//when I print out the AIO_USERNAME and AIO_KEY I get the correct data but the app
无法连接到我在 adafruit 的帐户。
我试过将信息移入
void MQTT_connect() {
WiFiClient client;
Adafruit_MQTT_Client mqtt(&client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);
Adafruit_MQTT_Publish temperature = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/temperature");
Adafruit_MQTT_Publish level = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/level");
Adafruit_MQTT_Publish level2 = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/level2");
Adafruit_MQTT_Publish battery = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/battery");
Adafruit_MQTT_Publish date = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/date");
Adafruit_MQTT_Publish trip = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/trip");
Adafruit_MQTT_Publish video1 = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/video");
}
但这不起作用并打开另一罐蠕虫。
比如最后一行得到一个
expected primary-expression before '(' token
错误
有没有人建议如何更新或替换 AIO_USERNAME 和 AIO_KEY 以便使用存储的数据?
【问题讨论】:
-
我已回滚您的编辑。如果您想发布自己问题的解决方案,请使用回答.
标签: arduino mqtt arduino-esp8266 adafruit eeprom