From f5d7f7919d2df0d5675d9ecd3c9030d43ae7adc8 Mon Sep 17 00:00:00 2001 From: ROBERT REINOLD Date: Thu, 29 Sep 2016 23:58:54 -0500 Subject: [PATCH 01/27] Added Reverse Geocoding and OpenMovieDatabase --- Angular Service/README.md | 8 ++- Angular Service/cbService.js | 4 +- .../readme.md | 0 .../service.js | 0 .../snippet.js | 0 .../README.md | 15 ++++ .../service.js | 69 +++++++++++++++++++ Sending Emails with Mailgun/SendMail.js | 44 ++++++------ 8 files changed, 113 insertions(+), 27 deletions(-) create mode 100644 Integration with Google Maps Reverse Geocoding/readme.md create mode 100644 Integration with Google Maps Reverse Geocoding/service.js create mode 100644 Integration with Google Maps Reverse Geocoding/snippet.js create mode 100644 Integration with Open Movie Database/README.md create mode 100644 Integration with Open Movie Database/service.js diff --git a/Angular Service/README.md b/Angular Service/README.md index 996bf44..cce8ad1 100644 --- a/Angular Service/README.md +++ b/Angular Service/README.md @@ -1,8 +1,12 @@ # Overview -Angular Service for clearblade platform +Angular Service for Clearblade Platform. You can drop this into your Angular Project to easy integrate an Angular project with ClearBlade Novi Platform. # Usage -Create an app and use this service +>1. Add cbService.js to your Angular Project +>2. Replace with your ClearBlade System Key. +>3. Replace with your ClearBlade System Secret. +>4. From your Angular Project, call the #init method to initialize your session with ClearBlade Novi. +>5. Use #runCode to run one of your ClearBlade Novi Code Services! # Further Documentation https://github.com/ClearBlade/Angular-SDK \ No newline at end of file diff --git a/Angular Service/cbService.js b/Angular Service/cbService.js index 106e25a..5788f94 100644 --- a/Angular Service/cbService.js +++ b/Angular Service/cbService.js @@ -7,8 +7,8 @@ angular.module(app_name) var deferred = $q.defer(); var initOptions = { - systemKey: "KEY", - systemSecret: "SECRET", + systemKey: , + systemSecret: , URI: "https://platform.clearblade.com", callback: function (err, body) { diff --git a/Integration with Google Maps Reverse Geocoding/readme.md b/Integration with Google Maps Reverse Geocoding/readme.md new file mode 100644 index 0000000..e69de29 diff --git a/Integration with Google Maps Reverse Geocoding/service.js b/Integration with Google Maps Reverse Geocoding/service.js new file mode 100644 index 0000000..e69de29 diff --git a/Integration with Google Maps Reverse Geocoding/snippet.js b/Integration with Google Maps Reverse Geocoding/snippet.js new file mode 100644 index 0000000..e69de29 diff --git a/Integration with Open Movie Database/README.md b/Integration with Open Movie Database/README.md new file mode 100644 index 0000000..ae6768f --- /dev/null +++ b/Integration with Open Movie Database/README.md @@ -0,0 +1,15 @@ +# Integrate with Open Movie Database, OMDb + +## Overview + +This pattern shows how to search by movie title to retrieve detailed movie data. + +## Usage + +>1. Replace the value of `movieTitle` with your requested movie title. + +Note: An API key is not required. + +## Further Documentation + +http://www.omdbapi.com/ diff --git a/Integration with Open Movie Database/service.js b/Integration with Open Movie Database/service.js new file mode 100644 index 0000000..1cb4f6c --- /dev/null +++ b/Integration with Open Movie Database/service.js @@ -0,0 +1,69 @@ +function imdbPattern(req, resp){ + // This is an example movie title + var movieTitle = "Reservoir Dogs"; + + // You can also pass a movie title into this Code Service. as part of the request + // As part of the request, pass in a JSON object like this: {movieTitle: "Reservoir Dogs"} + // then retrieve it with the following line + // var movieTitle = req.params.movieTitle; + + callImdb(movieTitle) + + function callImdb(title){ + + // Make an XHR Request to OMDB's API + var options = { + uri : "http://www.omdbapi.com/?t="+encodeURIComponent(title)+"&y=&plot=full&r=json" + }; + + var requestObject = ClearBlade.http().Request(); + requestObject.get(options,function(err,result){ + + result = JSON.parse(result) + + if(err){ + resp.error("Error encountered making HTTP Request: " + result); + } + + movieIsFound = result.Response == "True" ? true : false + + if(! movieIsFound ){ + resp.error("Movie not found in database.") + } + + resp.success(result) + + }); + } + + /* + Output: + + { + "Actors": "Harvey Keitel, Tim Roth, Michael Madsen, Chris Penn", + "Awards": "9 wins & 15 nominations.", + "Country": "USA", + "Director": "Quentin Tarantino", + "Genre": "Crime, Drama, Thriller", + "Language": "English", + "Metascore": "78", + "Plot": "Six criminals, who are strangers to each other, are hired by a crime boss, Joe Cabot, to carry out a diamond robbery. Right at the outset, they are given false names with the intention that they won't get too close and will concentrate on the job instead. They are completely sure that the robbery is going to be a success. But, when the police show up right at the time and the site of the robbery, panic spreads amongst the group members, and two of them are killed in the subsequent shootout, along with a few policemen and civilians. When the remaining people assemble at the premeditated rendezvous point (a warehouse), they begin to suspect that one of them is an undercover cop.", + "Poster": "http://ia.media-imdb.com/images/M/MV5BNWVhMzQ5MWUtNjZkNC00MGQwLTkzNmEtNjcyZDE2ZWYxNzc2XkEyXkFqcGdeQXVyNjU0OTQ0OTY@._V1_SX300.jpg", + "Rated": "R", + "Released": "02 Sep 1992", + "Response": "True", + "Runtime": "99 min", + "Title": "Reservoir Dogs", + "Type": "movie", + "Writer": "Quentin Tarantino, Roger Avary (background radio dialog), Quentin Tarantino (background radio dialog)", + "Year": "1992", + "imdbID": "tt0105236", + "imdbRating": "8.4", + "imdbVotes": "668,196" + } + */ + + +} + + diff --git a/Sending Emails with Mailgun/SendMail.js b/Sending Emails with Mailgun/SendMail.js index b190ff8..d8800c8 100644 --- a/Sending Emails with Mailgun/SendMail.js +++ b/Sending Emails with Mailgun/SendMail.js @@ -1,14 +1,31 @@ function SendMail(req, resp){ + var initCallback = function(err, response) { + if (err) { + resp.error(response); + } + }; + var initOptions = { + systemKey: req.systemKey, + systemSecret: req.systemSecret, + // Insert your USERNAME and PASSWORD + email: , + password: , + callback: initCallback + }; + ClearBlade.init(initOptions); + + sendMail() + function sendMail(){ var options = { auth: { - // Drop in YOUR_API_KEY + // User is the literal string "api" user: "api", - pass : "YOUR_API_KEY" + // Insert your API_KEY + pass : }, - // Drop in YOUR_DOMAIN - uri : "https://api.mailgun.net/v3/YOUR_DOMAIN/messages", + uri : "https://api.mailgun.net/v3//messages", qs: { "from": "Mailgun Sandbox ", "to": "foo ", @@ -27,23 +44,4 @@ function SendMail(req, resp){ } }); } - - function initClearBlade() { - var initCallback = function(err, response) { - if (err) { - resp.error(response); - } - }; - var initOptions = { - systemKey: req.systemKey, - systemSecret: req.systemSecret, - email: "your_user", - password: "your_password", - callback: initCallback - }; - ClearBlade.init(initOptions); - } - - initClearBlade(); - sendMail(); } From c59d4db97d77de70315818a4be0d4b4809a8d516 Mon Sep 17 00:00:00 2001 From: ROBERT REINOLD Date: Fri, 30 Sep 2016 14:02:44 -0500 Subject: [PATCH 02/27] Refactored MailGun, Updated Open Movie Database --- .../README.md | 3 +- .../service.js | 6 +- Sending Emails with Mailgun/README.md | 4 +- Sending Emails with Mailgun/SendMail.js | 70 +++++++------------ 4 files changed, 35 insertions(+), 48 deletions(-) diff --git a/Integration with Open Movie Database/README.md b/Integration with Open Movie Database/README.md index ae6768f..cb784f1 100644 --- a/Integration with Open Movie Database/README.md +++ b/Integration with Open Movie Database/README.md @@ -2,11 +2,12 @@ ## Overview -This pattern shows how to search by movie title to retrieve detailed movie data. +This pattern shows how to fetch detailed movie info by searching with a movie title. ## Usage >1. Replace the value of `movieTitle` with your requested movie title. +>2. Add 'clearblade' and 'http' to list of Required libraries (Settings > Requires > Add) Note: An API key is not required. diff --git a/Integration with Open Movie Database/service.js b/Integration with Open Movie Database/service.js index 1cb4f6c..4439a02 100644 --- a/Integration with Open Movie Database/service.js +++ b/Integration with Open Movie Database/service.js @@ -1,4 +1,4 @@ -function imdbPattern(req, resp){ +function fetchMovieData(req, resp){ // This is an example movie title var movieTitle = "Reservoir Dogs"; @@ -7,9 +7,9 @@ function imdbPattern(req, resp){ // then retrieve it with the following line // var movieTitle = req.params.movieTitle; - callImdb(movieTitle) + callOmdb(movieTitle) - function callImdb(title){ + function callOmdb(title){ // Make an XHR Request to OMDB's API var options = { diff --git a/Sending Emails with Mailgun/README.md b/Sending Emails with Mailgun/README.md index 3ae88a4..93fc876 100644 --- a/Sending Emails with Mailgun/README.md +++ b/Sending Emails with Mailgun/README.md @@ -7,6 +7,8 @@ This repository allows you to send e-mails with ClearBlade via the Mailgun API, Log into your Mailgun account, and view the Domain tabs to find the following values: >1. Replace **** with Mailgun API key >2. Replace **** with your Mailgun Domain +>3. Replace ****, ****, and **** +>4. Add 'clearblade' and 'http' to your Required Libraries (Settings > Requires > Add) ## Further Documentation -https://documentation.mailgun.com/quickstart.html \ No newline at end of file +https://documentation.mailgun.com/quickstart.html diff --git a/Sending Emails with Mailgun/SendMail.js b/Sending Emails with Mailgun/SendMail.js index d8800c8..25899c4 100644 --- a/Sending Emails with Mailgun/SendMail.js +++ b/Sending Emails with Mailgun/SendMail.js @@ -1,47 +1,31 @@ function SendMail(req, resp){ - - var initCallback = function(err, response) { - if (err) { - resp.error(response); - } - }; - var initOptions = { - systemKey: req.systemKey, - systemSecret: req.systemSecret, - // Insert your USERNAME and PASSWORD - email: , - password: , - callback: initCallback - }; - ClearBlade.init(initOptions); - sendMail() + var options = { + auth: { + // User is the literal string "api" + user: "api", + // Insert your API_KEY + pass : + }, + uri : "https://api.mailgun.net/v3//messages", + qs: { + "from": "Mailgun Sandbox ", + // ex. "Rob " + "to": , + // ex. "Hey!" + "subject": , + // "How are you?" + "text": + }, + strictSSL: false + }; - function sendMail(){ - var options = { - auth: { - // User is the literal string "api" - user: "api", - // Insert your API_KEY - pass : - }, - uri : "https://api.mailgun.net/v3//messages", - qs: { - "from": "Mailgun Sandbox ", - "to": "foo ", - "subject": "Test message using mailgun", - "text": "Hi xyz. This is a test message from code service using mailgun http api!" - }, - strictSSL: false - }; - - var requestObject = ClearBlade.http().Request(); - requestObject.post(options,function(err,result){ - if(err){ - resp.error("Failed"); - }else{ - resp.success(result); - } - }); - } + var requestObject = ClearBlade.http().Request(); + requestObject.post(options,function(err,result){ + if(err){ + resp.error("Unable to post email: "+result); + }else{ + resp.success(result); + } +} } From d20d416eb5109e186b3f6f0b99a4ee18f34b67ce Mon Sep 17 00:00:00 2001 From: ROBERT REINOLD Date: Fri, 30 Sep 2016 14:07:51 -0500 Subject: [PATCH 03/27] Updated Mailgun README.md --- Sending Emails with Mailgun/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Sending Emails with Mailgun/README.md b/Sending Emails with Mailgun/README.md index 93fc876..3b33646 100644 --- a/Sending Emails with Mailgun/README.md +++ b/Sending Emails with Mailgun/README.md @@ -5,9 +5,9 @@ This repository allows you to send e-mails with ClearBlade via the Mailgun API, ## Usage Log into your Mailgun account, and view the Domain tabs to find the following values: ->1. Replace **** with Mailgun API key ->2. Replace **** with your Mailgun Domain ->3. Replace ****, ****, and **** +>1. Replace with Mailgun API key +>2. Replace with your Mailgun Domain +>3. Replace , , and >4. Add 'clearblade' and 'http' to your Required Libraries (Settings > Requires > Add) ## Further Documentation From aa5e2b2dcbd26e7a98fe4a85ed12c444474cebd0 Mon Sep 17 00:00:00 2001 From: ROBERT REINOLD Date: Fri, 30 Sep 2016 14:12:02 -0500 Subject: [PATCH 04/27] Updated Mailgun README.md --- Sending Emails with Mailgun/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Sending Emails with Mailgun/README.md b/Sending Emails with Mailgun/README.md index 3b33646..119d968 100644 --- a/Sending Emails with Mailgun/README.md +++ b/Sending Emails with Mailgun/README.md @@ -5,9 +5,9 @@ This repository allows you to send e-mails with ClearBlade via the Mailgun API, ## Usage Log into your Mailgun account, and view the Domain tabs to find the following values: ->1. Replace with Mailgun API key ->2. Replace with your Mailgun Domain ->3. Replace , , and +>1. Replace \ with Mailgun API key +>2. Replace \ with your Mailgun Domain +>3. Replace \, \, and \ >4. Add 'clearblade' and 'http' to your Required Libraries (Settings > Requires > Add) ## Further Documentation From 6768ffe713d89ae55229cdd46dcbe3a2b6fe2671 Mon Sep 17 00:00:00 2001 From: ROBERT REINOLD Date: Wed, 25 Jan 2017 11:02:57 -0600 Subject: [PATCH 05/27] Added SendGrid Pattern --- Sending Emails with SendGrid/README.md | 14 ++++++ Sending Emails with SendGrid/SendGrid.js | 60 ++++++++++++++++++++++++ 2 files changed, 74 insertions(+) create mode 100644 Sending Emails with SendGrid/README.md create mode 100644 Sending Emails with SendGrid/SendGrid.js diff --git a/Sending Emails with SendGrid/README.md b/Sending Emails with SendGrid/README.md new file mode 100644 index 0000000..b61e62b --- /dev/null +++ b/Sending Emails with SendGrid/README.md @@ -0,0 +1,14 @@ +#Sending Emails Using SendGrid + +## Overview +This repository allows you to send e-mails with ClearBlade via the SendGrid API, which uses the HTTP Protocol. Sample code to send an e-mail is given in **SendGrid.js**. + +## Usage + +1. Create a free SendGrid Account. Log into your SendGrid account, and view the Settings > API Keys tab. Create an API Key with full access to "Mail Send" rights. +>1. Replace \ with SendGrid API key +>2. Replace \ with your desired email address. This will be the 'sender' of the email. +>4. Add 'log' and 'http' to your Required Libraries (Settings > Requires > Add) + +## Further Documentation +https://sendgrid.com/docs diff --git a/Sending Emails with SendGrid/SendGrid.js b/Sending Emails with SendGrid/SendGrid.js new file mode 100644 index 0000000..efb7b4e --- /dev/null +++ b/Sending Emails with SendGrid/SendGrid.js @@ -0,0 +1,60 @@ +/* +Send an email to a list of e-mail address. + +Ex. sendEmailToList("This is my subject line","HTML is supported!",["email1@gmail.com","email2@gmail.com"],function(err, data){ ... }) + + subject String - Subject line + body String - HTML body of email + recipientList][String] - Array of email address recipients ex. ["email1@gmail.com","email2@gmail.com"] + callback - callback after request is sent + +*/ +function sendEmailToList(subject, body, recipientList, callback){ + + var SEND_GRID_API_KEY = + var ORIGIN_EMAIL_ADDRESS = + + var toField = formatRecipients(recipientList) + + log("Subject: " + subject) + log("Body: " + body) + log("To: " + JSON.stringify(toField)) + + var requestObject = Requests(); + var url = "https://api.sendgrid.com/v3/mail/send"; + var options = { + "uri": url, + "headers": {"Authorization": "Bearer "+SEND_GRID_API_KEY,'Content-Type': 'application/json'}, + body: JSON.stringify({ + personalizations: [ + { + to: toField, + subject: subject, + }, + ], + from: { + email: ORIGIN_EMAIL_ADDRESS, + }, + content: [ + { + type: 'text/html', + value: body, + }, + ], + }) + }; + requestObject.post(options, callback); + +} + +function formatRecipients(recipientList){ + var field = [] + for(i in recipientList){ + var email = recipientList[i] + field.push({email:email}) + } + return field +} + + + From 07430a40be4896d566bc548e76f247a23860e8b5 Mon Sep 17 00:00:00 2001 From: ROBERT REINOLD Date: Wed, 25 Jan 2017 11:04:27 -0600 Subject: [PATCH 06/27] Updated SendGrid README.md --- Sending Emails with SendGrid/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Sending Emails with SendGrid/README.md b/Sending Emails with SendGrid/README.md index b61e62b..531cbaa 100644 --- a/Sending Emails with SendGrid/README.md +++ b/Sending Emails with SendGrid/README.md @@ -5,9 +5,9 @@ This repository allows you to send e-mails with ClearBlade via the SendGrid API, ## Usage -1. Create a free SendGrid Account. Log into your SendGrid account, and view the Settings > API Keys tab. Create an API Key with full access to "Mail Send" rights. ->1. Replace \ with SendGrid API key ->2. Replace \ with your desired email address. This will be the 'sender' of the email. +>1. Create a free SendGrid Account. Log into your SendGrid account, and view the Settings > API Keys tab. Create an API Key with full access to "Mail Send" rights. +>2. Replace \ with SendGrid API key +>3. Replace \ with your desired email address. This will be the 'sender' of the email. >4. Add 'log' and 'http' to your Required Libraries (Settings > Requires > Add) ## Further Documentation From 416c1df746fed99e215eaa92c031ad5ff9ddc012 Mon Sep 17 00:00:00 2001 From: Rohan Bendre Date: Thu, 2 Mar 2017 12:37:23 -0600 Subject: [PATCH 07/27] Modified few things in BLE system --- Bluetooth Low Energy Gateway/BLE/.cbmeta | 9 ++-- .../BLEDeviceStatus/BLEDeviceStatus.js | 3 ++ .../BLEDeviceStatus/BLEDeviceStatus.json | 2 +- .../BLEGatewayStatus/BLEGatewayStatus.json | 2 +- .../libraries/BLEReadData/BLEReadData.json | 2 +- .../code/libraries/LogErrors/LogErrors.json | 2 +- .../libraries/ProcessTopic/ProcessTopic.json | 2 +- .../AddNewBLEDevice/AddNewBLEDevice.js | 8 ++-- .../AddNewBLEDevice/AddNewBLEDevice.json | 7 ++- .../BLE/code/services/BLE/BLE.js | 1 + .../BLE/code/services/BLE/BLE.json | 2 +- .../BLE/data/BLEDevice.json | 9 ++-- .../BLE/data/BLEErrors.json | 9 ++-- .../BLE/data/BLEGateway.json | 9 ++-- .../BLE/data/BLEReadValues.json | 9 ++-- .../BLE/edges/schema.json | 3 ++ .../BLE/roles/Administrator.json | 43 ++++++++++++++++++- .../BLE/roles/Anonymous.json | 5 +++ .../BLE/roles/Authenticated.json | 43 ++++++++++++++++++- Bluetooth Low Energy Gateway/BLE/system.json | 8 ++-- .../BLE/triggers/BLEPublish.json | 2 +- .../BLE/users/test@clearblade.com.json | 7 +-- 22 files changed, 148 insertions(+), 39 deletions(-) create mode 100644 Bluetooth Low Energy Gateway/BLE/edges/schema.json diff --git a/Bluetooth Low Energy Gateway/BLE/.cbmeta b/Bluetooth Low Energy Gateway/BLE/.cbmeta index 125deb2..2c3ae60 100644 --- a/Bluetooth Low Energy Gateway/BLE/.cbmeta +++ b/Bluetooth Low Energy Gateway/BLE/.cbmeta @@ -1,6 +1,7 @@ { - "assetRefreshDates": [], - "developerEmail": "sanket@clearblade.com", - "platformURL": "https://platform.clearblade.com", - "token": "kgvVTr6jOyi66IFUnyTt7P--Jt5yngufloXLCgM6ZcXkmNcA-XG22EEBNFZYBDcNYTh7HMptNKqaFPM3" + "asset_refresh_dates": [], + "developer_email": "trainer@clearblade.com", + "messaging_url": "platform.clearblade.com:1883", + "platform_url": "https://platform.clearblade.com", + "token": "jE_vxJfsQyWD9ENlvE9Ei6xiNqnTAyekv32Zy6M9wmsW81qMKbPs9IPHnjZWyyc2cN_QAQt4TgJi5g_ylQ==" } \ No newline at end of file diff --git a/Bluetooth Low Energy Gateway/BLE/code/libraries/BLEDeviceStatus/BLEDeviceStatus.js b/Bluetooth Low Energy Gateway/BLE/code/libraries/BLEDeviceStatus/BLEDeviceStatus.js index 574cce9..4f370db 100644 --- a/Bluetooth Low Energy Gateway/BLE/code/libraries/BLEDeviceStatus/BLEDeviceStatus.js +++ b/Bluetooth Low Energy Gateway/BLE/code/libraries/BLEDeviceStatus/BLEDeviceStatus.js @@ -55,10 +55,13 @@ function BLEDeviceStatus(bluetoothMac, message, resp) { }); }; + log("Before query"); + log(bluetoothMac); var query = ClearBlade.Query({collectionName: "BLEGateway"}); query.equalTo("bluetooth_mac", bluetoothMac); // Check if gateway exists in the collection query.fetch(function(err, data) { if(err) { + log(data); resp.error({error: true, result: data}); } else { log("Checking gateway existence"); diff --git a/Bluetooth Low Energy Gateway/BLE/code/libraries/BLEDeviceStatus/BLEDeviceStatus.json b/Bluetooth Low Energy Gateway/BLE/code/libraries/BLEDeviceStatus/BLEDeviceStatus.json index 2f9b8f2..9f09b4e 100644 --- a/Bluetooth Low Energy Gateway/BLE/code/libraries/BLEDeviceStatus/BLEDeviceStatus.json +++ b/Bluetooth Low Energy Gateway/BLE/code/libraries/BLEDeviceStatus/BLEDeviceStatus.json @@ -3,6 +3,6 @@ "dependencies": "", "description": "", "name": "BLEDeviceStatus", - "version": 2, + "version": 8, "visibility": "system" } \ No newline at end of file diff --git a/Bluetooth Low Energy Gateway/BLE/code/libraries/BLEGatewayStatus/BLEGatewayStatus.json b/Bluetooth Low Energy Gateway/BLE/code/libraries/BLEGatewayStatus/BLEGatewayStatus.json index 4a9da0b..adbd51a 100644 --- a/Bluetooth Low Energy Gateway/BLE/code/libraries/BLEGatewayStatus/BLEGatewayStatus.json +++ b/Bluetooth Low Energy Gateway/BLE/code/libraries/BLEGatewayStatus/BLEGatewayStatus.json @@ -3,6 +3,6 @@ "dependencies": "", "description": "", "name": "BLEGatewayStatus", - "version": 2, + "version": 1, "visibility": "system" } \ No newline at end of file diff --git a/Bluetooth Low Energy Gateway/BLE/code/libraries/BLEReadData/BLEReadData.json b/Bluetooth Low Energy Gateway/BLE/code/libraries/BLEReadData/BLEReadData.json index c49b9b6..706cf40 100644 --- a/Bluetooth Low Energy Gateway/BLE/code/libraries/BLEReadData/BLEReadData.json +++ b/Bluetooth Low Energy Gateway/BLE/code/libraries/BLEReadData/BLEReadData.json @@ -3,6 +3,6 @@ "dependencies": "", "description": "", "name": "BLEReadData", - "version": 2, + "version": 1, "visibility": "system" } \ No newline at end of file diff --git a/Bluetooth Low Energy Gateway/BLE/code/libraries/LogErrors/LogErrors.json b/Bluetooth Low Energy Gateway/BLE/code/libraries/LogErrors/LogErrors.json index e1ed039..f9b0a7d 100644 --- a/Bluetooth Low Energy Gateway/BLE/code/libraries/LogErrors/LogErrors.json +++ b/Bluetooth Low Energy Gateway/BLE/code/libraries/LogErrors/LogErrors.json @@ -3,6 +3,6 @@ "dependencies": "", "description": "", "name": "LogErrors", - "version": 2, + "version": 1, "visibility": "system" } \ No newline at end of file diff --git a/Bluetooth Low Energy Gateway/BLE/code/libraries/ProcessTopic/ProcessTopic.json b/Bluetooth Low Energy Gateway/BLE/code/libraries/ProcessTopic/ProcessTopic.json index 31d6af7..b47b374 100644 --- a/Bluetooth Low Energy Gateway/BLE/code/libraries/ProcessTopic/ProcessTopic.json +++ b/Bluetooth Low Energy Gateway/BLE/code/libraries/ProcessTopic/ProcessTopic.json @@ -3,6 +3,6 @@ "dependencies": "BLEGatewayStatus,BLEDeviceStatus,BLEReadData,LogErrors", "description": "", "name": "ProcessTopic", - "version": 3, + "version": 1, "visibility": "system" } \ No newline at end of file diff --git a/Bluetooth Low Energy Gateway/BLE/code/services/AddNewBLEDevice/AddNewBLEDevice.js b/Bluetooth Low Energy Gateway/BLE/code/services/AddNewBLEDevice/AddNewBLEDevice.js index 34b4b27..9ea131e 100644 --- a/Bluetooth Low Energy Gateway/BLE/code/services/AddNewBLEDevice/AddNewBLEDevice.js +++ b/Bluetooth Low Energy Gateway/BLE/code/services/AddNewBLEDevice/AddNewBLEDevice.js @@ -1,7 +1,7 @@ function AddNewBLEDevice(req, resp){ - var deviceAddress = "55:95:1A:36:37:F1"; - var gatewayAddress = "B8:27:EB:F5:08:30"; - var uuid = 0x2A07 + var deviceAddress = "FC:FC:48:9F:E6:E7"; + var gatewayAddress = "f4:0f:24:22:89:cd"; + var uuid = 0x2A06 var deviceType = "Proximity Sensor" log("Starting Add new BLE Device"); ClearBlade.init({ @@ -16,7 +16,7 @@ function AddNewBLEDevice(req, resp){ } else { log("Init success"); //resp.success(body); - var topic = "ble/" + gatewayAddress + "/BLECommands"; + var topic = "ble/" + gatewayAddress + "/BLEDeviceStatus"; var payload = {"command": "connect", "deviceAddress": deviceAddress, "deviceType": deviceType, "uuids": [uuid]}; var msg = ClearBlade.Messaging({}, function(){}); msg.publish(topic, JSON.stringify(payload)); diff --git a/Bluetooth Low Energy Gateway/BLE/code/services/AddNewBLEDevice/AddNewBLEDevice.json b/Bluetooth Low Energy Gateway/BLE/code/services/AddNewBLEDevice/AddNewBLEDevice.json index 7522bac..0dfebad 100644 --- a/Bluetooth Low Energy Gateway/BLE/code/services/AddNewBLEDevice/AddNewBLEDevice.json +++ b/Bluetooth Low Energy Gateway/BLE/code/services/AddNewBLEDevice/AddNewBLEDevice.json @@ -1,10 +1,13 @@ { - "current_version": 3, + "current_version": 29, "dependencies": "clearblade,log", "logging_enabled": "true", "name": "AddNewBLEDevice", "params": [], - "permissions": {}, + "permissions": { + "Administrator": 1, + "Authenticated": 1 + }, "run_user": "", "source": "AddNewBLEDevice.js" } \ No newline at end of file diff --git a/Bluetooth Low Energy Gateway/BLE/code/services/BLE/BLE.js b/Bluetooth Low Energy Gateway/BLE/code/services/BLE/BLE.js index 2b8d0a8..9ab8dd4 100644 --- a/Bluetooth Low Energy Gateway/BLE/code/services/BLE/BLE.js +++ b/Bluetooth Low Energy Gateway/BLE/code/services/BLE/BLE.js @@ -30,6 +30,7 @@ function BLE(req, resp){ log("Processing Topic: " + topicEnd); if((topicEnd !== "executed") && (topicEnd !== "messages")) { + log("Here"); ProcessTopic(topicEnd, mac, message, resp); } } \ No newline at end of file diff --git a/Bluetooth Low Energy Gateway/BLE/code/services/BLE/BLE.json b/Bluetooth Low Energy Gateway/BLE/code/services/BLE/BLE.json index e813688..ddfe140 100644 --- a/Bluetooth Low Energy Gateway/BLE/code/services/BLE/BLE.json +++ b/Bluetooth Low Energy Gateway/BLE/code/services/BLE/BLE.json @@ -1,5 +1,5 @@ { - "current_version": 5, + "current_version": 11, "dependencies": "clearblade,log,ProcessTopic", "logging_enabled": "true", "name": "BLE", diff --git a/Bluetooth Low Energy Gateway/BLE/data/BLEDevice.json b/Bluetooth Low Energy Gateway/BLE/data/BLEDevice.json index 0f918c7..9f00243 100644 --- a/Bluetooth Low Energy Gateway/BLE/data/BLEDevice.json +++ b/Bluetooth Low Energy Gateway/BLE/data/BLEDevice.json @@ -1,9 +1,12 @@ { - "appID": "e88dc4f50ab28be689f990fbc229", - "collectionID": "f897c4f50a9291f5d5b7d4f1ecdd01", + "app_id": "c2e1a38b0be8df8a86fdf0858bd101", + "collection_id": "c2e1a38b0be884d29cf694e9f669", "items": [], "name": "BLEDevice", - "permissions": {}, + "permissions": { + "Administrator": 15, + "Authenticated": 15 + }, "schema": [ { "ColumnName": "item_id", diff --git a/Bluetooth Low Energy Gateway/BLE/data/BLEErrors.json b/Bluetooth Low Energy Gateway/BLE/data/BLEErrors.json index c3f9a77..5117c15 100644 --- a/Bluetooth Low Energy Gateway/BLE/data/BLEErrors.json +++ b/Bluetooth Low Energy Gateway/BLE/data/BLEErrors.json @@ -1,9 +1,12 @@ { - "appID": "e88dc4f50ab28be689f990fbc229", - "collectionID": "d299c4f50ad4aeb0a3adb69ccf23", + "app_id": "c2e1a38b0be8df8a86fdf0858bd101", + "collection_id": "c2e1a38b0bf4f98895b78ca2c38101", "items": [], "name": "BLEErrors", - "permissions": {}, + "permissions": { + "Administrator": 15, + "Authenticated": 15 + }, "schema": [ { "ColumnName": "item_id", diff --git a/Bluetooth Low Energy Gateway/BLE/data/BLEGateway.json b/Bluetooth Low Energy Gateway/BLE/data/BLEGateway.json index deddb1e..15eae73 100644 --- a/Bluetooth Low Energy Gateway/BLE/data/BLEGateway.json +++ b/Bluetooth Low Energy Gateway/BLE/data/BLEGateway.json @@ -1,9 +1,12 @@ { - "appID": "e88dc4f50ab28be689f990fbc229", - "collectionID": "a497c4f50a86b1879ee6a181f6de01", + "app_id": "c2e1a38b0be8df8a86fdf0858bd101", + "collection_id": "c4e1a38b0b8ad993efe3a1eab8f901", "items": [], "name": "BLEGateway", - "permissions": {}, + "permissions": { + "Administrator": 15, + "Authenticated": 15 + }, "schema": [ { "ColumnName": "item_id", diff --git a/Bluetooth Low Energy Gateway/BLE/data/BLEReadValues.json b/Bluetooth Low Energy Gateway/BLE/data/BLEReadValues.json index a67f43c..a6eeada 100644 --- a/Bluetooth Low Energy Gateway/BLE/data/BLEReadValues.json +++ b/Bluetooth Low Energy Gateway/BLE/data/BLEReadValues.json @@ -1,9 +1,12 @@ { - "appID": "e88dc4f50ab28be689f990fbc229", - "collectionID": "ea98c4f50acafafab6d6abafb22e", + "app_id": "c2e1a38b0be8df8a86fdf0858bd101", + "collection_id": "c4e1a38b0b9ec7dd8180deeba770", "items": [], "name": "BLEReadValues", - "permissions": {}, + "permissions": { + "Administrator": 15, + "Authenticated": 15 + }, "schema": [ { "ColumnName": "item_id", diff --git a/Bluetooth Low Energy Gateway/BLE/edges/schema.json b/Bluetooth Low Energy Gateway/BLE/edges/schema.json new file mode 100644 index 0000000..65894e6 --- /dev/null +++ b/Bluetooth Low Energy Gateway/BLE/edges/schema.json @@ -0,0 +1,3 @@ +{ + "columns": [] +} \ No newline at end of file diff --git a/Bluetooth Low Energy Gateway/BLE/roles/Administrator.json b/Bluetooth Low Energy Gateway/BLE/roles/Administrator.json index 801499e..1817cd6 100644 --- a/Bluetooth Low Energy Gateway/BLE/roles/Administrator.json +++ b/Bluetooth Low Energy Gateway/BLE/roles/Administrator.json @@ -7,16 +7,55 @@ { "Level": 1, "Name": "BLE", - "SystemKey": "e88dc4f50ab28be689f990fbc229" + "SystemKey": "c2e1a38b0be8df8a86fdf0858bd101" + }, + { + "Level": 1, + "Name": "AddNewBLEDevice", + "SystemKey": "c2e1a38b0be8df8a86fdf0858bd101" + } + ], + "Collections": [ + { + "Columns": [], + "ID": "c2e1a38b0be884d29cf694e9f669", + "Items": [], + "Level": 15, + "Name": "BLEDevice" + }, + { + "Columns": [], + "ID": "c2e1a38b0bf4f98895b78ca2c38101", + "Items": [], + "Level": 15, + "Name": "BLEErrors" + }, + { + "Columns": [], + "ID": "c4e1a38b0b8ad993efe3a1eab8f901", + "Items": [], + "Level": 15, + "Name": "BLEGateway" + }, + { + "Columns": [], + "ID": "c4e1a38b0b9ec7dd8180deeba770", + "Items": [], + "Level": 15, + "Name": "BLEReadValues" } ], - "Collections": [], + "DevicesList": { + "Level": 0 + }, "MsgHistory": { "Level": 0 }, + "Portals": [], "Push": { "Level": 0 }, + "SystemServices": null, "Topics": [], "UsersList": { "Level": 0 diff --git a/Bluetooth Low Energy Gateway/BLE/roles/Anonymous.json b/Bluetooth Low Energy Gateway/BLE/roles/Anonymous.json index 2816180..db57a6e 100644 --- a/Bluetooth Low Energy Gateway/BLE/roles/Anonymous.json +++ b/Bluetooth Low Energy Gateway/BLE/roles/Anonymous.json @@ -5,12 +5,17 @@ "Permissions": { "CodeServices": [], "Collections": [], + "DevicesList": { + "Level": 0 + }, "MsgHistory": { "Level": 0 }, + "Portals": [], "Push": { "Level": 0 }, + "SystemServices": null, "Topics": [], "UsersList": { "Level": 0 diff --git a/Bluetooth Low Energy Gateway/BLE/roles/Authenticated.json b/Bluetooth Low Energy Gateway/BLE/roles/Authenticated.json index 2922517..b5cbc19 100644 --- a/Bluetooth Low Energy Gateway/BLE/roles/Authenticated.json +++ b/Bluetooth Low Energy Gateway/BLE/roles/Authenticated.json @@ -7,16 +7,55 @@ { "Level": 1, "Name": "BLE", - "SystemKey": "e88dc4f50ab28be689f990fbc229" + "SystemKey": "c2e1a38b0be8df8a86fdf0858bd101" + }, + { + "Level": 1, + "Name": "AddNewBLEDevice", + "SystemKey": "c2e1a38b0be8df8a86fdf0858bd101" + } + ], + "Collections": [ + { + "Columns": [], + "ID": "c2e1a38b0be884d29cf694e9f669", + "Items": [], + "Level": 15, + "Name": "BLEDevice" + }, + { + "Columns": [], + "ID": "c2e1a38b0bf4f98895b78ca2c38101", + "Items": [], + "Level": 15, + "Name": "BLEErrors" + }, + { + "Columns": [], + "ID": "c4e1a38b0b8ad993efe3a1eab8f901", + "Items": [], + "Level": 15, + "Name": "BLEGateway" + }, + { + "Columns": [], + "ID": "c4e1a38b0b9ec7dd8180deeba770", + "Items": [], + "Level": 15, + "Name": "BLEReadValues" } ], - "Collections": [], + "DevicesList": { + "Level": 0 + }, "MsgHistory": { "Level": 0 }, + "Portals": [], "Push": { "Level": 0 }, + "SystemServices": null, "Topics": [], "UsersList": { "Level": 0 diff --git a/Bluetooth Low Energy Gateway/BLE/system.json b/Bluetooth Low Energy Gateway/BLE/system.json index 63f2421..66f559d 100644 --- a/Bluetooth Low Energy Gateway/BLE/system.json +++ b/Bluetooth Low Energy Gateway/BLE/system.json @@ -1,8 +1,10 @@ { "auth": true, "description": "", + "edge_sync": {}, + "messaging_url": "platform.clearblade.com:1883", "name": "BLE", - "platformURL": "https://platform.clearblade.com", - "systemKey": "e88dc4f50ab28be689f990fbc229", - "systemSecret": "E88DC4F50A8481D5FDC6BAFFEE1F" + "platform_url": "https://platform.clearblade.com", + "system_key": "c2e1a38b0be8df8a86fdf0858bd101", + "system_secret": "C2E1A38B0B88FF8D8D8787959C0E" } \ No newline at end of file diff --git a/Bluetooth Low Energy Gateway/BLE/triggers/BLEPublish.json b/Bluetooth Low Energy Gateway/BLE/triggers/BLEPublish.json index d585f7c..1cf9883 100644 --- a/Bluetooth Low Energy Gateway/BLE/triggers/BLEPublish.json +++ b/Bluetooth Low Energy Gateway/BLE/triggers/BLEPublish.json @@ -8,7 +8,7 @@ "visibility": true }, "key_value_pairs": { - "topic": "ble/#" + "topic": "ble/f4:0f:24:22:89:cd/BLEDeviceStatus" }, "name": "BLEPublish", "service_name": "BLE" diff --git a/Bluetooth Low Energy Gateway/BLE/users/test@clearblade.com.json b/Bluetooth Low Energy Gateway/BLE/users/test@clearblade.com.json index 0e20c49..05d9bd4 100644 --- a/Bluetooth Low Energy Gateway/BLE/users/test@clearblade.com.json +++ b/Bluetooth Low Energy Gateway/BLE/users/test@clearblade.com.json @@ -1,8 +1,9 @@ { - "creation_date": "2016-06-08T20:52:56Z", + "creation_date": "2017-02-27T19:05:05Z", "email": "test@clearblade.com", "roles": [ - "Authenticated" + "Authenticated", + "Administrator" ], - "user_id": "d096c4f50ad6b8a39bc5b7cede45" + "user_id": "c2e1a38b0ba69c94dde3eee3b9c401" } \ No newline at end of file From 73ca44b7cb4a9f8642cd4435e142353bbdd361d7 Mon Sep 17 00:00:00 2001 From: Rohan Bendre Date: Mon, 6 Mar 2017 12:38:53 -0600 Subject: [PATCH 08/27] Removed references to Novi --- Library q for promises/readme.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Library q for promises/readme.md b/Library q for promises/readme.md index cb5d24a..f2212e5 100644 --- a/Library q for promises/readme.md +++ b/Library q for promises/readme.md @@ -1,6 +1,6 @@ This qLib is a modified version of the nodeJS package https://www.npmjs.com/package/q -Simply import this as a library into your Novi system +Simply import this as a library into your ClearBlade Platform system Require the qLib in the service of your choice Begin using q as normal @@ -24,4 +24,4 @@ Ex: Note: only modifications from original library include removal of unneeded environment recongition code during entry - removal of calls to setTimeouts (not honored in Novi). These calls are unnecessary in Novi as they are only hacks to help performance in NodeJS \ No newline at end of file + removal of calls to setTimeouts (not honored in ClearBlade Platform). These calls are unnecessary in ClearBlade Platform as they are only hacks to help performance in NodeJS From 15ae94e06e5dd5527bc84a6ce6d616f03e9d02b0 Mon Sep 17 00:00:00 2001 From: Jim Bouquet Date: Mon, 3 Apr 2017 11:45:22 -0500 Subject: [PATCH 09/27] Modified code so that the adapter does not require as much user setup. --- .../BluetoothGateway.py | 224 +++++++++++++++++- Bluetooth Low Energy Gateway/BluetoothLE.py | 101 ++++++-- Bluetooth Low Energy Gateway/MQTT.py | 71 ++---- Bluetooth Low Energy Gateway/README.md | 45 ++-- Bluetooth Low Energy Gateway/main.py | 23 +- 5 files changed, 369 insertions(+), 95 deletions(-) diff --git a/Bluetooth Low Energy Gateway/BluetoothGateway.py b/Bluetooth Low Energy Gateway/BluetoothGateway.py index f7b5ac3..f376f64 100644 --- a/Bluetooth Low Energy Gateway/BluetoothGateway.py +++ b/Bluetooth Low Energy Gateway/BluetoothGateway.py @@ -1,7 +1,223 @@ +import os +import re +import time +import json +import sys +import atexit from MQTT import MQTT +from BluetoothLE import BluetoothLE +from bluepy.btle import Scanner, ScanEntry, DefaultDelegate, BTLEException class BluetoothGateway: - def StartGateway(self, credentials): - print "Starting Bluetooth Gateway\n" - print "Connecting the MQTT Broker" - self.mqtt = MQTT(credentials) \ No newline at end of file + connectedBLEDevices = {} + + def __init__(self, credentials): + self.credentials = credentials + self.scanner = None + + self.gwBTMac = self.GetMacAddress() + self.StartGateway() + + + def GetMacAddress(self): + #Execute the hcitool command and extract the mac address using a regular expression + mac = re.search('hci0\s*(([0-9a-fA-F]{2}:){5}([0-9a-fA-F]{2}))', os.popen('hcitool -i hci0 dev').read()).group(1) + return mac + + def StartGateway(self): + print("Starting Bluetooth Gateway\n") + print("Connecting the MQTT Broker") + self.mqtt = MQTT(self.credentials) + time.sleep(2) + + #Subscribe to the BLE Commands topic + #print "\nSubscribing to topic: ble/" + self.gwBTMac + "/BLECommands" + self.mqtt.SubscribeToTopic("ble/" + self.gwBTMac + "/BLECommands", self.BleCommandReceived) + + + #Publish the gateway status message + #print "Publishing topic: " + "ble/" + self.gwBTMac + "/BLEGatewayStatus" + self.PublishGatewayOnlineEvent() + + time.sleep(2) + + #Register an exit handler to set the gateway offline when an exit happens + atexit.register(self.setGatewayOffline) + + try: + while True: + self.reconcileDevices() + + #Scan for devices every two minutes + self.ScanForDevices() + time.sleep(self.credentials['scanInterval']) + except KeyboardInterrupt: + print "Gateway stopping..." + + def reconcileDevices(self): + #If a device is in the connectedBLEDevices dictionary has a scanned attribute of false, + #it has gone offline. Update the device status and delete the previous device + for key in self.connectedBLEDevices.keys(): + if self.connectedBLEDevices[key]['scanned'] == False: + print "Device disconnected, deleting device", key + self.setDeviceStatus(self.connectedBLEDevices[key]['peripheral'], False) + del self.connectedBLEDevices[key]['peripheral'] + del self.connectedBLEDevices[key] + + def setDeviceStatus(self, device, online): + dev = {} + dev['deviceAddress'] = device.deviceAddress + dev['deviceType'] = device.deviceType + dev['deviceAddrType'] = device.addrType + + if online: + dev['status'] = "Connected" + print "Setting the device to Connected" + else: + dev['status'] = "Offline" + print "Setting the device to Offline" + + #Publish the device status message + self.PublishMessage(json.dumps(dev), "BLEDeviceStatus", None) + + def setGatewayOffline(self): + #Publish the gateway status message + print "Setting the gateway to offline" + self.PublishGatewayOfflineEvent() + + #Give some time for the offline message to be published + time.sleep(1) + + def ScanForDevices(self): + #Before we re-scan again, set the scanned attribute of the existing devices to false + for key in self.connectedBLEDevices.keys(): + self.connectedBLEDevices[key]['scanned'] = False + + print("Scanning for devices") + if self.scanner == None: + self.scanner = Scanner().withDelegate(ScanDelegate(self)) + + #devices will contain an array of ScanEntry objects + devices = self.scanner.scan(5) + + def PublishMessage(self, message, messageType, callback): + if messageType == "addBLEdevice": + self.mqtt.PublishTopic(messageType, message, callback) + else: + topic = "ble/" + self.gwBTMac + "/" + messageType + self.mqtt.PublishTopic(topic, message, callback) + + def PublishGatewayOnlineEvent(self): + messageToPublish = "{\"gatewayAddress\":\"" + self.gwBTMac + "\", \"status\": \"Online\"}" + #self.PublishMessage(messageToPublish, "BLEGatewayStatus", self.OnStatusPublished) + self.PublishMessage(messageToPublish, "BLEGatewayStatus", None) + + def PublishGatewayOfflineEvent(self): + messageToPublish = "{\"gatewayAddress\":\"" + self.gwBTMac + "\", \"status\": \"Offline\"}" + self.PublishMessage(messageToPublish, "/BLEGatewayStatus", None) + + def PublishGatewayOfflineEvent(self): + messageToPublish = "{\"gatewayAddress\":\"" + self.gwBTMac + "\", \"status\": \"Offline\"}" + self.PublishMessage(messageToPublish, "/BLEDeviceStatus", None) + + def PublishError(self, error): + self.PublishMessage(error, "BLEErrors", None) + + def OnStatusPublished(self, client, userdata, mid): + print "Gateway status set to online" + + def BleCommandReceived(self, client, obj, message): + arrivedMessageJSON = message.payload + + try: + parsedMessage = json.loads(arrivedMessageJSON) + if parsedMessage['command'] == 'connect': + deviceAddress = parsedMessage['deviceAddress'] + deviceType = parsedMessage['deviceType'] + deviceAddrType = parsedMessage['deviceAddrType'] + try: + #If the device already exists, use the existing peripheral instance + # and re-read the data values + if self.connectedBLEDevices.get(deviceAddress) == None: + print "Creating new device" + peripheral = BluetoothLE(deviceAddress, deviceType, deviceAddrType, self) + device = {} + device['peripheral'] = peripheral + device['scanned'] = True + self.connectedBLEDevices[deviceAddress] = device + else: + print "Connecting to existing device" + self.connectedBLEDevices[deviceAddress]['scanned'] = True + self.connectedBLEDevices[deviceAddress]['peripheral'].ConnectToBLEDevice(False) + + except BTLEException as be: + print("BTLEException: " + str(be)) + self.PublishError("BTLEException: Code = " + str(be.code) + ", Message = " + be.message) + except: + print(sys.exc_info()) + print("Could not connect to " + deviceType) + self.PublishError("Could not connect to " + deviceType) + elif parsedMessage['command'] == 'write': + writeDeviceAddress = parsedMessage['deviceAddress'] + if (writeDeviceAddress in self.connectedBLEDevices) == True: + try: + self.connectedBLEDevices[writeDeviceAddress]['peripheral'].WriteValue(parsedMessage['data'], parsedMessage['uuid']) + except: + print("Error writing to BLE device" + deviceAddress) + self.PublishError("Error writing to BLE device " + deviceAddress) + else: + print(writeDeviceAddress + ": No such device found in device dictionary. Please connect the device first and then try again") + self.PublishError(writeDeviceAddress + \ + ": No such device found in device dictionary. Please connect the device first and then try again") + except: + print "Invalid JSON received in BTLE command" + print arrivedMessageJSON + print(sys.exc_info()) + self.PublishError("Invalid JSON received in BTLE command") + +#This class is used by the btle.Scanner class. The class provides methods +#invoked by the scanner when device related events occur +class ScanDelegate(DefaultDelegate): + def __init__(self, gateway): + self.gateway = gateway + DefaultDelegate.__init__(self) + + #Invoked when advertising data is received from a BLE device + def handleDiscovery(self, dev, isNewDev, isNewData): + #Add the device to the internal array + #self.gateway.connectedBLEDevices[dev.addr] = dev + + #We only want to use the device if we can connect to it + if dev.connectable: + #Only add the device if it is new + #TODO - Handle isNewData later + if isNewDev: + #Initialize the device type + deviceType = "Unknown" + + #Loop through the advertising data to try and find the name tuples + scanData = dev.getScanData() + for tuple in scanData: + if tuple[0] == 8 or tuple[0] == 9: + print "Setting device type to " + dev.getValueText(tuple[0]) + deviceType = dev.getValueText(tuple[0]) + + if deviceType != "Unknown": + self.addDeviceToPlatform(str(dev.addr), dev.addrType, str(deviceType)) + + #Invoked when a notification is received from a connected Peripheral object + def handleNotification(self, charHandle, data): + #Print the data that was received + print data + + def addDeviceToPlatform(self, mac, addrType, deviceType): + print "Adding device to platform" + + #Add the device to the platform + device = {} + device["deviceAddress"] = mac + device["deviceType"] = deviceType + device["deviceAddrType"] = addrType + device["gatewayAddress"] = self.gateway.gwBTMac + + self.gateway.PublishMessage(json.dumps(device), "addBLEdevice", None) diff --git a/Bluetooth Low Energy Gateway/BluetoothLE.py b/Bluetooth Low Energy Gateway/BluetoothLE.py index b8de319..dbe6248 100644 --- a/Bluetooth Low Energy Gateway/BluetoothLE.py +++ b/Bluetooth Low Energy Gateway/BluetoothLE.py @@ -1,42 +1,105 @@ import thread +import sys import time +import json +import string from bluepy.btle import Peripheral from bluepy.btle import Scanner from bluepy.btle import UUID +from bluepy.btle import BTLEException class BluetoothLE: - def __init__(self, deviceAddress, deviceType, uuids, mqttConnection): + def __init__(self, deviceAddress, deviceType, addrType, mqttConnection): self.deviceAddress = deviceAddress self.deviceType = deviceType - self.uuids = uuids self.mqtt = mqttConnection - self.bleConnection = self.ConnectToBLEDevice() + self.addrType = addrType + self.bleConnection = None + + self.ConnectToBLEDevice(True) - def ConnectToBLEDevice(self): - bleConnection = Peripheral(self.deviceAddress, "random") - print "Connected to " + self.deviceAddress - messageToPublish = "{\"deviceType\":\"" + self.deviceType + "\", \"deviceAddress\":\"" + self.deviceAddress + "\", \"status\": \"connected\"}" - self.mqtt.PublishMessage(messageToPublish, "BLEDeviceStatus") + def ConnectToBLEDevice(self, createNew): + print "Connecting to device ", self.deviceType + if createNew: + self.bleConnection = Peripheral(self.deviceAddress, self.addrType) + self.mqtt.setDeviceStatus(self, True) + else: + self.bleConnection.connect(self.deviceAddress, self.addrType) + + print "Connected to " + self.deviceType thread.start_new_thread(self.ReadLoop, ()) - return bleConnection + def ReadLoop(self): - while True: - for uuid in self.uuids: - try: - self.ReadValue(uuid) - except: - print "Failed to read data" + readData = {} + characteristics = self.bleConnection.getCharacteristics() + + for char in characteristics: + if char.supportsRead(): + try: + value = char.read() + printable = True + #if the value is not printable, string escape it + for c in value: + if c in string.printable: + printable = False + break + + if not printable: + value = value.encode('string-escape') + + readData[str(char.uuid.getCommonName())] = value + except: + print "Failed to read data for uuid ", str(char.uuid.getCommonName()) + print sys.exc_info() + + readData["services"] = [] + + services = self.bleConnection.getServices() + for service in services: + serviceData = {} + serviceData["name"] = str(service.uuid.getCommonName()) + + serviceChars = service.getCharacteristics() + for serviceChar in serviceChars: + if serviceChar.supportsRead(): + try: + value = serviceChar.read() + printable = True + #if the value is not printable, string escape it + for c in value: + if c in string.printable: + printable = False + break + if not printable: + value = value.encode('string-escape') + + serviceData[str(serviceChar.uuid.getCommonName())] = value + except: + print "Failed to read data for uuid ", str(serviceChar.uuid.getCommonName()) + print sys.exc_info() - time.sleep(2) + if serviceData: + readData["services"].append(serviceData) + + print readData + + message = {} + message["deviceAddress"] = self.deviceAddress + message["deviceType"] = self.deviceType + message["readData"] = str(readData) + + self.mqtt.PublishMessage(json.dumps(message), "BLEReadData", None) + + #Disconnect the peripheral once we are done reading data + self.bleConnection.disconnect() def ReadValue(self, uuid): - uuidValue = UUID(uuid) characteristics = self.bleConnection.getCharacteristics(uuid=uuid)[0] readValue = characteristics.read() - print + messageToPublish = "{\"deviceType\":\"" + self.deviceType + "\", \"deviceAddress\":\"" + self.deviceAddress + "\", \"readData\": \"" + readValue + "\"}" - self.mqtt.PublishMessage(messageToPublish, "BLEReadData") + self.mqtt.PublishMessage(messageToPublish, "BLEReadData", None) def WriteValue(self, data, uuid): uuidValue = UUID(uuid) diff --git a/Bluetooth Low Energy Gateway/MQTT.py b/Bluetooth Low Energy Gateway/MQTT.py index 0acff3a..c567089 100644 --- a/Bluetooth Low Energy Gateway/MQTT.py +++ b/Bluetooth Low Energy Gateway/MQTT.py @@ -1,67 +1,32 @@ -import json +import sys from clearblade import auth from clearblade import Client from clearblade import Messaging -from BluetoothLE import BluetoothLE class MQTT: - connectedBLEDevices = {} def __init__(self, credentials): self.systemKey = credentials['systemKey'] self.systemSecret = credentials['systemSecret'] - self.username = credentials['username'] - self.password = credentials['password'] + self.username = credentials['deviceName'] + self.password = credentials['activeKey'] self.platformURL = credentials['platformURL'] - self.gwBTMac = credentials['gwBTMac'] - self.mqttConnection = self.ConnectToMQTT() - messageToPublish = "{\"gatewayAddress\":\"" + self.gwBTMac + "\", \"status\": \"Online\"}" - self.mqttConnection.publishMessage("ble/" + self.gwBTMac + "/BLEGatewayStatus", messageToPublish, 0) - self.Subscribe("ble/" + self.gwBTMac + "/BLECommands", self.MessageArrivedCallback) - while True: - pass - def ConnectToMQTT(self): - cbAuth = auth.Auth() - user = Client.UserClient(self.systemKey, self.systemSecret, self.username, self.password, self.platformURL) - cbAuth.Authenticate(user) - messagingClient = Messaging.Messaging(user) - messagingClient.InitializeMQTT() - return messagingClient + #Connect to MQTT + self.messagingClient = self.Connect() + + def Connect(self): + cbAuth = auth.Auth() - def PublishMessage(self, message, messageType): - topic = "ble/" + self.gwBTMac + "/" + messageType - self.mqttConnection.publishMessage(topic, message, 0) + #Authenticate using device auth + device = Client.DevClient(self.systemKey, self.systemSecret, self.username, self.password, self.platformURL) + cbAuth.Authenticate(device) + messagingClient = Messaging.Messaging(device) - def MessageArrivedCallback(self, client, obj, message): - arrivedMessageJSON = message.payload - print arrivedMessageJSON + messagingClient.InitializeMQTT() + return messagingClient - try: - parsedMessage = json.loads(arrivedMessageJSON) - if parsedMessage['command'] == 'connect': - deviceAddress = parsedMessage['deviceAddress'] - deviceType = parsedMessage['deviceType'] - uuids = parsedMessage['uuids'] - try: - bleConnection = BluetoothLE(deviceAddress, deviceType, uuids, self) - self.connectedBLEDevices[deviceAddress] = bleConnection - except: - print "Could not connect to " + deviceAddress - self.PublishMessage("Could not connect to " + deviceAddress, "BLEErrors") - elif parsedMessage['command'] == 'write': - writeDeviceAddress = parsedMessage['deviceAddress'] - if self.connectedBLEDevices.has_key(writeDeviceAddress) == True: - try: - self.connectedBLEDevices[writeDeviceAddress].WriteValue(parsedMessage['data'], parsedMessage['uuid']) - except: - print "Error writing to BLE device" - self.PublishMessage("Error writing to BLE device " + deviceAddress, "BLEErrors") - else: - print writeDeviceAddress + ": No such device found in device dictionary. Please connect the device first and then try again" - self.PublishMessage(writeDeviceAddress + ": No such device found in device dictionary. Please connect the device first and then try again", "BLEErrors") - except: - print "Invalid JSON" - self.PublishMessage("Invalid JSON", "BLEErrors") + def PublishTopic(self, topic, message, callback): + self.messagingClient.publishMessage(topic, message, 0, callback) - def Subscribe(self, topic, callback): - self.mqttConnection.subscribe(topic, 0, callback) \ No newline at end of file + def SubscribeToTopic(self, topic, callback): + self.messagingClient.subscribe(topic, 0, callback) diff --git a/Bluetooth Low Energy Gateway/README.md b/Bluetooth Low Energy Gateway/README.md index da428fe..3947e69 100644 --- a/Bluetooth Low Energy Gateway/README.md +++ b/Bluetooth Low Energy Gateway/README.md @@ -1,12 +1,14 @@ # Bluetooth Low Enegry Gateway for ClearBlade -This is a BLE Gateway for the Raspberry Pi. It connects to the ClearBlade platform over MQTT and sends status and error messages back to the platform for processing. Commands can be sent to this gateway from the platform for adding new BLE devices, reading and writing data to and from these devices. +This is a BLE Gateway for the ClearBlade Platform that can be executed on any Linux operating system (including Raspberry Pi) supporting bluetooth. The adapter requires the bluez library to be installed. The adapter connects to the ClearBlade platform over MQTT and sends status and error messages back to the platform for processing. In addition, the adapter will automatically scan for BLE devices and add those devices to the ClearBlade Platform. + +Commands can be sent to this gateway from the platform for reading and writing data to and from connected BLE devices. ## Prerequisites - Install the cb-cli tool from http://docs.clearblade.com/v/2/4-Developer_Reference/CLI/1_GettingStarted/ - You will need the ClearBlade Python SDK installed. Instructions can be found at https://github.com/ClearBlade/Python-API - Eclipse Paho Python SDK is required. Installation instructions can be found at https://eclipse.org/paho/clients/python/ -- Lastly the bluepy BLE library for Python is required and can be downloaded from https://github.com/IanHarvey/bluepy +- Lastly, the bluepy BLE library for Python is required and can be downloaded from https://github.com/IanHarvey/bluepy ## Import the BLE System - Create a new account on the ClearBlade platform if you haven't already @@ -15,20 +17,31 @@ This is a BLE Gateway for the Raspberry Pi. It connects to the ClearBlade platfo - After you have installed the cb-cli tool ```cd``` into the __BLE__ directory - Then run ```cb-cli import -importrows -importusers``` - It will ask you for the platform URL and your account username and password and then the system will be successfully imported -- This system contains all the code to process messages coming from the bluetooth gateway and also send messages to the gateway -- The __BLEGateway__ collection contains the gateway status, __BLEDevice__ collection contains the attached low energy devices to the gateway, __BLEReadValues__ collection contains the data read from these low energy devices and __BLEErrors__ collection contains the different error messages sent from the gateway - -## Add the Gateway MAC Address to the BLEGateway Collection -- Before we start the gateway, we need to add the gateway's bluetooth MAC address to the __BLEGateway__ collection -- Create a new row in the __BLEGateway__ collection and copy and paste the bluetooth MAC address of your gateway under the __bluetooth_mac__ column +- This system contains all the code needed to process messages coming from the bluetooth gateway and also send messages to the gateway +- The __BLEGateway__ collection contains the gateway status. +- The __BLEDevice__ collection contains the low energy devices connected to the gateway. +- The __BLEReadValues__ collection contains the data read from these low energy devices. +- The __BLEErrors__ collection contains various error messages sent from the gateway. +## Add device entry to devices table +Before we start the gateway, we need to add a device, representing the gateway, to the ClearBlade Platform. +- From the BLE system within the ClearBlade Platform Developers console, select __Auth --> Devices__ +- Click __+ Device__ +- Enter the following information in the __New Device__ dialog: + - __Name__: The name of the device + - __Type__: A description of the type of device being added (for example: Raspberry Pi 3 model B) + - __Enabled__: _ _YES_ _ + - __Allow Key Authorization__: _ _YES_ _ +- Click __Create__ +- In the newly inserted row, double click within the __active_key__ cell and enter an authentication key (ex. 1234567890) ## Starting the Gateway -- Edit __main.py__ and fill the __credentials__ dictionary with your own credentials -- Run ```python main.py``` to start the gateway - -## Add a new Bluetooth Low Energy device to the gateway -- To add a new device to the gateway, go to the __AddNewBLEDevice__ Code Service and change the deviceAddress, gatewayAddress, uuid and deviceType to that of the device you want to add and hit __Save and Test__ -- This will add the new device and start reading data from the specified uuid -- You can check for errors in the __BLEErrors__collection -- The new device, if added successfully will appear in the __BLEDevice__ collection and the data read from that device will be visible in the __BLEReadValues__ collection \ No newline at end of file +- Open a terminal session on the device where the gateway will run and enter the following command: + - sudo python main.py --systemKey --systemSecret --deviceName --activeKey [--platformUrl ] [--scanInterval ] + - Alternatively, you can also use the shorter versions of the flags: + - sudo python main.py -k -s -n -a -u +- Once the gateway has started, it will automatically: + 1. Start scanning for BLE devices + 2. Add any found devices to the platform + 3. Read any available information from the device + 4. Store data read from the device in the BLEReadValues collection \ No newline at end of file diff --git a/Bluetooth Low Energy Gateway/main.py b/Bluetooth Low Energy Gateway/main.py index 24b3626..2acea93 100644 --- a/Bluetooth Low Energy Gateway/main.py +++ b/Bluetooth Low Energy Gateway/main.py @@ -1,6 +1,23 @@ from BluetoothGateway import BluetoothGateway +import sys, getopt, argparse -credentials = {'systemKey': 'SYSTEMKEY', 'systemSecret': 'SYSTEMSECRET', 'username': 'test@clearblade.com', 'password': 'clearblade', 'platformURL': 'PLATFORM_URL', 'gwBTMac': 'GATEWAY_BLUETOOTH_MAC'} +credentials = {} -gateway = BluetoothGateway() -gateway.StartGateway(credentials) \ No newline at end of file +def _parseArgs(argv): + #TODO - Add a flag to specify mac address filters + parser = argparse.ArgumentParser(description='Start BLE Adapter') + parser.add_argument('--systemKey', required=True, help='The System Key of the ClearBlade platform the BLE adapter will connect to.') + parser.add_argument('--systemSecret', required=True, help='The System Secret of the ClearBlade platform the BLE adapter will connect to.') + parser.add_argument('--deviceName', required=True, \ + help='The name of the device, defined within the devices table of the ClearBlade platform, representing the BLE Adapter.') + parser.add_argument('--activeKey', required=True, \ + help='The Active Key, defined within the devices table of the ClearBlade platform, corresponding to the BLE Adapter.') + parser.add_argument('--scanInterval', dest="scanInterval", default=120, type=int, \ + help='The amount of time to wait between each successive scan for BLE devices. The default is 120 (2 minutes)') + parser.add_argument('--platformUrl', dest="platformURL", default="https://localhost:9000", \ + help='The url of the ClearBlade platform the BLE adapter will connect to. The default is https://localhost:9000') + + return vars(parser.parse_args(args=argv[1:])) + +credentials = _parseArgs(sys.argv) +gateway = BluetoothGateway(credentials) From 5b4114a7fd3392b8ddced651400180f9470deb3a Mon Sep 17 00:00:00 2001 From: Jim Bouquet Date: Mon, 3 Apr 2017 12:24:41 -0500 Subject: [PATCH 10/27] Updated system to work with latest adapter code --- .../BLEDeviceStatus/BLEDeviceStatus.js | 6 ++- .../BLEDeviceStatus/BLEDeviceStatus.json | 2 +- .../BLEGatewayStatus/BLEGatewayStatus.js | 20 +++++++++- .../BLEGatewayStatus/BLEGatewayStatus.json | 2 +- .../AddNewBLEDevice/AddNewBLEDevice.js | 40 ++++++++----------- .../AddNewBLEDevice/AddNewBLEDevice.json | 2 +- .../BLE/code/services/BLE/BLE.js | 31 +++++--------- .../BLE/code/services/BLE/BLE.json | 2 +- .../BLE/data/BLEDevice.json | 5 +++ .../BLE/triggers/AddBLEDevice.json | 15 +++++++ .../BLE/triggers/BLEPublish.json | 2 +- 11 files changed, 73 insertions(+), 54 deletions(-) create mode 100644 Bluetooth Low Energy Gateway/BLE/triggers/AddBLEDevice.json diff --git a/Bluetooth Low Energy Gateway/BLE/code/libraries/BLEDeviceStatus/BLEDeviceStatus.js b/Bluetooth Low Energy Gateway/BLE/code/libraries/BLEDeviceStatus/BLEDeviceStatus.js index 4f370db..dfeb1df 100644 --- a/Bluetooth Low Energy Gateway/BLE/code/libraries/BLEDeviceStatus/BLEDeviceStatus.js +++ b/Bluetooth Low Energy Gateway/BLE/code/libraries/BLEDeviceStatus/BLEDeviceStatus.js @@ -19,7 +19,8 @@ function BLEDeviceStatus(bluetoothMac, message, resp) { gateway_mac: bluetoothMac, ble_device_mac: message.deviceAddress, device_status: message.status, - device_type: message.deviceType + device_type: message.deviceType, + device_addr_type: message.deviceAddrType }; log("New item: " + newItem); var collection = ClearBlade.Collection({collectionName: "BLEDevice"}); @@ -38,7 +39,8 @@ function BLEDeviceStatus(bluetoothMac, message, resp) { gateway_mac: bluetoothMac, ble_device_mac: message.deviceAddress, device_status: message.status, - device_type: message.deviceType + device_type: message.deviceType, + device_addr_type: message.deviceAddrType }; log("Updated item: " + updateItem); nodeQuery.update(updateItem, function(err, data) { diff --git a/Bluetooth Low Energy Gateway/BLE/code/libraries/BLEDeviceStatus/BLEDeviceStatus.json b/Bluetooth Low Energy Gateway/BLE/code/libraries/BLEDeviceStatus/BLEDeviceStatus.json index 9f09b4e..4cd07fd 100644 --- a/Bluetooth Low Energy Gateway/BLE/code/libraries/BLEDeviceStatus/BLEDeviceStatus.json +++ b/Bluetooth Low Energy Gateway/BLE/code/libraries/BLEDeviceStatus/BLEDeviceStatus.json @@ -3,6 +3,6 @@ "dependencies": "", "description": "", "name": "BLEDeviceStatus", - "version": 8, + "version": 9, "visibility": "system" } \ No newline at end of file diff --git a/Bluetooth Low Energy Gateway/BLE/code/libraries/BLEGatewayStatus/BLEGatewayStatus.js b/Bluetooth Low Energy Gateway/BLE/code/libraries/BLEGatewayStatus/BLEGatewayStatus.js index 7cf4d28..c2f32fa 100644 --- a/Bluetooth Low Energy Gateway/BLE/code/libraries/BLEGatewayStatus/BLEGatewayStatus.js +++ b/Bluetooth Low Energy Gateway/BLE/code/libraries/BLEGatewayStatus/BLEGatewayStatus.js @@ -7,9 +7,25 @@ function BLEGatewayStatus(deviceID, message, resp) { resp.error({error: true, result: data}); } else { var gateway = data.DATA; - if(gateway.length === 0) { // No gateway found in collection + if(gateway.length === 0) { // Gateway not found in collection, create it log("No gateway found in collection"); - resp.success({error: true, result: "No gateway found"}); + + var newGateway = { + bluetooth_mac: deviceID, + status: message + }; + + var callback = function (err, data) { + if (err) { + resp.success({error: true, result: "Error creating new gateway: " + JSON.stringify(data)}); + } else { + resp.success(data); + } + }; + + log("Adding gateway to collection") + var col = ClearBlade.Collection({collectionName: "BLEGateway" }); + col.create(newGateway, callback); } else { // Gateway found var changes = { status: message // Update gateway status diff --git a/Bluetooth Low Energy Gateway/BLE/code/libraries/BLEGatewayStatus/BLEGatewayStatus.json b/Bluetooth Low Energy Gateway/BLE/code/libraries/BLEGatewayStatus/BLEGatewayStatus.json index adbd51a..4a9da0b 100644 --- a/Bluetooth Low Energy Gateway/BLE/code/libraries/BLEGatewayStatus/BLEGatewayStatus.json +++ b/Bluetooth Low Energy Gateway/BLE/code/libraries/BLEGatewayStatus/BLEGatewayStatus.json @@ -3,6 +3,6 @@ "dependencies": "", "description": "", "name": "BLEGatewayStatus", - "version": 1, + "version": 2, "visibility": "system" } \ No newline at end of file diff --git a/Bluetooth Low Energy Gateway/BLE/code/services/AddNewBLEDevice/AddNewBLEDevice.js b/Bluetooth Low Energy Gateway/BLE/code/services/AddNewBLEDevice/AddNewBLEDevice.js index 9ea131e..2048d6d 100644 --- a/Bluetooth Low Energy Gateway/BLE/code/services/AddNewBLEDevice/AddNewBLEDevice.js +++ b/Bluetooth Low Energy Gateway/BLE/code/services/AddNewBLEDevice/AddNewBLEDevice.js @@ -1,27 +1,19 @@ function AddNewBLEDevice(req, resp){ - var deviceAddress = "FC:FC:48:9F:E6:E7"; - var gatewayAddress = "f4:0f:24:22:89:cd"; - var uuid = 0x2A06 - var deviceType = "Proximity Sensor" + log("In Add New BLE Device"); + log(JSON.stringify(req)); + + var body = JSON.parse(req.params.body) + log("Starting Add new BLE Device"); - ClearBlade.init({ - systemKey: req.systemKey, - systemSecret: req.systemSecret, - email: "test@clearblade.com", - password: "clearblade", - callback: function(err, body) { - if(err) { - log("Init Error: " + JSON.stringify(body)); - resp.error("initialization error " + JSON.stringify(body)); - } else { - log("Init success"); - //resp.success(body); - var topic = "ble/" + gatewayAddress + "/BLEDeviceStatus"; - var payload = {"command": "connect", "deviceAddress": deviceAddress, "deviceType": deviceType, "uuids": [uuid]}; - var msg = ClearBlade.Messaging({}, function(){}); - msg.publish(topic, JSON.stringify(payload)); - resp.success("Done"); - } - } - }); + ClearBlade.init({request: req}); + + var topic = "ble/" + body.gatewayAddress + "/BLECommands"; + var payload = {"command": "connect", "deviceAddress": body.deviceAddress, "deviceType": body.deviceType, "uuids": body.uuids, "deviceAddrType": body.deviceAddrType}; + + var msg = ClearBlade.Messaging(); + + log("Publishing topic: " + topic + " with payload " + JSON.stringify(payload)); + + msg.publish(topic, JSON.stringify(payload)); + resp.success("Done"); } \ No newline at end of file diff --git a/Bluetooth Low Energy Gateway/BLE/code/services/AddNewBLEDevice/AddNewBLEDevice.json b/Bluetooth Low Energy Gateway/BLE/code/services/AddNewBLEDevice/AddNewBLEDevice.json index 0dfebad..e472361 100644 --- a/Bluetooth Low Energy Gateway/BLE/code/services/AddNewBLEDevice/AddNewBLEDevice.json +++ b/Bluetooth Low Energy Gateway/BLE/code/services/AddNewBLEDevice/AddNewBLEDevice.json @@ -1,5 +1,5 @@ { - "current_version": 29, + "current_version": 30, "dependencies": "clearblade,log", "logging_enabled": "true", "name": "AddNewBLEDevice", diff --git a/Bluetooth Low Energy Gateway/BLE/code/services/BLE/BLE.js b/Bluetooth Low Energy Gateway/BLE/code/services/BLE/BLE.js index 9ab8dd4..1339e92 100644 --- a/Bluetooth Low Energy Gateway/BLE/code/services/BLE/BLE.js +++ b/Bluetooth Low Energy Gateway/BLE/code/services/BLE/BLE.js @@ -1,22 +1,9 @@ function BLE(req, resp){ log("Starting"); - ClearBlade.init({ - systemKey: req.systemKey, - systemSecret: req.systemSecret, - email: "test@clearblade.com", - password: "clearblade", - callback: function(err, body) { - if(err) { - log("Init Error: " + JSON.stringify(body)); - resp.error("initialization error " + JSON.stringify(body)); - } else { - log("Init success"); - //resp.success(body); - } - } - }); - - var topic = req.params.topic; + + ClearBlade.init({request:req}); + + var topic = req.params.topic; var message = req.params.body; var topicSplit = topic.split('/'); @@ -29,8 +16,10 @@ function BLE(req, resp){ var topicEnd = topicSplit[2]; log("Processing Topic: " + topicEnd); - if((topicEnd !== "executed") && (topicEnd !== "messages")) { - log("Here"); - ProcessTopic(topicEnd, mac, message, resp); + if(topicEnd !== "BLECommands" && topicEnd !== "messages") { + if(topicEnd != "connect") { + log("Here"); + ProcessTopic(topicEnd, mac, message, resp); + } } -} \ No newline at end of file +} diff --git a/Bluetooth Low Energy Gateway/BLE/code/services/BLE/BLE.json b/Bluetooth Low Energy Gateway/BLE/code/services/BLE/BLE.json index ddfe140..5f18acc 100644 --- a/Bluetooth Low Energy Gateway/BLE/code/services/BLE/BLE.json +++ b/Bluetooth Low Energy Gateway/BLE/code/services/BLE/BLE.json @@ -1,5 +1,5 @@ { - "current_version": 11, + "current_version": 12, "dependencies": "clearblade,log,ProcessTopic", "logging_enabled": "true", "name": "BLE", diff --git a/Bluetooth Low Energy Gateway/BLE/data/BLEDevice.json b/Bluetooth Low Energy Gateway/BLE/data/BLEDevice.json index 9f00243..10d533f 100644 --- a/Bluetooth Low Energy Gateway/BLE/data/BLEDevice.json +++ b/Bluetooth Low Energy Gateway/BLE/data/BLEDevice.json @@ -32,6 +32,11 @@ "ColumnName": "device_type", "ColumnType": "string", "PK": false + }, + { + "ColumnName": "device_addr_type", + "ColumnType": "string", + "PK": false } ] } \ No newline at end of file diff --git a/Bluetooth Low Energy Gateway/BLE/triggers/AddBLEDevice.json b/Bluetooth Low Energy Gateway/BLE/triggers/AddBLEDevice.json new file mode 100644 index 0000000..2a88562 --- /dev/null +++ b/Bluetooth Low Energy Gateway/BLE/triggers/AddBLEDevice.json @@ -0,0 +1,15 @@ +{ + "event_definition": { + "def_keys": [ + "topic" + ], + "def_module": "Messaging", + "def_name": "Publish", + "visibility": true + }, + "key_value_pairs": { + "topic": "addBLEdevice" + }, + "name": "AddBLEDevice", + "service_name": "AddNewBLEDevice" +} \ No newline at end of file diff --git a/Bluetooth Low Energy Gateway/BLE/triggers/BLEPublish.json b/Bluetooth Low Energy Gateway/BLE/triggers/BLEPublish.json index 1cf9883..d585f7c 100644 --- a/Bluetooth Low Energy Gateway/BLE/triggers/BLEPublish.json +++ b/Bluetooth Low Energy Gateway/BLE/triggers/BLEPublish.json @@ -8,7 +8,7 @@ "visibility": true }, "key_value_pairs": { - "topic": "ble/f4:0f:24:22:89:cd/BLEDeviceStatus" + "topic": "ble/#" }, "name": "BLEPublish", "service_name": "BLE" From 93a399faffcb793ebc0cec8ab3a4ba49f7014786 Mon Sep 17 00:00:00 2001 From: Jim Bouquet Date: Wed, 5 Apr 2017 15:50:37 -0500 Subject: [PATCH 11/27] Added code to detect hex data and convert it accordingly. Fixed readData and writeData functionality. --- .../BluetoothGateway.py | 132 +++++++++++------- Bluetooth Low Energy Gateway/BluetoothLE.py | 87 ++++++++---- 2 files changed, 139 insertions(+), 80 deletions(-) diff --git a/Bluetooth Low Energy Gateway/BluetoothGateway.py b/Bluetooth Low Energy Gateway/BluetoothGateway.py index f376f64..38548d4 100644 --- a/Bluetooth Low Energy Gateway/BluetoothGateway.py +++ b/Bluetooth Low Energy Gateway/BluetoothGateway.py @@ -10,7 +10,7 @@ class BluetoothGateway: connectedBLEDevices = {} - + def __init__(self, credentials): self.credentials = credentials self.scanner = None @@ -34,7 +34,7 @@ def StartGateway(self): #print "\nSubscribing to topic: ble/" + self.gwBTMac + "/BLECommands" self.mqtt.SubscribeToTopic("ble/" + self.gwBTMac + "/BLECommands", self.BleCommandReceived) - + #Publish the gateway status message #print "Publishing topic: " + "ble/" + self.gwBTMac + "/BLEGatewayStatus" self.PublishGatewayOnlineEvent() @@ -47,7 +47,7 @@ def StartGateway(self): try: while True: self.reconcileDevices() - + #Scan for devices every two minutes self.ScanForDevices() time.sleep(self.credentials['scanInterval']) @@ -99,7 +99,7 @@ def ScanForDevices(self): #devices will contain an array of ScanEntry objects devices = self.scanner.scan(5) - + def PublishMessage(self, message, messageType, callback): if messageType == "addBLEdevice": self.mqtt.PublishTopic(messageType, message, callback) @@ -108,73 +108,99 @@ def PublishMessage(self, message, messageType, callback): self.mqtt.PublishTopic(topic, message, callback) def PublishGatewayOnlineEvent(self): - messageToPublish = "{\"gatewayAddress\":\"" + self.gwBTMac + "\", \"status\": \"Online\"}" - #self.PublishMessage(messageToPublish, "BLEGatewayStatus", self.OnStatusPublished) - self.PublishMessage(messageToPublish, "BLEGatewayStatus", None) + messageToPublish = {} + messageToPublish["gatewayAddress"] = self.gwBTMac + messageToPublish["status"] = "Online" - def PublishGatewayOfflineEvent(self): - messageToPublish = "{\"gatewayAddress\":\"" + self.gwBTMac + "\", \"status\": \"Offline\"}" - self.PublishMessage(messageToPublish, "/BLEGatewayStatus", None) + self.PublishMessage(json.dumps(messageToPublish), "BLEGatewayStatus", None) def PublishGatewayOfflineEvent(self): - messageToPublish = "{\"gatewayAddress\":\"" + self.gwBTMac + "\", \"status\": \"Offline\"}" - self.PublishMessage(messageToPublish, "/BLEDeviceStatus", None) + messageToPublish = {} + messageToPublish["gatewayAddress"] = self.gwBTMac + messageToPublish["status"] = "Offline" + + self.PublishMessage(json.dumps(messageToPublish), "/BLEGatewayStatus", None) def PublishError(self, error): self.PublishMessage(error, "BLEErrors", None) def OnStatusPublished(self, client, userdata, mid): - print "Gateway status set to online" + print "Gateway status set to online" def BleCommandReceived(self, client, obj, message): + print "BleComand message type", type(message) + print "Message contents = ", message arrivedMessageJSON = message.payload + print "message payload = ", arrivedMessageJSON + + parsedMessage = {} try: parsedMessage = json.loads(arrivedMessageJSON) - if parsedMessage['command'] == 'connect': - deviceAddress = parsedMessage['deviceAddress'] - deviceType = parsedMessage['deviceType'] - deviceAddrType = parsedMessage['deviceAddrType'] - try: - #If the device already exists, use the existing peripheral instance - # and re-read the data values - if self.connectedBLEDevices.get(deviceAddress) == None: - print "Creating new device" - peripheral = BluetoothLE(deviceAddress, deviceType, deviceAddrType, self) - device = {} - device['peripheral'] = peripheral - device['scanned'] = True - self.connectedBLEDevices[deviceAddress] = device - else: - print "Connecting to existing device" - self.connectedBLEDevices[deviceAddress]['scanned'] = True - self.connectedBLEDevices[deviceAddress]['peripheral'].ConnectToBLEDevice(False) - - except BTLEException as be: - print("BTLEException: " + str(be)) - self.PublishError("BTLEException: Code = " + str(be.code) + ", Message = " + be.message) - except: - print(sys.exc_info()) - print("Could not connect to " + deviceType) - self.PublishError("Could not connect to " + deviceType) - elif parsedMessage['command'] == 'write': - writeDeviceAddress = parsedMessage['deviceAddress'] - if (writeDeviceAddress in self.connectedBLEDevices) == True: - try: - self.connectedBLEDevices[writeDeviceAddress]['peripheral'].WriteValue(parsedMessage['data'], parsedMessage['uuid']) - except: - print("Error writing to BLE device" + deviceAddress) - self.PublishError("Error writing to BLE device " + deviceAddress) - else: - print(writeDeviceAddress + ": No such device found in device dictionary. Please connect the device first and then try again") - self.PublishError(writeDeviceAddress + \ - ": No such device found in device dictionary. Please connect the device first and then try again") except: print "Invalid JSON received in BTLE command" print arrivedMessageJSON print(sys.exc_info()) self.PublishError("Invalid JSON received in BTLE command") + deviceAddress = parsedMessage['deviceAddress'] + if parsedMessage['command'] == 'connect': + deviceType = parsedMessage['deviceType'] + deviceAddrType = parsedMessage['deviceAddrType'] + try: + #If the device already exists, use the existing peripheral instance + # and re-read the data values + if self.connectedBLEDevices.get(deviceAddress) == None: + print "Creating new device" + peripheral = BluetoothLE(deviceAddress, deviceType, deviceAddrType, self) + device = {} + device['peripheral'] = peripheral + device['scanned'] = True + self.connectedBLEDevices[deviceAddress] = device + else: + print "Connecting to existing device" + self.connectedBLEDevices[deviceAddress]['scanned'] = True + self.connectedBLEDevices[deviceAddress]['peripheral'].ConnectToBLEDevice(False) + + except BTLEException as be: + print("BTLEException: " + str(be)) + self.PublishError("BTLEException: Code = " + str(be.code) + ", Message = " + be.message) + except: + print(sys.exc_info()) + print("Could not connect to " + deviceType) + self.PublishError("Could not connect to " + deviceType) + elif parsedMessage['command'] == 'read' or parsedMessage['command'] == 'readAll': + readDeviceAddress = parsedMessage['deviceAddress'] + if (readDeviceAddress in self.connectedBLEDevices) == True: + try: + if parsedMessage['command'] == 'read': + self.connectedBLEDevices[readDeviceAddress]['peripheral'].ReadValue(parsedMessage['uuid']) + else: + self.connectedBLEDevices[readDeviceAddress]['peripheral'].ReadLoop() + + except: + print("Error reading from BLE device" + readDeviceAddress) + print(sys.exc_info()) + self.PublishError("Error reading from BLE device " + readDeviceAddress) + else: + print(readDeviceAddress + ": No such device found. Please connect the device first and then try again") + self.PublishError(readDeviceAddress + \ + ": No such device found. Please connect the device first and then try again") + elif parsedMessage['command'] == 'write': + writeDeviceAddress = parsedMessage['deviceAddress'] + if (writeDeviceAddress in self.connectedBLEDevices) == True: + try: + self.connectedBLEDevices[writeDeviceAddress]['peripheral'].WriteValue(parsedMessage['data'], parsedMessage['uuid']) + except: + print("Error writing to BLE device" + deviceAddress) + print(sys.exc_info()) + self.PublishError("Error writing to BLE device " + deviceAddress) + else: + print(writeDeviceAddress + ": No such device found. Please connect the device first and then try again") + self.PublishError(writeDeviceAddress + \ + ": No such device found. Please connect the device first and then try again") + + #This class is used by the btle.Scanner class. The class provides methods #invoked by the scanner when device related events occur class ScanDelegate(DefaultDelegate): @@ -219,5 +245,5 @@ def addDeviceToPlatform(self, mac, addrType, deviceType): device["deviceType"] = deviceType device["deviceAddrType"] = addrType device["gatewayAddress"] = self.gateway.gwBTMac - - self.gateway.PublishMessage(json.dumps(device), "addBLEdevice", None) + + self.gateway.PublishMessage(json.dumps(device), "addBLEdevice", None) \ No newline at end of file diff --git a/Bluetooth Low Energy Gateway/BluetoothLE.py b/Bluetooth Low Energy Gateway/BluetoothLE.py index dbe6248..77732fd 100644 --- a/Bluetooth Low Energy Gateway/BluetoothLE.py +++ b/Bluetooth Low Energy Gateway/BluetoothLE.py @@ -3,6 +3,7 @@ import time import json import string +import struct from bluepy.btle import Peripheral from bluepy.btle import Scanner from bluepy.btle import UUID @@ -15,7 +16,7 @@ def __init__(self, deviceAddress, deviceType, addrType, mqttConnection): self.mqtt = mqttConnection self.addrType = addrType self.bleConnection = None - + self.ConnectToBLEDevice(True) def ConnectToBLEDevice(self, createNew): @@ -25,10 +26,51 @@ def ConnectToBLEDevice(self, createNew): self.mqtt.setDeviceStatus(self, True) else: self.bleConnection.connect(self.deviceAddress, self.addrType) - + print "Connected to " + self.deviceType thread.start_new_thread(self.ReadLoop, ()) + text_characters = "".join(map(chr, range(32, 127))) + _null_trans = string.maketrans("", "") + + def isText(self, s, text_characters=text_characters, threshold=0.30): + # if s contains any null, it's not text: + if "\x00" in s: + return False + # an "empty" string is "text" (arbitrary but reasonable choice): + if not s: + return True + # Get the substring of s made up of non-text characters + t = s.translate(self._null_trans, text_characters) + # s is 'text' if less than 30% of its characters are non-text ones: + return len(t)/len(s) <= threshold + + def formatValue(self, value): + #We need to determine if we have hex data or a character string + #The best we can do, without hard coding characteristic ID's is to + #see if the valueis alphanumeric or contains only 1 or 2 characters. + #If the value is not alphanumeric or is a length of 1 or 2, assume it is hex data + theValue = value + + if not self.isText(theValue) or len(theValue) ==1 or len(theValue) == 2: + #Assume the data is hex. We now need to unpack it + if len(theValue) == 1: + #Assume signed char + theValue = struct.unpack('b', theValue)[0] + elif len(theValue) ==2: + #Assume short + theValue = struct.unpack('h', theValue)[0] + elif len(theValue) == 4: + #Assume long + theValue = struct.unpack('l', theValue)[0] + elif len(theValue) == 8: + #Assume long long + theValue = struct.unpack('q', theValue)[0] + else: + #Only other thing we can do + theValue = theValue.encode('string-escape') + + return theValue def ReadLoop(self): readData = {} @@ -37,24 +79,14 @@ def ReadLoop(self): for char in characteristics: if char.supportsRead(): try: - value = char.read() - printable = True - #if the value is not printable, string escape it - for c in value: - if c in string.printable: - printable = False - break - - if not printable: - value = value.encode('string-escape') - + value = self.formatValue(char.read()) readData[str(char.uuid.getCommonName())] = value except: print "Failed to read data for uuid ", str(char.uuid.getCommonName()) print sys.exc_info() readData["services"] = [] - + services = self.bleConnection.getServices() for service in services: serviceData = {} @@ -64,16 +96,7 @@ def ReadLoop(self): for serviceChar in serviceChars: if serviceChar.supportsRead(): try: - value = serviceChar.read() - printable = True - #if the value is not printable, string escape it - for c in value: - if c in string.printable: - printable = False - break - if not printable: - value = value.encode('string-escape') - + value = self.formatValue(serviceChar.read()) serviceData[str(serviceChar.uuid.getCommonName())] = value except: print "Failed to read data for uuid ", str(serviceChar.uuid.getCommonName()) @@ -95,14 +118,24 @@ def ReadLoop(self): self.bleConnection.disconnect() def ReadValue(self, uuid): + self.bleConnection.connect(self.deviceAddress, self.addrType) characteristics = self.bleConnection.getCharacteristics(uuid=uuid)[0] - readValue = characteristics.read() + readValue = self.formatValue(characteristics.read()) + + messageToPublish = {} + messageToPublish["deviceType"] = self.deviceType + messageToPublish["deviceAddress"] = self.deviceAddress + messageToPublish["readData"] = readValue + + self.mqtt.PublishMessage(json.dumps(messageToPublish), "BLEReadData", None) + self.bleConnection.disconnect() - messageToPublish = "{\"deviceType\":\"" + self.deviceType + "\", \"deviceAddress\":\"" + self.deviceAddress + "\", \"readData\": \"" + readValue + "\"}" - self.mqtt.PublishMessage(messageToPublish, "BLEReadData", None) + print "Successfully read data from device. Data value = ", readValue def WriteValue(self, data, uuid): + self.bleConnection.connect(self.deviceAddress, self.addrType) uuidValue = UUID(uuid) characteristics = self.bleConnection.getCharacteristics(uuid=uuid)[0] characteristics.write(data, True) print "Successfully wrote data to device " + self.deviceAddress + self.bleConnection.disconnect() \ No newline at end of file From 34efecd0b0a2967361209ed144a7df65ac160765 Mon Sep 17 00:00:00 2001 From: Jim Bouquet Date: Wed, 5 Apr 2017 15:53:37 -0500 Subject: [PATCH 12/27] Removed print statements --- Bluetooth Low Energy Gateway/BluetoothGateway.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/Bluetooth Low Energy Gateway/BluetoothGateway.py b/Bluetooth Low Energy Gateway/BluetoothGateway.py index 38548d4..deb4a1a 100644 --- a/Bluetooth Low Energy Gateway/BluetoothGateway.py +++ b/Bluetooth Low Energy Gateway/BluetoothGateway.py @@ -128,18 +128,13 @@ def OnStatusPublished(self, client, userdata, mid): print "Gateway status set to online" def BleCommandReceived(self, client, obj, message): - print "BleComand message type", type(message) - print "Message contents = ", message arrivedMessageJSON = message.payload - print "message payload = ", arrivedMessageJSON - parsedMessage = {} try: parsedMessage = json.loads(arrivedMessageJSON) except: print "Invalid JSON received in BTLE command" - print arrivedMessageJSON print(sys.exc_info()) self.PublishError("Invalid JSON received in BTLE command") From 537c5f07db2ecc8df895b8344ed8b438f801699d Mon Sep 17 00:00:00 2001 From: Martin Pandola Date: Fri, 11 Aug 2017 15:07:09 -0500 Subject: [PATCH 13/27] Added CoAP Lib --- CoAP Lib/README.md | 73 ++++++++++ CoAP Lib/coapLib.js | 316 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 389 insertions(+) create mode 100644 CoAP Lib/README.md create mode 100644 CoAP Lib/coapLib.js diff --git a/CoAP Lib/README.md b/CoAP Lib/README.md new file mode 100644 index 0000000..1eb9792 --- /dev/null +++ b/CoAP Lib/README.md @@ -0,0 +1,73 @@ +# CoAP Lib + +A ClearBlade library for parsing and building CoAP packets. + +**Under construction!** +Parsing works but building does not. + +## Usage + +### Import to ClearBlade Platform + +Currently, the easiest way to do this is by copy/pasting this into a new library. +Then make sure you include it as a dependency in any service you're calling it from. + +### Parsing + +Parsing assumes your packet is an array of integers. + +```javascript +// Make a CoAP object +var coap = CoAP(); + +// This is the packet we want to parse +var packet = [65,1,0,1,0,186,99,108,101,97,114,98,108,97,100,101,97,50]; + +// Parsing the packet returns an object like below +var parsed = coap.parse(packet); +log(parsed); +/* +{ + "CoAP Version": 1, + "Request Type": "Confirmable", + "Command": { + "Code": "0.01", + "Name": "GET", + "Type": "Request" + }, + "Message ID": "0001", + "Token": "00", + "Options": { + "Uri-Path": "clearblade", + "Accept": "application/json" + } +} +*/ +``` + +### Building + +_(remember that buiding doesn't work yet so don't you go expecting anything)_ + +Building assumes you construct your options object in the following format. + +```javascript +var options = { + "Request Type": "Confirmable", + "Command": "POST", + "Message ID": 24, + "Token": 1, + "Options": { + "Uri-Path": "clearblade_rgb", + "Content-Type": "application/octet-stream", + "Payload": [0, 255, 112, 255, 0] +}; + +// Make a CoAP object +var coap = CoAP(); + +// Building a packet returns an array of integers +var newPacket = coap.build(options); +log(newPacket); +// [65, 2, 0, 24, 1, 185, 114, 103, 98, 45, 108, 105, 103, 104, 116, 97, 42, 255, 0, 255, 112, 255, 0] +``` \ No newline at end of file diff --git a/CoAP Lib/coapLib.js b/CoAP Lib/coapLib.js new file mode 100644 index 0000000..adc6c70 --- /dev/null +++ b/CoAP Lib/coapLib.js @@ -0,0 +1,316 @@ + +/****************************************************************************** + * * + * /$$$$$$ /$$$$$$ /$$$$$$$ /$$ /$$ /$$ * + * /$$__ $$ /$$__ $$| $$__ $$ | $$ |__/| $$ * + * | $$ \__/ /$$$$$$ | $$ \ $$| $$ \ $$ | $$ /$$| $$$$$$$ * + * | $$ /$$__ $$| $$$$$$$$| $$$$$$$/ | $$ | $$| $$__ $$ * + * | $$ | $$ \ $$| $$__ $$| $$____/ | $$ | $$| $$ \ $$ * + * | $$ $$| $$ | $$| $$ | $$| $$ | $$ | $$| $$ | $$ * + * | $$$$$$/| $$$$$$/| $$ | $$| $$ | $$$$$$$$| $$| $$$$$$$/ * + * \______/ \______/ |__/ |__/|__/ |________/|__/|_______/ * + * * + * * + * Written in accordance to https://tools.ietf.org/html/rfc7252 * + * * + ******************************************************************************/ + +function CoAP(){ + + // PARSING HELPER FUNCTIONS + + function intArrToHexString(arr){ + return (arr.map(function(x){var y=x.toString(16);return x<16?'0'+y:y})).join(''); + } + + function intArrToAsciiString(arr){ + return arr.map(function(x){return String.fromCharCode(x)}).join(""); + } + + function intArrToInt(arr){ + return parseInt(intArrToHexString(arr),16); + } + + function splitByte(toSplit){ + var byte = toSplit; + var ret = []; + ret = ret.concat((byte&0xF0)>>4); + ret = ret.concat(byte&0x0F); + return ret; + } + + function splitHalfByte(toSplit){ + var halfByte = toSplit; + var ret = []; + ret = ret.concat((halfByte&0xC)>>2); + ret = ret.concat(halfByte&0x3); + return ret; + } + + function mapRequest(reqType){ + ret = "Invalid request type"; + switch(reqType){ + case 0: + ret = "Confirmable"; + break; + case 1: + ret = "Non-confirmable"; + break; + case 2: + ret = "Acknowledgement"; + break; + case 3: + ret = "Reset"; + break; + } + return ret; + } + + function mapFormat(formatNum){ + switch(formatNum){ + case 0: + return "text/plain;charset=utf-8"; + case 40: + return "application/link-format"; + case 41: + return "application/xml"; + case 42: + return "application/octet-stream"; + case 47: + return "application/exi"; + case 50: + return "application/json"; + default: + return "invalid format"; + } + } + + function mapCommand(command){ + ret = []; + if(command<32){ + ret = ret.concat(["Request"]); + }else{ + ret = ret.concat(["Response"]); + } + switch(command){ + case 0: + return ret.concat(["0.00", "Empty message"]); + case 1: + return ret.concat(["0.01", "GET"]); + case 2: + return ret.concat(["0.02", "POST"]); + case 3: + return ret.concat(["0.03", "PUT"]); + case 4: + return ret.concat(["0.04", "DELETE"]); + } + return ["Invalid command", null, null]; + } + + function mapOptions(optionNum, optionVal){ + var ret = ["invalid option", optionVal]; + switch(optionNum){ + case 1: + ret[0] = "If-Match"; + // ret[1] is opaque + break; + case 3: + ret[0] = "Uri-Host"; + ret[1] = intArrToAsciiString(ret[1]); + break; + case 4: + ret[0] = "ETag"; + // ret[1] is opaque + break; + case 5: + ret[0] = "If-None-Match"; + // ret[1] is empty + break; + case 7: + ret[0] = "Uri-Port"; + ret[1] = intArrToInt(ret[1]); + break; + case 8: + ret[0] = "Location-Path"; + ret[1] = intArrToAsciiString(ret[1]); + break; + case 11: + ret[0] = "Uri-Path"; + ret[1] = intArrToAsciiString(ret[1]); + break; + case 12: + ret[0] = "Content-Format"; + ret[1] = mapFormat(intArrToInt(ret[1])); + break; + case 14: + ret[0] = "Max-Age"; + ret[1] = intArrToInt(ret[1]); + break; + case 15: + ret[0] = "Uri-Query"; + ret[1] = intArrToAsciiString(ret[1]); + break; + case 17: + ret[0] = "Accept"; + ret[1] = mapFormat(intArrToInt(ret[1])); + break; + case 20: + ret[0] = "Location-Query"; + ret[1] = intArrToAsciiString(ret[1]); + break; + case 35: + ret[0] = "Proxy-Uri"; + ret[1] = intArrToAsciiString(ret[1]); + break; + case 39: + ret[0] = "Proxy-Scheme"; + ret[1] = intArrToAsciiString(ret[1]); + break; + case 60: + ret[0] = "Size1"; + ret[1] = intArrToInt(ret[1]); + break; + } + return ret; + } + + // BUILDING HELPER FUNCTIONS + + function mapBackCommand(command){ + switch(command){ + case "0.00": + case "EMPTY": + case "EMPTY MESSAGE": + return 0; + case "0.01": + case "GET": + return 1; + case "0.02": + case "POST": + return 2; + case "0.03": + case "PUT": + return 1; + case "0.04": + case "DELETE": + return 2; + } + } + + + // ACCESSIBLE FUNCTIONS + + function parseCoAP(buffer){ + var buf = buffer.slice(); + var packet = {} + var firstByte = splitByte(buf.shift()); + var firstHalfByte = splitHalfByte(firstByte[0]); + packet["CoAP Version"] = firstHalfByte[0]; + packet["Request Type"] = mapRequest(firstHalfByte[1]); + var tokenLength = firstByte[1]; + var command = mapCommand(buf.shift()); + packet["Command"] = { + Type: command[0], + Code: command[1], + Name: command[2] + }; + packet["Message ID"] = intArrToHexString([].concat(buf.splice(0,2))); + packet["Token"] = intArrToHexString([].concat(buf.splice(0,tokenLength))); + var options = {}; + var prevOptions = 0; + while(buf.length>0){ + var option = buf.shift(); + var optionSplit = splitByte(option); + var delta; + var len = optionSplit[1]; + if(option===0xFF){ + options.Payload = buf.slice(); + buf = []; + }else{ + switch(optionSplit[0]){ + case 0xF: + if(optionSplit[1]!==0xF){ + return{ + "Error": "Message format error", + "Details": "Encountered an option delta of 15 and it's not the payload marker" + }; + } + break; + case 0xE: + delta = parseInt(intArrToHexString([].concat(buf.splice(0,2))),16)-269; + break; + case 0xD: + delta = buf.shift()-13; + break; + default: + delta = optionSplit[0]; + break; + } + option = prevOptions+delta; + prevOptions += option; + switch(len){ + case 0xF: + return{ + "Error": "Message format error", + "Details": "Encountered an option length of 15" + }; + case 0xE: + len = parseInt(intArrToHexString([].concat(buf.splice(0,2))),16)-269; + break; + case 0xD: + len = buf.shift()-13; + break; + default: + break; + } + option = mapOptions(option, [].concat(buf.splice(0,len))); + options[option[0]] = option[1]; + } + } + if(Object.keys(options).length){ + packet["Options"] = options; + } + return packet; + } + + /* + { + "CoAP Version": 1, + "Request Type": "Confirmable", + "Command": { + "Code": "0.02", + "Name": "POST", + "Type": "Request" + }, + "Message ID": "0001", + "Token": "00", + "Options": { + "Content-Format": "application/octet-stream", + "Payload": [ + 0, + 255, + 0, + 0, + 0 + ], + "Uri-Path": "rgbclick" + } + } + */ + + function buildCoAP(options){ + var reqType = options["Request Type"].toUpperCase(); + var command = options["Command"].toUpperCase(); + var messageID = parseInt(options["Message ID"]); + var token = parseInt(options["Token"]); + log(reqType) + log(command+"::"+mapBackCommand(command)) + log(messageID) + log(token) + } + + return { + parse: parseCoAP, + build: buildCoAP + } +} From 67082709448a92b07a3cdad3a0927761118aa82c Mon Sep 17 00:00:00 2001 From: Martin Pandola Date: Tue, 15 Aug 2017 19:13:08 -0500 Subject: [PATCH 14/27] CoAP Lib can now build packets --- CoAP Lib/coapLib.js | 325 +++++++++++++++++++++++++++++++++++++------- 1 file changed, 274 insertions(+), 51 deletions(-) diff --git a/CoAP Lib/coapLib.js b/CoAP Lib/coapLib.js index adc6c70..157c406 100644 --- a/CoAP Lib/coapLib.js +++ b/CoAP Lib/coapLib.js @@ -48,22 +48,18 @@ function CoAP(){ } function mapRequest(reqType){ - ret = "Invalid request type"; switch(reqType){ case 0: - ret = "Confirmable"; - break; + return "Confirmable"; case 1: - ret = "Non-confirmable"; - break; + return "Non-confirmable"; case 2: - ret = "Acknowledgement"; - break; + return "Acknowledgement"; case 3: - ret = "Reset"; - break; + return "Reset"; + default: + return "Invalid request type"; } - return ret; } function mapFormat(formatNum){ @@ -86,7 +82,7 @@ function CoAP(){ } function mapCommand(command){ - ret = []; + var ret = []; if(command<32){ ret = ret.concat(["Request"]); }else{ @@ -170,12 +166,53 @@ function CoAP(){ ret[0] = "Size1"; ret[1] = intArrToInt(ret[1]); break; + default: + ret[1] = { + number: optionNum, + value: optionVal + }; + break; } return ret; } // BUILDING HELPER FUNCTIONS + function asciiToIntArr(str){ + return str.split("").map(function(c){return c.charCodeAt(0)}); + } + + function hexStringToIntArr(hex){ + var ret = hex.match(/.{2}/g).map(function(x){return parseInt(x,16)}); + if(!(typeof ret[0] != 'undefined' && ret[0])){ + ret.shift(); + } + return ret; + } + + function intToIntArr(messageStr){ + var hex = parseInt(messageStr).toString(16); + if(hex.length%2===1){ + hex = '0'+hex; + } + return hexStringToIntArr(hex); + } + + function mapBackReqType(reqType){ + switch(reqType.replace(/[- ]/g,"")){ + case "CONFIRMABLE": + return 0; + case "NONCONFIRMABLE": + return 1; + case "ACKNOWLEDGEMENT": + return 2; + case "RESET": + return 3; + default: + return -1; + } + } + function mapBackCommand(command){ switch(command){ case "0.00": @@ -197,10 +234,181 @@ function CoAP(){ } } + function mapBackOption(option){ + var op = option.replace(/[- ]/g,"").toUpperCase(); + switch(op){ + case "IFMATCH": + return 1; + case "URIHOST": + return 3; + case "ETAG": + return 4; + case "IFNONEMATCH": + return 5; + case "URIPORT": + return 7; + case "LOCATIONPATH": + return 8; + case "URIPATH": + return 11; + case "CONTENTFORMAT": + return 12; + case "MAXAGE": + return 14; + case "URIQUERY": + return 15; + case "ACCEPT": + return 17; + case "LOCATIONQUERY": + return 20; + case "PROXYURI": + return 35; + case "PROXYSCHEME": + return 39; + case "SIZE1": + return 60; + case "PAYLOAD": + return -2; + default: + return -1; + } + } + + function getOptionDeltas(options){ + var nums = []; + for(var option in options){ + var num = mapBackOption(option); + nums.push({ + original: num, + delta: num, + value: options[option] + }); + } + nums.sort(function(a,b){ + return parseInt(a.original) - parseInt(b.original); + }) + if(nums[0].original===-2){ + nums.push(nums[0]); + nums.shift(); + } + for(var i=0;i>8); + excessDelta.push((delta-269)&0xFF); + delta = 14<<4; + } + var value = convertOptionValues(option.original, option.value); + if(value.constructor === Array){ + if(delta===0xFF){ + optionsBuf.push(delta); + }else if(value.length<13){ + optionsBuf.push(delta|value.length); + }else if(value.length<269){ + optionsBuf.push(delta|13) + excessLength.push(value.length-13); + }else{ + optionsBuf.push(delta|14); + excessLength.push((value.length-269)>>8); + excessLength.push((value.length-269)&0xFF); + } + }else{ + optionsBuf.push(delta|1); + } + optionsBuf = optionsBuf.concat(excessDelta).concat(excessLength).concat(value); + } + return optionsBuf; + } // ACCESSIBLE FUNCTIONS function parseCoAP(buffer){ + if(buffer.constructor !== Array){ + return "Invalid packet. Expected array." + } var buf = buffer.slice(); var packet = {} var firstByte = splitByte(buf.shift()); @@ -214,8 +422,8 @@ function CoAP(){ Code: command[1], Name: command[2] }; - packet["Message ID"] = intArrToHexString([].concat(buf.splice(0,2))); - packet["Token"] = intArrToHexString([].concat(buf.splice(0,tokenLength))); + packet["Message ID"] = intArrToHexString([].concat(buf.splice(0,2))).toUpperCase(); + packet["Token"] = intArrToHexString([].concat(buf.splice(0,tokenLength))).toUpperCase(); var options = {}; var prevOptions = 0; while(buf.length>0){ @@ -237,17 +445,17 @@ function CoAP(){ } break; case 0xE: - delta = parseInt(intArrToHexString([].concat(buf.splice(0,2))),16)-269; + delta = parseInt(intArrToHexString([].concat(buf.splice(0,2))),16)+269; break; case 0xD: - delta = buf.shift()-13; + delta = buf.shift()+13; break; default: delta = optionSplit[0]; break; } option = prevOptions+delta; - prevOptions += option; + prevOptions += delta; switch(len){ case 0xF: return{ @@ -255,10 +463,10 @@ function CoAP(){ "Details": "Encountered an option length of 15" }; case 0xE: - len = parseInt(intArrToHexString([].concat(buf.splice(0,2))),16)-269; + len = parseInt(intArrToHexString([].concat(buf.splice(0,2))),16)+269; break; case 0xD: - len = buf.shift()-13; + len = buf.shift()+13; break; default: break; @@ -273,40 +481,55 @@ function CoAP(){ return packet; } - /* - { - "CoAP Version": 1, - "Request Type": "Confirmable", - "Command": { - "Code": "0.02", - "Name": "POST", - "Type": "Request" - }, - "Message ID": "0001", - "Token": "00", - "Options": { - "Content-Format": "application/octet-stream", - "Payload": [ - 0, - 255, - 0, - 0, - 0 - ], - "Uri-Path": "rgbclick" - } + function buildCoAP(details){ + var reqType, command, messageID, token, options; + for(var deet in details){ + switch(deet.replace(/[-_ ]/g,"").toUpperCase()){ + case "REQUESTTYPE": + reqType = mapBackReqType(details[deet].toUpperCase()); + break; + case "COMMAND": + command = mapBackCommand(details[deet].toUpperCase()); + break; + case "MESSAGEID": + messageID = details[deet]; + if(typeof parseInt(messageID) != 'undefined' && parseInt(messageID)){ + messageID = intToIntArr(messageID); + }else{ + messageID = hexStringToIntArr(messageID); + } + if(messageID.length>2){ + return "Message ID is too large"; + } + if(messageID.length<2){ + messageID = [0].concat(messageID); + } + break; + case "TOKEN": + token = details[deet]; + if(typeof parseInt(token) != 'undefined' && parseInt(token)){ + token = intToIntArr(token); + }else{ + token = hexStringToIntArr(token); + } + if(token.length>8){ + return "Token is too large"; + } + break; + case "OPTIONS": + options = buildOptionsBuf(details[deet]); + break; + } } - */ - - function buildCoAP(options){ - var reqType = options["Request Type"].toUpperCase(); - var command = options["Command"].toUpperCase(); - var messageID = parseInt(options["Message ID"]); - var token = parseInt(options["Token"]); - log(reqType) - log(command+"::"+mapBackCommand(command)) - log(messageID) - log(token) + if( !(typeof reqType!='undefined') + ||!(typeof command!='undefined') + ||!(typeof messageID!='undefined') + ||!(typeof token!='undefined') + ){ + return "Missing required parameter" + } + var firstByte = ((4 | reqType)<<4)|token.length; + return [].concat(firstByte).concat(command).concat(messageID).concat(token).concat(options); } return { From 203ada28e294177e793cd3b5d6c22c6faa6efe67 Mon Sep 17 00:00:00 2001 From: Martin Pandola Date: Tue, 15 Aug 2017 19:17:37 -0500 Subject: [PATCH 15/27] Fixed regex error in CoAP Lib --- CoAP Lib/coapLib.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/CoAP Lib/coapLib.js b/CoAP Lib/coapLib.js index 157c406..a938a3d 100644 --- a/CoAP Lib/coapLib.js +++ b/CoAP Lib/coapLib.js @@ -199,7 +199,7 @@ function CoAP(){ } function mapBackReqType(reqType){ - switch(reqType.replace(/[- ]/g,"")){ + switch(reqType.replace(/[\- ]/g,"")){ case "CONFIRMABLE": return 0; case "NONCONFIRMABLE": @@ -235,7 +235,7 @@ function CoAP(){ } function mapBackOption(option){ - var op = option.replace(/[- ]/g,"").toUpperCase(); + var op = option.replace(/[\- ]/g,"").toUpperCase(); switch(op){ case "IFMATCH": return 1; @@ -302,7 +302,7 @@ function CoAP(){ } function mapBackFormat(format){ - switch(format.replace(/[;-=/]/g,"").toUpperCase()){ + switch(format.replace(/[;\-=/]/g,"").toUpperCase()){ case "TEXTPLAINCHARSETUTF8": case "TEXTPLAIN": return 0; @@ -484,7 +484,7 @@ function CoAP(){ function buildCoAP(details){ var reqType, command, messageID, token, options; for(var deet in details){ - switch(deet.replace(/[-_ ]/g,"").toUpperCase()){ + switch(deet.replace(/[\-_ ]/g,"").toUpperCase()){ case "REQUESTTYPE": reqType = mapBackReqType(details[deet].toUpperCase()); break; From b5e1afcd195b0f39a62db0739abf2da524f5b719 Mon Sep 17 00:00:00 2001 From: Martin Pandola Date: Tue, 15 Aug 2017 20:16:33 -0500 Subject: [PATCH 16/27] Updated CoAP Lib README --- CoAP Lib/README.md | 57 +++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 51 insertions(+), 6 deletions(-) diff --git a/CoAP Lib/README.md b/CoAP Lib/README.md index 1eb9792..1ad167c 100644 --- a/CoAP Lib/README.md +++ b/CoAP Lib/README.md @@ -2,8 +2,7 @@ A ClearBlade library for parsing and building CoAP packets. -**Under construction!** -Parsing works but building does not. +Written in accordance to the [RFC 7252](https://tools.ietf.org/html/rfc7252) specification. ## Usage @@ -16,6 +15,20 @@ Then make sure you include it as a dependency in any service you're calling it f Parsing assumes your packet is an array of integers. +Assuming you pass in a valid packet, the parse function will return an object with the following key-value pairs: + + - CoAP Version (int) - should always be 1. + - Request Type (string) - one of: Confirmable, Non-confirmable, Acknowledgement, or Reset. + - Command (dict) - contains: + - Type (string) - either Request or Response. + - Name (string) - something like GET or Not Found. + - Code (string) - the code associated with this response/request name. + - Message ID (string) - the hex string representation of the message ID. + - Token (string) - the hex string representation of the token. + - Options (dictionary) - option names and their associated values (if any are present). + +##### Example + ```javascript // Make a CoAP object var coap = CoAP(); @@ -47,9 +60,40 @@ log(parsed); ### Building -_(remember that buiding doesn't work yet so don't you go expecting anything)_ - Building assumes you construct your options object in the following format. +The first four keys are required, options is _optionary_. + +- Request Type (string) - one of: Confirmable, Non-confirmable, Acknowledgement, or Reset. +- Command (string) - either the code or name of the request/response. +- Message ID (string) - the hex string representation of the message ID. +- Token (string) - the hex string representation of the token. +- Options (dict) - option names and their associated values. + Options will expect their values in the following formats: + - If-Match - integer array representing the raw hex bytes. + - Uri-Host - string. Max of 255 characters. + - ETag - integer array representing the raw hex bytes. + - If-None-Match - empty array. + - Uri-Port - integer. + - Location-Path - string. Max of 255 characters. + - Uri-Path - string. Max of 255 characters. + - Content-Format - string. + One of: + - text/plain + - application/link-format + - application/xml + - application/octet-stream + - application/exi + - application/json + - Max-Age - integer. + - Uri-Query - string. Max of 255 characters. + - Accept - string. + Same options as Content-Format. + - Location-Query - string. Max of 255 characters. + - Proxy-Uri - string. Max of 1034 characters. + - Proxy-Scheme - string. Max of 255 characters. + - Size1 - integer. + +##### Example ```javascript var options = { @@ -59,8 +103,9 @@ var options = { "Token": 1, "Options": { "Uri-Path": "clearblade_rgb", - "Content-Type": "application/octet-stream", + "Content-Format": "application/octet-stream", "Payload": [0, 255, 112, 255, 0] + } }; // Make a CoAP object @@ -69,5 +114,5 @@ var coap = CoAP(); // Building a packet returns an array of integers var newPacket = coap.build(options); log(newPacket); -// [65, 2, 0, 24, 1, 185, 114, 103, 98, 45, 108, 105, 103, 104, 116, 97, 42, 255, 0, 255, 112, 255, 0] +// [65, 2, 0, 24, 1, 189, 1, 99, 108, 101, 97, 114, 98, 108, 97, 100, 101, 95, 114, 103, 98, 17, 42, 255, 0, 255, 112, 255, 0] ``` \ No newline at end of file From 60d23107082906781360d3779b6e5dfae167e5e0 Mon Sep 17 00:00:00 2001 From: rreinold Date: Wed, 28 Feb 2018 13:34:38 -0600 Subject: [PATCH 17/27] Updated that aws s3 has moved to ipm --- Access Control with AWS S3/README.md | 17 ++--------------- 1 file changed, 2 insertions(+), 15 deletions(-) diff --git a/Access Control with AWS S3/README.md b/Access Control with AWS S3/README.md index 3a6736f..4c08dbb 100644 --- a/Access Control with AWS S3/README.md +++ b/Access Control with AWS S3/README.md @@ -1,16 +1,3 @@ -# Using the ClearBlade Platform to enhance AWS S3 access control +# Note -## Overview - -Add a layer of security on top of existing AWS S3 Access control. - -## Usage - ->1. Store AWS key and secret in a Collection ->2. Replace `` with your collection name. ->3. Choose to give access to credentials via a Code Service only to the users/devices that are authenticated with the ClearBlade Platform. ->4. Place getAWSAccess.js code into a Code Service. - -## Further Documentation - -http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSGettingStartedGuide/AWSCredentials.html \ No newline at end of file +Pattern has moved: https://ipm.clearblade.com \ No newline at end of file From 0ada74e6723179f5276af0051da583eae9778486 Mon Sep 17 00:00:00 2001 From: rreinold Date: Wed, 28 Feb 2018 13:35:51 -0600 Subject: [PATCH 18/27] removed aws snippet --- Access Control with AWS S3/getAWSAccess.js | 16 ---------------- 1 file changed, 16 deletions(-) delete mode 100644 Access Control with AWS S3/getAWSAccess.js diff --git a/Access Control with AWS S3/getAWSAccess.js b/Access Control with AWS S3/getAWSAccess.js deleted file mode 100644 index 68c054b..0000000 --- a/Access Control with AWS S3/getAWSAccess.js +++ /dev/null @@ -1,16 +0,0 @@ -function getAWSAccess(req, resp){ - function getAccess() { - var callback = function(err, data) { - if (err) { - resp.error(data); - } else { - resp.success(data); - } - } - var query = ClearBlade.Query({'collectionName': }); - query.fetch(callback); - } - - ClearBlade.init({request:req}); - getAccess(); -} \ No newline at end of file From d0e964b03d0d671a4e4fa7efe4a9176a8937862d Mon Sep 17 00:00:00 2001 From: rreinold Date: Wed, 28 Feb 2018 14:57:33 -0600 Subject: [PATCH 19/27] Moved dropbox to ipm --- Access Control with Dropbox/README.md | 17 ++--------------- Access Control with Dropbox/getDropboxAccess.js | 16 ---------------- 2 files changed, 2 insertions(+), 31 deletions(-) delete mode 100644 Access Control with Dropbox/getDropboxAccess.js diff --git a/Access Control with Dropbox/README.md b/Access Control with Dropbox/README.md index 834b024..4c08dbb 100644 --- a/Access Control with Dropbox/README.md +++ b/Access Control with Dropbox/README.md @@ -1,16 +1,3 @@ -# Using the ClearBlade Platform to enhance Dropbox access control +# Note -## Overview - -Add a layer of security on top of existing DropBox Access control. - -## Usage - ->1. Store Dropbox authorization credentials in a Collection ->2. Replace `` with your collection name. ->3. Choose to give access to his Dropbox credentials via a Code Service only to the users/devices that are authenticated with the ClearBlade Platform. ->4. Place getDropboxAccess.js code into a Code Service. - -## Further Documentation - -https://www.dropbox.com/developers-v1/core/ +Pattern has moved: https://ipm.clearblade.com \ No newline at end of file diff --git a/Access Control with Dropbox/getDropboxAccess.js b/Access Control with Dropbox/getDropboxAccess.js deleted file mode 100644 index 6c8487f..0000000 --- a/Access Control with Dropbox/getDropboxAccess.js +++ /dev/null @@ -1,16 +0,0 @@ -function getDropboxAccess(req, resp){ - function getAccess() { - var callback = function(err, data) { - if (err) { - resp.error(data); - } else { - resp.success(data); - } - } - var query = ClearBlade.Query({'collectionName': }); - query.fetch(callback); - } - - ClearBlade.init({request:req}); - getAccess(); -} \ No newline at end of file From 8dde8bb3c840b6b47aaf355382eec86785fb1522 Mon Sep 17 00:00:00 2001 From: rreinold Date: Wed, 28 Feb 2018 16:57:01 -0600 Subject: [PATCH 20/27] angular service is on ipm --- Angular Service/README.md | 13 +---- Angular Service/cbService.js | 104 ----------------------------------- 2 files changed, 2 insertions(+), 115 deletions(-) delete mode 100644 Angular Service/cbService.js diff --git a/Angular Service/README.md b/Angular Service/README.md index cce8ad1..4c08dbb 100644 --- a/Angular Service/README.md +++ b/Angular Service/README.md @@ -1,12 +1,3 @@ -# Overview -Angular Service for Clearblade Platform. You can drop this into your Angular Project to easy integrate an Angular project with ClearBlade Novi Platform. +# Note -# Usage ->1. Add cbService.js to your Angular Project ->2. Replace with your ClearBlade System Key. ->3. Replace with your ClearBlade System Secret. ->4. From your Angular Project, call the #init method to initialize your session with ClearBlade Novi. ->5. Use #runCode to run one of your ClearBlade Novi Code Services! - -# Further Documentation -https://github.com/ClearBlade/Angular-SDK \ No newline at end of file +Pattern has moved: https://ipm.clearblade.com \ No newline at end of file diff --git a/Angular Service/cbService.js b/Angular Service/cbService.js deleted file mode 100644 index 5788f94..0000000 --- a/Angular Service/cbService.js +++ /dev/null @@ -1,104 +0,0 @@ -angular.module(app_name) -.service('cb', ['$q', function ($q) { - - var cbObj = new ClearBlade(); - - var init = function (email, password) { - var deferred = $q.defer(); - - var initOptions = { - systemKey: , - systemSecret: , - URI: "https://platform.clearblade.com", - - callback: function (err, body) { - if (err) { - deferred.reject(body); - } else { - deferred.resolve(body); - } - } - } - if (typeof email != undefined){ - initOptions.email = email - } - if (typeof password != undefined){ - initOptions.password = password - } - - cbObj.init(initOptions); - - return deferred.promise; - } - - var runCode = function (funcName, params, retryCounter) { - var deferred = $q.defer(); - if(typeof retryCounter == 'undefined'){ - retryCounter = 0; - } - var retryMax = 4; - - function go() { - cbObj.Code().execute(funcName, params, function (err, body) { - if (err) { - if(retryCounter=0 || body.success === false) - body.code = '6'; - else if(body.success === true) - body.code = '1'; - console.log(body); - deferred.resolve(body); - } - } - }); -} -if (!cbObj.user) { - init().then(function () { - go(); - }, function (err) { - if(retryCounter Date: Mon, 12 Mar 2018 12:30:38 -0500 Subject: [PATCH 21/27] q moved to ipm --- Library q for promises/Readme.md | 3 + Library q for promises/lib/qLib.js | 1984 -------------------- Library q for promises/readme.md | 27 - Library q for promises/service/qExample.js | 31 - 4 files changed, 3 insertions(+), 2042 deletions(-) create mode 100644 Library q for promises/Readme.md delete mode 100644 Library q for promises/lib/qLib.js delete mode 100644 Library q for promises/readme.md delete mode 100644 Library q for promises/service/qExample.js diff --git a/Library q for promises/Readme.md b/Library q for promises/Readme.md new file mode 100644 index 0000000..4c08dbb --- /dev/null +++ b/Library q for promises/Readme.md @@ -0,0 +1,3 @@ +# Note + +Pattern has moved: https://ipm.clearblade.com \ No newline at end of file diff --git a/Library q for promises/lib/qLib.js b/Library q for promises/lib/qLib.js deleted file mode 100644 index fde41b5..0000000 --- a/Library q for promises/lib/qLib.js +++ /dev/null @@ -1,1984 +0,0 @@ - - -(function (definition) { - - Q = definition(); - -})(function () { -"use strict"; - -var hasStacks = false; -try { - throw new Error(); -} catch (e) { - hasStacks = !!e.stack; -} - -// All code after this point will be filtered from stack traces reported -// by Q. -var qStartingLine = captureLine(); -var qFileName; - -// shims - -// used for fallback in "allResolved" -var noop = function () {}; - -// Use the fastest possible means to execute a task in a future turn -// of the event loop. -var nextTick =(function () { - // linked list of tasks (single, with head node) - var head = {task: void 0, next: null}; - var tail = head; - var flushing = false; - var requestTick = void 0; - var isNodeJS = false; - // queue for late tasks, used by unhandled rejection tracking - var laterQueue = []; - - function flush() { - /* jshint loopfunc: true */ - var task, domain; - - while (head.next) { - head = head.next; - task = head.task; - head.task = void 0; - domain = head.domain; - - if (domain) { - head.domain = void 0; - domain.enter(); - } - runSingle(task, domain); - - } - while (laterQueue.length) { - task = laterQueue.pop(); - runSingle(task); - } - flushing = false; - } - // runs a single function in the async queue - function runSingle(task, domain) { - try { - task(); - - } catch (e) { - if (isNodeJS) { - // In node, uncaught exceptions are considered fatal errors. - // Re-throw them synchronously to interrupt flushing! - - // Ensure continuation if the uncaught exception is suppressed - // listening "uncaughtException" events (as domains does). - // Continue in next event to avoid tick recursion. - if (domain) { - domain.exit(); - } - //setTimeout(flush, 0); - flush(); - if (domain) { - domain.enter(); - } - - throw e; - - } else { - // In browsers, uncaught exceptions are not fatal. - // Re-throw them asynchronously to avoid slow-downs. - //setTimeout(function () { - throw e; - //}, 0); - } - } - - if (domain) { - domain.exit(); - } - } - - nextTick = function (task) { - tail = tail.next = { - task: task, - domain: isNodeJS && process.domain, - next: null - }; - - if (!flushing) { - flushing = true; - requestTick(); - } - }; - - if (typeof process === "object" && - process.toString() === "[object process]" && process.nextTick) { - // Ensure Q is in a real Node environment, with a `process.nextTick`. - // To see through fake Node environments: - // * Mocha test runner - exposes a `process` global without a `nextTick` - // * Browserify - exposes a `process.nexTick` function that uses - // `setTimeout`. In this case `setImmediate` is preferred because - // it is faster. Browserify's `process.toString()` yields - // "[object Object]", while in a real Node environment - // `process.nextTick()` yields "[object process]". - isNodeJS = true; - - requestTick = function () { - process.nextTick(flush); - }; - - } else if (typeof setImmediate === "function") { - // In IE10, Node.js 0.9+, or https://github.com/NobleJS/setImmediate - if (typeof window !== "undefined") { - requestTick = setImmediate.bind(window, flush); - } else { - requestTick = function () { - setImmediate(flush); - }; - } - - } else if (typeof MessageChannel !== "undefined") { - // modern browsers - // http://www.nonblocking.io/2011/06/windownexttick.html - var channel = new MessageChannel(); - // At least Safari Version 6.0.5 (8536.30.1) intermittently cannot create - // working message ports the first time a page loads. - channel.port1.onmessage = function () { - requestTick = requestPortTick; - channel.port1.onmessage = flush; - flush(); - }; - var requestPortTick = function () { - // Opera requires us to provide a message payload, regardless of - // whether we use it. - channel.port2.postMessage(0); - }; - requestTick = function () { - //setTimeout(flush, 0); - flush(); - requestPortTick(); - }; - - } else { - // old browsers - requestTick = function () { - // setTimeout(flush, 0); - flush(); - }; - } - // runs a task after all other tasks have been run - // this is useful for unhandled rejection tracking that needs to happen - // after all `then`d tasks have been run. - nextTick.runAfter = function (task) { - laterQueue.push(task); - if (!flushing) { - flushing = true; - requestTick(); - } - }; - return nextTick; -})(); - -// Attempt to make generics safe in the face of downstream -// modifications. -// There is no situation where this is necessary. -// If you need a security guarantee, these primordials need to be -// deeply frozen anyway, and if you don’t need a security guarantee, -// this is just plain paranoid. -// However, this **might** have the nice side-effect of reducing the size of -// the minified code by reducing x.call() to merely x() -// See Mark Miller’s explanation of what this does. -// http://wiki.ecmascript.org/doku.php?id=conventions:safe_meta_programming -var call = Function.call; -function uncurryThis(f) { - return function () { - return call.apply(f, arguments); - }; -} -// This is equivalent, but slower: -// uncurryThis = Function_bind.bind(Function_bind.call); -// http://jsperf.com/uncurrythis - -var array_slice = uncurryThis(Array.prototype.slice); - -var array_reduce = uncurryThis( - Array.prototype.reduce || function (callback, basis) { - var index = 0, - length = this.length; - // concerning the initial value, if one is not provided - if (arguments.length === 1) { - // seek to the first value in the array, accounting - // for the possibility that is is a sparse array - do { - if (index in this) { - basis = this[index++]; - break; - } - if (++index >= length) { - throw new TypeError(); - } - } while (1); - } - // reduce - for (; index < length; index++) { - // account for the possibility that the array is sparse - if (index in this) { - basis = callback(basis, this[index], index); - } - } - return basis; - } -); - -var array_indexOf = uncurryThis( - Array.prototype.indexOf || function (value) { - // not a very good shim, but good enough for our one use of it - for (var i = 0; i < this.length; i++) { - if (this[i] === value) { - return i; - } - } - return -1; - } -); - -var array_map = uncurryThis( - Array.prototype.map || function (callback, thisp) { - var self = this; - var collect = []; - array_reduce(self, function (undefined, value, index) { - collect.push(callback.call(thisp, value, index, self)); - }, void 0); - return collect; - } -); - -var object_create = Object.create || function (prototype) { - function Type() { } - Type.prototype = prototype; - return new Type(); -}; - -var object_hasOwnProperty = uncurryThis(Object.prototype.hasOwnProperty); - -var object_keys = Object.keys || function (object) { - var keys = []; - for (var key in object) { - if (object_hasOwnProperty(object, key)) { - keys.push(key); - } - } - return keys; -}; - -var object_toString = uncurryThis(Object.prototype.toString); - -function isObject(value) { - return value === Object(value); -} - -// generator related shims - -// FIXME: Remove this function once ES6 generators are in SpiderMonkey. -function isStopIteration(exception) { - return ( - object_toString(exception) === "[object StopIteration]" || - exception instanceof QReturnValue - ); -} - -// FIXME: Remove this helper and Q.return once ES6 generators are in -// SpiderMonkey. -var QReturnValue; -if (typeof ReturnValue !== "undefined") { - QReturnValue = ReturnValue; -} else { - QReturnValue = function (value) { - this.value = value; - }; -} - -// long stack traces - -var STACK_JUMP_SEPARATOR = "From previous event:"; - -function makeStackTraceLong(error, promise) { - // If possible, transform the error stack trace by removing Node and Q - // cruft, then concatenating with the stack trace of `promise`. See #57. - if (hasStacks && - promise.stack && - typeof error === "object" && - error !== null && - error.stack && - error.stack.indexOf(STACK_JUMP_SEPARATOR) === -1 - ) { - var stacks = []; - for (var p = promise; !!p; p = p.source) { - if (p.stack) { - stacks.unshift(p.stack); - } - } - stacks.unshift(error.stack); - - var concatedStacks = stacks.join("\n" + STACK_JUMP_SEPARATOR + "\n"); - error.stack = filterStackString(concatedStacks); - } -} - -function filterStackString(stackString) { - var lines = stackString.split("\n"); - var desiredLines = []; - for (var i = 0; i < lines.length; ++i) { - var line = lines[i]; - - if (!isInternalFrame(line) && !isNodeFrame(line) && line) { - desiredLines.push(line); - } - } - return desiredLines.join("\n"); -} - -function isNodeFrame(stackLine) { - return stackLine.indexOf("(module.js:") !== -1 || - stackLine.indexOf("(node.js:") !== -1; -} - -function getFileNameAndLineNumber(stackLine) { - // Named functions: "at functionName (filename:lineNumber:columnNumber)" - // In IE10 function name can have spaces ("Anonymous function") O_o - var attempt1 = /at .+ \((.+):(\d+):(?:\d+)\)$/.exec(stackLine); - if (attempt1) { - return [attempt1[1], Number(attempt1[2])]; - } - - // Anonymous functions: "at filename:lineNumber:columnNumber" - var attempt2 = /at ([^ ]+):(\d+):(?:\d+)$/.exec(stackLine); - if (attempt2) { - return [attempt2[1], Number(attempt2[2])]; - } - - // Firefox style: "function@filename:lineNumber or @filename:lineNumber" - var attempt3 = /.*@(.+):(\d+)$/.exec(stackLine); - if (attempt3) { - return [attempt3[1], Number(attempt3[2])]; - } -} - -function isInternalFrame(stackLine) { - var fileNameAndLineNumber = getFileNameAndLineNumber(stackLine); - - if (!fileNameAndLineNumber) { - return false; - } - - var fileName = fileNameAndLineNumber[0]; - var lineNumber = fileNameAndLineNumber[1]; - - return fileName === qFileName && - lineNumber >= qStartingLine && - lineNumber <= qEndingLine; -} - -// discover own file name and line number range for filtering stack -// traces -function captureLine() { - if (!hasStacks) { - return; - } - - try { - throw new Error(); - } catch (e) { - var lines = e.stack.split("\n"); - var firstLine = lines[0].indexOf("@") > 0 ? lines[1] : lines[2]; - var fileNameAndLineNumber = getFileNameAndLineNumber(firstLine); - if (!fileNameAndLineNumber) { - return; - } - - qFileName = fileNameAndLineNumber[0]; - return fileNameAndLineNumber[1]; - } -} - -function deprecate(callback, name, alternative) { - return function () { - if (typeof console !== "undefined" && - typeof console.warn === "function") { - console.warn(name + " is deprecated, use " + alternative + - " instead.", new Error("").stack); - } - return callback.apply(callback, arguments); - }; -} - -// end of shims -// beginning of real work - -/** - * Constructs a promise for an immediate reference, passes promises through, or - * coerces promises from different systems. - * @param value immediate reference or promise - */ -function Q(value) { - // If the object is already a Promise, return it directly. This enables - // the resolve function to both be used to created references from objects, - // but to tolerably coerce non-promises to promises. - if (value instanceof Promise) { - return value; - } - - // assimilate thenables - if (isPromiseAlike(value)) { - return coerce(value); - } else { - return fulfill(value); - } -} -Q.resolve = Q; - -/** - * Performs a task in a future turn of the event loop. - * @param {Function} task - */ -Q.nextTick = nextTick; - -/** - * Controls whether or not long stack traces will be on - */ -Q.longStackSupport = false; - -// enable long stacks if Q_DEBUG is set -if (typeof process === "object" && process && process.env && process.env.Q_DEBUG) { - Q.longStackSupport = true; -} - -/** - * Constructs a {promise, resolve, reject} object. - * - * `resolve` is a callback to invoke with a more resolved value for the - * promise. To fulfill the promise, invoke `resolve` with any value that is - * not a thenable. To reject the promise, invoke `resolve` with a rejected - * thenable, or invoke `reject` with the reason directly. To resolve the - * promise to another thenable, thus putting it in the same state, invoke - * `resolve` with that other thenable. - */ -Q.defer = defer; -function defer() { - // if "messages" is an "Array", that indicates that the promise has not yet - // been resolved. If it is "undefined", it has been resolved. Each - // element of the messages array is itself an array of complete arguments to - // forward to the resolved promise. We coerce the resolution value to a - // promise using the `resolve` function because it handles both fully - // non-thenable values and other thenables gracefully. - var messages = [], progressListeners = [], resolvedPromise; - - var deferred = object_create(defer.prototype); - var promise = object_create(Promise.prototype); - - promise.promiseDispatch = function (resolve, op, operands) { - var args = array_slice(arguments); - if (messages) { - messages.push(args); - if (op === "when" && operands[1]) { // progress operand - progressListeners.push(operands[1]); - } - } else { - Q.nextTick(function () { - resolvedPromise.promiseDispatch.apply(resolvedPromise, args); - }); - } - }; - - // XXX deprecated - promise.valueOf = function () { - if (messages) { - return promise; - } - var nearerValue = nearer(resolvedPromise); - if (isPromise(nearerValue)) { - resolvedPromise = nearerValue; // shorten chain - } - return nearerValue; - }; - - promise.inspect = function () { - if (!resolvedPromise) { - return { state: "pending" }; - } - return resolvedPromise.inspect(); - }; - - if (Q.longStackSupport && hasStacks) { - try { - throw new Error(); - } catch (e) { - // NOTE: don't try to use `Error.captureStackTrace` or transfer the - // accessor around; that causes memory leaks as per GH-111. Just - // reify the stack trace as a string ASAP. - // - // At the same time, cut off the first line; it's always just - // "[object Promise]\n", as per the `toString`. - promise.stack = e.stack.substring(e.stack.indexOf("\n") + 1); - } - } - - // NOTE: we do the checks for `resolvedPromise` in each method, instead of - // consolidating them into `become`, since otherwise we'd create new - // promises with the lines `become(whatever(value))`. See e.g. GH-252. - - function become(newPromise) { - resolvedPromise = newPromise; - promise.source = newPromise; - - array_reduce(messages, function (undefined, message) { - Q.nextTick(function () { - newPromise.promiseDispatch.apply(newPromise, message); - }); - }, void 0); - - messages = void 0; - progressListeners = void 0; - } - - deferred.promise = promise; - deferred.resolve = function (value) { - if (resolvedPromise) { - return; - } - - become(Q(value)); - }; - - deferred.fulfill = function (value) { - if (resolvedPromise) { - return; - } - - become(fulfill(value)); - }; - deferred.reject = function (reason) { - if (resolvedPromise) { - return; - } - - become(reject(reason)); - }; - deferred.notify = function (progress) { - if (resolvedPromise) { - return; - } - - array_reduce(progressListeners, function (undefined, progressListener) { - Q.nextTick(function () { - progressListener(progress); - }); - }, void 0); - }; - - return deferred; -} - -/** - * Creates a Node-style callback that will resolve or reject the deferred - * promise. - * @returns a nodeback - */ -defer.prototype.makeNodeResolver = function () { - var self = this; - return function (error, value) { - if (error) { - self.reject(error); - } else if (arguments.length > 2) { - self.resolve(array_slice(arguments, 1)); - } else { - self.resolve(value); - } - }; -}; - -/** - * @param resolver {Function} a function that returns nothing and accepts - * the resolve, reject, and notify functions for a deferred. - * @returns a promise that may be resolved with the given resolve and reject - * functions, or rejected by a thrown exception in resolver - */ -Q.Promise = promise; // ES6 -Q.promise = promise; -function promise(resolver) { - if (typeof resolver !== "function") { - throw new TypeError("resolver must be a function."); - } - var deferred = defer(); - try { - resolver(deferred.resolve, deferred.reject, deferred.notify); - } catch (reason) { - deferred.reject(reason); - } - return deferred.promise; -} - -promise.race = race; // ES6 -promise.all = all; // ES6 -promise.reject = reject; // ES6 -promise.resolve = Q; // ES6 - -// XXX experimental. This method is a way to denote that a local value is -// serializable and should be immediately dispatched to a remote upon request, -// instead of passing a reference. -Q.passByCopy = function (object) { - //freeze(object); - //passByCopies.set(object, true); - return object; -}; - -Promise.prototype.passByCopy = function () { - //freeze(object); - //passByCopies.set(object, true); - return this; -}; - -/** - * If two promises eventually fulfill to the same value, promises that value, - * but otherwise rejects. - * @param x {Any*} - * @param y {Any*} - * @returns {Any*} a promise for x and y if they are the same, but a rejection - * otherwise. - * - */ -Q.join = function (x, y) { - return Q(x).join(y); -}; - -Promise.prototype.join = function (that) { - return Q([this, that]).spread(function (x, y) { - if (x === y) { - // TODO: "===" should be Object.is or equiv - return x; - } else { - throw new Error("Q can't join: not the same: " + x + " " + y); - } - }); -}; - -/** - * Returns a promise for the first of an array of promises to become settled. - * @param answers {Array[Any*]} promises to race - * @returns {Any*} the first promise to be settled - */ -Q.race = race; -function race(answerPs) { - return promise(function (resolve, reject) { - // Switch to this once we can assume at least ES5 - // answerPs.forEach(function (answerP) { - // Q(answerP).then(resolve, reject); - // }); - // Use this in the meantime - for (var i = 0, len = answerPs.length; i < len; i++) { - Q(answerPs[i]).then(resolve, reject); - } - }); -} - -Promise.prototype.race = function () { - return this.then(Q.race); -}; - -/** - * Constructs a Promise with a promise descriptor object and optional fallback - * function. The descriptor contains methods like when(rejected), get(name), - * set(name, value), post(name, args), and delete(name), which all - * return either a value, a promise for a value, or a rejection. The fallback - * accepts the operation name, a resolver, and any further arguments that would - * have been forwarded to the appropriate method above had a method been - * provided with the proper name. The API makes no guarantees about the nature - * of the returned object, apart from that it is usable whereever promises are - * bought and sold. - */ -Q.makePromise = Promise; -function Promise(descriptor, fallback, inspect) { - if (fallback === void 0) { - fallback = function (op) { - return reject(new Error( - "Promise does not support operation: " + op - )); - }; - } - if (inspect === void 0) { - inspect = function () { - return {state: "unknown"}; - }; - } - - var promise = object_create(Promise.prototype); - - promise.promiseDispatch = function (resolve, op, args) { - var result; - try { - if (descriptor[op]) { - result = descriptor[op].apply(promise, args); - } else { - result = fallback.call(promise, op, args); - } - } catch (exception) { - result = reject(exception); - } - if (resolve) { - resolve(result); - } - }; - - promise.inspect = inspect; - - // XXX deprecated `valueOf` and `exception` support - if (inspect) { - var inspected = inspect(); - if (inspected.state === "rejected") { - promise.exception = inspected.reason; - } - - promise.valueOf = function () { - var inspected = inspect(); - if (inspected.state === "pending" || - inspected.state === "rejected") { - return promise; - } - return inspected.value; - }; - } - - return promise; -} - -Promise.prototype.toString = function () { - return "[object Promise]"; -}; - -Promise.prototype.then = function (fulfilled, rejected, progressed) { - var self = this; - var deferred = defer(); - var done = false; // ensure the untrusted promise makes at most a - // single call to one of the callbacks - - function _fulfilled(value) { - try { - return typeof fulfilled === "function" ? fulfilled(value) : value; - } catch (exception) { - return reject(exception); - } - } - - function _rejected(exception) { - if (typeof rejected === "function") { - makeStackTraceLong(exception, self); - try { - return rejected(exception); - } catch (newException) { - return reject(newException); - } - } - return reject(exception); - } - - function _progressed(value) { - return typeof progressed === "function" ? progressed(value) : value; - } - - Q.nextTick(function () { - self.promiseDispatch(function (value) { - if (done) { - return; - } - done = true; - - deferred.resolve(_fulfilled(value)); - }, "when", [function (exception) { - if (done) { - return; - } - done = true; - - deferred.resolve(_rejected(exception)); - }]); - }); - - // Progress propagator need to be attached in the current tick. - self.promiseDispatch(void 0, "when", [void 0, function (value) { - var newValue; - var threw = false; - try { - newValue = _progressed(value); - } catch (e) { - threw = true; - if (Q.onerror) { - Q.onerror(e); - } else { - throw e; - } - } - - if (!threw) { - deferred.notify(newValue); - } - }]); - - return deferred.promise; -}; - -Q.tap = function (promise, callback) { - return Q(promise).tap(callback); -}; - -/** - * Works almost like "finally", but not called for rejections. - * Original resolution value is passed through callback unaffected. - * Callback may return a promise that will be awaited for. - * @param {Function} callback - * @returns {Q.Promise} - * @example - * doSomething() - * .then(...) - * .tap(console.log) - * .then(...); - */ -Promise.prototype.tap = function (callback) { - callback = Q(callback); - - return this.then(function (value) { - return callback.fcall(value).thenResolve(value); - }); -}; - -/** - * Registers an observer on a promise. - * - * Guarantees: - * - * 1. that fulfilled and rejected will be called only once. - * 2. that either the fulfilled callback or the rejected callback will be - * called, but not both. - * 3. that fulfilled and rejected will not be called in this turn. - * - * @param value promise or immediate reference to observe - * @param fulfilled function to be called with the fulfilled value - * @param rejected function to be called with the rejection exception - * @param progressed function to be called on any progress notifications - * @return promise for the return value from the invoked callback - */ -Q.when = when; -function when(value, fulfilled, rejected, progressed) { - return Q(value).then(fulfilled, rejected, progressed); -} - -Promise.prototype.thenResolve = function (value) { - return this.then(function () { return value; }); -}; - -Q.thenResolve = function (promise, value) { - return Q(promise).thenResolve(value); -}; - -Promise.prototype.thenReject = function (reason) { - return this.then(function () { throw reason; }); -}; - -Q.thenReject = function (promise, reason) { - return Q(promise).thenReject(reason); -}; - -/** - * If an object is not a promise, it is as "near" as possible. - * If a promise is rejected, it is as "near" as possible too. - * If it’s a fulfilled promise, the fulfillment value is nearer. - * If it’s a deferred promise and the deferred has been resolved, the - * resolution is "nearer". - * @param object - * @returns most resolved (nearest) form of the object - */ - -// XXX should we re-do this? -Q.nearer = nearer; -function nearer(value) { - if (isPromise(value)) { - var inspected = value.inspect(); - if (inspected.state === "fulfilled") { - return inspected.value; - } - } - return value; -} - -/** - * @returns whether the given object is a promise. - * Otherwise it is a fulfilled value. - */ -Q.isPromise = isPromise; -function isPromise(object) { - return object instanceof Promise; -} - -Q.isPromiseAlike = isPromiseAlike; -function isPromiseAlike(object) { - return isObject(object) && typeof object.then === "function"; -} - -/** - * @returns whether the given object is a pending promise, meaning not - * fulfilled or rejected. - */ -Q.isPending = isPending; -function isPending(object) { - return isPromise(object) && object.inspect().state === "pending"; -} - -Promise.prototype.isPending = function () { - return this.inspect().state === "pending"; -}; - -/** - * @returns whether the given object is a value or fulfilled - * promise. - */ -Q.isFulfilled = isFulfilled; -function isFulfilled(object) { - return !isPromise(object) || object.inspect().state === "fulfilled"; -} - -Promise.prototype.isFulfilled = function () { - return this.inspect().state === "fulfilled"; -}; - -/** - * @returns whether the given object is a rejected promise. - */ -Q.isRejected = isRejected; -function isRejected(object) { - return isPromise(object) && object.inspect().state === "rejected"; -} - -Promise.prototype.isRejected = function () { - return this.inspect().state === "rejected"; -}; - -//// BEGIN UNHANDLED REJECTION TRACKING - -// This promise library consumes exceptions thrown in handlers so they can be -// handled by a subsequent promise. The exceptions get added to this array when -// they are created, and removed when they are handled. Note that in ES6 or -// shimmed environments, this would naturally be a `Set`. -var unhandledReasons = []; -var unhandledRejections = []; -var reportedUnhandledRejections = []; -var trackUnhandledRejections = true; - -function resetUnhandledRejections() { - unhandledReasons.length = 0; - unhandledRejections.length = 0; - - if (!trackUnhandledRejections) { - trackUnhandledRejections = true; - } -} - -function trackRejection(promise, reason) { - if (!trackUnhandledRejections) { - return; - } - if (typeof process === "object" && typeof process.emit === "function") { - Q.nextTick.runAfter(function () { - if (array_indexOf(unhandledRejections, promise) !== -1) { - process.emit("unhandledRejection", reason, promise); - reportedUnhandledRejections.push(promise); - } - }); - } - - unhandledRejections.push(promise); - if (reason && typeof reason.stack !== "undefined") { - unhandledReasons.push(reason.stack); - } else { - unhandledReasons.push("(no stack) " + reason); - } -} - -function untrackRejection(promise) { - if (!trackUnhandledRejections) { - return; - } - - var at = array_indexOf(unhandledRejections, promise); - if (at !== -1) { - if (typeof process === "object" && typeof process.emit === "function") { - Q.nextTick.runAfter(function () { - var atReport = array_indexOf(reportedUnhandledRejections, promise); - if (atReport !== -1) { - process.emit("rejectionHandled", unhandledReasons[at], promise); - reportedUnhandledRejections.splice(atReport, 1); - } - }); - } - unhandledRejections.splice(at, 1); - unhandledReasons.splice(at, 1); - } -} - -Q.resetUnhandledRejections = resetUnhandledRejections; - -Q.getUnhandledReasons = function () { - // Make a copy so that consumers can't interfere with our internal state. - return unhandledReasons.slice(); -}; - -Q.stopUnhandledRejectionTracking = function () { - resetUnhandledRejections(); - trackUnhandledRejections = false; -}; - -resetUnhandledRejections(); - -//// END UNHANDLED REJECTION TRACKING - -/** - * Constructs a rejected promise. - * @param reason value describing the failure - */ -Q.reject = reject; -function reject(reason) { - var rejection = Promise({ - "when": function (rejected) { - // note that the error has been handled - if (rejected) { - untrackRejection(this); - } - return rejected ? rejected(reason) : this; - } - }, function fallback() { - return this; - }, function inspect() { - return { state: "rejected", reason: reason }; - }); - - // Note that the reason has not been handled. - trackRejection(rejection, reason); - - return rejection; -} - -/** - * Constructs a fulfilled promise for an immediate reference. - * @param value immediate reference - */ -Q.fulfill = fulfill; -function fulfill(value) { - return Promise({ - "when": function () { - return value; - }, - "get": function (name) { - return value[name]; - }, - "set": function (name, rhs) { - value[name] = rhs; - }, - "delete": function (name) { - delete value[name]; - }, - "post": function (name, args) { - // Mark Miller proposes that post with no name should apply a - // promised function. - if (name === null || name === void 0) { - return value.apply(void 0, args); - } else { - return value[name].apply(value, args); - } - }, - "apply": function (thisp, args) { - return value.apply(thisp, args); - }, - "keys": function () { - return object_keys(value); - } - }, void 0, function inspect() { - return { state: "fulfilled", value: value }; - }); -} - -/** - * Converts thenables to Q promises. - * @param promise thenable promise - * @returns a Q promise - */ -function coerce(promise) { - var deferred = defer(); - Q.nextTick(function () { - try { - promise.then(deferred.resolve, deferred.reject, deferred.notify); - } catch (exception) { - deferred.reject(exception); - } - }); - return deferred.promise; -} - -/** - * Annotates an object such that it will never be - * transferred away from this process over any promise - * communication channel. - * @param object - * @returns promise a wrapping of that object that - * additionally responds to the "isDef" message - * without a rejection. - */ -Q.master = master; -function master(object) { - return Promise({ - "isDef": function () {} - }, function fallback(op, args) { - return dispatch(object, op, args); - }, function () { - return Q(object).inspect(); - }); -} - -/** - * Spreads the values of a promised array of arguments into the - * fulfillment callback. - * @param fulfilled callback that receives variadic arguments from the - * promised array - * @param rejected callback that receives the exception if the promise - * is rejected. - * @returns a promise for the return value or thrown exception of - * either callback. - */ -Q.spread = spread; -function spread(value, fulfilled, rejected) { - return Q(value).spread(fulfilled, rejected); -} - -Promise.prototype.spread = function (fulfilled, rejected) { - return this.all().then(function (array) { - return fulfilled.apply(void 0, array); - }, rejected); -}; - -/** - * The async function is a decorator for generator functions, turning - * them into asynchronous generators. Although generators are only part - * of the newest ECMAScript 6 drafts, this code does not cause syntax - * errors in older engines. This code should continue to work and will - * in fact improve over time as the language improves. - * - * ES6 generators are currently part of V8 version 3.19 with the - * --harmony-generators runtime flag enabled. SpiderMonkey has had them - * for longer, but under an older Python-inspired form. This function - * works on both kinds of generators. - * - * Decorates a generator function such that: - * - it may yield promises - * - execution will continue when that promise is fulfilled - * - the value of the yield expression will be the fulfilled value - * - it returns a promise for the return value (when the generator - * stops iterating) - * - the decorated function returns a promise for the return value - * of the generator or the first rejected promise among those - * yielded. - * - if an error is thrown in the generator, it propagates through - * every following yield until it is caught, or until it escapes - * the generator function altogether, and is translated into a - * rejection for the promise returned by the decorated generator. - */ -Q.async = async; -function async(makeGenerator) { - return function () { - // when verb is "send", arg is a value - // when verb is "throw", arg is an exception - function continuer(verb, arg) { - var result; - - // Until V8 3.19 / Chromium 29 is released, SpiderMonkey is the only - // engine that has a deployed base of browsers that support generators. - // However, SM's generators use the Python-inspired semantics of - // outdated ES6 drafts. We would like to support ES6, but we'd also - // like to make it possible to use generators in deployed browsers, so - // we also support Python-style generators. At some point we can remove - // this block. - - if (typeof StopIteration === "undefined") { - // ES6 Generators - try { - result = generator[verb](arg); - } catch (exception) { - return reject(exception); - } - if (result.done) { - return Q(result.value); - } else { - return when(result.value, callback, errback); - } - } else { - // SpiderMonkey Generators - // FIXME: Remove this case when SM does ES6 generators. - try { - result = generator[verb](arg); - } catch (exception) { - if (isStopIteration(exception)) { - return Q(exception.value); - } else { - return reject(exception); - } - } - return when(result, callback, errback); - } - } - var generator = makeGenerator.apply(this, arguments); - var callback = continuer.bind(continuer, "next"); - var errback = continuer.bind(continuer, "throw"); - return callback(); - }; -} - -/** - * The spawn function is a small wrapper around async that immediately - * calls the generator and also ends the promise chain, so that any - * unhandled errors are thrown instead of forwarded to the error - * handler. This is useful because it's extremely common to run - * generators at the top-level to work with libraries. - */ -Q.spawn = spawn; -function spawn(makeGenerator) { - Q.done(Q.async(makeGenerator)()); -} - -// FIXME: Remove this interface once ES6 generators are in SpiderMonkey. -/** - * Throws a ReturnValue exception to stop an asynchronous generator. - * - * This interface is a stop-gap measure to support generator return - * values in older Firefox/SpiderMonkey. In browsers that support ES6 - * generators like Chromium 29, just use "return" in your generator - * functions. - * - * @param value the return value for the surrounding generator - * @throws ReturnValue exception with the value. - * @example - * // ES6 style - * Q.async(function* () { - * var foo = yield getFooPromise(); - * var bar = yield getBarPromise(); - * return foo + bar; - * }) - * // Older SpiderMonkey style - * Q.async(function () { - * var foo = yield getFooPromise(); - * var bar = yield getBarPromise(); - * Q.return(foo + bar); - * }) - */ -Q["return"] = _return; -function _return(value) { - throw new QReturnValue(value); -} - -/** - * The promised function decorator ensures that any promise arguments - * are settled and passed as values (`this` is also settled and passed - * as a value). It will also ensure that the result of a function is - * always a promise. - * - * @example - * var add = Q.promised(function (a, b) { - * return a + b; - * }); - * add(Q(a), Q(B)); - * - * @param {function} callback The function to decorate - * @returns {function} a function that has been decorated. - */ -Q.promised = promised; -function promised(callback) { - return function () { - return spread([this, all(arguments)], function (self, args) { - return callback.apply(self, args); - }); - }; -} - -/** - * sends a message to a value in a future turn - * @param object* the recipient - * @param op the name of the message operation, e.g., "when", - * @param args further arguments to be forwarded to the operation - * @returns result {Promise} a promise for the result of the operation - */ -Q.dispatch = dispatch; -function dispatch(object, op, args) { - return Q(object).dispatch(op, args); -} - -Promise.prototype.dispatch = function (op, args) { - var self = this; - var deferred = defer(); - Q.nextTick(function () { - self.promiseDispatch(deferred.resolve, op, args); - }); - return deferred.promise; -}; - -/** - * Gets the value of a property in a future turn. - * @param object promise or immediate reference for target object - * @param name name of property to get - * @return promise for the property value - */ -Q.get = function (object, key) { - return Q(object).dispatch("get", [key]); -}; - -Promise.prototype.get = function (key) { - return this.dispatch("get", [key]); -}; - -/** - * Sets the value of a property in a future turn. - * @param object promise or immediate reference for object object - * @param name name of property to set - * @param value new value of property - * @return promise for the return value - */ -Q.set = function (object, key, value) { - return Q(object).dispatch("set", [key, value]); -}; - -Promise.prototype.set = function (key, value) { - return this.dispatch("set", [key, value]); -}; - -/** - * Deletes a property in a future turn. - * @param object promise or immediate reference for target object - * @param name name of property to delete - * @return promise for the return value - */ -Q.del = // XXX legacy -Q["delete"] = function (object, key) { - return Q(object).dispatch("delete", [key]); -}; - -Promise.prototype.del = // XXX legacy -Promise.prototype["delete"] = function (key) { - return this.dispatch("delete", [key]); -}; - -/** - * Invokes a method in a future turn. - * @param object promise or immediate reference for target object - * @param name name of method to invoke - * @param value a value to post, typically an array of - * invocation arguments for promises that - * are ultimately backed with `resolve` values, - * as opposed to those backed with URLs - * wherein the posted value can be any - * JSON serializable object. - * @return promise for the return value - */ -// bound locally because it is used by other methods -Q.mapply = // XXX As proposed by "Redsandro" -Q.post = function (object, name, args) { - return Q(object).dispatch("post", [name, args]); -}; - -Promise.prototype.mapply = // XXX As proposed by "Redsandro" -Promise.prototype.post = function (name, args) { - return this.dispatch("post", [name, args]); -}; - -/** - * Invokes a method in a future turn. - * @param object promise or immediate reference for target object - * @param name name of method to invoke - * @param ...args array of invocation arguments - * @return promise for the return value - */ -Q.send = // XXX Mark Miller's proposed parlance -Q.mcall = // XXX As proposed by "Redsandro" -Q.invoke = function (object, name /*...args*/) { - return Q(object).dispatch("post", [name, array_slice(arguments, 2)]); -}; - -Promise.prototype.send = // XXX Mark Miller's proposed parlance -Promise.prototype.mcall = // XXX As proposed by "Redsandro" -Promise.prototype.invoke = function (name /*...args*/) { - return this.dispatch("post", [name, array_slice(arguments, 1)]); -}; - -/** - * Applies the promised function in a future turn. - * @param object promise or immediate reference for target function - * @param args array of application arguments - */ -Q.fapply = function (object, args) { - return Q(object).dispatch("apply", [void 0, args]); -}; - -Promise.prototype.fapply = function (args) { - return this.dispatch("apply", [void 0, args]); -}; - -/** - * Calls the promised function in a future turn. - * @param object promise or immediate reference for target function - * @param ...args array of application arguments - */ -Q["try"] = -Q.fcall = function (object /* ...args*/) { - return Q(object).dispatch("apply", [void 0, array_slice(arguments, 1)]); -}; - -Promise.prototype.fcall = function (/*...args*/) { - return this.dispatch("apply", [void 0, array_slice(arguments)]); -}; - -/** - * Binds the promised function, transforming return values into a fulfilled - * promise and thrown errors into a rejected one. - * @param object promise or immediate reference for target function - * @param ...args array of application arguments - */ -Q.fbind = function (object /*...args*/) { - var promise = Q(object); - var args = array_slice(arguments, 1); - return function fbound() { - return promise.dispatch("apply", [ - this, - args.concat(array_slice(arguments)) - ]); - }; -}; -Promise.prototype.fbind = function (/*...args*/) { - var promise = this; - var args = array_slice(arguments); - return function fbound() { - return promise.dispatch("apply", [ - this, - args.concat(array_slice(arguments)) - ]); - }; -}; - -/** - * Requests the names of the owned properties of a promised - * object in a future turn. - * @param object promise or immediate reference for target object - * @return promise for the keys of the eventually settled object - */ -Q.keys = function (object) { - return Q(object).dispatch("keys", []); -}; - -Promise.prototype.keys = function () { - return this.dispatch("keys", []); -}; - -/** - * Turns an array of promises into a promise for an array. If any of - * the promises gets rejected, the whole array is rejected immediately. - * @param {Array*} an array (or promise for an array) of values (or - * promises for values) - * @returns a promise for an array of the corresponding values - */ -// By Mark Miller -// http://wiki.ecmascript.org/doku.php?id=strawman:concurrency&rev=1308776521#allfulfilled -Q.all = all; -function all(promises) { - return when(promises, function (promises) { - var pendingCount = 0; - var deferred = defer(); - array_reduce(promises, function (undefined, promise, index) { - var snapshot; - if ( - isPromise(promise) && - (snapshot = promise.inspect()).state === "fulfilled" - ) { - promises[index] = snapshot.value; - } else { - ++pendingCount; - when( - promise, - function (value) { - promises[index] = value; - if (--pendingCount === 0) { - deferred.resolve(promises); - } - }, - deferred.reject, - function (progress) { - deferred.notify({ index: index, value: progress }); - } - ); - } - }, void 0); - if (pendingCount === 0) { - deferred.resolve(promises); - } - return deferred.promise; - }); -} - -Promise.prototype.all = function () { - return all(this); -}; - -/** - * Returns the first resolved promise of an array. Prior rejected promises are - * ignored. Rejects only if all promises are rejected. - * @param {Array*} an array containing values or promises for values - * @returns a promise fulfilled with the value of the first resolved promise, - * or a rejected promise if all promises are rejected. - */ -Q.any = any; - -function any(promises) { - if (promises.length === 0) { - return Q.resolve(); - } - - var deferred = Q.defer(); - var pendingCount = 0; - array_reduce(promises, function (prev, current, index) { - var promise = promises[index]; - - pendingCount++; - - when(promise, onFulfilled, onRejected, onProgress); - function onFulfilled(result) { - deferred.resolve(result); - } - function onRejected(err) { - pendingCount--; - if (pendingCount === 0) { - err.message = ("Q can't get fulfillment value from any promise, all " + - "promises were rejected. Last error message: " + err.message); - deferred.reject(err); - } - } - function onProgress(progress) { - deferred.notify({ - index: index, - value: progress - }); - } - }, undefined); - - return deferred.promise; -} - -Promise.prototype.any = function () { - return any(this); -}; - -/** - * Waits for all promises to be settled, either fulfilled or - * rejected. This is distinct from `all` since that would stop - * waiting at the first rejection. The promise returned by - * `allResolved` will never be rejected. - * @param promises a promise for an array (or an array) of promises - * (or values) - * @return a promise for an array of promises - */ -Q.allResolved = deprecate(allResolved, "allResolved", "allSettled"); -function allResolved(promises) { - return when(promises, function (promises) { - promises = array_map(promises, Q); - return when(all(array_map(promises, function (promise) { - return when(promise, noop, noop); - })), function () { - return promises; - }); - }); -} - -Promise.prototype.allResolved = function () { - return allResolved(this); -}; - -/** - * @see Promise#allSettled - */ -Q.allSettled = allSettled; -function allSettled(promises) { - return Q(promises).allSettled(); -} - -/** - * Turns an array of promises into a promise for an array of their states (as - * returned by `inspect`) when they have all settled. - * @param {Array[Any*]} values an array (or promise for an array) of values (or - * promises for values) - * @returns {Array[State]} an array of states for the respective values. - */ -Promise.prototype.allSettled = function () { - return this.then(function (promises) { - return all(array_map(promises, function (promise) { - promise = Q(promise); - function regardless() { - return promise.inspect(); - } - return promise.then(regardless, regardless); - })); - }); -}; - -/** - * Captures the failure of a promise, giving an oportunity to recover - * with a callback. If the given promise is fulfilled, the returned - * promise is fulfilled. - * @param {Any*} promise for something - * @param {Function} callback to fulfill the returned promise if the - * given promise is rejected - * @returns a promise for the return value of the callback - */ -Q.fail = // XXX legacy -Q["catch"] = function (object, rejected) { - return Q(object).then(void 0, rejected); -}; - -Promise.prototype.fail = // XXX legacy -Promise.prototype["catch"] = function (rejected) { - return this.then(void 0, rejected); -}; - -/** - * Attaches a listener that can respond to progress notifications from a - * promise's originating deferred. This listener receives the exact arguments - * passed to ``deferred.notify``. - * @param {Any*} promise for something - * @param {Function} callback to receive any progress notifications - * @returns the given promise, unchanged - */ -Q.progress = progress; -function progress(object, progressed) { - return Q(object).then(void 0, void 0, progressed); -} - -Promise.prototype.progress = function (progressed) { - return this.then(void 0, void 0, progressed); -}; - -/** - * Provides an opportunity to observe the settling of a promise, - * regardless of whether the promise is fulfilled or rejected. Forwards - * the resolution to the returned promise when the callback is done. - * The callback can return a promise to defer completion. - * @param {Any*} promise - * @param {Function} callback to observe the resolution of the given - * promise, takes no arguments. - * @returns a promise for the resolution of the given promise when - * ``fin`` is done. - */ -Q.fin = // XXX legacy -Q["finally"] = function (object, callback) { - return Q(object)["finally"](callback); -}; - -Promise.prototype.fin = // XXX legacy -Promise.prototype["finally"] = function (callback) { - if (!callback || typeof callback.apply !== "function") { - throw new Error("Q can't apply finally callback"); - } - callback = Q(callback); - return this.then(function (value) { - return callback.fcall().then(function () { - return value; - }); - }, function (reason) { - // TODO attempt to recycle the rejection with "this". - return callback.fcall().then(function () { - throw reason; - }); - }); -}; - -/** - * Terminates a chain of promises, forcing rejections to be - * thrown as exceptions. - * @param {Any*} promise at the end of a chain of promises - * @returns nothing - */ -Q.done = function (object, fulfilled, rejected, progress) { - return Q(object).done(fulfilled, rejected, progress); -}; - -Promise.prototype.done = function (fulfilled, rejected, progress) { - var onUnhandledError = function (error) { - // forward to a future turn so that ``when`` - // does not catch it and turn it into a rejection. - Q.nextTick(function () { - makeStackTraceLong(error, promise); - if (Q.onerror) { - Q.onerror(error); - } else { - throw error; - } - }); - }; - - // Avoid unnecessary `nextTick`ing via an unnecessary `when`. - var promise = fulfilled || rejected || progress ? - this.then(fulfilled, rejected, progress) : - this; - - if (typeof process === "object" && process && process.domain) { - onUnhandledError = process.domain.bind(onUnhandledError); - } - - promise.then(void 0, onUnhandledError); -}; - -/** - * Causes a promise to be rejected if it does not get fulfilled before - * some milliseconds time out. - * @param {Any*} promise - * @param {Number} milliseconds timeout - * @param {Any*} custom error message or Error object (optional) - * @returns a promise for the resolution of the given promise if it is - * fulfilled before the timeout, otherwise rejected. - */ -Q.timeout = function (object, ms, error) { - return Q(object).timeout(ms, error); -}; - -Promise.prototype.timeout = function (ms, error) { - var deferred = defer(); - var timeoutId = setTimeout(function () { - if (!error || "string" === typeof error) { - error = new Error(error || "Timed out after " + ms + " ms"); - error.code = "ETIMEDOUT"; - } - deferred.reject(error); - }, ms); - - this.then(function (value) { - clearTimeout(timeoutId); - deferred.resolve(value); - }, function (exception) { - clearTimeout(timeoutId); - deferred.reject(exception); - }, deferred.notify); - - return deferred.promise; -}; - -/** - * Returns a promise for the given value (or promised value), some - * milliseconds after it resolved. Passes rejections immediately. - * @param {Any*} promise - * @param {Number} milliseconds - * @returns a promise for the resolution of the given promise after milliseconds - * time has elapsed since the resolution of the given promise. - * If the given promise rejects, that is passed immediately. - */ -Q.delay = function (object, timeout) { - if (timeout === void 0) { - timeout = object; - object = void 0; - } - return Q(object).delay(timeout); -}; - -Promise.prototype.delay = function (timeout) { - return this.then(function (value) { - var deferred = defer(); - setTimeout(function () { - deferred.resolve(value); - }, timeout); - return deferred.promise; - }); -}; - -/** - * Passes a continuation to a Node function, which is called with the given - * arguments provided as an array, and returns a promise. - * - * Q.nfapply(FS.readFile, [__filename]) - * .then(function (content) { - * }) - * - */ -Q.nfapply = function (callback, args) { - return Q(callback).nfapply(args); -}; - -Promise.prototype.nfapply = function (args) { - var deferred = defer(); - var nodeArgs = array_slice(args); - nodeArgs.push(deferred.makeNodeResolver()); - this.fapply(nodeArgs).fail(deferred.reject); - return deferred.promise; -}; - -/** - * Passes a continuation to a Node function, which is called with the given - * arguments provided individually, and returns a promise. - * @example - * Q.nfcall(FS.readFile, __filename) - * .then(function (content) { - * }) - * - */ -Q.nfcall = function (callback /*...args*/) { - var args = array_slice(arguments, 1); - return Q(callback).nfapply(args); -}; - -Promise.prototype.nfcall = function (/*...args*/) { - var nodeArgs = array_slice(arguments); - var deferred = defer(); - nodeArgs.push(deferred.makeNodeResolver()); - this.fapply(nodeArgs).fail(deferred.reject); - return deferred.promise; -}; - -/** - * Wraps a NodeJS continuation passing function and returns an equivalent - * version that returns a promise. - * @example - * Q.nfbind(FS.readFile, __filename)("utf-8") - * .then(console.log) - * .done() - */ -Q.nfbind = -Q.denodeify = function (callback /*...args*/) { - if (callback === undefined) { - throw new Error("Q can't wrap an undefined function"); - } - var baseArgs = array_slice(arguments, 1); - return function () { - var nodeArgs = baseArgs.concat(array_slice(arguments)); - var deferred = defer(); - nodeArgs.push(deferred.makeNodeResolver()); - Q(callback).fapply(nodeArgs).fail(deferred.reject); - return deferred.promise; - }; -}; - -Promise.prototype.nfbind = -Promise.prototype.denodeify = function (/*...args*/) { - var args = array_slice(arguments); - args.unshift(this); - return Q.denodeify.apply(void 0, args); -}; - -Q.nbind = function (callback, thisp /*...args*/) { - var baseArgs = array_slice(arguments, 2); - return function () { - var nodeArgs = baseArgs.concat(array_slice(arguments)); - var deferred = defer(); - nodeArgs.push(deferred.makeNodeResolver()); - function bound() { - return callback.apply(thisp, arguments); - } - Q(bound).fapply(nodeArgs).fail(deferred.reject); - return deferred.promise; - }; -}; - -Promise.prototype.nbind = function (/*thisp, ...args*/) { - var args = array_slice(arguments, 0); - args.unshift(this); - return Q.nbind.apply(void 0, args); -}; - -/** - * Calls a method of a Node-style object that accepts a Node-style - * callback with a given array of arguments, plus a provided callback. - * @param object an object that has the named method - * @param {String} name name of the method of object - * @param {Array} args arguments to pass to the method; the callback - * will be provided by Q and appended to these arguments. - * @returns a promise for the value or error - */ -Q.nmapply = // XXX As proposed by "Redsandro" -Q.npost = function (object, name, args) { - return Q(object).npost(name, args); -}; - -Promise.prototype.nmapply = // XXX As proposed by "Redsandro" -Promise.prototype.npost = function (name, args) { - var nodeArgs = array_slice(args || []); - var deferred = defer(); - nodeArgs.push(deferred.makeNodeResolver()); - this.dispatch("post", [name, nodeArgs]).fail(deferred.reject); - return deferred.promise; -}; - -/** - * Calls a method of a Node-style object that accepts a Node-style - * callback, forwarding the given variadic arguments, plus a provided - * callback argument. - * @param object an object that has the named method - * @param {String} name name of the method of object - * @param ...args arguments to pass to the method; the callback will - * be provided by Q and appended to these arguments. - * @returns a promise for the value or error - */ -Q.nsend = // XXX Based on Mark Miller's proposed "send" -Q.nmcall = // XXX Based on "Redsandro's" proposal -Q.ninvoke = function (object, name /*...args*/) { - var nodeArgs = array_slice(arguments, 2); - var deferred = defer(); - nodeArgs.push(deferred.makeNodeResolver()); - Q(object).dispatch("post", [name, nodeArgs]).fail(deferred.reject); - return deferred.promise; -}; - -Promise.prototype.nsend = // XXX Based on Mark Miller's proposed "send" -Promise.prototype.nmcall = // XXX Based on "Redsandro's" proposal -Promise.prototype.ninvoke = function (name /*...args*/) { - var nodeArgs = array_slice(arguments, 1); - var deferred = defer(); - nodeArgs.push(deferred.makeNodeResolver()); - this.dispatch("post", [name, nodeArgs]).fail(deferred.reject); - return deferred.promise; -}; - -/** - * If a function would like to support both Node continuation-passing-style and - * promise-returning-style, it can end its internal promise chain with - * `nodeify(nodeback)`, forwarding the optional nodeback argument. If the user - * elects to use a nodeback, the result will be sent there. If they do not - * pass a nodeback, they will receive the result promise. - * @param object a result (or a promise for a result) - * @param {Function} nodeback a Node.js-style callback - * @returns either the promise or nothing - */ -Q.nodeify = nodeify; -function nodeify(object, nodeback) { - return Q(object).nodeify(nodeback); -} - -Promise.prototype.nodeify = function (nodeback) { - if (nodeback) { - this.then(function (value) { - Q.nextTick(function () { - nodeback(null, value); - }); - }, function (error) { - Q.nextTick(function () { - nodeback(error); - }); - }); - } else { - return this; - } -}; - -Q.noConflict = function() { - throw new Error("Q.noConflict only works when Q is used as a global"); -}; - -// All code before this point will be filtered from stack traces. -var qEndingLine = captureLine(); - -return Q; - -}); \ No newline at end of file diff --git a/Library q for promises/readme.md b/Library q for promises/readme.md deleted file mode 100644 index cb5d24a..0000000 --- a/Library q for promises/readme.md +++ /dev/null @@ -1,27 +0,0 @@ -This qLib is a modified version of the nodeJS package https://www.npmjs.com/package/q - -Simply import this as a library into your Novi system -Require the qLib in the service of your choice -Begin using q as normal - -Ex: - -``` - var deferred = Q.defer(); - - request.get(options, function(err,resp){ - if(err){ - //the error is a JSON value of the error in question, shaped like {"error":"message"} - deferred.reject(new Error("Status code was " + JSON.stringify(err))); - }else{ - //resp is JSON of the response - deferred.resolve(resp); - } - } ); - - return deferred.promise; -``` - -Note: only modifications from original library include - removal of unneeded environment recongition code during entry - removal of calls to setTimeouts (not honored in Novi). These calls are unnecessary in Novi as they are only hacks to help performance in NodeJS \ No newline at end of file diff --git a/Library q for promises/service/qExample.js b/Library q for promises/service/qExample.js deleted file mode 100644 index 325ea7e..0000000 --- a/Library q for promises/service/qExample.js +++ /dev/null @@ -1,31 +0,0 @@ -function qTest(req, resp){ - - function requestAPage() { - var request = Requests(); - var options = { - "uri":"https://www.google.com", - } - var deferred = Q.defer(); - - request.get(options, function(err,resp){ - if(err){ - //the error is a JSON value of the error in question, shaped like {"error":"message"} - deferred.reject(new Error("Status code was " + JSON.stringify(err))); - }else{ - //resp is JSON of the response - deferred.resolve(resp); - } - } ); - - return deferred.promise; - } - - - requestAPage() - .then(function (value) { - resp.success("promise was successful with value:"+value); - }, function (reason) { - resp.failure("promside failed because: "+reason); - } - ); -} \ No newline at end of file From 656713a7c0bd45c7c2a82a77a2cf6ca573d4c3fb Mon Sep 17 00:00:00 2001 From: rreinold Date: Mon, 12 Mar 2018 12:35:17 -0500 Subject: [PATCH 22/27] removed readme --- Library q for promises/Readme.md | 3 --- Library q for promises/readme.md | 3 --- 2 files changed, 6 deletions(-) delete mode 100644 Library q for promises/Readme.md delete mode 100644 Library q for promises/readme.md diff --git a/Library q for promises/Readme.md b/Library q for promises/Readme.md deleted file mode 100644 index 4c08dbb..0000000 --- a/Library q for promises/Readme.md +++ /dev/null @@ -1,3 +0,0 @@ -# Note - -Pattern has moved: https://ipm.clearblade.com \ No newline at end of file diff --git a/Library q for promises/readme.md b/Library q for promises/readme.md deleted file mode 100644 index 79fed04..0000000 --- a/Library q for promises/readme.md +++ /dev/null @@ -1,3 +0,0 @@ -# Note - -Pattern has moved: https://ipm.clearblade.com From 83f15de5220312165b0076d177c404e47b1580e2 Mon Sep 17 00:00:00 2001 From: rreinold Date: Mon, 12 Mar 2018 12:36:01 -0500 Subject: [PATCH 23/27] fixed Readme --- Library q for promises/Readme.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 Library q for promises/Readme.md diff --git a/Library q for promises/Readme.md b/Library q for promises/Readme.md new file mode 100644 index 0000000..79fed04 --- /dev/null +++ b/Library q for promises/Readme.md @@ -0,0 +1,3 @@ +# Note + +Pattern has moved: https://ipm.clearblade.com From 51c46c853b00b2df9704b4b4f01aa0ea4f67c7c4 Mon Sep 17 00:00:00 2001 From: rreinold Date: Mon, 12 Mar 2018 12:37:00 -0500 Subject: [PATCH 24/27] CoAP Lib moved to ipm --- CoAP Lib/README.md | 119 +--------- CoAP Lib/coapLib.js | 539 -------------------------------------------- 2 files changed, 2 insertions(+), 656 deletions(-) delete mode 100644 CoAP Lib/coapLib.js diff --git a/CoAP Lib/README.md b/CoAP Lib/README.md index 1ad167c..79fed04 100644 --- a/CoAP Lib/README.md +++ b/CoAP Lib/README.md @@ -1,118 +1,3 @@ -# CoAP Lib +# Note -A ClearBlade library for parsing and building CoAP packets. - -Written in accordance to the [RFC 7252](https://tools.ietf.org/html/rfc7252) specification. - -## Usage - -### Import to ClearBlade Platform - -Currently, the easiest way to do this is by copy/pasting this into a new library. -Then make sure you include it as a dependency in any service you're calling it from. - -### Parsing - -Parsing assumes your packet is an array of integers. - -Assuming you pass in a valid packet, the parse function will return an object with the following key-value pairs: - - - CoAP Version (int) - should always be 1. - - Request Type (string) - one of: Confirmable, Non-confirmable, Acknowledgement, or Reset. - - Command (dict) - contains: - - Type (string) - either Request or Response. - - Name (string) - something like GET or Not Found. - - Code (string) - the code associated with this response/request name. - - Message ID (string) - the hex string representation of the message ID. - - Token (string) - the hex string representation of the token. - - Options (dictionary) - option names and their associated values (if any are present). - -##### Example - -```javascript -// Make a CoAP object -var coap = CoAP(); - -// This is the packet we want to parse -var packet = [65,1,0,1,0,186,99,108,101,97,114,98,108,97,100,101,97,50]; - -// Parsing the packet returns an object like below -var parsed = coap.parse(packet); -log(parsed); -/* -{ - "CoAP Version": 1, - "Request Type": "Confirmable", - "Command": { - "Code": "0.01", - "Name": "GET", - "Type": "Request" - }, - "Message ID": "0001", - "Token": "00", - "Options": { - "Uri-Path": "clearblade", - "Accept": "application/json" - } -} -*/ -``` - -### Building - -Building assumes you construct your options object in the following format. -The first four keys are required, options is _optionary_. - -- Request Type (string) - one of: Confirmable, Non-confirmable, Acknowledgement, or Reset. -- Command (string) - either the code or name of the request/response. -- Message ID (string) - the hex string representation of the message ID. -- Token (string) - the hex string representation of the token. -- Options (dict) - option names and their associated values. - Options will expect their values in the following formats: - - If-Match - integer array representing the raw hex bytes. - - Uri-Host - string. Max of 255 characters. - - ETag - integer array representing the raw hex bytes. - - If-None-Match - empty array. - - Uri-Port - integer. - - Location-Path - string. Max of 255 characters. - - Uri-Path - string. Max of 255 characters. - - Content-Format - string. - One of: - - text/plain - - application/link-format - - application/xml - - application/octet-stream - - application/exi - - application/json - - Max-Age - integer. - - Uri-Query - string. Max of 255 characters. - - Accept - string. - Same options as Content-Format. - - Location-Query - string. Max of 255 characters. - - Proxy-Uri - string. Max of 1034 characters. - - Proxy-Scheme - string. Max of 255 characters. - - Size1 - integer. - -##### Example - -```javascript -var options = { - "Request Type": "Confirmable", - "Command": "POST", - "Message ID": 24, - "Token": 1, - "Options": { - "Uri-Path": "clearblade_rgb", - "Content-Format": "application/octet-stream", - "Payload": [0, 255, 112, 255, 0] - } -}; - -// Make a CoAP object -var coap = CoAP(); - -// Building a packet returns an array of integers -var newPacket = coap.build(options); -log(newPacket); -// [65, 2, 0, 24, 1, 189, 1, 99, 108, 101, 97, 114, 98, 108, 97, 100, 101, 95, 114, 103, 98, 17, 42, 255, 0, 255, 112, 255, 0] -``` \ No newline at end of file +Pattern has moved: https://ipm.clearblade.com diff --git a/CoAP Lib/coapLib.js b/CoAP Lib/coapLib.js deleted file mode 100644 index a938a3d..0000000 --- a/CoAP Lib/coapLib.js +++ /dev/null @@ -1,539 +0,0 @@ - -/****************************************************************************** - * * - * /$$$$$$ /$$$$$$ /$$$$$$$ /$$ /$$ /$$ * - * /$$__ $$ /$$__ $$| $$__ $$ | $$ |__/| $$ * - * | $$ \__/ /$$$$$$ | $$ \ $$| $$ \ $$ | $$ /$$| $$$$$$$ * - * | $$ /$$__ $$| $$$$$$$$| $$$$$$$/ | $$ | $$| $$__ $$ * - * | $$ | $$ \ $$| $$__ $$| $$____/ | $$ | $$| $$ \ $$ * - * | $$ $$| $$ | $$| $$ | $$| $$ | $$ | $$| $$ | $$ * - * | $$$$$$/| $$$$$$/| $$ | $$| $$ | $$$$$$$$| $$| $$$$$$$/ * - * \______/ \______/ |__/ |__/|__/ |________/|__/|_______/ * - * * - * * - * Written in accordance to https://tools.ietf.org/html/rfc7252 * - * * - ******************************************************************************/ - -function CoAP(){ - - // PARSING HELPER FUNCTIONS - - function intArrToHexString(arr){ - return (arr.map(function(x){var y=x.toString(16);return x<16?'0'+y:y})).join(''); - } - - function intArrToAsciiString(arr){ - return arr.map(function(x){return String.fromCharCode(x)}).join(""); - } - - function intArrToInt(arr){ - return parseInt(intArrToHexString(arr),16); - } - - function splitByte(toSplit){ - var byte = toSplit; - var ret = []; - ret = ret.concat((byte&0xF0)>>4); - ret = ret.concat(byte&0x0F); - return ret; - } - - function splitHalfByte(toSplit){ - var halfByte = toSplit; - var ret = []; - ret = ret.concat((halfByte&0xC)>>2); - ret = ret.concat(halfByte&0x3); - return ret; - } - - function mapRequest(reqType){ - switch(reqType){ - case 0: - return "Confirmable"; - case 1: - return "Non-confirmable"; - case 2: - return "Acknowledgement"; - case 3: - return "Reset"; - default: - return "Invalid request type"; - } - } - - function mapFormat(formatNum){ - switch(formatNum){ - case 0: - return "text/plain;charset=utf-8"; - case 40: - return "application/link-format"; - case 41: - return "application/xml"; - case 42: - return "application/octet-stream"; - case 47: - return "application/exi"; - case 50: - return "application/json"; - default: - return "invalid format"; - } - } - - function mapCommand(command){ - var ret = []; - if(command<32){ - ret = ret.concat(["Request"]); - }else{ - ret = ret.concat(["Response"]); - } - switch(command){ - case 0: - return ret.concat(["0.00", "Empty message"]); - case 1: - return ret.concat(["0.01", "GET"]); - case 2: - return ret.concat(["0.02", "POST"]); - case 3: - return ret.concat(["0.03", "PUT"]); - case 4: - return ret.concat(["0.04", "DELETE"]); - } - return ["Invalid command", null, null]; - } - - function mapOptions(optionNum, optionVal){ - var ret = ["invalid option", optionVal]; - switch(optionNum){ - case 1: - ret[0] = "If-Match"; - // ret[1] is opaque - break; - case 3: - ret[0] = "Uri-Host"; - ret[1] = intArrToAsciiString(ret[1]); - break; - case 4: - ret[0] = "ETag"; - // ret[1] is opaque - break; - case 5: - ret[0] = "If-None-Match"; - // ret[1] is empty - break; - case 7: - ret[0] = "Uri-Port"; - ret[1] = intArrToInt(ret[1]); - break; - case 8: - ret[0] = "Location-Path"; - ret[1] = intArrToAsciiString(ret[1]); - break; - case 11: - ret[0] = "Uri-Path"; - ret[1] = intArrToAsciiString(ret[1]); - break; - case 12: - ret[0] = "Content-Format"; - ret[1] = mapFormat(intArrToInt(ret[1])); - break; - case 14: - ret[0] = "Max-Age"; - ret[1] = intArrToInt(ret[1]); - break; - case 15: - ret[0] = "Uri-Query"; - ret[1] = intArrToAsciiString(ret[1]); - break; - case 17: - ret[0] = "Accept"; - ret[1] = mapFormat(intArrToInt(ret[1])); - break; - case 20: - ret[0] = "Location-Query"; - ret[1] = intArrToAsciiString(ret[1]); - break; - case 35: - ret[0] = "Proxy-Uri"; - ret[1] = intArrToAsciiString(ret[1]); - break; - case 39: - ret[0] = "Proxy-Scheme"; - ret[1] = intArrToAsciiString(ret[1]); - break; - case 60: - ret[0] = "Size1"; - ret[1] = intArrToInt(ret[1]); - break; - default: - ret[1] = { - number: optionNum, - value: optionVal - }; - break; - } - return ret; - } - - // BUILDING HELPER FUNCTIONS - - function asciiToIntArr(str){ - return str.split("").map(function(c){return c.charCodeAt(0)}); - } - - function hexStringToIntArr(hex){ - var ret = hex.match(/.{2}/g).map(function(x){return parseInt(x,16)}); - if(!(typeof ret[0] != 'undefined' && ret[0])){ - ret.shift(); - } - return ret; - } - - function intToIntArr(messageStr){ - var hex = parseInt(messageStr).toString(16); - if(hex.length%2===1){ - hex = '0'+hex; - } - return hexStringToIntArr(hex); - } - - function mapBackReqType(reqType){ - switch(reqType.replace(/[\- ]/g,"")){ - case "CONFIRMABLE": - return 0; - case "NONCONFIRMABLE": - return 1; - case "ACKNOWLEDGEMENT": - return 2; - case "RESET": - return 3; - default: - return -1; - } - } - - function mapBackCommand(command){ - switch(command){ - case "0.00": - case "EMPTY": - case "EMPTY MESSAGE": - return 0; - case "0.01": - case "GET": - return 1; - case "0.02": - case "POST": - return 2; - case "0.03": - case "PUT": - return 1; - case "0.04": - case "DELETE": - return 2; - } - } - - function mapBackOption(option){ - var op = option.replace(/[\- ]/g,"").toUpperCase(); - switch(op){ - case "IFMATCH": - return 1; - case "URIHOST": - return 3; - case "ETAG": - return 4; - case "IFNONEMATCH": - return 5; - case "URIPORT": - return 7; - case "LOCATIONPATH": - return 8; - case "URIPATH": - return 11; - case "CONTENTFORMAT": - return 12; - case "MAXAGE": - return 14; - case "URIQUERY": - return 15; - case "ACCEPT": - return 17; - case "LOCATIONQUERY": - return 20; - case "PROXYURI": - return 35; - case "PROXYSCHEME": - return 39; - case "SIZE1": - return 60; - case "PAYLOAD": - return -2; - default: - return -1; - } - } - - function getOptionDeltas(options){ - var nums = []; - for(var option in options){ - var num = mapBackOption(option); - nums.push({ - original: num, - delta: num, - value: options[option] - }); - } - nums.sort(function(a,b){ - return parseInt(a.original) - parseInt(b.original); - }) - if(nums[0].original===-2){ - nums.push(nums[0]); - nums.shift(); - } - for(var i=0;i>8); - excessDelta.push((delta-269)&0xFF); - delta = 14<<4; - } - var value = convertOptionValues(option.original, option.value); - if(value.constructor === Array){ - if(delta===0xFF){ - optionsBuf.push(delta); - }else if(value.length<13){ - optionsBuf.push(delta|value.length); - }else if(value.length<269){ - optionsBuf.push(delta|13) - excessLength.push(value.length-13); - }else{ - optionsBuf.push(delta|14); - excessLength.push((value.length-269)>>8); - excessLength.push((value.length-269)&0xFF); - } - }else{ - optionsBuf.push(delta|1); - } - optionsBuf = optionsBuf.concat(excessDelta).concat(excessLength).concat(value); - } - return optionsBuf; - } - - // ACCESSIBLE FUNCTIONS - - function parseCoAP(buffer){ - if(buffer.constructor !== Array){ - return "Invalid packet. Expected array." - } - var buf = buffer.slice(); - var packet = {} - var firstByte = splitByte(buf.shift()); - var firstHalfByte = splitHalfByte(firstByte[0]); - packet["CoAP Version"] = firstHalfByte[0]; - packet["Request Type"] = mapRequest(firstHalfByte[1]); - var tokenLength = firstByte[1]; - var command = mapCommand(buf.shift()); - packet["Command"] = { - Type: command[0], - Code: command[1], - Name: command[2] - }; - packet["Message ID"] = intArrToHexString([].concat(buf.splice(0,2))).toUpperCase(); - packet["Token"] = intArrToHexString([].concat(buf.splice(0,tokenLength))).toUpperCase(); - var options = {}; - var prevOptions = 0; - while(buf.length>0){ - var option = buf.shift(); - var optionSplit = splitByte(option); - var delta; - var len = optionSplit[1]; - if(option===0xFF){ - options.Payload = buf.slice(); - buf = []; - }else{ - switch(optionSplit[0]){ - case 0xF: - if(optionSplit[1]!==0xF){ - return{ - "Error": "Message format error", - "Details": "Encountered an option delta of 15 and it's not the payload marker" - }; - } - break; - case 0xE: - delta = parseInt(intArrToHexString([].concat(buf.splice(0,2))),16)+269; - break; - case 0xD: - delta = buf.shift()+13; - break; - default: - delta = optionSplit[0]; - break; - } - option = prevOptions+delta; - prevOptions += delta; - switch(len){ - case 0xF: - return{ - "Error": "Message format error", - "Details": "Encountered an option length of 15" - }; - case 0xE: - len = parseInt(intArrToHexString([].concat(buf.splice(0,2))),16)+269; - break; - case 0xD: - len = buf.shift()+13; - break; - default: - break; - } - option = mapOptions(option, [].concat(buf.splice(0,len))); - options[option[0]] = option[1]; - } - } - if(Object.keys(options).length){ - packet["Options"] = options; - } - return packet; - } - - function buildCoAP(details){ - var reqType, command, messageID, token, options; - for(var deet in details){ - switch(deet.replace(/[\-_ ]/g,"").toUpperCase()){ - case "REQUESTTYPE": - reqType = mapBackReqType(details[deet].toUpperCase()); - break; - case "COMMAND": - command = mapBackCommand(details[deet].toUpperCase()); - break; - case "MESSAGEID": - messageID = details[deet]; - if(typeof parseInt(messageID) != 'undefined' && parseInt(messageID)){ - messageID = intToIntArr(messageID); - }else{ - messageID = hexStringToIntArr(messageID); - } - if(messageID.length>2){ - return "Message ID is too large"; - } - if(messageID.length<2){ - messageID = [0].concat(messageID); - } - break; - case "TOKEN": - token = details[deet]; - if(typeof parseInt(token) != 'undefined' && parseInt(token)){ - token = intToIntArr(token); - }else{ - token = hexStringToIntArr(token); - } - if(token.length>8){ - return "Token is too large"; - } - break; - case "OPTIONS": - options = buildOptionsBuf(details[deet]); - break; - } - } - if( !(typeof reqType!='undefined') - ||!(typeof command!='undefined') - ||!(typeof messageID!='undefined') - ||!(typeof token!='undefined') - ){ - return "Missing required parameter" - } - var firstByte = ((4 | reqType)<<4)|token.length; - return [].concat(firstByte).concat(command).concat(messageID).concat(token).concat(options); - } - - return { - parse: parseCoAP, - build: buildCoAP - } -} From 6e3baeadfe9db6c2f96ad15a3f87d8580b97e1b2 Mon Sep 17 00:00:00 2001 From: rreinold Date: Mon, 12 Mar 2018 12:39:49 -0500 Subject: [PATCH 25/27] moved to ipm --- Integration with Twilio SMS/README.md | 11 +---- Integration with Twilio SMS/twilioSms.js | 55 ---------------------- Sending Emails with SendGrid/README.md | 15 +----- Sending Emails with SendGrid/SendGrid.js | 60 ------------------------ 4 files changed, 4 insertions(+), 137 deletions(-) delete mode 100644 Integration with Twilio SMS/twilioSms.js delete mode 100644 Sending Emails with SendGrid/SendGrid.js diff --git a/Integration with Twilio SMS/README.md b/Integration with Twilio SMS/README.md index d86a0f9..79fed04 100644 --- a/Integration with Twilio SMS/README.md +++ b/Integration with Twilio SMS/README.md @@ -1,10 +1,3 @@ -# Send sms using Twilio and ClearBlade +# Note --The twilio api allows to send sms using http. --For free trial, we can send sms only to numbers that have been verified. --Sample code to send mail is given in twilioSMS.js - --Go to https://www.twilio.com/try-twilio and signup for free twilio account --Get your free phone no that is used for sending sms --Replace user key with your Account Sid --Replace pass with your auth token \ No newline at end of file +Pattern has moved: https://ipm.clearblade.com diff --git a/Integration with Twilio SMS/twilioSms.js b/Integration with Twilio SMS/twilioSms.js deleted file mode 100644 index 045726a..0000000 --- a/Integration with Twilio SMS/twilioSms.js +++ /dev/null @@ -1,55 +0,0 @@ -/* - -1. Go To Settings > Requires > Add `http` and `ClearBlade` -2. Change `TwilioSMS` below to the name of your particular service - -*/ - -function TwilioSMS(req, resp){ - - ClearBlade.init({request:req}); - sendSMS(); - - function sendSMS(){ - var options = { - "auth":{ - user: , - pass : - }, - uri : "https://api.twilio.com/2010-04-01/Accounts//SMS/Messages.json", - "body":{ - "Body" : , - "To" : , - "From": - }, - "form":true - }; - - /* - Example - function sendSMS(){ - var options = { - "auth":{ - user: "fffffffffffffffffffffffff477ddf", - pass : "fffffffffffffffffffffffed2ef55de" - }, - uri : "https://api.twilio.com/2010-04-01/Accounts/fffffffffffffffffffffffff477ddf/SMS/Messages.json", - "body":{ - "Body" : "Your friend says hi!", - "To" : "(+1 555-555-5555)", - "From": "(+1 777-777-7777)" - }, - "form":true - }; - */ - - var requestObject = ClearBlade.http().Request(); - requestObject.post(options,function(err,result){ - if(err){ - resp.error("Failed"); - }else{ - resp.success(result); - } - }); - } -} \ No newline at end of file diff --git a/Sending Emails with SendGrid/README.md b/Sending Emails with SendGrid/README.md index 531cbaa..79fed04 100644 --- a/Sending Emails with SendGrid/README.md +++ b/Sending Emails with SendGrid/README.md @@ -1,14 +1,3 @@ -#Sending Emails Using SendGrid +# Note -## Overview -This repository allows you to send e-mails with ClearBlade via the SendGrid API, which uses the HTTP Protocol. Sample code to send an e-mail is given in **SendGrid.js**. - -## Usage - ->1. Create a free SendGrid Account. Log into your SendGrid account, and view the Settings > API Keys tab. Create an API Key with full access to "Mail Send" rights. ->2. Replace \ with SendGrid API key ->3. Replace \ with your desired email address. This will be the 'sender' of the email. ->4. Add 'log' and 'http' to your Required Libraries (Settings > Requires > Add) - -## Further Documentation -https://sendgrid.com/docs +Pattern has moved: https://ipm.clearblade.com diff --git a/Sending Emails with SendGrid/SendGrid.js b/Sending Emails with SendGrid/SendGrid.js deleted file mode 100644 index efb7b4e..0000000 --- a/Sending Emails with SendGrid/SendGrid.js +++ /dev/null @@ -1,60 +0,0 @@ -/* -Send an email to a list of e-mail address. - -Ex. sendEmailToList("This is my subject line","HTML is supported!",["email1@gmail.com","email2@gmail.com"],function(err, data){ ... }) - - subject String - Subject line - body String - HTML body of email - recipientList][String] - Array of email address recipients ex. ["email1@gmail.com","email2@gmail.com"] - callback - callback after request is sent - -*/ -function sendEmailToList(subject, body, recipientList, callback){ - - var SEND_GRID_API_KEY = - var ORIGIN_EMAIL_ADDRESS = - - var toField = formatRecipients(recipientList) - - log("Subject: " + subject) - log("Body: " + body) - log("To: " + JSON.stringify(toField)) - - var requestObject = Requests(); - var url = "https://api.sendgrid.com/v3/mail/send"; - var options = { - "uri": url, - "headers": {"Authorization": "Bearer "+SEND_GRID_API_KEY,'Content-Type': 'application/json'}, - body: JSON.stringify({ - personalizations: [ - { - to: toField, - subject: subject, - }, - ], - from: { - email: ORIGIN_EMAIL_ADDRESS, - }, - content: [ - { - type: 'text/html', - value: body, - }, - ], - }) - }; - requestObject.post(options, callback); - -} - -function formatRecipients(recipientList){ - var field = [] - for(i in recipientList){ - var email = recipientList[i] - field.push({email:email}) - } - return field -} - - - From ac7046ed6e3de8da1728bbb1153a8f46a2047407 Mon Sep 17 00:00:00 2001 From: rreinold Date: Tue, 27 Mar 2018 15:31:33 -0500 Subject: [PATCH 26/27] coap integration moved to ipm --- CoAP Integration/README.md | 8 +- CoAP Integration/cb-coap/.classpath | 29 ------- CoAP Integration/cb-coap/.project | 23 ------ .../org.eclipse.core.resources.prefs | 4 - .../.settings/org.eclipse.jdt.core.prefs | 5 -- .../.settings/org.eclipse.m2e.core.prefs | 4 - .../cb-coap/Californium.properties | 41 ---------- CoAP Integration/cb-coap/libs/CB.jar | Bin 49425 -> 0 bytes CoAP Integration/cb-coap/libs/gson-2.3.jar | Bin 206853 -> 0 bytes .../cb-coap/libs/mqtt-client-0.4.0.jar | Bin 146728 -> 0 bytes CoAP Integration/cb-coap/pom.xml | 37 --------- .../java/com/clearblade/coap/cb_coap/App.java | 77 ------------------ .../com/clearblade/coap/cb_coap/AppTest.java | 38 --------- .../com/clearblade/coap/cb_coap/App$1.class | Bin 1153 -> 0 bytes .../com/clearblade/coap/cb_coap/App.class | Bin 2838 -> 0 bytes .../com/clearblade/coap/cb_coap/AppTest.class | Bin 641 -> 0 bytes 16 files changed, 2 insertions(+), 264 deletions(-) delete mode 100644 CoAP Integration/cb-coap/.classpath delete mode 100644 CoAP Integration/cb-coap/.project delete mode 100644 CoAP Integration/cb-coap/.settings/org.eclipse.core.resources.prefs delete mode 100644 CoAP Integration/cb-coap/.settings/org.eclipse.jdt.core.prefs delete mode 100644 CoAP Integration/cb-coap/.settings/org.eclipse.m2e.core.prefs delete mode 100644 CoAP Integration/cb-coap/Californium.properties delete mode 100644 CoAP Integration/cb-coap/libs/CB.jar delete mode 100644 CoAP Integration/cb-coap/libs/gson-2.3.jar delete mode 100644 CoAP Integration/cb-coap/libs/mqtt-client-0.4.0.jar delete mode 100644 CoAP Integration/cb-coap/pom.xml delete mode 100644 CoAP Integration/cb-coap/src/main/java/com/clearblade/coap/cb_coap/App.java delete mode 100644 CoAP Integration/cb-coap/src/test/java/com/clearblade/coap/cb_coap/AppTest.java delete mode 100644 CoAP Integration/cb-coap/target/classes/com/clearblade/coap/cb_coap/App$1.class delete mode 100644 CoAP Integration/cb-coap/target/classes/com/clearblade/coap/cb_coap/App.class delete mode 100644 CoAP Integration/cb-coap/target/test-classes/com/clearblade/coap/cb_coap/AppTest.class diff --git a/CoAP Integration/README.md b/CoAP Integration/README.md index ced0fe7..bd03605 100644 --- a/CoAP Integration/README.md +++ b/CoAP Integration/README.md @@ -1,7 +1,3 @@ -# CoAP integration for ClearBlade +Moved to IPM [ipm.clearblade.com](https://ipm.clearblade.com) -## Importing project in Eclipse -- Open Eclipse and go to File->Import and select __Existing Maven Project__ and import the __cb-coap__ project -- You will need to change the credentials in App.java -- Replace ```YOUR_SYSTEM_KEY, YOUR_SYSTEM_SECRET, YOUR_PLATFORM_URL, YOUR_MESSAGING_URL, YOUR_EMAIL, YOUR_PASSWORD``` with your own -- All messages are sent and received on the ___coap-test__ topic. \ No newline at end of file +Source: https://github.com/ClearBlade/coap-adapter diff --git a/CoAP Integration/cb-coap/.classpath b/CoAP Integration/cb-coap/.classpath deleted file mode 100644 index 3dfa708..0000000 --- a/CoAP Integration/cb-coap/.classpath +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/CoAP Integration/cb-coap/.project b/CoAP Integration/cb-coap/.project deleted file mode 100644 index 10d968e..0000000 --- a/CoAP Integration/cb-coap/.project +++ /dev/null @@ -1,23 +0,0 @@ - - - cb-coap - - - - - - org.eclipse.jdt.core.javabuilder - - - - - org.eclipse.m2e.core.maven2Builder - - - - - - org.eclipse.jdt.core.javanature - org.eclipse.m2e.core.maven2Nature - - diff --git a/CoAP Integration/cb-coap/.settings/org.eclipse.core.resources.prefs b/CoAP Integration/cb-coap/.settings/org.eclipse.core.resources.prefs deleted file mode 100644 index f9fe345..0000000 --- a/CoAP Integration/cb-coap/.settings/org.eclipse.core.resources.prefs +++ /dev/null @@ -1,4 +0,0 @@ -eclipse.preferences.version=1 -encoding//src/main/java=UTF-8 -encoding//src/test/java=UTF-8 -encoding/=UTF-8 diff --git a/CoAP Integration/cb-coap/.settings/org.eclipse.jdt.core.prefs b/CoAP Integration/cb-coap/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index abec6ca..0000000 --- a/CoAP Integration/cb-coap/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,5 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5 -org.eclipse.jdt.core.compiler.compliance=1.5 -org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning -org.eclipse.jdt.core.compiler.source=1.5 diff --git a/CoAP Integration/cb-coap/.settings/org.eclipse.m2e.core.prefs b/CoAP Integration/cb-coap/.settings/org.eclipse.m2e.core.prefs deleted file mode 100644 index f897a7f..0000000 --- a/CoAP Integration/cb-coap/.settings/org.eclipse.m2e.core.prefs +++ /dev/null @@ -1,4 +0,0 @@ -activeProfiles= -eclipse.preferences.version=1 -resolveWorkspaceProjects=true -version=1 diff --git a/CoAP Integration/cb-coap/Californium.properties b/CoAP Integration/cb-coap/Californium.properties deleted file mode 100644 index 6caa557..0000000 --- a/CoAP Integration/cb-coap/Californium.properties +++ /dev/null @@ -1,41 +0,0 @@ -#Californium CoAP Properties file -#Tue Jun 28 08:19:08 EDT 2016 -HTTP_SERVER_SOCKET_BUFFER_SIZE=8192 -UDP_CONNECTOR_OUT_CAPACITY=2147483647 -CONGESTION_CONTROL_ALGORITHM=Cocoa -USE_CONGESTION_CONTROL=false -ACK_TIMEOUT=2000 -NOTIFICATION_CHECK_INTERVAL_COUNT=100 -MAX_MESSAGE_SIZE=1024 -DEDUPLICATOR=DEDUPLICATOR_MARK_AND_SWEEP -COAP_PORT=5683 -ACK_TIMEOUT_SCALE=2.0 -PREFERRED_BLOCK_SIZE=512 -NETWORK_STAGE_RECEIVER_THREAD_COUNT=1 -PROTOCOL_STAGE_THREAD_COUNT=8 -MAX_TRANSMIT_WAIT=93000 -UDP_CONNECTOR_RECEIVE_BUFFER=0 -EXCHANGE_LIFETIME=247000 -HTTP_SERVER_SOCKET_TIMEOUT=100000 -CROP_ROTATION_PERIOD=2000 -UDP_CONNECTOR_DATAGRAM_SIZE=2048 -MAX_RETRANSMIT=4 -NOTIFICATION_CHECK_INTERVAL=86400000 -LEISURE=5000 -HTTP_CACHE_RESPONSE_MAX_AGE=86400 -BLOCKWISE_STATUS_LIFETIME=600000 -UDP_CONNECTOR_SEND_BUFFER=0 -HEALTH_STATUS_PRINT_LEVEL=FINEST -NETWORK_STAGE_SENDER_THREAD_COUNT=1 -NON_LIFETIME=145000 -TOKEN_SIZE_LIMIT=8 -HTTP_PORT=8080 -MARK_AND_SWEEP_INTERVAL=10000 -HEALTH_STATUS_INTERVAL=60 -ACK_RANDOM_FACTOR=1.5 -NSTART=1 -USE_RANDOM_MID_START=true -HTTP_CACHE_SIZE=32 -PROBING_RATE=1.0 -NOTIFICATION_REREGISTRATION_BACKOFF=2000 -COAP_SECURE_PORT=5684 diff --git a/CoAP Integration/cb-coap/libs/CB.jar b/CoAP Integration/cb-coap/libs/CB.jar deleted file mode 100644 index 8af40270a4ff2880a61f55076d6b7305f1b2b700..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49425 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 diff --git a/CoAP Integration/cb-coap/libs/gson-2.3.jar b/CoAP Integration/cb-coap/libs/gson-2.3.jar deleted file mode 100644 index a7f7ce5e993d6eba344ef9ea2c20ee525d67c7fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 206853 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

8pu^>z)tD3grF12*!9sJy6je0BmJJ!KpauD}5Ii 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 diff --git a/CoAP Integration/cb-coap/libs/mqtt-client-0.4.0.jar b/CoAP Integration/cb-coap/libs/mqtt-client-0.4.0.jar deleted file mode 100644 index 8f1d92faa19659dd3339f7d89c895c41d2ad5fef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 146728 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 z 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 E9|Nvw@Bjb+ diff --git a/CoAP Integration/cb-coap/pom.xml b/CoAP Integration/cb-coap/pom.xml deleted file mode 100644 index 88a62a3..0000000 --- a/CoAP Integration/cb-coap/pom.xml +++ /dev/null @@ -1,37 +0,0 @@ - - 4.0.0 - - com.clearblade.coap - cb-coap - 0.0.1-SNAPSHOT - jar - - cb-coap - http://maven.apache.org - - - UTF-8 - - - - - junit - junit - 3.8.1 - test - - - org.eclipse.californium - californium-core - 1.0.4 - - - - - repo.eclipse.org - Californium Repository - https://repo.eclipse.org/content/repositories/californium/ - - - diff --git a/CoAP Integration/cb-coap/src/main/java/com/clearblade/coap/cb_coap/App.java b/CoAP Integration/cb-coap/src/main/java/com/clearblade/coap/cb_coap/App.java deleted file mode 100644 index b2bf25c..0000000 --- a/CoAP Integration/cb-coap/src/main/java/com/clearblade/coap/cb_coap/App.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.clearblade.coap.cb_coap; - -import java.util.HashMap; - -import org.eclipse.californium.core.CoapClient; -import org.eclipse.californium.core.CoapResponse; -import org.eclipse.californium.core.Utils; - -import com.clearblade.java.api.ClearBlade; -import com.clearblade.java.api.ClearBladeException; -import com.clearblade.java.api.InitCallback; -import com.clearblade.java.api.Message; - -/** - * Hello world! - * - */ -public class App -{ - private static String SYSTEM_KEY = "YOUR_SYSTEM_KEY"; - private static String SYSTEM_SECRET = "YOUR_SYSTEM_SECRET"; - private static String PLATFORM_URL = "YOUR_PLATFORM_URL"; - private static String MESSAGING_URL = "YOUR_MESSAGING_URL"; - private static String EMAIL = "YOUR_EMAIL"; - private static String PASSWORD = "YOUR_PASSWORD"; - private static HashMap initOptions = new HashMap(); - private static Message message = null; - private static boolean initFlag = false; - - public static void main( String[] args ) - { - boolean initStatus = initializeCB(); - if(!initStatus) { - return; - } - - String clientID = "ClearBladeCOAPTest"; - message = new Message(clientID); - - CoapClient client = new CoapClient("coap://californium.eclipse.org:5683/obs"); - - System.out.println("SYNCHRONOUS"); - - CoapResponse response = client.get(); - - if (response!=null) { - System.out.println(Utils.prettyPrint(response)); - String messagePayload = Utils.prettyPrint(response); - message.publish("coap-test", messagePayload); - - } else { - System.out.println("No response received."); - } - } - - private static boolean initializeCB() { - InitCallback initCallback = new InitCallback(){ - @Override - public void done(boolean results){ - initFlag = true; - } - @Override - public void error(ClearBladeException exception){ - //initialization failed, given a ClearBladeException with the cause - System.out.println("CB init error: " + exception.getMessage()); - } - }; - initOptions.put("platformURL", PLATFORM_URL); - initOptions.put("messagingURL", MESSAGING_URL); - initOptions.put("email", EMAIL); - initOptions.put("password", PASSWORD); - - ClearBlade.initialize(SYSTEM_KEY, SYSTEM_SECRET, initOptions, initCallback); - - return initFlag; - } -} diff --git a/CoAP Integration/cb-coap/src/test/java/com/clearblade/coap/cb_coap/AppTest.java b/CoAP Integration/cb-coap/src/test/java/com/clearblade/coap/cb_coap/AppTest.java deleted file mode 100644 index fa75769..0000000 --- a/CoAP Integration/cb-coap/src/test/java/com/clearblade/coap/cb_coap/AppTest.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.clearblade.coap.cb_coap; - -import junit.framework.Test; -import junit.framework.TestCase; -import junit.framework.TestSuite; - -/** - * Unit test for simple App. - */ -public class AppTest - extends TestCase -{ - /** - * Create the test case - * - * @param testName name of the test case - */ - public AppTest( String testName ) - { - super( testName ); - } - - /** - * @return the suite of tests being tested - */ - public static Test suite() - { - return new TestSuite( AppTest.class ); - } - - /** - * Rigourous Test :-) - */ - public void testApp() - { - assertTrue( true ); - } -} diff --git a/CoAP Integration/cb-coap/target/classes/com/clearblade/coap/cb_coap/App$1.class b/CoAP Integration/cb-coap/target/classes/com/clearblade/coap/cb_coap/App$1.class deleted file mode 100644 index 90e1cd505ebc99e5324fb4b47d0a14937fd6b6a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1153 zcmb7DZBG+H5PlY}Tzj4t%ZpN9C{ncr;Xr()fYJsNl46XQCi2B>ubZ;Ey}R69jry3O*=r@F5RG4Uc6Mi;XXe@2pTEBS0I-T}6C(_BuHSK7C3x6Wyd@mh=Yiuk z-z0WB2#TvF42I%R*jxUdJ3Nrit|#LfSE|X~cMM}2lKd@((Nej=VATAUurP{@jTFWh zvUTZ+=iN?Igs*s035HzVce!ftP-=g0XvBvyVwkTFv7RojLL@EUBOs%6P;OYbhzS!p zhS`6l+L%O^ABakTD0ru0qQG$JL}E;r z?P^!5mI%|hK@!%g1ub$RDR8}DVHQO#?@hui^+EfbNh(!j;Wo-9N(_rbqWrBD8w*%u zu-YQtBZYXIG@dM#PZQ_@mTWA;q4(!OAiNgC(pi<9${qAo(GaUP?rOqx?2{JMw1sST`AO8O$*j}B*t?!5!kXeyBq9_*=k(2xtTg-No8+yLWn@zeM@WCB z%?K=7EwaF47<74#c6L9A?0NDSE+9**2G}I4V^hXgj1L2B5Wr>vFx?Lt08lulFioj6 zT(~@ddP&h5D*pvD-!c0-H+O{j#U5_;aHofr9@d8Ow=sk23H(#$vKCHaybuN687HF?rEy2WzyWP-kQedn{)g*^DJ&f9aBC+c4Funzb0$a=fKBVWcyfy`0x2^z4-A-|1Ne zrxZ-z0PT2|bj#Axw9**cmJ%m6EoZ3lk_e?`;aSww(h{UuKK7?f!5NTH?Qfoz;0kBw zbs2{w98Gox7lNsU?lw*D3U&vzU}rLw?AAKwwTo@FkZ@Rm8#OYHQg*O27!8J_-EE=4 zww{hiTR0dR47HJly4!{9aRnYBdy>aR+s;|Ns%qIor?+->=LJL1$(hioO%@auwTNSn32&(mzR=yeo{-CEQ~LfO=;$|mN&$+ z!}OvW9Za{qXb>SgDz_cXtek5}Gcpnm_-|I=pp4n(X)hfZR1gNyrwBI<%`_h9;X$Xc zvofM|BP_aQP;^UpEHpmJM0s#^XD4lkjTb|>CUP($q2B+r+dYU&IGfFH*yz|)!i!nl^57=H z;)J?YUcqZ3P)|;nFf+n|IR&?&@s_mCTU!0ivHuNqLbq~ke!b6&6m$>fiR%AUn&Nb@ z6fA(9S(nS}w!Pv6A>oq$1+Ht}Ssob%r;W&WtLP0;&ASRrEQuhOlcr%UvK~*V>rPY6 z(=xKm^Jw;Dz8oMADc!iI&j$!mEuR+i?kNam*9lZ6Y)(9i$b<=@Fif=8l#UXfBda9< zi7~cuy@YcwkR1uT%hPgPTQRfRyax~1ecQ(7_U1d??!^i^WV|CvV`?^my~I@@X2W|5 z-p2=oMos`QSeeE0jIPLHnNwM#GE2rs?AwxWoQX6p;}Z#PolS4b_>2+fG|Rf5&Ch%B z1s;0vB>}a~?Yo?jhQg{2r z7I7xf28ZMM`7{}%mP&C|o#rTZ`DcYCZz8*#Pw7!Z%u$(ZJs_gw4a1p?o)4Q$if*Bi z)32KU4Qe^#xs!PEihbiyZW4!bK{%9Kz@eP^4&@xD_HLf5u!nk_<_@2;oYc)t^b+bR zaez;6P)2;(eFuwZ@Es}QnD0apjlP$QX!4ycqS<$@h}LzeGizusqEjlOtGbBbBPvy) zm%nG|Bxur2qh1=_gM)lJga&?(<1qXw; z6F24=2J0uM1%!80=DBu_+TOQ-{0)oHMSgE4N2{oXHVP0V+BMdsq;D!*yFrP-Alto4e q-{4zduZ-{Tec7=lQm3Yex4@)S(@hvu;Rol!AMq2Z*!C-={QL_sGrMH~ diff --git a/CoAP Integration/cb-coap/target/test-classes/com/clearblade/coap/cb_coap/AppTest.class b/CoAP Integration/cb-coap/target/test-classes/com/clearblade/coap/cb_coap/AppTest.class deleted file mode 100644 index 1433f4a24577465ea3f183745c5edad0a4d4b583..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 641 zcma)3O-sW-5Pj38jmG#@Tdm)S7Fq>^c&rFg@D#kX6!aq7xN2(Jlue?4OHYb|KfoU) z&ZaqtdXT{E&b~Kq-b_9|U*7>7VADj7uC@p_l(c`_PxWE7h) z2-SWv^ke5*iGh3w)t#e}mWU*wc;qv5OsLe|zPJ}oAci+iJ68VirrGEcj8=FhE#xt2 zqktk|*7b+-EE)8q>WE&z8YMUMM9>w=*Ln76#J7G#sJZ_z*(6NFZ0U^sX}MoU2!$x| zV+O1BhWpnvO%n@*<-ee|uC!1>MNhCuD1RTd6^JNGCpEPNUK=4_Z*(mXR&1>NdoCTGXU@dp%l_ntBF#J3zQ zj#m0wW@ZIboG*@9urbXU^D%>2)|kW`<}19qkFbPl eR(Hs!MhnIZmVa8 Date: Fri, 30 Mar 2018 18:21:50 -0500 Subject: [PATCH 27/27] mailgun moved to ipm --- Sending Emails with Mailgun/README.md | 15 ++---------- Sending Emails with Mailgun/SendMail.js | 31 ------------------------- 2 files changed, 2 insertions(+), 44 deletions(-) delete mode 100644 Sending Emails with Mailgun/SendMail.js diff --git a/Sending Emails with Mailgun/README.md b/Sending Emails with Mailgun/README.md index 119d968..4c08dbb 100644 --- a/Sending Emails with Mailgun/README.md +++ b/Sending Emails with Mailgun/README.md @@ -1,14 +1,3 @@ -#Sending Emails Using MailGun +# Note -## Overview -This repository allows you to send e-mails with ClearBlade via the Mailgun API, which uses the HTTP Protocol. You can choose to create a new domain for your outgoing e-mails, or use the mailgun domain. Sample code to send an e-mail is given in **SendMail.js**. - -## Usage -Log into your Mailgun account, and view the Domain tabs to find the following values: ->1. Replace \ with Mailgun API key ->2. Replace \ with your Mailgun Domain ->3. Replace \, \, and \ ->4. Add 'clearblade' and 'http' to your Required Libraries (Settings > Requires > Add) - -## Further Documentation -https://documentation.mailgun.com/quickstart.html +Pattern has moved: https://ipm.clearblade.com \ No newline at end of file diff --git a/Sending Emails with Mailgun/SendMail.js b/Sending Emails with Mailgun/SendMail.js deleted file mode 100644 index 25899c4..0000000 --- a/Sending Emails with Mailgun/SendMail.js +++ /dev/null @@ -1,31 +0,0 @@ -function SendMail(req, resp){ - - var options = { - auth: { - // User is the literal string "api" - user: "api", - // Insert your API_KEY - pass : - }, - uri : "https://api.mailgun.net/v3//messages", - qs: { - "from": "Mailgun Sandbox ", - // ex. "Rob " - "to": , - // ex. "Hey!" - "subject": , - // "How are you?" - "text": - }, - strictSSL: false - }; - - var requestObject = ClearBlade.http().Request(); - requestObject.post(options,function(err,result){ - if(err){ - resp.error("Unable to post email: "+result); - }else{ - resp.success(result); - } -} -}