ble_service.c 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. #include "include.h"
  2. #include "ble_service.h"
  3. #include "ble_user_service.h"
  4. #include "ble_hid_service.h"
  5. #include "ble_fota_service.h"
  6. ///////////////////////////////////////////////////////////////////////////
  7. const uint8_t adv_data_const[] = {
  8. // Flags general discoverable, BR/EDR not supported
  9. 0x02, 0x01, 0x06,
  10. // Manufacturer Specific Data
  11. 0x06, 0xff, 0x06, 0x00, 0x03, 0x00, 0x80,
  12. // Incomplete List of 16-bit Service Class UUIDs
  13. 0x03, 0x02, 0x12, 0x18,
  14. // Appearance: Mouse
  15. 0x03, 0x19, 0xc2, 0x03
  16. };
  17. const uint8_t scan_data_const[] = {
  18. // Name
  19. 0x08, 0x09, 'B', 'L', 'E', '-', 'B', 'O', 'X',
  20. };
  21. u32 ble_get_scan_data(u8 *scan_buf, u32 buf_size)
  22. {
  23. memset(scan_buf, 0, buf_size);
  24. u32 data_len = sizeof(scan_data_const);
  25. memcpy(scan_buf, scan_data_const, data_len);
  26. //读取BLE配置的蓝牙名称
  27. int len;
  28. len = strlen(xcfg_cb.le_name);
  29. if (len > 0) {
  30. memcpy(&scan_buf[2], xcfg_cb.le_name, len);
  31. data_len = 2 + len;
  32. scan_buf[0] = len + 1;
  33. }
  34. return data_len;
  35. }
  36. u32 ble_get_adv_data(u8 *adv_buf, u32 buf_size)
  37. {
  38. memset(adv_buf, 0, buf_size);
  39. u32 data_len = sizeof(adv_data_const);
  40. memcpy(adv_buf, adv_data_const, data_len);
  41. #if 1
  42. //读取BLE配置的蓝牙名称
  43. int len;
  44. len = strlen(xcfg_cb.le_name);
  45. if (len > 0 && (data_len + len + 2) <= 31) {
  46. memcpy(&adv_buf[data_len+2], xcfg_cb.le_name, len);
  47. adv_buf[data_len+0] = len + 1;
  48. adv_buf[data_len+1] = 0x09;
  49. data_len += 2 + len;
  50. }
  51. #endif
  52. return data_len;
  53. }
  54. const uint8_t profile_data[] =
  55. {
  56. // 0x0001 PRIMARY_SERVICE-FF12
  57. 0x0a, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x28, 0x12, 0xff,
  58. // 0x0002 CHARACTERISTIC-FF15 - READ | WRITE_WITHOUT_RESPONSE | DYNAMIC
  59. 0x0d, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x28, 0x06, 0x03, 0x00, 0x15, 0xff,
  60. // 0x0003 VALUE CHARACTERISTIC-FF15 - READ | WRITE_WITHOUT_RESPONSE | DYNAMIC
  61. // READ_ANYBODY, WRITE_ANYBODY
  62. 0x08, 0x00, 0x06, 0x01, 0x03, 0x00, 0x15, 0xff,
  63. // 0x0004 CHARACTERISTIC-FF14 - NOTIFY
  64. 0x0d, 0x00, 0x02, 0x00, 0x04, 0x00, 0x03, 0x28, 0x10, 0x05, 0x00, 0x14, 0xff,
  65. // 0x0005 VALUE CHARACTERISTIC-FF14 - NOTIFY -''
  66. //
  67. 0x08, 0x00, 0x00, 0x00, 0x05, 0x00, 0x14, 0xff,
  68. // 0x0006 CLIENT_CHARACTERISTIC_CONFIGURATION
  69. // READ_ANYBODY, WRITE_ANYBODY
  70. 0x0a, 0x00, 0x0e, 0x01, 0x06, 0x00, 0x02, 0x29, 0x00, 0x00,
  71. // 0x0007 PRIMARY_SERVICE-GAP_SERVICE
  72. 0x0a, 0x00, 0x02, 0x00, 0x07, 0x00, 0x00, 0x28, 0x00, 0x18,
  73. // 0x0008 CHARACTERISTIC-GAP_DEVICE_NAME - READ | DYNAMIC
  74. 0x0d, 0x00, 0x02, 0x00, 0x08, 0x00, 0x03, 0x28, 0x02, 0x09, 0x00, 0x00, 0x2a,
  75. // 0x0009 VALUE CHARACTERISTIC-GAP_DEVICE_NAME - READ | DYNAMIC
  76. // READ_ANYBODY
  77. 0x08, 0x00, 0x02, 0x01, 0x09, 0x00, 0x00, 0x2a,
  78. // 0x000a CHARACTERISTIC-GAP_APPEARANCE - READ
  79. 0x0d, 0x00, 0x02, 0x00, 0x0a, 0x00, 0x03, 0x28, 0x02, 0x0b, 0x00, 0x01, 0x2a,
  80. // 0x000b VALUE CHARACTERISTIC-GAP_APPEARANCE - READ -'c2 03'
  81. // READ_ANYBODY
  82. 0x0a, 0x00, 0x02, 0x00, 0x0b, 0x00, 0x01, 0x2a, 0xc2, 0x03,
  83. // 0x000c PRIMARY_SERVICE-GATT_SERVICE
  84. 0x0a, 0x00, 0x02, 0x00, 0x0c, 0x00, 0x00, 0x28, 0x01, 0x18,
  85. // 0x000d CHARACTERISTIC-GATT_SERVICE_CHANGED - INDICATE
  86. 0x0d, 0x00, 0x02, 0x00, 0x0d, 0x00, 0x03, 0x28, 0x20, 0x0e, 0x00, 0x05, 0x2a,
  87. // 0x000e VALUE CHARACTERISTIC-GATT_SERVICE_CHANGED - INDICATE -''
  88. //
  89. 0x08, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x05, 0x2a,
  90. // 0x000f CLIENT_CHARACTERISTIC_CONFIGURATION
  91. // READ_ANYBODY, WRITE_ANYBODY
  92. 0x0a, 0x00, 0x0e, 0x01, 0x0f, 0x00, 0x02, 0x29, 0x00, 0x00,
  93. // 0x0010 PRIMARY_SERVICE-1812
  94. 0x0a, 0x00, 0x02, 0x00, 0x10, 0x00, 0x00, 0x28, 0x12, 0x18,
  95. // 0x0011 CHARACTERISTIC-2a4a - READ
  96. 0x0d, 0x00, 0x02, 0x00, 0x11, 0x00, 0x03, 0x28, 0x02, 0x12, 0x00, 0x4a, 0x2a,
  97. // 0x0012 VALUE CHARACTERISTIC-2a4a - READ -'11 01 00 00'
  98. // READ_ANYBODY
  99. 0x0c, 0x00, 0x02, 0x00, 0x12, 0x00, 0x4a, 0x2a, 0x11, 0x01, 0x00, 0x00,
  100. // 0x0013 CHARACTERISTIC-2a4b - READ | ENCRYPTION_KEY_LEAST_SIZE_16 | DYNAMIC
  101. 0x0d, 0x00, 0x02, 0x00, 0x13, 0x00, 0x03, 0x28, 0x02, 0x14, 0x00, 0x4b, 0x2a,
  102. // 0x0014 VALUE CHARACTERISTIC-2a4b - READ | ENCRYPTION_KEY_LEAST_SIZE_16 | DYNAMIC
  103. // READ_ANYBODY, ENCRYPTION_KEY_SIZE=16
  104. 0x08, 0x00, 0x02, 0xf1, 0x14, 0x00, 0x4b, 0x2a,
  105. // 0x0015 CHARACTERISTIC-2a4c - WRITE_WITHOUT_RESPONSE | DYNAMIC
  106. 0x0d, 0x00, 0x02, 0x00, 0x15, 0x00, 0x03, 0x28, 0x04, 0x16, 0x00, 0x4c, 0x2a,
  107. // 0x0016 VALUE CHARACTERISTIC-2a4c - WRITE_WITHOUT_RESPONSE | DYNAMIC
  108. // WRITE_ANYBODY
  109. 0x08, 0x00, 0x04, 0x01, 0x16, 0x00, 0x4c, 0x2a,
  110. // 0x0017 CHARACTERISTIC-2a4d - READ | NOTIFY | DYNAMIC
  111. 0x0d, 0x00, 0x02, 0x00, 0x17, 0x00, 0x03, 0x28, 0x12, 0x18, 0x00, 0x4d, 0x2a,
  112. // 0x0018 VALUE CHARACTERISTIC-2a4d - READ | NOTIFY | DYNAMIC
  113. // READ_ANYBODY
  114. 0x08, 0x00, 0x02, 0x01, 0x18, 0x00, 0x4d, 0x2a,
  115. // 0x0019 CLIENT_CHARACTERISTIC_CONFIGURATION
  116. // READ_ANYBODY, WRITE_ANYBODY
  117. 0x0a, 0x00, 0x0e, 0x01, 0x19, 0x00, 0x02, 0x29, 0x00, 0x00,
  118. // 0x001a REPORT_REFERENCE-READ-1-1
  119. 0x0a, 0x00, 0x02, 0x00, 0x1a, 0x00, 0x08, 0x29, 0x01, 0x01,
  120. // 0x001b CHARACTERISTIC-2a4d - READ | NOTIFY | DYNAMIC
  121. 0x0d, 0x00, 0x02, 0x00, 0x1b, 0x00, 0x03, 0x28, 0x12, 0x1c, 0x00, 0x4d, 0x2a,
  122. // 0x001c VALUE CHARACTERISTIC-2a4d - READ | NOTIFY | DYNAMIC
  123. // READ_ANYBODY
  124. 0x08, 0x00, 0x02, 0x01, 0x1c, 0x00, 0x4d, 0x2a,
  125. // 0x001d CLIENT_CHARACTERISTIC_CONFIGURATION
  126. // READ_ANYBODY, WRITE_ANYBODY
  127. 0x0a, 0x00, 0x0e, 0x01, 0x1d, 0x00, 0x02, 0x29, 0x00, 0x00,
  128. // 0x001e REPORT_REFERENCE-READ-2-1
  129. 0x0a, 0x00, 0x02, 0x00, 0x1e, 0x00, 0x08, 0x29, 0x02, 0x01,
  130. // 0x001f CHARACTERISTIC-2a4d - READ | WRITE | WRITE_WITHOUT_RESPONSE | DYNAMIC
  131. 0x0d, 0x00, 0x02, 0x00, 0x1f, 0x00, 0x03, 0x28, 0x0e, 0x20, 0x00, 0x4d, 0x2a,
  132. // 0x0020 VALUE CHARACTERISTIC-2a4d - READ | WRITE | WRITE_WITHOUT_RESPONSE | DYNAMIC
  133. // READ_ANYBODY, WRITE_ANYBODY
  134. 0x08, 0x00, 0x0e, 0x01, 0x20, 0x00, 0x4d, 0x2a,
  135. // 0x0021 REPORT_REFERENCE-READ-2-2
  136. 0x0a, 0x00, 0x02, 0x00, 0x21, 0x00, 0x08, 0x29, 0x02, 0x02,
  137. // 0x0022 CHARACTERISTIC-2a4d - READ | NOTIFY | DYNAMIC
  138. 0x0d, 0x00, 0x02, 0x00, 0x22, 0x00, 0x03, 0x28, 0x12, 0x23, 0x00, 0x4d, 0x2a,
  139. // 0x0023 VALUE CHARACTERISTIC-2a4d - READ | NOTIFY | DYNAMIC
  140. // READ_ANYBODY
  141. 0x08, 0x00, 0x02, 0x01, 0x23, 0x00, 0x4d, 0x2a,
  142. // 0x0024 CLIENT_CHARACTERISTIC_CONFIGURATION
  143. // READ_ANYBODY, WRITE_ANYBODY
  144. 0x0a, 0x00, 0x0e, 0x01, 0x24, 0x00, 0x02, 0x29, 0x00, 0x00,
  145. // 0x0025 REPORT_REFERENCE-READ-3-1
  146. 0x0a, 0x00, 0x02, 0x00, 0x25, 0x00, 0x08, 0x29, 0x03, 0x01,
  147. // END
  148. 0x00, 0x00,
  149. }; // total size 198 bytes
  150. //----------------------------------------------------------------------------
  151. //
  152. const u8 *ble_get_profile_data(void)
  153. {
  154. return profile_data;
  155. }
  156. void ble_service_init(void)
  157. {
  158. printf("ble_service_init\n");
  159. ble_user_service_init();
  160. ble_hid_service_init();
  161. #if (AB_FOT_CHANNEL & AB_FOT_CHANNEL_BLE)
  162. ble_fota_service_init();
  163. #endif
  164. }