Продовжуємо день "кохання", та кохатись з кодом Сі, Сі++, вказівниками і з blynk'ом. Гуртовуха ще та.
В бібліотеці blynk є функція яка приймає номер піна і, вважай, будь яку інформацію, чи то ціле число, чи то з комою, чи то текстовий рядок. Ось воно:
/**
* Sends value to a Virtual Pin
*
* @param pin Virtual Pin number
* @param data Value to be sent
*/
template <typename... Args>
void virtualWrite(int pin, Args... values) {
char mem[BLYNK_MAX_SENDBYTES];
BlynkParam cmd(mem, 0, sizeof(mem));
cmd.add("vw");
cmd.add(pin);
cmd.add_multi(values...);
static_cast<Proto*>(this)->sendCmd(BLYNK_CMD_HARDWARE, 0, cmd.getBuffer(), cmd.getLength()-1);
}
/**
* Sends buffer to a Virtual Pin
*
* @param pin Virtual Pin number
* @param buff Data buffer
* @param len Length of data
*/
void virtualWriteBinary(int pin, const void* buff, size_t len) {
char mem[8];
BlynkParam cmd(mem, 0, sizeof(mem));
cmd.add("vw");
cmd.add(pin);
static_cast<Proto*>(this)->sendCmd(BLYNK_CMD_HARDWARE, 0, cmd.getBuffer(), cmd.getLength(), buff, len);
}
/**
* Sends BlynkParam to a Virtual Pin
*
* @param pin Virtual Pin number
* @param param
*/
void virtualWrite(int pin, const BlynkParam& param) {
virtualWriteBinary(pin, param.getBuffer(), param.getLength());
}
void virtualWrite(int pin, const BlynkParamAllocated& param) {
virtualWriteBinary(pin, param.getBuffer(), param.getLength());
}
Приклади застосування:
// Send string
Blynk.virtualWrite(pin, "abc");
// Send integer
Blynk.virtualWrite(pin, 123);
// Send float
Blynk.virtualWrite(pin, 12.34);
// Send multiple values as an array
Blynk.virtualWrite(pin, "hello", 123, 12.34);
// Send RAW data
Blynk.virtualWriteBinary(pin, buffer, length);
Так от коли я з STM32 кидаю ціле число і на ESP8266 очікую отримати ціле число і його передаю далі на блінк - все чудово працює ось таким чином:
//STM32 відправка стану кнопки
uint8_t state = 0;
Blynk_virtualWrite(V20, &state, sizeof(state));
Сама функція Blynk_virtualWrite:
void Blynk_virtualWrite(int pin, uint8_t *pData, uint8_t size)
{
char dataToBlynk[MYHIOT_SEND_BUFFER_SIZE - MYHIOT_OFFSET_DATA];
dataToBlynk[BLYNK_OFFSET_PIN] = pin;
uint8_t i;
for (i = 0; i < size; i++)
{
dataToBlynk[BLYNK_OFFSET_DATA_PIN + i] = pData[i];
}
myhiot_send(BLYNK_DEVICE_ID, 1, MYHIOT_COMMAND_BLYNK, dataToBlynk, size + BLYNK_OFFSET_DATA_PIN);
// uint8_t *mem;
// mem = (uint8_t *) malloc((size + BLYNK_OFFSET_DATA_PIN) * sizeof(uint8_t));
// *(mem + BLYNK_OFFSET_PIN) = (uint8_t) pin;
// memcpy(mem + BLYNK_OFFSET_DATA_PIN, pData, size);
// myhiot_send(BLYNK_DEVICE_ID, 1, MYHIOT_COMMAND_BLYNK, (char *) mem, sizeof(mem));
// free(mem);
}
Працює і розкоментована частина і закоментована.
Функцію myhiot_send не приводжу, там до пакету додаються адреси, пріоритети, контрольні суми, то не важливо.
На прийомній стороні (ESP8266) той пакет розбирається на складові і якщо я очікую конкретний тип даних char:
void data_received(unsigned char src_address, unsigned char dst_address, unsigned char command, char* data, unsigned char size)
{
if (command == MYHIOT_COMMAND_BLYNK)
{
Blynk.virtualWrite(data[0], data[1]);
}
}
То працює належним чином.
Якщо я пуляю з STM32, наприклад float:
float value = 12.987456;
Blynk_virtualWrite(V0, (uint8_t *) value, sizeof(value));
І приймаю на ESP8266, та передаю до Blynk ось так:
void data_received(unsigned char src_address, unsigned char dst_address, unsigned char command, char* data, unsigned char size)
{
if (command == MYHIOT_COMMAND_BLYNK)
{
Blynk.virtualWriteBinary(data[0], &data[1], sizeof(data) - 1);
}
}
То в додатку просто бачу послідовність кодів CHAR.
В мене не вистачає досвіду зрозуміти, як зробити так, щоб я не морочився з типами даних, які відправляю, зі сторони STM32 і на прийомній стороні це коректно сприймалось і передавало на blynk сервер, теж коректні дані.
Ну щоб було прозоро, що я відправляю дані з ESP8266 на блінк сервер, так само міг відправляти і з STM32.