IBM Watson Visual Recognition of Images Supports cURL. ESP32 Arduino Can Send cURL of Images and Receive JSON Response on Serial Monitor. Demo of Watson Visial Recognition can be found on this URL :
1 | https://www.ibm.com/watson/services/visual-recognition/demo/#demo |
WARNING : This testing project’s Arduino/ESP32 code may return blank response at present. It is for pointing to understand how the platform can be used from just ESP32.
The Lite (free) plan of IBM Watson Visual Recognition allows 1000 requests per month. That should be enough for testing and ordinary works. IBM Watson Visual Recognition supports up to 10 MB image size. Detailed documentation can be found on :
---
1 2 3 4 | https://console.bluemix.net/apidocs/visual-recognition https://github.com/IBM-Bluemix-Docs/visual-recognition/blob/master/getting-started.md https://console.bluemix.net/docs/services/visual-recognition/tutorial-custom-classifier.html#tutorial-custom-classifier https://www.ibm.com/watson/services/visual-recognition/demo/#demo |
First we need an running Watson Visual Recognition service on IBM Cloud. Then generate a credidential. After generating the API, we will get example cURL (change the API key) like this :
1 | curl -u "apikey:big_api_key_here" "https://gateway.watsonplatform.net/visual-recognition/api/v3/classify?url=https://watson-developer-cloud.github.io/doc-tutorial-downloads/visual-recognition/640px-IBM_VGA_90X8941_on_PS55.jpg&version=2018-03-19" |
apikey is their set & allowed user name. If you run cURL appending -v
with the above, you will see the request headers :
1 2 3 4 5 | > GET /visual-recognition/api/v3/classify?url=https://watson-developer-cloud.github.io/doc-tutorial-downloads/visual-recognition/640px-IBM_VGA_90X8941_on_PS55.jpg&version=2018-03-19 HTTP/1.1 > Host: gateway.watsonplatform.net > Authorization: Basic YXBpa2V5OmhBUG9lbzFGTUVxU3BBNjJ > User-Agent: curl/7.47.0 > Accept: */* |
It is an HTTP GET request with the above parameters. You can try this code for ESP32 :
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 | #include <WiFi.h> #include <WiFiMulti.h> #include <HTTPClient.h> #include <base64.h> #define USE_SERIAL Serial // <------- CHANGE PARAMETERS BELOW THIS LINE ------------> const char* ssid = "your hotspot"; const char* password = "abcdefgh"; #define IMAGE "https://watson-developer-cloud.github.io/doc-tutorial-downloads/visual-recognition/640px-IBM_VGA_90X8941_on_PS55.jpg" #define TOKEN "your-api" #define DATE "2018-03-19" // <------- CHANGE PARAMETERS ABOVE THIS LINE ------------> String urlPath = "/visual-recognition/api/v3/classify?url=" IMAGE "&version=" DATE; String urlHost = "gateway.watsonplatform.net"; int urlPort = 443; String authHeader; void setup() { Serial.begin(115200); Serial.println(); initWifi(); authHeader = "Authorization: Basic " + base64::encode("apikey:" TOKEN) + "\r\n"; } void loop() { doWiFiClientSecure(); delay(10000); } void doWiFiClientSecure() { WiFiClientSecure client; Serial.print("connect: "); Serial.println(urlHost); while ( ! client.connect(urlHost.c_str(), urlPort)) { Serial.print("."); } Serial.println("Connected"); String msg = "GET" + urlPath + " HTTP/1.1\r\n" "Host: " + urlHost + "\r\n" "" + authHeader + "" "Content-Type: application/json\r\n" "User-Agent: curl/7.47.0\r\n"; 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()); } |
Open serial monitor. You will see this output :
1 2 3 4 5 6 7 8 9 10 | Got response closing connection connect: gateway.watsonplatform.net Connected GET/visual-recognition/api/v3/classify?url=https://watson-developer-cloud.github.io/doc-tutorial-downloads/visual-recognition/640px-IBM_VGA_90X8941_on_PS55.jpg&version=2018-03-19 HTTP/1.1 Host: gateway.watsonplatform.net Authorization: Basic YXBpa2V5OmhBUG9lbzFGTUVxU Content-Type: application/json User-Agent: curl/7.47.0 |
This output header indicating the logic is correct.
Unplug ESP32 after once run. The code will continiously ping the server. Notice the blank output. Although I have not used JsonHttpClient, these problems are not rare. I modified my old codes for IBM Watson IoT for testing.
Tagged With curl -x arduino esp32 , esp32 read image/jpeg , https://watson-developer-cloud github io/doc-tutoirial-downloads/visual-recognition/640px-IBM VGA , https://www ibm com/watson/services/visual-recognition/demo/#demo , ibm watson visual recognition , visual recognition , visual recognition with arduino , watson curl visual recognition url , watson visual recognition demo