Семейство Arduino: важное и не очень;)
Есть часть кода на Arduino:
void loop() {
mySerial.println(“AT+INQ”); //сканирование доступных bluetooth
SerialMon.println(" RESTART SCAN");
delay(3000);
save_to_bufer(); // сохранение mac адреса 1-ого из них
…
//вывод в терминал mac адрес//
…
//подключение к ric//
…
mqtt.loop();
publishMAC(); // ф-ия отправки mac адреса в ric(объект)
}
он подключается к ric, выводит в терминал компьютера mac адрес, но не выполняет publishMAC(),(т. е. игнорирует эту функцию) с чем может быть связана данная проблема?
Здравствуйте.
Из вашего кусочка кода сложно сказать в чем может быть причина.
Вы уверены, что он подключается к RIC ? Статус объекта становится онлайн (зеленый круглый индикатор)?
Если подключение точно есть попробуйте добавить проверку и явное определение топика и пайлоада с мак в publishMAC()
void publishMAC() {
// Что нибудь типо такого
const char* topic = "your/topic";
const char* payload = "mac_payload";
if (client.publish(topic, payload)) {
Serial.println("Publish successful");
} else {
Serial.println("Publish failed");
}
После чего попробуйте включить отображение в платформе поулчаемых пакетов в виде кода. Если данные будут доходить, даже если не настроена модель вы это увидите
Когда то раньше, когда работал с Ардуино у меня был такой шаблон который позволял мне локализовывать проблему, может что-то пригодиться
#include <SoftwareSerial.h>
#include <PubSubClient.h>
#include <WiFi.h>
// Замена SoftwareSerial на соответствующий пин для вашего оборудования
SoftwareSerial mySerial(10, 11); // RX, TX
// Настройка WiFi и MQTT
const char* ssid = "your_SSID";
const char* password = "your_PASSWORD";
const char* mqtt_server = "your_MQTT_SERVER";
WiFiClient espClient;
PubSubClient client(espClient);
void setup() {
Serial.begin(115200);
mySerial.begin(9600); // Убедитесь, что скорость соответствует вашему модулю
// Настройка WiFi
setup_wifi();
// Настройка MQTT
client.setServer(mqtt_server, 1883);
// Другие необходимые настройки
}
void setup_wifi() {
delay(10);
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
void reconnect() {
String clientId = "your_CLIENTID";
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
// Попробуйте подключиться
if (client.connect(clientId.c_str())) {
Serial.println("connected");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
delay(3000);
publishMAC();
}
void publishMAC() {
const char* topic = "your_topic";
const char* payload = "your_payload";
if (client.publish(topic, payload)) {
Serial.println("Publish successful");
} else {
Serial.println("Publish failed");
}
}
есть код:
#define mySerial Serial2
void setup() {
mySerial.begin(9600); // Устанавливаем скорость последовательной связи Bluetooth модуля
Serial.begin(9600); // Устанавливаем скорость основной последовательной связи
Serial.println(“Hello”);
delay(300);
mySerial.println(“AT”);
delay(500);
mySerial.println(“AT+VERR?”);
delay(500);
mySerial.println(“AT+RENEW”);
delay(1000);
mySerial.println(“AT+RESET”);
delay(1000);
mySerial.println(“AT”);
delay(500);
mySerial.println(“AT+ROLE1”);
delay(1000);
mySerial.println(“AT+IMME1”);
delay(1000);
mySerial.println(“AT+RESET”);
delay(1000);
mySerial.println(“AT+FILT0”);
delay(2000);
mySerial.println(“AT+DISI?”);
}
void loop() {
if (mySerial.available()) {
Serial.write(mySerial.read());
}
if (Serial.available()) {
mySerial.write(Serial.read());
}
}
В результате его работы выводится:
Hello
OK
HMSoft V610
OK+RENEW
OK+RESET
OK
OK+Set:1
OK+Set:1
OKOK+DISIS
OK+DISC:00000000:00000000000000000000000000000000:0000000000:78BD64284478:-059
OK+DISC:00000000:00000000000000000000000000000000:0000000000:F0AE661416A0:-043
OK+DISC:4C000215:74278BDA212910FF8F0C720EAF059935:FFE0FFE1C5:8801F98CCAF4:-075
OK+DISC:00000000:00000000000000000000000000000000:0000000000:485DBDEA9F04:-069
OK+DISCE
Нужно сохранить в переменную строчку: 4C000215:74278BDA212910FF8F0C720EAF059935:FFE0FFE1C5:8801F98CCAF4:-075
Есть ли какой-то простой и удобный способ? Я пытался считывать каждую строку, но из-за этого очень сильно замедлился вывод этих строчек.
А что это вообще за строка? Это MAC адрес Bluetooth устройства?
Как будто в рамках данного кода выглядит так, что слушая последовательный порт не очень то удобно понять что поступают те данные которые удовлетворяют вашим требованиям и их нужно сохранить? Регулярок же нету в C - чтобы по какому то принципу разбирать строку? По какому принципу вы поинмаете что вам нужно сохранить именно это “4C000215:74278BDA212910FF8F0C720EAF059935:FFE0FFE1C5:8801F98CCAF4:-075”
это bluetooth ibeacon адрес для модуля bluetooth hm 10 из документации
команда AT+DISI? выдает OK+DISC[P0:P1:P2:P3:P4], где P0: Factory ID
P1: iBeacon UUID
P2: Major Value
Minor Value
Measured Power
P3: MAC
P4: RSSI
P0 length is 8; P1 length is 32; P2 length is 10; P3 length is 12, P4 length is 4
P2 include Major Value (length 4);
Minor Value (length 4);
Measured Power (length 2)
в общем вместо Major Value, Minor Value, Measured Power я хочу передавать значения датчиков и отправлять с помощью hm 10 на другую плату и после уже отправлять их на ric, используя gsm модем
Ну если у вас всегда будет одна платка в проекте использоваться и вы точно уверенны, что ее Factory ID = 4C000215 то может так закастылить? Ну или расширить проверку еще и по UUID…
#define mySerial Serial2
String buffer = "";
String targetString = "";
void setup() {
mySerial.begin(9600); // Устанавливаем скорость последовательной связи Bluetooth модуля
Serial.begin(9600); // Устанавливаем скорость основной последовательной связи
Serial.println("Hello");
delay(300);
mySerial.println("AT");
delay(500);
mySerial.println("AT+VERR?");
delay(500);
mySerial.println("AT+RENEW");
delay(1000);
mySerial.println("AT+RESET");
delay(1000);
mySerial.println("AT");
delay(500);
mySerial.println("AT+ROLE1");
delay(1000);
mySerial.println("AT+IMME1");
delay(1000);
mySerial.println("AT+RESET");
delay(1000);
mySerial.println("AT+FILT0");
delay(2000);
mySerial.println("AT+DISI?");
}
void loop() {
while (mySerial.available()) {
char c = mySerial.read();
buffer += c;
if (c == '\n') {
Serial.print(buffer);
// Проверяем, содержит ли строка целевой шаблон
if (buffer.startsWith("OK+DISC:4C000215:")) {
targetString = buffer; // Сохраняем строку в переменную
}
buffer = "";
}
}
while (Serial.available()) {
mySerial.write(Serial.read());
}
}