luat_ble.h 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405
  1. #ifndef __LUAT_BLE__
  2. #define __LUAT_BLE__
  3. // ble
  4. /*
  5. */
  6. typedef enum{
  7. LUAT_BLE_IDLE
  8. // BLE_ACTV_IDLE,
  9. // BLE_ACTV_ADV_CREATED,
  10. // BLE_ACTV_ADV_STARTED,
  11. // BLE_ACTV_SCAN_CREATED,
  12. // BLE_ACTV_SCAN_STARTED,
  13. // BLE_ACTV_INIT_CREATED,
  14. // BLE_ACTV_PER_SYNC_CREATED,
  15. // BLE_ACTV_PER_SYNC_STARTED,
  16. } luat_ble_actv_state;
  17. // Permission
  18. #define LUAT_BLE_GATT_PERM_READ (0x01 << 3) // Read
  19. #define LUAT_BLE_GATT_PERM_WRITE (0x01 << 4) // Write
  20. #define LUAT_BLE_GATT_PERM_IND (0x01 << 5) // Indication
  21. #define LUAT_BLE_GATT_PERM_NOTIFY (0x01 << 6) // Notification
  22. #define LUAT_BLE_GATT_PERM_WRITE_CMD (0x01 << 7) // Write Command
  23. typedef enum{
  24. LUAT_ADV_TYPE_FLAGS = 0x01,
  25. LUAT_ADV_TYPE_INCOMPLETE16,
  26. LUAT_ADV_TYPE_COMPLETE16,
  27. LUAT_ADV_TYPE_INCOMPLETE32,
  28. LUAT_ADV_TYPE_COMPLETE32,
  29. LUAT_ADV_TYPE_INCOMPLETE128,
  30. LUAT_ADV_TYPE_COMPLETE128,
  31. LUAT_ADV_TYPE_SHORTENED_LOCAL_NAME,
  32. LUAT_ADV_TYPE_COMPLETE_LOCAL_NAME,
  33. LUAT_ADV_TYPE_TX_POWER,
  34. LUAT_ADV_TYPE_CLASS_OF_DEVICE = 0x0D,
  35. LUAT_ADV_TYPE_SIMPLE_PAIRING_HASH,
  36. LUAT_ADV_TYPE_SIMPLE_PAIRING_RANDOMIZER,
  37. LUAT_ADV_TYPE_DEVICE_ID,
  38. // LUAT_ADV_TYPE_SECURITY_MANAGER_TK_VALUE, // 0x10
  39. LUAT_ADV_TYPE_SECURITY_MANAGER_OOB_FLAGS,
  40. LUAT_ADV_TYPE_PERIPHERAL_CONN_INTERVAL,
  41. LUAT_ADV_TYPE_SERVICE_UUIDS_16BIT = 0x14,
  42. LUAT_ADV_TYPE_SERVICE_UUIDS_128BIT,
  43. LUAT_ADV_TYPE_SERVICE_DATA_16BIT,
  44. LUAT_ADV_TYPE_PUBLIC_TARGET_ADDR,
  45. LUAT_ADV_TYPE_RANDOM_TARGET_ADDR,
  46. LUAT_ADV_TYPE_APPEARANCE,
  47. LUAT_ADV_TYPE_ADVERTISING_INTERVAL,
  48. LUAT_ADV_TYPE_LE_BLUETOOTH_DEVICE_ADDR,
  49. LUAT_ADV_TYPE_LE_ROLE,
  50. LUAT_ADV_TYPE_SIMP_PAIRING_HASH,
  51. LUAT_ADV_TYPE_SIMP_PAIRING_RANDOMIZER,
  52. LUAT_ADV_TYPE_SERVICE_UUIDS_32BIT,
  53. LUAT_ADV_TYPE_SERVICE_DATA_32BIT,
  54. LUAT_ADV_TYPE_SERVICE_DATA_128BIT,
  55. LUAT_ADV_TYPE_LE_SECURE_CONN_CONFIRM,
  56. LUAT_ADV_TYPE_LE_SECURE_CONN_RANDOM,
  57. LUAT_ADV_TYPE_URI,
  58. LUAT_ADV_TYPE_INDOOR_POSITION,
  59. LUAT_ADV_TYPE_TTANSPORT_DISC_DATA,
  60. LUAT_ADV_TYPE_LE_SUPPORT_FEATURES,
  61. LUAT_ADV_TYPE_CHAN_MAP_UPDATE_IND,
  62. LUAT_ADV_TYPE_PB_ADV,
  63. LUAT_ADV_TYPE_MESH_MESSAGE,
  64. LUAT_ADV_TYPE_MESH_BEACON,
  65. LUAT_ADV_TYPE_BIG_INFO,
  66. LUAT_ADV_TYPE_BROADCAST_CODE,
  67. LUAT_ADV_TYPE_RESOLVABLE_SET_ID,
  68. LUAT_ADV_TYPE_ADVERTISING_INTERVAL_LONG,
  69. LUAT_ADV_TYPE_BROADCAST_NAME,
  70. LUAT_ADV_TYPE_ENCRYPTED_ADVERTISING_DATA,
  71. LUAT_ADV_TYPE_PERIODIC_ADV_RESP_TIMING,
  72. LUAT_ADV_TYPE_ELECTRONIC_SHELF_LABEL = 0X34,
  73. LUAT_ADV_TYPE_3D_INFO_DATA = 0x3D,
  74. LUAT_ADV_TYPE_MANUFACTURER_SPECIFIC_DATA = 0xFF,
  75. } luat_ble_adv_type_t;
  76. // GATT SERVICE UUIDS 0X1800 - 0X185B
  77. #define LUAT_BLE_GATT_SERVICE_MIN 0X1800
  78. #define LUAT_BLE_GATT_SERVICE_MAX 0X185B
  79. // Descriptors UUIDS 0X2900 - 0X2915
  80. #define LUAT_BLE_GATT_DESC_MIN 0X2900
  81. #define LUAT_BLE_GATT_DESC_MAX 0X2915
  82. // Declarations
  83. #define LUAT_BLE_PRIMARY_SERVICE 0x2800
  84. #define LUAT_BLE_SECONDARY_SERVICE 0x2801
  85. #define LUAT_BLE_INCLUDE 0x2802
  86. #define LUAT_BLE_CHARACTERISTIC 0x2803
  87. typedef enum{
  88. LUAT_BLE_EVENT_NONE,
  89. // BLE
  90. LUAT_BLE_EVENT_INIT, // BLE初始化成功
  91. LUAT_BLE_EVENT_DEINIT, // BLE反初始化成功
  92. // ADV
  93. LUAT_BLE_EVENT_ADV_INIT, // BLE初始化广播成功
  94. LUAT_BLE_EVENT_ADV_START, // BLE开始广播
  95. LUAT_BLE_EVENT_ADV_STOP, // BLE停止广播
  96. LUAT_BLE_EVENT_ADV_DEINIT, // BLE反初始化广播成功
  97. // SCAN
  98. LUAT_BLE_EVENT_SCAN_INIT, // BLE初始化扫描成功
  99. LUAT_BLE_EVENT_SCAN_START, // BLE开始扫描
  100. LUAT_BLE_EVENT_SCAN_STOP, // BLE停止扫描
  101. LUAT_BLE_EVENT_SCAN_DEINIT, // BLE反初始化扫描成功
  102. LUAT_BLE_EVENT_SCAN_REPORT, // BLE扫描到设备
  103. // CONN
  104. LUAT_BLE_EVENT_CONN, // BLE连接成功
  105. LUAT_BLE_EVENT_DISCONN, // BLE断开连接
  106. LUAT_BLE_EVENT_GATT_DONE, // BLE GATT
  107. // WRITE/READ
  108. LUAT_BLE_EVENT_WRITE, // BLE从模式下,主设备写操作事件
  109. LUAT_BLE_EVENT_READ, // BLE从模式下,主设备读操作事件
  110. LUAT_BLE_EVENT_READ_VALUE, // BLE读value数据回调
  111. LUAT_BLE_EVENT_GATT_ITEM, // BLE GATT服务项回调
  112. LUAT_BLE_EVENT_MAX,
  113. } luat_ble_event_t;
  114. typedef enum{
  115. LUAT_BLE_UUID_TYPE_16 = 2,
  116. LUAT_BLE_UUID_TYPE_32 = 4,
  117. LUAT_BLE_UUID_TYPE_128 = 16,
  118. }luat_ble_uuid_type;
  119. typedef struct luat_bluetooth luat_bluetooth_t;
  120. typedef struct luat_ble luat_ble_t;
  121. typedef struct luat_ble_gatt_chara luat_ble_gatt_chara_t;
  122. #define LUAT_BLE_UUID_LEN_MAX 16
  123. typedef struct luat_ble_uuid{
  124. uint8_t uuid[LUAT_BLE_UUID_LEN_MAX];
  125. luat_ble_uuid_type uuid_type;
  126. }luat_ble_uuid_t;
  127. typedef struct luat_ble_gatt_descriptor{
  128. uint16_t handle;
  129. uint8_t uuid[LUAT_BLE_UUID_LEN_MAX];
  130. luat_ble_uuid_type uuid_type;
  131. uint16_t perm;
  132. uint16_t max_size;
  133. uint8_t* value;
  134. uint16_t value_len;
  135. }luat_ble_gatt_descriptor_t;
  136. struct luat_ble_gatt_chara{
  137. uint16_t handle;
  138. uint8_t uuid[LUAT_BLE_UUID_LEN_MAX];
  139. luat_ble_uuid_type uuid_type;
  140. uint16_t perm;
  141. uint16_t max_size;
  142. uint8_t* value;
  143. uint16_t value_len;
  144. luat_ble_gatt_descriptor_t* descriptor; // descriptor
  145. uint8_t descriptors_num; // number of descriptor
  146. };
  147. typedef struct {
  148. uint8_t uuid[LUAT_BLE_UUID_LEN_MAX];
  149. luat_ble_uuid_type uuid_type;
  150. luat_ble_gatt_chara_t* characteristics; // characteristics
  151. uint8_t characteristics_num; // number of characteristics
  152. }luat_ble_gatt_service_t;
  153. typedef enum{
  154. LUAT_BLE_ADDR_MODE_PUBLIC, // 控制器的公共地址
  155. LUAT_BLE_ADDR_MODE_RANDOM, // 生成的静态地址
  156. LUAT_BLE_ADDR_MODE_RPA, // 可解析的私有地址
  157. LUAT_BLE_ADDR_MODE_NRPA, // 不可解析的私有地址
  158. }luat_ble_addr_mode_t;
  159. enum {
  160. LUAT_BLE_ADV_TYPE_LEGACY = 0x00, /**< Legacy advertising */
  161. LUAT_BLE_ADV_TYPE_EXTENDED = 0x01, /**< Extended advertising */
  162. LUAT_BLE_ADV_PERIODIC = 0x02, /**< Periodic advertising */
  163. };
  164. typedef enum{
  165. LUAT_BLE_ADV_CHNL_37 = 0x01, /**< Byte value for advertising channel map for channel 37 enable */
  166. LUAT_BLE_ADV_CHNL_38 = 0x02, /**< Byte value for advertising channel map for channel 38 enable */
  167. LUAT_BLE_ADV_CHNL_39 = 0x04, /**< Byte value for advertising channel map for channel 39 enable */
  168. LUAT_BLE_ADV_CHNLS_ALL = 0x07, /**< Byte value for advertising channel map for channel 37, 38 and 39 enable */
  169. }luat_ble_adv_chnl_t;
  170. typedef enum{
  171. LUAT_BLE_ADV_PROP_CONNECTABLE = (1 << 0), /**< Connectable advertising */
  172. LUAT_BLE_ADV_PROP_SCANNABLE = (1 << 1), /**< Scannable advertising */
  173. LUAT_BLE_ADV_PROP_DIRECTED = (1 << 2), /**< Directed advertising */
  174. LUAT_BLE_ADV_PROP_HDC = (1 << 3), /**< High duty cycle advertising */
  175. LUAT_BLE_ADV_PROP_LEGACY = (1 << 4), /**< Legacy advertising */
  176. LUAT_BLE_ADV_PROP_ANONYMOUS = (1 << 5), /**< Anonymous advertising */
  177. LUAT_BLE_ADV_PROP_TX_PWR = (1 << 6), /**< Scan response */
  178. } luat_ble_adv_prop_t;
  179. typedef struct {
  180. luat_ble_adv_chnl_t channel_map;
  181. luat_ble_addr_mode_t addr_mode;
  182. uint32_t intv_min;
  183. uint32_t intv_max;
  184. uint8_t adv_prop;
  185. uint8_t adv_type;
  186. }luat_ble_adv_cfg_t;
  187. /// Scan type
  188. typedef enum {
  189. LUAT_BLE_PASSIVE_SCANNING, // Passive Scanning. No scanning PDUs shall be sent (default)
  190. LUAT_BLE_ACTIVE_SCANNING, // Active scanning. Scanning PDUs may be sent
  191. }luat_ble_scan_type_t;
  192. typedef enum {
  193. LUAT_BLE_MODE_NONE,
  194. LUAT_BLE_MODE_SLAVER,
  195. LUAT_BLE_MODE_MASTER,
  196. }luat_ble_mode_t;
  197. typedef struct {
  198. luat_ble_scan_type_t scan_type;
  199. luat_ble_addr_mode_t addr_mode;
  200. uint16_t scan_interval; // Scan interval (in unit of 625us).
  201. uint16_t scan_window; // Scan window (in unit of 625us).
  202. }luat_ble_scan_cfg_t;
  203. typedef struct{
  204. uint8_t peer_addr_type; /**< Peer address type */
  205. uint8_t peer_addr[6]; /**< Peer BT address */
  206. } luat_ble_device_info_t;
  207. typedef struct{
  208. uint16_t handle; /**< The index of the attribute */
  209. luat_ble_uuid_t uuid_service;
  210. luat_ble_uuid_t uuid_characteristic;
  211. luat_ble_uuid_t uuid_descriptor;
  212. uint8_t *value; /**< The attribute value */
  213. uint16_t value_len; /**< The length of the attribute value */
  214. uint16_t size;
  215. } luat_ble_write_req_t;
  216. typedef struct{
  217. uint16_t handle; /**< The index of the attribute */
  218. luat_ble_uuid_t uuid_service;
  219. luat_ble_uuid_t uuid_characteristic;
  220. luat_ble_uuid_t uuid_descriptor;
  221. uint8_t *value; /**< The attribute value */
  222. uint16_t value_len; /**< The data length read */
  223. uint16_t size; /**< The size of attribute value to read */
  224. } luat_ble_read_req_t;
  225. typedef struct{
  226. uint8_t actv_idx; /**< The index of the activity */
  227. uint8_t evt_type; /**< Event type (see enum \ref adv_report_info and see enum \ref adv_report_type)*/
  228. uint8_t adv_addr_type; /**< Advertising address type: public/random */
  229. int8_t rssi; /**< RSSI value for advertising packet (in dBm, between -127 and +20 dBm) */
  230. uint8_t *data; /**< Data of advertising packet */
  231. uint8_t data_len; /**< Data length in advertising packet */
  232. uint8_t adv_addr[6]; /**<Advertising address value */
  233. } luat_ble_adv_req_t;
  234. typedef struct luat_ble_conn_ind{
  235. /// Peer address type
  236. uint8_t peer_addr_type;
  237. /// Peer BT address
  238. uint8_t peer_addr[6];
  239. /// Clock accuracy
  240. uint8_t clk_accuracy;
  241. /// Connection interval
  242. uint16_t con_interval;
  243. /// Connection latency
  244. uint16_t con_latency;
  245. /// Link supervision timeout
  246. uint16_t sup_to;
  247. }luat_ble_conn_ind_t;
  248. typedef struct luat_ble_disconn_ind{
  249. uint8_t reason;
  250. }luat_ble_disconn_ind_t;
  251. typedef struct luat_ble_gatt_item_ind{
  252. uint8_t gatt_service_index;
  253. uint8_t gatt_service_total_num;
  254. luat_ble_gatt_service_t* gatt_service;
  255. }luat_ble_gatt_item_ind_t;
  256. typedef struct luat_ble_gatt_done_ind{
  257. uint8_t gatt_service_num;
  258. }luat_ble_gatt_done_ind_t;
  259. typedef struct{
  260. union {
  261. luat_ble_device_info_t luat_ble_device_info;
  262. luat_ble_write_req_t write_req;
  263. luat_ble_read_req_t read_req;
  264. luat_ble_adv_req_t adv_req;
  265. luat_ble_conn_ind_t conn_ind;
  266. luat_ble_disconn_ind_t disconn_ind;
  267. luat_ble_gatt_done_ind_t gatt_done_ind;
  268. luat_ble_gatt_item_ind_t gatt_item_ind;
  269. uint8_t data[256]; // 预留一个大的后备区域
  270. };
  271. } luat_ble_param_t;
  272. typedef struct {
  273. uint8_t *adv_data;
  274. int len;
  275. }luat_ble_adv_data_t;
  276. typedef void (*luat_ble_cb_t)(luat_ble_t* luat_ble, luat_ble_event_t ble_event, luat_ble_param_t* ble_param);
  277. struct luat_ble{
  278. luat_ble_mode_t mode;
  279. uint8_t actv_idx;
  280. luat_ble_actv_state state;
  281. luat_ble_cb_t cb;
  282. void* userdata;
  283. };
  284. // public function
  285. int luat_ble_uuid_swap(uint8_t* uuid_data, luat_ble_uuid_type uuid_type);
  286. int luat_ble_init(void* args, luat_ble_cb_t luat_ble_cb);
  287. int luat_ble_deinit(void* args);
  288. int luat_ble_set_name(void* args, char* name, uint8_t len);
  289. int luat_ble_set_max_mtu(void* args, uint16_t max_mtu);
  290. luat_ble_mode_t luat_ble_get_mode(void* args);
  291. // advertise
  292. int luat_ble_create_advertising(void* args, luat_ble_adv_cfg_t* adv_cfg);
  293. int luat_ble_set_adv_data(void* args, uint8_t* adv_buff, uint8_t adv_len);
  294. int luat_ble_set_scan_rsp_data(void* args, uint8_t* rsp_data, uint8_t rsp_len);
  295. int luat_ble_start_advertising(void* args);
  296. int luat_ble_stop_advertising(void* args);
  297. int luat_ble_delete_advertising(void* args);
  298. // gatt
  299. int luat_ble_create_gatt(void* args, luat_ble_gatt_service_t* gatt_service);
  300. int luat_ble_handle2uuid(uint16_t handle, luat_ble_uuid_t* uuid_service, luat_ble_uuid_t* uuid_characteristic, luat_ble_uuid_t* uuid_descriptor);
  301. int luat_ble_uuid2handle(luat_ble_uuid_t* uuid_service, luat_ble_uuid_t* uuid_characteristic, luat_ble_uuid_t* uuid_descriptor, uint16_t* handle);
  302. // slaver
  303. int luat_ble_write_notify_value(luat_ble_uuid_t* uuid_service, luat_ble_uuid_t* uuid_characteristic, luat_ble_uuid_t* uuid_descriptor, uint8_t* data, uint16_t len);
  304. int luat_ble_write_indicate_value(luat_ble_uuid_t* uuid_service, luat_ble_uuid_t* uuid_characteristic, luat_ble_uuid_t* uuid_descriptor, uint8_t* data, uint16_t len);
  305. int luat_ble_write_value(luat_ble_uuid_t* uuid_service, luat_ble_uuid_t* uuid_characteristic, luat_ble_uuid_t* uuid_descriptor, uint8_t* data, uint16_t len);
  306. int luat_ble_read_value(luat_ble_uuid_t* uuid_service, luat_ble_uuid_t* uuid_characteristic, luat_ble_uuid_t* uuid_descriptor, uint8_t** data, uint16_t* len);
  307. // master
  308. int luat_ble_notify_enable(luat_ble_uuid_t* uuid_service, luat_ble_uuid_t* uuid_characteristic, uint8_t enable);
  309. // scanning
  310. int luat_ble_create_scanning(void* args, luat_ble_scan_cfg_t* scan_cfg);
  311. int luat_ble_start_scanning(void* args);
  312. int luat_ble_stop_scanning(void* args);
  313. int luat_ble_delete_scanning(void* args);
  314. typedef struct luat_ble_rw_req{
  315. uint32_t len;
  316. luat_ble_uuid_t service;
  317. luat_ble_uuid_t characteristic;
  318. luat_ble_uuid_t descriptor;
  319. uint8_t data[0];
  320. }luat_ble_rw_req_t;
  321. typedef struct luat_ble_conn_req {
  322. uint8_t adv_addr_type; /**< Advertising address type: public/random */
  323. uint8_t adv_addr[6]; /**< Advertising address value */
  324. uint16_t conn_interval; /**< Connection interval */
  325. uint16_t conn_latency; /**< Connection latency */
  326. uint16_t sup_to; /**< Link supervision timeout */
  327. }luat_ble_connect_req_t;
  328. int luat_ble_connect(void* args, luat_ble_connect_req_t *conn);
  329. int luat_ble_disconnect(void* args);
  330. #endif