Sociala medier hamster (4 / 5 steg)
Steg 4: Koden
Nu, koden. Den elektriska imp plattformen ger dig alla instrument att interagera med hela världen av API: er och webservices. I grund och botten koden är kluvna i två: en agent, som körs på de elektriska Imp Cloud servrarna, och en enhet, vilket är din elektriska Imp
[Kopiera & klistra in från den officiella elektriska Imp dokumentation]
Agent-objekt representerar de imp agent: SSI-ekorren, kör i den elektriska Imp cloud servrar, som handlar om Internet-begäranden och svar för den integrerade havspolitiken. Agent-objektet används för att medla mellan den integrerade havspolitiken och dess agent.
Enhetsobjektet representerar serverbaserade agentens syn på den integrerade havspolitiken och används för att medla mellan agenten och den integrerade havspolitiken.
[End kopiera & klistra]
Så här går vi med vår agent kod. Den är baserad på användbara twitter biblioteket ingår i elektriska Imp webservices referens. Jag lade också till denna del av koden generera händelsen tweet manuellt
testa funktionen för manuella hamster skakar
funktion requestHandler (begäran, svar) {
försök {
Kontrollera om användaren skickas ledde som en frågeparameter
om ("tweet" i request.query) {
Device.send ("tweet", null);
}
Skicka ett svar tillbaka säger allt var OK.
Response.send (200, "tweet test ok");
} fånga (ex) {
Response.send (500, "Internal Server Error:" + ex);
}
}
registrera HTTP-hanteraren
http.OnRequest(requestHandler);
Om du vill aktivera twitter ström realtid parsning, behövde jag bara konfigurera dessa twitter konstanter
Twitter nycklar
CONST API_KEY = "";
CONST API_SECRET = "";
CONST AUTH_TOKEN = "";
CONST TOKEN_SECRET = "";
och denna linje
Twitter.Stream ("onTweet);
som berättar i grunden till stream-objektet att fånga alla tweets som innehåller strängen"
Så är här den kompletta agent koden
Copyright (c) 2013 elektriska Imp
Denna fil är licensierad under MIT License
http://opensource.org/licenses/MIT
Twitter nycklar
CONST API_KEY = "";
CONST API_SECRET = "";
CONST AUTH_TOKEN = "";
CONST TOKEN_SECRET = "";
klass Twitter {
OAuth
_consumerKey = null;
_consumerSecret = null;
_accessToken = null;
_accessSecret = null;
URL: er
streamUrl = "https://stream.twitter.com/1.1/";
tweetUrl = "https://api.twitter.com/1.1/statuses/update.json";
Streaming
streamingRequest = null;
_reconnectTimeout = null;
_buffer = null;
konstruktören (consumerKey, consumerSecret, accessToken, accessSecret) {
Detta ._consumerKey = consumerKey;
Detta ._consumerSecret = consumerSecret;
Detta ._accessToken = accessToken;
Detta ._accessSecret = accessSecret;
Detta ._reconnectTimeout = 60.
Detta ._buffer = "";
}
/***************************************************************************
* funktion: Tweet
* Inlägg en tweet till användarens tidslinje
*
* Params:
* status - tweet
* cb - en valfri återuppringning
*
* Avkastning:
* bool som anger om tweet framgångsrika (om ingen cb var medföljer)
* nothing(if a callback was supplied)
**************************************************************************/
funktionen tweet (status, cb = null) {
lokala headers = {};
lokala begäran = _oAuth1Request (tweetUrl, headers, {"status": status});
om (cb == null) {
lokala svar = request.sendsync();
om (svar & & response.statuscode! = 200) {
Server.log (format ("fel updating_status tweet. HTTP-Status koden % i:\r\n%s", response.statuscode, response.body));
returnera false;
} annat {
return true;
}
} annat {
Request.sendasync(CB);
}
}
/***************************************************************************
* funktion: ström
* Öppnar en anslutning till twitter streaming API
*
* Params:
* searchTerms - vad vi söker efter
* onTweet - callback funktion som körs när det finns data
* VidFel - callback funktion som körs när det finns ett fel
**************************************************************************/
funktionen stream (searchTerms, onTweet, onError = null) {
Server.log ("öppna ström för:" + searchTerms);
Ange standardhanterare för fel
om (VidFel == null) VidFel = _defaultErrorHandler.bindenv(this);
lokala metod = "statuses/filter.json"
lokala headers = {};
lokala post = {spår = searchTerms};
lokala begäran = _oAuth1Request (streamUrl + metod, rubriker, skriva);
this.streamingRequest = request.sendasync ()
function(resp) {
tidsgräns för dataanslutning
Server.log ("Stream stängd (" + resp.statuscode + ":" + resp.body + "")"");
om vi har autoreconnect som
om (resp.statuscode == 28) {
Stream (searchTerms, onTweet, onError);
} else om (resp.statuscode == 420) {
IMP.wakeup (_reconnectTimeout, function() {stream (searchTerms, onTweet, onError);}. bindenv(this));
_reconnectTimeout * = 2;
}
} .bindenv(this),
function(Body) {
försök {
om (body.len() == 2) {
_reconnectTimeout = 60.
_buffer = "";
hemkomst.
}
lokala data = null;
försök {
data = http.jsondecode(body);
} catch(ex) {
_buffer += kropp;
försök {
data = http.jsondecode(_buffer);
} fånga (ex) {
hemkomst.
}
}
om (data == null) återvända;
om det är ett fel
om ("fel" i data) {
Server.log ("fick ett fel");
onError(data.errors);
hemkomst.
}
annat {
om (_looksLikeATweet(data)) {
onTweet(data);
hemkomst.
}
}
} catch(ex) {
om ett fel uppstått, åberopa fel hanterare
VidFel ([{meddelande = "Ekorre fel -" + ex, kod = -1}]);
}
} .bindenv(this)
);
}
/ *** Privata funktion - kallar inte *** /
funktion _encode(str) {
återvända http.urlencode({s = str}).slice(2);
}
funktion _oAuth1Request (postUrl, headers, data) {
lokal tid = time();
lokala nonce = tid;
lokala 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 = tid});
parm_string += "&" + http.urlencode ({oauth_token = _accessToken});
parm_string += "&" + http.urlencode ({oauth_version = "1.0"});
parm_string += "&" + http.urlencode(data);
lokala signature_string = "POST &" + _encode(postUrl) + "&" + _encode(parm_string);
lokala nyckel = format ("%s & %s", _encode(_consumerSecret), _encode(_accessSecret));
lokala sha1 = _encode (http.base64encode (http.hash.hmacsha1 (signature_string, nyckel)));
lokala 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 = \" "+ tid +"\",";
auth_header += "oauth_token = \" "+ _accessToken +"\",";
auth_header += "oauth_version=\"1.0\"";
lokala headers = {
"Tillstånd": "OAuth" + auth_header
};
lokala url = postUrl + "?" + http.urlencode(data);
lokala begäran = http.post (url, headers, "");
returnera begäran;
}
funktion _looksLikeATweet(data) {
tillbaka)
"created_at" i data & &
"id" i data & &
"text" i data & &
"användare" i data
);
}
funktion _defaultErrorHandler(errors) {
foreach (fel i fel) {
Server.log ("Fel" + error.code + ":" + error.message);
}
}
}
Twitter <-Twitter (API_KEY, API_SECRET, AUTH_TOKEN, TOKEN_SECRET);
funktion onTweet(tweetData) {
Logga tweet, och som twittrade det (det finns mycket mer information i tweetData)
Server.log (format ("%s - %s", tweetData.text, tweetData.user.screen_name));
Device.send ("tweet", null);
}
testa funktionen för manuella hamster skakar
funktion requestHandler (begäran, svar) {
försök {
Kontrollera om användaren skickas ledde som en frågeparameter
om ("tweet" i request.query) {
Device.send ("tweet", null);
}
Skicka ett svar tillbaka säger allt var OK.
Response.send (200, "tweet test ok");
} fånga (ex) {
Response.send (500, "Internal Server Error:" + ex);
}
}
Twitter.Stream ("yoursearchstring", onTweet);
registrera HTTP-hanteraren
http.OnRequest(requestHandler);
Så, här är den styrkod, baserad på den elektriska Imp PWM Servo exempel
Dessa värden kan vara olika för din servo
CONST SERVO_MIN = 0,03;
CONST SERVO_MAX = 0,1;
skapa global variabel för servo och konfigurera
servo <-hardware.pin7;
servo.configure (PWM_OUT, 0,02, SERVO_MIN);
tilldela en global variabel pin9
ledde <-hardware.pin9;
Konfigurera LED stift för DIGITAL_OUTPUT
LED.configure(DIGITAL_OUT);
global variabel att spåra aktuella status LED stift
statliga < - 0;
inställd initialvärde LED stift (0 = av, 1 = på)
LED.write(State);
förväntar sig ett värde mellan 0.0 och 1.0
funktion SetServo(value) {
lokala scaledValue = värde * (SERVO_MAX-SERVO_MIN) + SERVO_MIN;
servo.write(scaledValue);
}
förväntar sig ett värde mellan-80.0 och 80,0
funktion SetServoDegrees(value) {
lokala scaledValue = (värde + 81) / 161.0 * (SERVO_MAX-SERVO_MIN) + SERVO_MIN;
servo.write(scaledValue);
}
nuvarande position (vi ska knäppa mellan 0 och 1)
ståndpunkten < - 0;
funktion HamsterDance() {
SetServoDegrees(-10);
IMP.Sleep(0.5);
SetServoDegrees(0);
IMP.Sleep(0.2);
SetServoDegrees(-15);
IMP.Sleep(0.2);
SetServoDegrees(5);
IMP.Sleep(0.2);
SetServoDegrees(-20);
IMP.Sleep(0.2);
SetServoDegrees(0);
IMP.Sleep(0.2);
SetServoDegrees(-78);
}
funktion ShakeRattleAndRoll(ledState) {
Server.log ("Låt oss skaka hamster!");
slå på lysdioderna för visuell felsökning
LED.write(1);
//
HamsterDance();
IMP.Sleep(2);
stänga av led
LED.write(0);
}
initiera servo till startposition
SetServoDegrees(-78);
skaka hamstern när fick ett tweet meddelande från Agent
agent.on ("tweet", ShakeRattleAndRoll);