ثبت یک اپلیکیشن در توییتر با آردوینو

قبل از اینکه شروع به کدنویسی کنیم باید اپلیکیشن خود را در وب سایت تویتتر(Twitter) ثبت کنیم تا کلید های API  و رمز(توکن) دسترسی OAuth را به دست بیاوریم. OAuth یک طرح احراز هویت است که به اپلیکیشن ها امکان می دهد تا از منابع دیگر اپلیکیشن ها استفاده کنند. در اینجا ما، قصد داریم به اپلیکیشن خود این امکان را بدهیم که بدون استفاده از نام کاربری(username) و پسورد(password) خوراک یا همان feed توییتر خود را آپدیت کنیم.

برای به دست آوردن تمام اطلاعات مورد نیاز،در سایت توییتر(Twitter) دربخش اپلیکیشن ها، یک اپلیکیشن جدید ایجاد کنید. پس از اینکه در این آدرس لاگین کردید، بر روی دکمه ی Create New App کلیک کنید و فرم مورد نظر را پر کنید:

 

 پس از اینکه اپلیکیشن جدید خود را ایجاد کردید، به تب Permissions بروید و سطح دسترسی اپلیکیشن را به Read and Write تغییر دهید. سپس به تب API Keys  بروید و دکمه ی Create My Access Token را فشار دهید. این کار چند دقیقه طول می کشد. چندین بار صفحه را رفرش کنید تا توکن دسترسی(access token) در دسترس شما قرار گیرد. تب API Keys باید حاوی تمام اطلاعاتی باشد که ما برای امکان دادن به این  اپلیکیشن، برای اصلاح وضعیت توییتر(Twitter status) خود نیاز داریم. این می تواند مانند زیر باشد:

کلید API  و API secret و access token و access token secret را کپی کنید. در بخش بعدی، به این موارد نیاز خواهیم داشت. یعنی وقتی که می خواهیم پیغام ها را با استفاده از نرم افزار Processing توییت کنیم.


 توییت کردن پیغام ها با استفاده از Processing

نرم افزار  Processing از توییتر پشتیبانی نمی کند  اما در برنامه های Processing ما به کتابخاله های جاوا دسترسی مستقیم داریم  و می توانیم برای جاوا، چند کتابخانه ی خوب توییتر را پیدا کنیم. یکی از این کتابخانه ها، Twitter4J است که می خواهیم از آن به خاطر اینکه بسیار کامل است  و به طور عالی از OAuth پیشتیبانی می کند، استفاده کنیم. از این لینک، به وبسایت Twitter4j بروید و آن رادانلود کرده و به طور موقت در یک پوشه قرار دهید. بسته به ورژن ای که دارید دانلود می کنید، ممکن است در فولدر مورد نظر، نام هایی مانند زیر را پیدا کنید:

twitter4jcore-x.y.z.jar
twitter4j-core-x.y.z-SNAPSHOT.jar

 IDE نرم افزار Processing را باز کنید و یک اسکچ(sketch) جدید باز کنید، و سپس فایل jar قبلی را در این IDE درگ کنید(خواهید دید که این فایل jar. به طور اتوماتیک در یک فولدر محلی به نام code کپی می شود). این تمام کاری بود که باید انجام می دادید تا اپلیکیشن شما به کتابخامه ی Twitter4J دسترسی داشته باشد. در زیر به بررسی برخی از کدهای تکراری می پردازیم:

import processing.serial.*;

final float  MAX_WORKING_TEMP = 32.0;
final int    LINE_FEED = 10;
final int    BAUD_RATE = 9600;
final int    FONT_SIZE = 32;
final int    WIDTH = 320;
final int    HEIGHT = 240;
final String API_KEY = "<YOUR API KEY>";
final String API_SECRET = "<YOUR API SECRET>";
final String ACCESS_TOKEN = "<YOUR ACCESS TOKEN>";
final String ACCESS_TOKEN_SECRET = "<YOUR ACCESS TOKEN SECRET>";

Serial _arduinoPort;
float _temperature;
boolean _isCelsius;
PFont _font;

void setup() {
  size(WIDTH, HEIGHT);
  _font = createFont("Arial", FONT_SIZE, true);
  println(Serial.list());
  _arduinoPort = new Serial(this, Serial.list()[0], BAUD_RATE);
  _arduinoPort.clear();
  _arduinoPort.bufferUntil(LINE_FEED);
  _arduinoPort.readStringUntil(LINE_FEED);
}

void draw() {
  background(255);
  fill(0);
  textFont(_font, FONT_SIZE);
  textAlign(CENTER, CENTER);
  if (_isCelsius)
    text(_temperature + " \u2103", WIDTH / 2, HEIGHT / 2);
  else 
    text(_temperature + " \u2109", WIDTH / 2, HEIGHT / 2);
} 

 کدهای بالا در آدرس زیر قرار دارند و با باز کردن فایل TweetTemperature.pde می توانید تمام آنها را مشاهده کنید. در این مقاله، می توانید فایل های کدها را دانلود کنید:

Ethernet/TweetTemperature/TweetTemperature.pde

مثل همیشه، ما کتابخانه های سریال(serial libraries) را  برای ارتباط با آردوینو ایمپورت(import) می کنیم و سپس به تعریف برخی ثابت ها(constant) که بعدا به آنها نیاز داریم، می پردازیم. اکثر این ثابت ها، حاوی اعتبارنامه هایی(credentials) برای دسترسی به سرویس توییتر به آنها نیاز داریم هستند. با استفاده از ثابت MAX_WORKING_TEMP ما می توانیم تعیین کنیم که برنامه در چه دمایی شروع به توییت کردن کند. دمای مورد نظر می تواند به سلسیوس(Celsius) یا فارنهایت(Fahrenheit) باشد. در باقی کدها، چند مقدار را تعریف می کنیم که برای رابط کاربری به آنها نیاز داریم؛ مثل عرض صفحه(screen width) و ارتفاع صفحه(screen height) و سایز فونت(font size).

پس از آن، ما تعدادی متغیر عضوی(member variable) تعریف می کنیم. متغیر arduinoPort_ حاوی یک ارجاع به آبجکت Serial است که از آن برای ارتباط با آردوینو استفاده می کنیم. متغیر temperature_ حاوی آخرین مقدار دمایی است که ما آن را از آردوینو دریافت کرده ایم. و اگر مقداری(value) که می خوانیم به درجه ی سلسیوس باشد، متغیر isCelsius_ برابر با true خواهد شد. ما برای تعریف کردن فونتی که از آن برای نشان دادن دما در صفحه ی نمایش نیاز داریم، از متغیر font_ استفاده می کنیم.

 سپس ما در متد setup سایز پنجره(window size) را تنظیم می کنیم و پس از آن، فونت دلخواه خود را تعریف می کنیم. سپس در خط 22، لیستی از تمام دستگاه های سریال(serial devices) در دسترس را چاپ(print)می کنیم. در ادامه ما متغیر arduinoPort_ را با اولین مقدار، مقداردهی اولیه(initialize) می کنیم به امید اینکه پورت یک آردوینو باشد.

 شما همچنین می توانید بر روی لیست مورد نظر به طور اتوماتیک حلقه بزنید و به جستجوی چیزی شبیه یک نام پورت آردوینو بگردید، اما این کار ضعیف است. در خط 24، متد clear را فراخوانی می کنیم تا بافر پورت سریال را خالی و پاک کند. در خط 25، با استفاده از متد bufferUntil مطمئن می‌شویم که فقط زمانی که یک کاراکترتعویض خط(linefeed)دریافت کرده‌ایم، از رویدادهای سریال(serial events) مطلع می‌شویم.

در خط 26، با فراخوانی متد readStringUntil مطمئن می شویم که کار را با یک بافر سریال تازه(a fresh serial buffer) شروع کرده ایم که حاوی هیچ خطی از داده های ناکامل(incomplete line of data) نباشد.

 متد draw آخرین دمایی که دریافت کرده ایم را در صفحه ی نمایش چاپ می کند. این مت، از متد background برای تعیین رنگ پس زمینه به سفید(white) استفاده می کند و از متد fill برای مشخص کردن رنگ متن استفاده می کند. سپس فونت را مشخص می کند و مطمئن می شود که متنی که ما داریم چاپ می کنیم، به طور افقی(horizontally) و عمودی(vertically) در وسط قرار داده شده باشد. در نهایت ما با استفاده از متد text دما را چاپ می کنیم.

 برای اینکه نتیجه زیباتر به نظر برسد، ما برای درجه ی سلسیوس، از کاراکتر رسمی یونیکد (\u2103)  و برای فارنهایت از (\u2109)  استفاده می کنیم. حالا بیایید منطق زنگ هشدار را پیاده سازی کنیم:

void serialEvent(Serial port) {
  final String arduinoData = port.readStringUntil(LINE_FEED);
  if (arduinoData != null) {
    final String[] data = split(trim(arduinoData), ' ');
    if (data.length == 2 && 
        (data[1].equals("C") || data[1].equals("F")))
    {
      _isCelsius = data[1].equals("C");
      _temperature = float(data[0]);
      if (Float.isNaN(_temperature))
        return;
      println(_temperature);
      int sleepTime = 5 * 60 * 1000;
      if (_temperature > MAX_WORKING_TEMP) {
        tweetAlarm();
        sleepTime = 120 * 60 * 1000;
      }
      try {
        Thread.sleep(sleepTime);
      }
      catch(InterruptedException ignoreMe) {}
    }
  }
}

void tweetAlarm() {
  ConfigurationBuilder cb = new ConfigurationBuilder();
  cb.setDebugEnabled(true)
    .setOAuthConsumerKey(API_KEY)
    .setOAuthConsumerSecret(API_SECRET)
    .setOAuthAccessToken(ACCESS_TOKEN)
    .setOAuthAccessTokenSecret(ACCESS_TOKEN_SECRET);
  TwitterFactory tf = new TwitterFactory(cb.build());
  Twitter twitter = tf.getInstance();  
  try {
    Status status = twitter.updateStatus(
      "Someone, please, take me to the beach!"
    );
    println(
      "Successfully updated status to '" + status.getText() + "'."
    );
  }
  catch (TwitterException e) {
    e.printStackTrace();
  }
}

این فایل ادامه ی کدهای قبلی است و در آدرس زیر قرار دارد:

Ethernet/TweetTemperature/TweetTemperature.pde

 هنگامی که داده های جدید بر روی پورت سریال دریافت می شوند، محیط اجرای نرم افزار Processing متد serialEvent را فراخوانی می کند. در آنجا سعی می کنیم یک خط از متن را بخوانیم و سپس برری کنیم که آیا این متن، حاوی یک عدد دسیمال، که به دنبال آن یک فاصله ی خالی و یک علامت C یا F وجود دارد، هست یا نه. با این کار، اطمینان حاصل می کنیم که یک داده ی دمای حقیقی را خوانده ایم و نه یک مقدار دیجیتال زباله. اگر داده های دما از نظر سینتکس دلخواه ما(شیوه ی نوشتن) صحیح باشند ، ما آن را به یک آبجکت float تبدیل می کنیم و بررسی می کنیم که آیا این مقدار، بزرگتر از  MAX_WORKING_TEMP است یا نه. در این برنامه، هیچ کس نباید مجبور شود در دماهای بالا کار کند؛ اگر هم مجبور شود، ما متد tweetAlarm را فراخوانی می کنیم  و یک پیغام را توییت می کنیم تا برخی از فالوورها ما را نجات دهند.

سپس دو ساعت تا بررسی بعدی خود صبر می کنیم. در غیر این صورت، پنج دقیقه صبر می کنیم و دوباره دما را بررسی می کنیم. متد tweetAlarm وضعیت توییتر(status ) ما را آپدیت می کند و این کار ساده است.

در سنت خوب و قدیمی جاوا، ما با استفاده از یک TwitterFactory یک نمونه ی جدید توییتر(new Twitter instance) را ایجاد می کنیم. این factory انتظار یک آبجکت ConfigurationBuilder را دارد که ما با اعتبار برنامه توییتر خود آن را مقداردهی اولیه کرده ایم.


 توییت کردن توسط آردوینو

Botanicalls یک کیت سخت افزاری مفید است. این کیت بررسی می کند که آیا گیاهان شما نیاز به آب دارند یا نه. و اگر نیاز داشته باشند، این کیت یک پیغام هشدار را از طریق سایت توییتر ارسال می کند. به محض اینکه به گیاه خود آب دهید، کیت Botanicalls یک پیغام تشکر thank you را ارسال می کند. با اینکه نسخه ی رسمی Botanicalls یک قطعه سخت افزاری تخصصی است، اما می توانیم آن را با استفاده از آردوینو ایجاد کنیم؛ برای انجام این کار، اینجا کلیک کنید. Botanicalls باعث ساده شدن زندگی می شود.

اینکه آیا دستگاه های فروش خودکار توییتینگ زندگی شما را بهبود می بخشد یا نه یک موضوع سلیقه ای است. کاربران این دستگاه فروش تغییر یافته باید خود را با استفاده از کارت RFID شناسایی کنند.هر زمان که آنها شیرینی می خرند، دستگاه فروش خودکار نام آنها و آنچه را که خریده اند توییت می کند.


 در نهایت ما در خط 36 متد updateStatus را فراخوانی می کنیم. اگر همه چیز خوب پیش برود، یک پیغام موفقیت آمیز در کنسول(console) چاپ می شود. اما اگر اشتباهی رخ دهد، متد updateStatus یک هشدار(exception) صادر می کند و پشته ی ردیابی خطا(stack trace) برای فرایندهای دیباگ کردن چاپ می شود. تمام کدهایی که نیاز داریم، همین است؛ بنابراین آردوینوی خود را به رایانه متصل کنید و کدها را اجرا کنید. 

تصویر زیر، نشان می دهد که اگر دمای اتاق کار من بیشتر از 32 درجه ی سلسیوس باشد، چه اتفاقی در توییتر می افتد. اگر اولین بار است که می خواهید تست انجام دهید، ممکن است مجبور شوید دمایی کمتر از 32.0 را انتخاب کنید:

 

بهتر است که از یک رایانه ی تمام عیار برای اتصال به اینترنت استفاده شود اما ممکن است ظرفیت های این رایانه برای بیشتر اپلیکیشن ها بیش از حد باشد. در بخش بعدی، یاد می گیرید که چگونه یک آردوینو را به یک دستگاه شبکه(networking device) تبدیل کنید.

برای نظردهی، در سایت عضو شوید یا به آن وارد شوید!

ستاره غیر فعالستاره غیر فعالستاره غیر فعالستاره غیر فعالستاره غیر فعال