In our previous guide, we have shown that we can trigger ESP32 (with Arduino IDE) to send message to IBM Watson IoT in Presence of a Particular Samsung Galaxy Smartwatch. That process 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 LED. In our other series of articles, we used the IBM Watson IoT Widgets. A natural question arises: can we can make the ESP32 to trigger events on IBM Watson IoT when a particular Samsung Smartwatch will come closer to it so that we will get the status of the smartwatch, such as closer or far away? The screenshot will answer.

IBM Watson IoT widgets or cards can be customized with images and CSS. We need one of the default widget for this project. This guide involves a piece of code which is improved version from the previous guide. This is the 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 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 | #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"); doWiFiClientLost(); } } 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\": {\"Our device found!\": \"") + 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 doWiFiClientLost() { WiFiClientSecure client; Serial.print("connect: "); Serial.println(urlHost); while ( ! client.connect(urlHost.c_str(), urlPort)) { Serial.print("."); } Serial.println("Connected"); String postData = String("{ \"d\": {\"Our device is away!\": \"") + 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()); } |
You will also get the above code on our ESP32 IBM Watson IoT Example repository on GitHub as detect-smartwatch-on-dashboard-widget.ino.
---
As you can see, connection and disconnection are two separate functions doWiFiClientSecure()
and doWiFiClientLost()
:
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 | 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\": {\"Our device found!\": \"") + 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 doWiFiClientLost() { WiFiClientSecure client; Serial.print("connect: "); Serial.println(urlHost); while ( ! client.connect(urlHost.c_str(), urlPort)) { Serial.print("."); } Serial.println("Connected"); String postData = String("{ \"d\": {\"Our device is away!\": \"") + 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(); } |
On IBM Watson IoT dashboard, create an “all device properties” card. There is nothing more to explain.