Stap 4: De code
Nu, de code. Het platform elektrische imp geeft u alle instrumenten om te interageren met de hele wereld van API's en webservices. Kortom, de code is opgesplitst in twee: een agent, die wordt uitgevoerd op de servers van de wolk van elektrische Imp, en een apparaat, dat is uw elektrische Imp
[Kopiëren & plakken uit de officiële elektrische Imp documentatie]
De agent-object vertegenwoordigt van het GMB agent: de serverzijde eekhoorn, uitgevoerd in de elektrische Imp de servers van de wolk, die zich met Internet aanvragen en antwoorden namens het GMB bezighoudt. De agent-object wordt gebruikt om de communicatie tussen het GMB en diens agent bemiddelen.
Het apparaatobject vertegenwoordigt de server gebaseerde agent weergave van het GMB en wordt gebruikt voor de communicatie tussen de agent en het GMB bemiddelen.
[Einde van kopiëren en plakken]
Dus hier gaan we met onze agent-code. Het gebaseerd op de bibliotheek van de nuttige twitter in de elektrische Imp webservices verwijzing opgenomen. Ik heb ook dit stukje code voor het genereren van de tweet gebeurtenis handmatig toegevoegd
Opdat het twitter stream real-time parseren, moest ik configureren deze twitter-constanten zijn
en deze regel
in feite vertelt die naar het stream-object te vangen alle de tweets met de tekenreeks"
Dus, hier is de volledige agent-code
http://opensource.org/licenses/mit/ / Twitter sleutels const API_KEY = ""; Const API_SECRET = ""; Const AUTH_TOKEN = ""; Const TOKEN_SECRET = ""; klasse Twitter {/ / OAuth _consumerKey = null; _consumerSecret = null; _accessToken = null; _accessSecret = null; URL's streamUrl = "https://stream.twitter.com/1.1/"; tweetUrl = "https://api.twitter.com/1.1/statuses/update.json"; Streaming streamingRequest = null; _reconnectTimeout = null; _buffer = null; constructor (consumerKey, consumerSecret, accessToken, accessSecret) {deze ._consumerKey = consumerKey; deze ._consumerSecret = consumerSecret; deze ._accessToken = accessToken; deze ._accessSecret = accessSecret; deze ._reconnectTimeout = 60; deze ._buffer = "";} / *** * functie: Tweet * post een tweet op de tijdlijn van de gebruiker ** Params: * status - tweet * cb - een optionele retouraanroep ** terug: * bool die aangeeft of de tweet geslaagd is (als geen cb werd geleverd) * nothing (als een retouraanroep werd geleverd) *** / functie tweet (status, cb = null) {lokale headers = {}; lokale verzoek = _oAuth1Request (tweetUrl, headers, {"status": status}); als (cb == null) {lokale reactie = request.sendsync(); als (reactie & & response.statuscode! = 200) {server.log (formaat ("fout updating_status tweet. HTTP Status Code % i:\r\n%s", response.statuscode, response.body)); return false; } else {return true;}} else {request.sendasync(cb);}} / *** * functie: Stream * opent een verbinding met de twitter's streaming API ** Params: * searchTerms - wat wij op zoek bent naar * onTweet - callback-functie die wordt uitgevoerd wanneer er gegevens * onError - callback-functie die wordt uitgevoerd wanneer er een fout *** / functie van de stream (searchTerms, onTweet, onError = null) {server.log ("Opening stream voor:" + searchTerms); Stel standaard foutenhandler als (onError == null) onError = _defaultErrorHandler.bindenv(this); lokale methode = "statuses/filter.json" lokale kopteksten = {}; lokale post = {bijhouden = searchTerms}; lokale verzoek = _oAuth1Request (streamUrl + methode, headers, post); this.streamingRequest request.sendasync = (function(resp) {/ / verbinding timeout server.log ("Stream gesloten (" + resp.statuscode + ":" + resp.body + "")""); Als we ingesteld hebben als autoreconnect (resp.statuscode == 28) {stream (searchTerms, onTweet, onError);} anders als (resp.statuscode == 420) {imp.wakeup (_reconnectTimeout, {stream (searchTerms, onTweet, onError);} function. bindenv(this)); _reconnectTimeout * = 2; }} .bindenv(this), function(body) {probeer {als (body.len() == 2) {_reconnectTimeout = 60; _buffer = ""; terugkeer; } lokale gegevens = null; Probeer {gegevens = http.jsondecode(body);} catch(ex) {_buffer += lichaam; probeer {gegevens = http.jsondecode(_buffer);} vangst (ex-) {terugkeer;}} als (gegevens == null) return; Als er een fout als ("fouten" in gegevens) {server.log ("Got een fout"), onError(data.errors); terugkeer;} else {als (_looksLikeATweet(data)) {onTweet(data); terugkeer;}}} Catch(ex) {/ / als er is een fout opgetreden, fout handler onError beroepen ([{message = "Fout bij eekhoorn -" + ex, code = -1}]);}}. bindenv(this)); } / *** Private Function - noem niet *** / _encode(str) {return http.urlencode({s = str}).slice(2);} function function _oAuth1Request (postUrl, headers, gegevens) {lokale tijd = time(); lokale nonce = tijd; lokale parm_string = http.urlencode ({oauth_consumer_key = _consumerKey}); parm_string += "&" + http.urlencode ({oauth_nonce = nonce}); parm_string += "&" + http.urlencode ({oauth_signature_method = "HMAC-SHA1"}); parm_string += "&" + http.urlencode ({oauth_timestamp = tijd}); parm_string += "&" + http.urlencode ({oauth_token = _accessToken}); parm_string += "&" + http.urlencode ({oauth_version = "1.0"}); parm_string += "&" + http.urlencode(data); lokale signature_string = "POST &" + _encode ( postUrl) + "&" + _encode(parm_string); lokale toets = formaat ("%s & %s", _encode(_consumerSecret), _encode(_accessSecret)); lokale sha1 = _encode (http.base64encode (http.hash.hmacsha1 (signature_string, belangrijkste))); lokale auth_header = "oauth_consumer_key = \" "+ _consumerKey +"\","; auth_header += "oauth_nonce = \" "+ nonce +"\","; auth_header += "oauth_signature = \" "+ sha1 +"\","; auth_header += "oauth_signature_method = \" "+"HMAC-SHA1"+"\","; auth_header += "oauth_timestamp = \" "+ tijd +"\","; auth_header += "oauth_token = \" "+ _accessToken +"\","; auth_header += "oauth_version=\"1.0\"";" lokale headers = {"Vergunning": "OAuth" + auth_header}; lokale url = postUrl + "? "+ http.urlencode(data); lokale verzoek = http.post (url, headers, ""); terug verzoek; } functie _looksLikeATweet(data) {terug ("created_at" in gegevens & & 'id' in gegevens & & "tekst" in gegevens & & 'gebruiker' in de gegevens);} function _defaultErrorHandler(errors) {foreach (fout fouten) {server.log ("Fout" + error.code + ":" + error.message);}}} Twitter <-Twitter (API_KEY, API_SECRET, AUTH_TOKEN, TOKEN_SECRET); functioneren onTweet(tweetData) {/ / Meld u tweet, en die het (er is veel meer info in tweetData) tweeted server.log (formaat ("%s - %s", tweetData.text, tweetData.user.screen_name)); device.send ("tweet", null);} test functie voor handmatige hamster schudden van de functie requestHandler (aanvraag, reactie) {probeer {/ / controleren als de gebruiker led als queryreeksparameter verzonden als ("tweet" in request.query) {device.send ("tweet", null);} / / Stuur een reactie terug zeggen alles was OK. response.send (200, "tweet test ok");} vangst (ex) {response.send (500, "Internal Server Error:" + ex);}} Twitter.Stream ("yoursearchstring", onTweet) ;// registreren de HTTP-handler http.onrequest(requestHandler);
Dan, hier is de apparaatcode, gebaseerd op de elektrische Imp Servo van de PWM-voorbeeld