void WExpandedThingItem::manufacturerUpdated() { QSqlQuery q = HACC_DB->query("select name, icon_id from manufacturers where id=?", QVariantList() << hacc::model::CManufacturer::id()); if(HACC_QUERY_DATA_AVIALABLE(q)) { //! \todo Добавить действие, если запрос не вернет данных setManufacturerData(HACC_DB_2_DBID(q, 1), HACC_DB_2_STRG(q, 0)); } }
/** * @brief Parse the advertising pay load. * * The pay load is a buffer of bytes that is either 31 bytes long or terminated by * a 0 length value. Each entry in the buffer has the format: * [length][type][data...] * * The length does not include itself but does include everything after it until the next record. A record * with a length value of 0 indicates a terminator. * * https://www.bluetooth.com/specifications/assigned-numbers/generic-access-profile */ void BLEAdvertisedDevice::parseAdvertisement(uint8_t* payload, size_t total_len) { uint8_t length; uint8_t ad_type; uint8_t sizeConsumed = 0; bool finished = false; m_payload = payload; m_payloadLength = total_len; while(!finished) { length = *payload; // Retrieve the length of the record. payload++; // Skip to type sizeConsumed += 1 + length; // increase the size consumed. if (length != 0) { // A length of 0 indicates that we have reached the end. ad_type = *payload; payload++; length--; char* pHex = BLEUtils::buildHexData(nullptr, payload, length); ESP_LOGD(LOG_TAG, "Type: 0x%.2x (%s), length: %d, data: %s", ad_type, BLEUtils::advTypeToString(ad_type), length, pHex); free(pHex); switch(ad_type) { case ESP_BLE_AD_TYPE_NAME_CMPL: { // Adv Data Type: 0x09 setName(std::string(reinterpret_cast<char*>(payload), length)); break; } // ESP_BLE_AD_TYPE_NAME_CMPL case ESP_BLE_AD_TYPE_TX_PWR: { // Adv Data Type: 0x0A setTXPower(*payload); break; } // ESP_BLE_AD_TYPE_TX_PWR case ESP_BLE_AD_TYPE_APPEARANCE: { // Adv Data Type: 0x19 setAppearance(*reinterpret_cast<uint16_t*>(payload)); break; } // ESP_BLE_AD_TYPE_APPEARANCE case ESP_BLE_AD_TYPE_FLAG: { // Adv Data Type: 0x01 setAdFlag(*payload); break; } // ESP_BLE_AD_TYPE_FLAG case ESP_BLE_AD_TYPE_16SRV_CMPL: case ESP_BLE_AD_TYPE_16SRV_PART: { // Adv Data Type: 0x02 for (int var = 0; var < length/2; ++var) { setServiceUUID(BLEUUID(*reinterpret_cast<uint16_t*>(payload + var * 2))); } break; } // ESP_BLE_AD_TYPE_16SRV_PART case ESP_BLE_AD_TYPE_32SRV_CMPL: case ESP_BLE_AD_TYPE_32SRV_PART: { // Adv Data Type: 0x04 for (int var = 0; var < length/4; ++var) { setServiceUUID(BLEUUID(*reinterpret_cast<uint32_t*>(payload + var * 4))); } break; } // ESP_BLE_AD_TYPE_32SRV_PART case ESP_BLE_AD_TYPE_128SRV_CMPL: { // Adv Data Type: 0x07 setServiceUUID(BLEUUID(payload, 16, false)); break; } // ESP_BLE_AD_TYPE_128SRV_CMPL case ESP_BLE_AD_TYPE_128SRV_PART: { // Adv Data Type: 0x06 setServiceUUID(BLEUUID(payload, 16, false)); break; } // ESP_BLE_AD_TYPE_128SRV_PART // See CSS Part A 1.4 Manufacturer Specific Data case ESP_BLE_AD_MANUFACTURER_SPECIFIC_TYPE: { setManufacturerData(std::string(reinterpret_cast<char*>(payload), length)); break; } // ESP_BLE_AD_MANUFACTURER_SPECIFIC_TYPE case ESP_BLE_AD_TYPE_SERVICE_DATA: { // Adv Data Type: 0x16 (Service Data) - 2 byte UUID if (length < 2) { ESP_LOGE(LOG_TAG, "Length too small for ESP_BLE_AD_TYPE_SERVICE_DATA"); break; } uint16_t uuid = *(uint16_t*)payload; setServiceDataUUID(BLEUUID(uuid)); if (length > 2) { setServiceData(std::string(reinterpret_cast<char*>(payload + 2), length - 2)); } break; } //ESP_BLE_AD_TYPE_SERVICE_DATA case ESP_BLE_AD_TYPE_32SERVICE_DATA: { // Adv Data Type: 0x20 (Service Data) - 4 byte UUID if (length < 4) { ESP_LOGE(LOG_TAG, "Length too small for ESP_BLE_AD_TYPE_32SERVICE_DATA"); break; } uint32_t uuid = *(uint32_t*) payload; setServiceDataUUID(BLEUUID(uuid)); if (length > 4) { setServiceData(std::string(reinterpret_cast<char*>(payload + 4), length - 4)); } break; } //ESP_BLE_AD_TYPE_32SERVICE_DATA case ESP_BLE_AD_TYPE_128SERVICE_DATA: { // Adv Data Type: 0x21 (Service Data) - 16 byte UUID if (length < 16) { ESP_LOGE(LOG_TAG, "Length too small for ESP_BLE_AD_TYPE_128SERVICE_DATA"); break; } setServiceDataUUID(BLEUUID(payload, (size_t)16, false)); if (length > 16) { setServiceData(std::string(reinterpret_cast<char*>(payload + 16), length - 16)); } break; } //ESP_BLE_AD_TYPE_32SERVICE_DATA default: { ESP_LOGD(LOG_TAG, "Unhandled type: adType: %d - 0x%.2x", ad_type, ad_type); break; } } // switch payload += length; } // Length <> 0 if (sizeConsumed >= total_len) finished = true; } // !finished } // parseAdvertisement