Mwadime Makokha / Mbed 2 deprecated BlueToothSIM868

Dependencies:   mbed

Committer:
MwadimeMakokha
Date:
Wed Jan 08 11:31:58 2020 +0000
Revision:
4:6f32ed1480a4
Parent:
3:936c6d909891
Add comments

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MwadimeMakokha 1:940070f92554 1 #include "BT.h"
MwadimeMakokha 1:940070f92554 2 Serial* BT::modemSerial =0;
MwadimeMakokha 1:940070f92554 3 BT::BT(Serial &port){
MwadimeMakokha 1:940070f92554 4 modemSerial = &port;
MwadimeMakokha 3:936c6d909891 5 //Test if the modem is good
MwadimeMakokha 2:83d03d7148a5 6 send_bt_cmd("ATE0");
MwadimeMakokha 2:83d03d7148a5 7 get_response(1000,false);
MwadimeMakokha 3:936c6d909891 8 DEBUG_PRINTLN("%s",modem_response);
MwadimeMakokha 3:936c6d909891 9 //Power the device and unpair all devices
MwadimeMakokha 3:936c6d909891 10 power_bt_device(1);
MwadimeMakokha 3:936c6d909891 11 bt_unpair_device();
MwadimeMakokha 1:940070f92554 12 }
MwadimeMakokha 4:6f32ed1480a4 13 /*
MwadimeMakokha 4:6f32ed1480a4 14 @brief Get the bluetooth status -> The modem response contains the status
MwadimeMakokha 4:6f32ed1480a4 15 */
MwadimeMakokha 1:940070f92554 16 void BT::get_bt_status(){
MwadimeMakokha 4:6f32ed1480a4 17 send_bt_cmd("AT+BTSTATUS?");
MwadimeMakokha 1:940070f92554 18 get_response(1000,true);
MwadimeMakokha 1:940070f92554 19 DEBUG_PRINTLN("%s",modem_response);
MwadimeMakokha 2:83d03d7148a5 20 }
MwadimeMakokha 2:83d03d7148a5 21
MwadimeMakokha 4:6f32ed1480a4 22 /*
MwadimeMakokha 4:6f32ed1480a4 23 @brief power the bt funtionality on/off depending on the params passed
MwadimeMakokha 4:6f32ed1480a4 24 @params bool on/off -> determines if bt powered on or off
MwadimeMakokha 4:6f32ed1480a4 25 */
MwadimeMakokha 1:940070f92554 26 void BT::power_bt_device(bool on){
MwadimeMakokha 1:940070f92554 27 if(on)send_bt_cmd("AT+BTPOWER=1");
MwadimeMakokha 1:940070f92554 28 else send_bt_cmd("AT+BTPOWER=0");
MwadimeMakokha 1:940070f92554 29 get_response(1000,false);
MwadimeMakokha 1:940070f92554 30 DEBUG_PRINTLN("%s",modem_response);
MwadimeMakokha 1:940070f92554 31 }
MwadimeMakokha 2:83d03d7148a5 32
MwadimeMakokha 4:6f32ed1480a4 33 /*
MwadimeMakokha 4:6f32ed1480a4 34 @brief scan for the devices for the time passed in the params and gets the phone id from the mac_address
MwadimeMakokha 4:6f32ed1480a4 35 @params waiting time for scanning
MwadimeMakokha 4:6f32ed1480a4 36 @retval phone id
MwadimeMakokha 4:6f32ed1480a4 37 */
MwadimeMakokha 2:83d03d7148a5 38 char BT::bt_scan(uint32_t timeout){
MwadimeMakokha 2:83d03d7148a5 39 char id;
MwadimeMakokha 2:83d03d7148a5 40 if(timeout>60000){
MwadimeMakokha 2:83d03d7148a5 41 int cmd_rounds = timeout/10000;
MwadimeMakokha 2:83d03d7148a5 42 for(int k=0;k<cmd_rounds;k++){
MwadimeMakokha 2:83d03d7148a5 43 send_bt_cmd("AT+BTSCAN=1,10");
MwadimeMakokha 2:83d03d7148a5 44 get_response(10000,true);
MwadimeMakokha 1:940070f92554 45 DEBUG_PRINTLN("%s",modem_response);
MwadimeMakokha 1:940070f92554 46 char* mac_address = get_phone_mac_addr();
MwadimeMakokha 2:83d03d7148a5 47 id = get_phone_id(mac_address);
MwadimeMakokha 2:83d03d7148a5 48 if(id != '0') break ;
MwadimeMakokha 2:83d03d7148a5 49 }
MwadimeMakokha 2:83d03d7148a5 50 }
MwadimeMakokha 2:83d03d7148a5 51 return id;
MwadimeMakokha 1:940070f92554 52 }
MwadimeMakokha 2:83d03d7148a5 53
MwadimeMakokha 4:6f32ed1480a4 54 /*
MwadimeMakokha 4:6f32ed1480a4 55 @brief pair with device of the id given
MwadimeMakokha 4:6f32ed1480a4 56 @params id of the phone to be paired
MwadimeMakokha 4:6f32ed1480a4 57 */
MwadimeMakokha 1:940070f92554 58 void BT::bt_pair_device(char id){
MwadimeMakokha 4:6f32ed1480a4 59 DEBUG_PRINTLN("ID returned");
MwadimeMakokha 1:940070f92554 60 modemSerial->printf("AT+BTPAIR=0,%c\n\r",id);
MwadimeMakokha 2:83d03d7148a5 61 get_response(5000,true);
MwadimeMakokha 1:940070f92554 62 DEBUG_PRINTLN("%s",modem_response);
MwadimeMakokha 2:83d03d7148a5 63 char* passkey = get_phone_passkey();
MwadimeMakokha 2:83d03d7148a5 64 if(passkey != "error"){
MwadimeMakokha 2:83d03d7148a5 65 send_bt_cmd("AT+BTPAIR=1,1");
MwadimeMakokha 2:83d03d7148a5 66 get_response(3000,true);
MwadimeMakokha 2:83d03d7148a5 67 }
MwadimeMakokha 2:83d03d7148a5 68 else{
MwadimeMakokha 2:83d03d7148a5 69 DEBUG_PRINTLN("Error");
MwadimeMakokha 2:83d03d7148a5 70 }
MwadimeMakokha 1:940070f92554 71 }
MwadimeMakokha 2:83d03d7148a5 72
MwadimeMakokha 4:6f32ed1480a4 73 /*
MwadimeMakokha 4:6f32ed1480a4 74 @brief provide mac address of the bt phone
MwadimeMakokha 4:6f32ed1480a4 75 @retval mac_address
MwadimeMakokha 4:6f32ed1480a4 76 */
MwadimeMakokha 1:940070f92554 77 char* BT::get_phone_mac_addr(){
MwadimeMakokha 4:6f32ed1480a4 78 //TODO: Get mac address from MQTT event
MwadimeMakokha 3:936c6d909891 79 return mac_addr_1;
MwadimeMakokha 4:6f32ed1480a4 80 }
MwadimeMakokha 3:936c6d909891 81
MwadimeMakokha 4:6f32ed1480a4 82 /*
MwadimeMakokha 4:6f32ed1480a4 83 @brief get the device bt id
MwadimeMakokha 4:6f32ed1480a4 84 @params mac_address of the device
MwadimeMakokha 4:6f32ed1480a4 85 @retval device bt id
MwadimeMakokha 4:6f32ed1480a4 86 */
MwadimeMakokha 1:940070f92554 87 char BT::get_phone_id(char* addr){
MwadimeMakokha 1:940070f92554 88 char id=0;
MwadimeMakokha 1:940070f92554 89 bool id_found=false;
MwadimeMakokha 1:940070f92554 90 char* dev_addr;
MwadimeMakokha 1:940070f92554 91 int comma_count =0;
MwadimeMakokha 1:940070f92554 92 int arr_index =0;
MwadimeMakokha 1:940070f92554 93 while(modem_response[arr_index] != 0){
MwadimeMakokha 1:940070f92554 94 if(comma_count==1)id = modem_response[arr_index++];
MwadimeMakokha 1:940070f92554 95 if(comma_count==3){
MwadimeMakokha 1:940070f92554 96 for(int k=0;k<17;k++){
MwadimeMakokha 1:940070f92554 97 dev_addr[k] = modem_response[arr_index+k];
MwadimeMakokha 1:940070f92554 98 }
MwadimeMakokha 1:940070f92554 99 if(strcmp(dev_addr,addr) == 0){
MwadimeMakokha 1:940070f92554 100 DEBUG_PRINTLN("id = %c",id);
MwadimeMakokha 1:940070f92554 101 id_found = true;
MwadimeMakokha 1:940070f92554 102 break;
MwadimeMakokha 1:940070f92554 103 }
MwadimeMakokha 1:940070f92554 104 }
MwadimeMakokha 1:940070f92554 105 if(modem_response[arr_index]==',')comma_count++;
MwadimeMakokha 1:940070f92554 106 if(modem_response[arr_index]=='\n')comma_count=0;
MwadimeMakokha 1:940070f92554 107 arr_index++;
MwadimeMakokha 1:940070f92554 108 }
MwadimeMakokha 1:940070f92554 109 return id_found?id:'0';
MwadimeMakokha 1:940070f92554 110 }
MwadimeMakokha 1:940070f92554 111
MwadimeMakokha 4:6f32ed1480a4 112 /*
MwadimeMakokha 4:6f32ed1480a4 113 @brief get the passkey during pairing
MwadimeMakokha 4:6f32ed1480a4 114 @retval the pairing passkeys
MwadimeMakokha 4:6f32ed1480a4 115 */
MwadimeMakokha 2:83d03d7148a5 116 char* BT::get_phone_passkey(){
MwadimeMakokha 2:83d03d7148a5 117 int arr_index = 0;
MwadimeMakokha 2:83d03d7148a5 118 char* passkey=new char[7];
MwadimeMakokha 2:83d03d7148a5 119 bool passkey_found=false;
MwadimeMakokha 2:83d03d7148a5 120 int comma_count = 0;
MwadimeMakokha 2:83d03d7148a5 121 while(modem_response[arr_index] !=0){
MwadimeMakokha 2:83d03d7148a5 122 if(comma_count == 2){
MwadimeMakokha 2:83d03d7148a5 123 int i =0;
MwadimeMakokha 2:83d03d7148a5 124 while(modem_response[arr_index+i] != 0){
MwadimeMakokha 2:83d03d7148a5 125 passkey[i] = modem_response[arr_index+i];
MwadimeMakokha 2:83d03d7148a5 126 i++;
MwadimeMakokha 2:83d03d7148a5 127 }
MwadimeMakokha 2:83d03d7148a5 128 passkey[i] = 0;
MwadimeMakokha 2:83d03d7148a5 129 passkey_found = true;
MwadimeMakokha 2:83d03d7148a5 130 break;
MwadimeMakokha 2:83d03d7148a5 131 }
MwadimeMakokha 2:83d03d7148a5 132 if(modem_response[arr_index]==',')comma_count++;
MwadimeMakokha 2:83d03d7148a5 133 arr_index++;
MwadimeMakokha 2:83d03d7148a5 134 }
MwadimeMakokha 2:83d03d7148a5 135 if(passkey_found){
MwadimeMakokha 2:83d03d7148a5 136 return passkey;
MwadimeMakokha 2:83d03d7148a5 137 }
MwadimeMakokha 2:83d03d7148a5 138 DEBUG_PRINTLN("Error");
MwadimeMakokha 2:83d03d7148a5 139 return "error";
MwadimeMakokha 2:83d03d7148a5 140 }
MwadimeMakokha 2:83d03d7148a5 141
MwadimeMakokha 4:6f32ed1480a4 142 /*
MwadimeMakokha 4:6f32ed1480a4 143 @brief unpair bt device
MwadimeMakokha 4:6f32ed1480a4 144 */
MwadimeMakokha 2:83d03d7148a5 145 void BT::bt_unpair_device(){
MwadimeMakokha 2:83d03d7148a5 146 send_bt_cmd("AT+BTUNPAIR=0");
MwadimeMakokha 2:83d03d7148a5 147 get_response(1000,false);
MwadimeMakokha 2:83d03d7148a5 148 }
MwadimeMakokha 2:83d03d7148a5 149
MwadimeMakokha 4:6f32ed1480a4 150 /*
MwadimeMakokha 4:6f32ed1480a4 151 @brief connect to bt device
MwadimeMakokha 4:6f32ed1480a4 152 */
MwadimeMakokha 3:936c6d909891 153 void BT::bt_connect_device(char id){
MwadimeMakokha 3:936c6d909891 154 modemSerial->printf("AT+BTCONNECT=%c,10\n\r",id);
MwadimeMakokha 3:936c6d909891 155 get_response(2000,true);
MwadimeMakokha 2:83d03d7148a5 156 DEBUG_PRINTLN("%s",modem_response);
MwadimeMakokha 2:83d03d7148a5 157 }
MwadimeMakokha 2:83d03d7148a5 158
MwadimeMakokha 4:6f32ed1480a4 159 /*
MwadimeMakokha 4:6f32ed1480a4 160 @brief disconnect bt device
MwadimeMakokha 4:6f32ed1480a4 161 */
MwadimeMakokha 3:936c6d909891 162 void BT::bt_disconnect_device(char id){
MwadimeMakokha 3:936c6d909891 163 modemSerial->printf("AT+BTDISCONN=%c",id);
MwadimeMakokha 3:936c6d909891 164 get_response(2000,true);
MwadimeMakokha 3:936c6d909891 165 DEBUG_PRINTLN("%s",modem_response);
MwadimeMakokha 3:936c6d909891 166 }
MwadimeMakokha 4:6f32ed1480a4 167
MwadimeMakokha 4:6f32ed1480a4 168 /*
MwadimeMakokha 4:6f32ed1480a4 169 @brief gets the bt device available profiles
MwadimeMakokha 4:6f32ed1480a4 170 */
MwadimeMakokha 3:936c6d909891 171 void BT::bt_get_profile_id(char id){
MwadimeMakokha 2:83d03d7148a5 172 modemSerial->printf("AT+BTGETPROF=%c\n\r",id);
MwadimeMakokha 2:83d03d7148a5 173 get_response(2000,true);
MwadimeMakokha 2:83d03d7148a5 174 DEBUG_PRINTLN("%s",modem_response);
MwadimeMakokha 2:83d03d7148a5 175 }
MwadimeMakokha 2:83d03d7148a5 176
MwadimeMakokha 2:83d03d7148a5 177 void BT::send_bt_cmd(char* cmd){
MwadimeMakokha 1:940070f92554 178 modemSerial->printf(cmd);
MwadimeMakokha 1:940070f92554 179 modemSerial->printf("\n\r");
MwadimeMakokha 1:940070f92554 180 }
MwadimeMakokha 2:83d03d7148a5 181 void BT::get_response(uint32_t timeout,bool is_multiline){
MwadimeMakokha 1:940070f92554 182 int arr_index=0;
MwadimeMakokha 1:940070f92554 183 while(timeout){
MwadimeMakokha 1:940070f92554 184 if(arr_index >= 254) break;
MwadimeMakokha 1:940070f92554 185 while(modemSerial->readable()){
MwadimeMakokha 1:940070f92554 186 char c = modemSerial->getc();
MwadimeMakokha 1:940070f92554 187 if(c == '\r') continue;
MwadimeMakokha 1:940070f92554 188 if(c=='\n' && arr_index==0){
MwadimeMakokha 1:940070f92554 189 continue;
MwadimeMakokha 1:940070f92554 190 }
MwadimeMakokha 1:940070f92554 191 if(c=='\n' && !is_multiline){
MwadimeMakokha 1:940070f92554 192 break;
MwadimeMakokha 1:940070f92554 193 }
MwadimeMakokha 1:940070f92554 194 modem_response[arr_index] = c;
MwadimeMakokha 1:940070f92554 195 arr_index++;
MwadimeMakokha 1:940070f92554 196 }
MwadimeMakokha 1:940070f92554 197 timeout--;
MwadimeMakokha 1:940070f92554 198 wait_ms(1);
MwadimeMakokha 1:940070f92554 199 }
MwadimeMakokha 1:940070f92554 200 modem_response[arr_index] = 0;
MwadimeMakokha 3:936c6d909891 201 }
MwadimeMakokha 3:936c6d909891 202 char* BT::get_response(){
MwadimeMakokha 3:936c6d909891 203 return modem_response;
MwadimeMakokha 1:940070f92554 204 }