We can trigger ESP32 to send message to IBM Watson IoT in Presence of a Particular Samsung Galaxy Smartwatch. This involves BLE and WiFi. In our one series of articles on Samsung Smartwatch as Proximity Switch, we triggered a local event, such as control of a relay. In our other series of articles, we sent message to IBM Watson IoT with upon pressing a button (this guide and this guide).
Now, we can combine the two projects so that ESP32 will connect with IBM Watson IoT when a particular Samsung Smartwatch will come closer to it. That is great for some automation which we can not handle locally, like sending a text message or an Email. This is the working code :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 | #include "BLEDevice.h" #include <WiFi.h> #include <WiFiMulti.h> #include <HTTPClient.h> #include <base64.h> #define USE_SERIAL Serial const char* ssid = "your-hotspot"; const char* password = "password-of-hotspot"; #define ORG "paste-it-here" #define DEVICE_TYPE "DevBoard" //change #define DEVICE_ID "ESP32" // change #define TOKEN "your-token" #define EVENT "myEvent" // example // <------- CHANGE PARAMETERS ABOVE THIS LINE ------------> String urlPath = "/api/v0002/device/types/" DEVICE_TYPE "/devices/" DEVICE_ID "/events/" EVENT; String urlHost = ORG ".messaging.internetofthings.ibmcloud.com"; int urlPort = 8883; String authHeader; static BLEAddress *pServerAddress; BLEScan* pBLEScan; BLEClient* pClient; bool deviceFound = false; bool LEDoff = false; bool BotonOff = false; String knownAddresses[] = { "e0:a1:07:b7:0b:95"}; // change the MAC unsigned long entry; static void notifyCallback( BLERemoteCharacteristic* pBLERemoteCharacteristic, uint8_t* pData, size_t length, bool isNotify) { Serial.print("Notify callback for characteristic "); Serial.print(pBLERemoteCharacteristic->getUUID().toString().c_str()); Serial.print(" of data length "); Serial.println(length); } class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks { void onResult(BLEAdvertisedDevice Device){ // show the MAC of other BLE devices //Serial.print("BLE Advertised Device found: "); //Serial.println(Device.toString().c_str()); pServerAddress = new BLEAddress(Device.getAddress()); bool known = false; bool Master = false; for (int i = 0; i < (sizeof(knownAddresses) / sizeof(knownAddresses[0])); i++) { if (strcmp(pServerAddress->toString().c_str(), knownAddresses[i].c_str()) == 0) known = true; } if (known) { Serial.print("Our device found!"); Serial.print("Device distance:"); Serial.println(Device.getRSSI()); // adjust the value. -85 is medium distance // -60 is closer than -85 if (Device.getRSSI() > -85) { deviceFound = true; } else { deviceFound = false; } Device.getScan()->stop(); delay(100); } } }; void setup() { Serial.begin(115200); BLEDevice::init(""); pClient = BLEDevice::createClient(); pBLEScan = BLEDevice::getScan(); pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks()); pBLEScan->setActiveScan(true); initWifi(); authHeader = "Authorization: Basic " + base64::encode("use-token-auth:" TOKEN) + "\r\n"; Serial.println("Done"); } void Bluetooth() { Serial.println(); Serial.println("BLE Scan restarted....."); deviceFound = false; BLEScanResults scanResults = pBLEScan->start(5); if (deviceFound) { Serial.println("Found"); doWiFiClientSecure(); delay(10000); } else{ Serial.println("Device is not closer"); } } void loop() { Bluetooth(); } void doWiFiClientSecure() { WiFiClientSecure client; Serial.print("connect: "); Serial.println(urlHost); while ( ! client.connect(urlHost.c_str(), urlPort)) { Serial.print("."); } Serial.println("Connected"); String postData = String("{ \"d\": {\"aMessage\": \"") + millis()/1000 + "\"} }"; String msg = "POST " + urlPath + " HTTP/1.1\r\n" "Host: " + urlHost + "\r\n" "" + authHeader + "" "Content-Type: application/json\r\n" "Content-Length: " + postData.length() + "\r\n" "\r\n" + postData; client.print(msg); Serial.print(msg); Serial.print("\n*** Request sent, receiving response..."); while (!!!client.available()) { delay(50); Serial.print("."); } Serial.println(); Serial.println("Got response"); while(client.available()){ Serial.write(client.read()); } Serial.println(); Serial.println("closing connection"); client.stop(); } void initWifi() { Serial.print("Connecting to: "); Serial.print(WiFi.SSID()); WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(250); Serial.print("."); } Serial.println(""); Serial.print("WiFi connected, IP address: "); Serial.println(WiFi.localIP()); } |
NOTE : You need to follow this guide to enable Arduino IDE to upload this large code on ESP32. Else you’ll face “Sketch Too Big” error! This code will consume 85% space. So, we have some more space to upgrade the code in future.
---
The above code, in presence of the particular smartwatch will give this output on serial monitor :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | Connected POST /api/v0002/device/types/DevBoard/devices/ESP32/events/myEvent HTTP/1.1 Host: tko2rj.messaging.internetofthings.ibmcloud.com Authorization: Basic dXNlLXRva2VuLWF1dGg6YihONHFQM0BMeCF5ZGFvaUVN Content-Type: application/json Content-Length: 28 { "d": {"aMessage": "5"} } *** Request sent, receiving response................... Got response HTTP/1.1 200 OK Server: IBM WIoTP Message Gateway Date: Tue, 17 Mar 2020 17:35:52 GMT Access-Control-Allow-Origin: * Access-Control-Allow-Credentials: true Connection: keep-alive Keep-Alive: timeout=60 Cache-Control: no-cache Content-Type: text/plain;charset=utf-8 Content-Length: 0 closing connection |
And this debug information on your IBM Watson IoT’s log :
If the device is absent, then you’ll get :
1 2 3 4 5 6 7 8 | BLE Scan restarted..... The device is not closer BLE Scan restarted..... The device is not closer BLE Scan restarted..... The device is not closer |
We had a GitHub repository with all sample codes for IBM Watson IoT we have created. We have added the above code to the repository as smartwatch-BLE-switch.ino
.
This code can be advanced with distance measurement data and applied in real-life with car, garage door and so on to automatically notify the family members.