Интересно, а почему товарищ
здесь пишет , что добился до 1.1 МБит/с на CH582F . Сам я ещё не дошёл до отправки больших массивов данных. Всего что я понял за два дня, это как создать на openwch ble api собственный сервис. Самый простой пример для этого взял из
battservice.c . Изучив этот сервис меня озадачил подход к отправке через Notify.
Но сначала про чтение атрибутов из структуры. Например battLevel так записывается
C:
// Battery Level Value
{
{ATT_BT_UUID_SIZE, battLevelUUID}, /* type */
GATT_PERMIT_READ, /* permissions */
0, /* handle */
(uint8_t *)&battLevel /* pValue */
},
Тут просто стек сам лезет по этому указателю pValue и читает или записывает байты.
С чтением совсем просто, так как у меня все данные в характеристиках 16-ти битные, то разницы нету какой uuid, все они по два байта и просто написал такой калбак.
C:
static bStatus_t bicycle_ReadAttrCB(uint16_t connHandle, gattAttribute_t *pAttr,
uint8_t *pValue, uint16_t *pLen, uint16_t offset,
uint16_t maxLen, uint8_t method)
{
*pLen = 2;
tmos_memcpy(pValue, pAttr->pValue, 2);
return SUCCESS;
}
Но с notify всё иначе и запутанней.
Оказалось, что стеку ble вообще не важны сами данные из переменной, на которую указывает атрибут на pValue .
Через Notify просто шлёт то, что ты ему передашь вручную хоть число, хоть массив байт.
А та ссылка на данные pValue , которая указывается в структуре атрибутов gattAttribute_t , нужна только когда клиент хочет сделать обычное read write характеристики.
Но notify работает через handle атрибута, а uuid только для того, чтобы при инициализации стек понял, что это за характеристика и где она находится в таблице.
В общем при самой передаче через notify стек пользуется не uuid и не pValue , а handle блин.
Это типа handle как адрес ячейки в таблице атрибутов, по которому клиент потом понимает,
что именно обновилось. И индекс атрибута handle в массиве надо посчитать вручную. Тут он BATT_LEVEL_VALUE_IDX
C:
// кусок из кода notify
noti.handle = battAttrTbl[BATT_LEVEL_VALUE_IDX].handle;
noti.len = BATT_LEVEL_VALUE_LEN;
noti.pValue[0] = battLevel;
Получается, если мы что-то добавляем к нашему сервису новую характеристику или дескриптор не забываем обновлять этот индекс, иначе будет слать не то, что надо.
Но зачем так делать, я не понимаю. Нанятому программисту, видимо, мало на счёт насыпали.
Или, может, они такие сидят в офисе и думают "Надо добавить боли. Пусть у людей будет свой Dark Souls среди протоколов!”
В итоге, пока я пытаюсь понять, почему при notify улетает не температура, а какая-то батарейка, уже появляются мысли дропнуть все нафиг.
А потом вернувшись в gattAttribute_t, и осознал что структура это портал в иное измерение, где handle важнее uuid.
Пока что продолжаю делать задуманное, пока не выгорел как pecherskih.
.