Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp
00001 #include "mbed.h" 00002 #include "ESP32.h" 00003 00004 #define BLE_NOTIFICATION_CHAR 6 00005 #define BLE_INDICATION_CHAR 7 00006 00007 BufferedSerial esp32(P7_1, P0_1, 1024); 00008 ATParser_os esp_parser(esp32); 00009 Serial pc(USBTX, USBRX); // tx, rx 00010 DigitalOut esp_en(P5_3); 00011 DigitalOut esp_io0(P3_14); 00012 DigitalOut led_green(LED1); 00013 DigitalOut led_yellow(LED2); 00014 DigitalOut led_orange(LED3); 00015 DigitalOut led_red(LED4); 00016 InterruptIn button0(USER_BUTTON0); 00017 InterruptIn button1(USER_BUTTON1); 00018 Semaphore event_sem(0); 00019 00020 const char ble_name[] = "GR-LYCHEE"; 00021 bool ble_advertizing; 00022 bool ble_connected; 00023 uint8_t ble_conn_index; 00024 uint8_t ble_srv_index; 00025 00026 bool button0_flag = false; 00027 bool button1_flag = false; 00028 bool ble_notification_on = false; 00029 bool ble_indication_on = false; 00030 00031 void esp32_event() { 00032 event_sem.release(); 00033 } 00034 00035 void ble_client_read() { 00036 uint8_t mac[6] = {0}; 00037 00038 led_yellow = 1; 00039 esp_parser.recv("%hhd,\"%hhx:%hhx:%hhx:%hhx:%hhx:%hhx\"", 00040 &ble_conn_index, &mac[0], &mac[1], &mac[2], &mac[3], &mac[4], &mac[5]); 00041 printf("conn_index=%d, mac[%x:%x:%x:%x:%x:%x]\r\n", 00042 ble_conn_index, mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); 00043 led_yellow = 0; 00044 } 00045 00046 void ble_client_write() { 00047 uint8_t char_index, desc_index = 0; 00048 uint16_t len; 00049 00050 led_orange = 1; 00051 esp_parser.recv("%hhd,%hhd,%hhd,", &ble_conn_index, &ble_srv_index, &char_index); 00052 printf("conn=%d srv=%d char=%d\r\n", ble_conn_index, ble_srv_index, char_index); 00053 00054 char c = esp_parser.getc(); 00055 if (c != ',') { 00056 desc_index = c; 00057 esp_parser.getc(); // to read ',' after desc_index. 00058 printf("desc=%d\r\n", desc_index); 00059 } 00060 00061 esp_parser.recv("%hhd,", &len); 00062 printf("length=%d\r\n", len); 00063 00064 uint8_t *data = (uint8_t *)malloc(len * sizeof(uint8_t)); 00065 for (int i = 0; i < len; i++) { 00066 data[i] = esp_parser.getc(); 00067 printf("%x\r\n", data[i]); 00068 } 00069 00070 if ((desc_index == 49) && (char_index == BLE_NOTIFICATION_CHAR)) { 00071 if (data[0] == 1) { 00072 printf("Notification On\r\n"); 00073 ble_notification_on = true; 00074 } else { 00075 printf("Notification Off\r\n"); 00076 ble_notification_on = false; 00077 } 00078 } else if ((desc_index == 49) && (char_index == BLE_INDICATION_CHAR)) { 00079 if (data[0] == 2) { 00080 printf("Indication On\r\n"); 00081 ble_indication_on = true; 00082 } else { 00083 printf("Indication Off\r\n"); 00084 ble_indication_on = false; 00085 } 00086 } 00087 led_orange = 0; 00088 } 00089 00090 void ble_client_disconn() { 00091 led_green = 0; 00092 printf("disconnected client\r\n"); 00093 ble_connected = false; 00094 } 00095 00096 void ble_client_conn() { 00097 uint8_t mac[6] = {0}; 00098 esp_parser.recv("%hhd,\"%hhx:%hhx:%hhx:%hhx:%hhx:%hhx\"", 00099 &ble_conn_index, &mac[0], &mac[1], &mac[2], &mac[3], &mac[4], &mac[5]); 00100 printf("connected client conn_index is %d, mac[%x:%x:%x:%x:%x:%x]\r\n", 00101 ble_conn_index, mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); 00102 00103 led_green = 1; 00104 ble_advertizing = false; 00105 ble_connected = true; 00106 } 00107 00108 void ub0_interrupt() { 00109 if (button0_flag == false) { 00110 button0_flag = true; 00111 event_sem.release(); 00112 } 00113 } 00114 00115 void ub1_interrupt() { 00116 if (button1_flag == false) { 00117 button1_flag = true; 00118 event_sem.release(); 00119 } 00120 } 00121 00122 int main() { 00123 00124 printf("Bluetooth sample started\r\n"); 00125 led_green = 0; 00126 led_yellow = 0; 00127 led_orange = 0; 00128 led_red = 0; 00129 ble_advertizing = false; 00130 ble_connected = false; 00131 button0.fall(ub0_interrupt); 00132 button1.fall(ub1_interrupt); 00133 00134 // Initializing esp32 access 00135 esp32.baud(115200); 00136 esp32.attach(Callback<void()>(esp32_event)); 00137 esp_io0 = 1; 00138 esp_en = 0; 00139 Thread::wait(10); 00140 esp_en = 1; 00141 esp_parser.setTimeout(1500); 00142 if (esp_parser.recv("ready")) { 00143 printf("ESP32 ready\r\n"); 00144 } else { 00145 printf("ESP32 error\r\n"); 00146 led_red = 1; 00147 while (1); 00148 } 00149 00150 // Initializing esp32 as a server with GATT service 00151 esp_parser.setTimeout(5000); 00152 if (esp_parser.send("AT+BLEINIT=2") && esp_parser.recv("OK") 00153 && esp_parser.send("AT+BLENAME=\"%s\"", ble_name) && esp_parser.recv("OK") 00154 && esp_parser.send("AT+BLEGATTSSRVCRE") && esp_parser.recv("OK") 00155 && esp_parser.send("AT+BLEGATTSSRVSTART") && esp_parser.recv("OK")) { 00156 printf("GATT initialized\r\n"); 00157 } else { 00158 printf("fail to initialize\r\n"); 00159 led_red = 1; 00160 while (1); 00161 } 00162 00163 uint8_t start, type; 00164 uint16_t uuid; 00165 esp_parser.send("AT+BLEGATTSSRV?"); 00166 if (esp_parser.recv("+BLEGATTSSRV:%hhd,%hhd,%hhx,%hhd\r\nOK", &ble_srv_index, &start, &uuid, &type)) { 00167 printf("srv_index is %d\r\n", ble_srv_index); 00168 } else { 00169 printf("fail to get service\r\n"); 00170 led_red = 1; 00171 } 00172 00173 esp_parser.oob("+READ:", ble_client_read); 00174 esp_parser.oob("+WRITE:", ble_client_write); 00175 esp_parser.oob("+BLEDISCONN:", ble_client_disconn); 00176 esp_parser.oob("+BLECONN:", ble_client_conn); 00177 00178 while (1) { 00179 esp_parser.setTimeout(5000); 00180 if (esp_parser.send("AT+BLEADVSTART") && esp_parser.recv("OK")) { 00181 printf("Advertising started. Please connect to any client\r\n"); 00182 ble_advertizing = true; 00183 } else { 00184 printf("fail to start advertising\r\n"); 00185 led_red = 1; 00186 while (1); 00187 } 00188 00189 while (ble_connected || ble_advertizing) { 00190 event_sem.wait(); 00191 esp_parser.setTimeout(5); 00192 esp_parser.recv(" "); //dummy read for parser callback 00193 00194 // Set attribute of C300 00195 if (button0_flag) { 00196 static uint8_t data = 1; // write data 00197 esp_parser.setTimeout(5000); 00198 // AT+BLEGATTSSETATTR=<srv_index>,<char_index>[,<desc_index>],<length> 00199 if (esp_parser.send("AT+BLEGATTSSETATTR=%d,1,,1", ble_srv_index) && esp_parser.recv(">")) { 00200 if (esp_parser.putc(data) && esp_parser.recv("OK")) { 00201 printf("success to send\r\n"); 00202 } else { 00203 printf("fail to send\r\n"); 00204 } 00205 } else { 00206 printf("fail to command AT\r\n"); 00207 } 00208 esp_parser.flush(); 00209 button0_flag = false; 00210 data++; 00211 } 00212 00213 // Set notification of C305 00214 if (button1_flag && ble_notification_on) { 00215 static uint8_t data = 0xff; // write data 00216 esp_parser.setTimeout(5000); 00217 // AT+BLEGATTSNTFY=<conn_index>,<srv_index>,<char_index>,<length> 00218 if (esp_parser.send("AT+BLEGATTSNTFY=%d,%d,%d,1", ble_conn_index, ble_srv_index, BLE_NOTIFICATION_CHAR) 00219 && esp_parser.recv(">")) { 00220 if (esp_parser.putc(data) && esp_parser.recv("OK")) { 00221 printf("success to notify\r\n"); 00222 } else { 00223 printf("fail to notify\r\n"); 00224 } 00225 } else { 00226 printf("fail to command AT\r\n"); 00227 } 00228 esp_parser.flush(); 00229 button1_flag = false; 00230 data--; 00231 } 00232 } 00233 } 00234 }
Generated on Sun Jul 17 2022 03:48:06 by
1.7.2