Wednesday Jan 22, 2014

How to Build Your Own $3.2bln Nest Startup Using Java SE Embedded Tech (Part 1)

As we all saw recently, the company that starts with the letter "G" up Highway 101 in Mountain View bought Nest Labs for $3.2 billion (with a "b"), maker of the Internet of Things (IoT) Nest thermostat. Well, here's your chance in this new Java SE Embedded IoT blog series, to learn how to build your own $3.2 billion Nest Startup using a Raspberry Pi, some hobby electronic parts, and Java SE Embedded Technology.

This blog series was inspired by Spark Team's Arduino Based blog post at the spark.io. But, we'll use a more powerful but still inexpensive Raspberry Pi, and we'll base the software on Java SE Embedded which is a much more powerful programming language and platform than you can ever find on the Arduino.

This project will need the following parts:

So, for the low total cost of about $125.28 (plus tax and shipping) you can build your own $3.2 billion IoT startup company. Well... maybe, the start of a $3.2 billion IoT startup company, but you'll have a nifty IoT Java SE Embedded enabled home thermostat in the end, regardless. And, that's just as good as a $3.2 billion IoT startup, right? ;-)

Come back for the next steps in this series, to get you on your way...

Full series of steps:
How to Build Your Own $3.2bln Nest Startup Using Java SE Embedded Tech (Part 1)
How to Build Your Own $3.2bln Nest Startup Using Java SE Embedded Tech (Part 2)
How to Build Your Own $3.2bln Nest Startup Using Java SE Embedded Tech (Part 3)
How to Build Your Own $3.2bln Nest Startup Using Java SE Embedded Tech (Part 4)
How to Build Your Own $3.2bln Nest Startup Using Java SE Embedded Tech (Part 5)
How to Build Your Own $3.2bln Nest Startup Using Java SE Embedded Tech (Part 6)
How to Build Your Own $3.2bln Nest Startup Using Java SE Embedded Tech (Part 7)
How to Build Your Own $3.2bln Nest Startup Using Java SE Embedded Tech (Part 8)
How to Build Your Own $3.2bln Nest Startup Using Java SE Embedded Tech (Part 9)
<<< Previous  | Next >>>

Friday Jan 10, 2014

Happy Java SE Embedded Enabled Internet of Things (IoT) New Year!

Whew! That's a mouthful to say. How about if I just say, "Happy Java-Is-the-Best-for-IoT New Year!" That's better. In 2014, for this blog I hope to explore new and interesting ways to make your Internet of Things smarter by using Java SE Embedded.

As a look back at 2013, you can see by my blog statistics (in the picture) that it seems like there were a lot of embedded developers out there who were interested in the blossoming IoT topics that my blog covered over the past 12 months.

You can also see my blog's Page Views, Unique Visits, and Returning Visits for all of 2013 vs. all of 2012 (for comparison).

See:

My Blog 2013 vs. 2012 Summary

The overall numbers for 2013 look great, with 152,262 unique visitors who stopped to read my blog last year (2013) compared to 108,162 of you who stopped by in the previous year (2012). And, the 2013 visitors read 202,818 pages of my blog for all of last year. Whew! That's a lot of pages read!

Thanks to all who follow my blog! As you can also see in the chart, last year there were 16,183 returning visitors to my blog compared to 7,738 returning visitors in 2012. So, hopefully, I will keep posting technical updates, DIY IoT projects, and interesting news and articles about Java SE Embedded in 2014 to match what you all wanted in 2013 when there was such a big uptick in my return visitors.

Leave me a comment if there are any specific topics you'd like me to cover related to Java SE Embedded, Internet of Things, and how to make embedded devices smarter for 2014.

In the meantime, I hope everyone has a Happy New Year! :-D

Tuesday Dec 24, 2013

Internet of Things (IoT) Christmas Special: Santa Detector (Part 5)

Well, this wraps up the Internet of Things (IoT) Christmas Special! Hope you enjoyed seeing the steps for creating the Java SE Embedded enabled Santa Detector!

The last step is to place the Raspberry Pi device connected to your Parallax PIR motion sensor nearby a plate of cookies and a glass of milk tonight. Then, start your Java SE Embedded SantaDetector.java app on the RPi before you go to bed, and tomorrow morning you and your child should see a tweet around midnight that shows that Santa came by.

(NOTE to parents [VERY IMPORTANT]: Remember to, you know, do the "thing" with the "thing" at around *mumble-mumble*. Got it? Nudge-nudge, wink-wink...) ;-)

Here's the full compilable Java source code again for reference:
https://java.net/projects/orbit/downloads/download/SantaDetector.java

That's a wrap!

Have a very Merry Christmas and a Happy Internet of Things (IoT) New Year! ;-)

See the full series of steps:
Internet of Things (IoT) Christmas Special: Santa Detector (Part 1)
Internet of Things (IoT) Christmas Special: Santa Detector (Part 2)
Internet of Things (IoT) Christmas Special: Santa Detector (Part 3)
Internet of Things (IoT) Christmas Special: Santa Detector (Part 4)
Internet of Things (IoT) Christmas Special: Santa Detector (Part 5)
<<< Previous  | Next >>>

Monday Dec 23, 2013

Internet of Things (IoT) Christmas Special: Santa Detector (Part 4)

So, let's take a closer look at the Java SE Embedded code snippet that will send out a tweet when the Santa Detector Raspberry Pi motion sensor is triggered, which will let the Oracle cloud and the Twitterverse know when Santa has arrived at your house. And, if you are doing this project with your child, it will prove once and for all that yes, there is a Santa Claus. Yay!

Here's the full compilable Java source code again for reference:
https://java.net/projects/orbit/downloads/download/SantaDetector.java

0. First, you need to have a Twitter 
account and you need to create your 
own Santa Detector Twitter app to 
make this work.  

Just follow the steps here:
Create Santa Detector Twitter App

And, make sure to do the following extra steps to make your Twitter app "Read and Write" enabled:

 1. Go to your Twitter app account by signing
  in with our Twitter login info:
    https://dev.twitter.com/
 2. Select your account icon -> My Applications
 3. Select the Santa Detector app (To create the
  app: see above)
 4. Click on the Settings tab
 5. In the section "Application Type Access:",
  select "Read and Write"
 6. Check the box for "Allow this application 
  to be used to Sign in with Twitter"
 7. Click "Update this Twitter's app settings"
 8. Click on the Details tab
 9. Refresh your Web browser
10. Make sure the Access level says: 
  "Read and write"
11. Copy the Twitter app information from the
  page into the SantaDetector.java code (Java
  variables near the top of the file):
   OAuth setting: Consumer Key
   OAuth setting: Consumer Secret
   Access token: Access token
   Access token: Access token secret

Next, take a look at the code snippet in the SantaDetector.java file that will send the tweet by calling the Java method tweetStatus():

 static void tweetStatus(String statusStr) {

        boolean verboseFlag = true;
        String requestURIEnc = null;

        try {
            requestURIEnc = URLEncoder.encode(requestURI, "UTF-8");
        } catch (UnsupportedEncodingException uee) {
            uee.printStackTrace();
        }

        try {

            if (statusStr == null) {
                statusStr = "Tweet, tweet.  Hello world!";
            }

            // Construct encoded string, parameter encoded string, & data
            String statusEncStr = URLEncoder.encode(statusStr, "UTF-8");

            // Param encode status string twice: once for unsafe characters 
            //  String, once for escaping % for Signature base string
            String statusUnsafeEncStr = unsafeEncode(unsafeEncode(statusStr));

            String postData = "status=" + statusEncStr;

            // First set the default cookie manager
            CookieHandler.setDefault(new CookieManager(null,
                    CookiePolicy.ACCEPT_ALL));

            // Send postData
            URL url = new URL(requestURI);

            HttpsURLConnection conn = (HttpsURLConnection) 
		url.openConnection();
            conn.setDoOutput(true);
            conn.setRequestMethod("POST");

            // Get current date time with Calendar()
            Calendar cal = Calendar.getInstance();
            String timeStr = String.
                    valueOf(cal.getTimeInMillis()).substring(0, 10);

            String basestring = "POST&" + requestURIEnc
                    + "&oauth_consumer_key%3D" + consumerKey
                    + "%26oauth_nonce%3D5bffa3b2711bbcdaa4f301" + timeStr
                    + 
                   "%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D"
                    + timeStr + "%26oauth_token%3D" + accessToken
                    + "%26oauth_version%3D1.0" + "%26status%3D"
                    + statusUnsafeEncStr;

            String secretsStr = consumerSecret + "&" + accessTokenSecret;
            SecretKeySpec keySpec
                    = new SecretKeySpec(secretsStr.getBytes(),
                            "HmacSHA1");

            Mac mac = Mac.getInstance("HmacSHA1");
            mac.init(keySpec);
            byte[] result = mac.doFinal(basestring.getBytes());

            String signature = URLEncoder.encode(base64Encode(result), 
						 "UTF-8");

            String credentials
                    = "oauth_consumer_key=\"" + consumerKey + "\","
                    + "oauth_nonce=\"5bffa3b2711bbcdaa4f301" + timeStr
                    + "\","
                    + "oauth_signature=\"" + signature + "\","
                    + "oauth_signature_method=\"HMAC-SHA1\","
                    + "oauth_timestamp=\"" + timeStr + "\","
                    + "oauth_token=\""
                    + accessToken + "\","
                    + "oauth_version=\"1.0\"";

            conn.addRequestProperty("Authorization", "OAuth " + credentials);

            String lenStr = String.valueOf(postData.length());
            conn.setRequestProperty("Content-Length", lenStr);
            conn.setRequestProperty("Content-Type",
                    "application/x-www-form-urlencoded");

            // Do as if you're using Firefox 3.6.3
            conn.setRequestProperty("User-Agent",
                    "Mozilla/5.0 (Windows; U; Windows NT 5.1; "
                    + "en-US; rv:1.9.2.3) Gecko/20100401");

            if (tweetFlag) {
                conn.connect();
                OutputStream output = conn.getOutputStream();

                output.write(postData.getBytes("UTF-8"));

                // Get the response
                InputStream response = conn.getInputStream();
                BufferedReader rd
                        = new BufferedReader(new InputStreamReader(response));
                String line;
                while ((line = rd.readLine()) != null) {
                    if (verboseFlag) {
                        System.out.println(line);
                    }
                }
                rd.close();
            }
            
            System.out.println("Tweet status = " + statusStr +
                    "\n basestring = " + basestring);

        } catch (IOException | NoSuchAlgorithmException |
                InvalidKeyException | IllegalStateException e) {
            e.printStackTrace();
        }
    }

You see that you can take the above code snippet and just make a tweetStatus library out of it. It is self contained as long as you add the following utilities that need to go along with it.

    public static String unsafeEncode(String input) {
        StringBuilder resultStr = new StringBuilder();
        for (char ch : input.toCharArray()) {
            if (isUnsafe(ch)) {
                resultStr.append('%');
                resultStr.append(toHex(ch / 16));
                resultStr.append(toHex(ch % 16));
            } else {
                resultStr.append(ch);
            }
        }
        return resultStr.toString();
    }

    private static char toHex(int ch) {
        return (char) (ch < 10 ? '0' + ch : 'A' + ch - 10);
    }

    private static boolean isUnsafe(char ch) {
        if (ch > 128 || ch < 0) {
            return true;
        }
        return "$&+,/:;=?@ \"<>#%{}|\\^~[]`'!_*".indexOf(ch) >= 0;
    }

    private final static char[] BASE64CHARS
           = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
           .toCharArray();

    private static final int[] intChars = new int[128];

    /**
     * Translates the specified byte array into Base64 string.
     *
     * @param inputBuffer byte array (not null)
     * @return the translated Base64 string (not null)
     */
    public static String base64Encode(byte[] inputBuffer) {

        // Check if intChars array needs to be init'd
        if (intChars.length == 0) {
            for (int index = 0; index < BASE64CHARS.length; index++) {
                intChars[BASE64CHARS[index]] = index;
            }
        }

        int bufferSize = inputBuffer.length;
        char[] charArray = new char[((bufferSize + 2) / 3) * 4];
        int charIndex = 0;
        int inputIndex = 0;
        while (inputIndex < bufferSize) {
            byte byte0 = inputBuffer[inputIndex++];
            byte byte1 = (inputIndex < bufferSize)
                    ? inputBuffer[inputIndex++] : 0;
            byte byte2 = (inputIndex < bufferSize)
                    ? inputBuffer[inputIndex++] : 0;

            int mask = 0x3F;
            charArray[charIndex++] = BASE64CHARS[(byte0 >> 2) & mask];
            charArray[charIndex++] = BASE64CHARS[((byte0 << 4)
                    | ((byte1 & 0xFF) >> 4)) & mask];
            charArray[charIndex++] = BASE64CHARS[((byte1 << 2)
                    | ((byte2 & 0xFF) >> 6)) & mask];
            charArray[charIndex++] = BASE64CHARS[byte2 & mask];
        }

        switch (bufferSize % 3) {
            case 1:
                charArray[--charIndex] = '=';
            case 2:
                charArray[--charIndex] = '=';
        }

        return new String(charArray);
    }


So, that's all there is to it to enable your Santa Detector to tweet when Santa has arrived. In the next blog post, we'll wrap it all up and figure out where to place the Raspberry Pi with the sensor for best coverage...

It's almost Christmas Eve, so get ready! ;-)

See the full series of steps:
Internet of Things (IoT) Christmas Special: Santa Detector (Part 1)
Internet of Things (IoT) Christmas Special: Santa Detector (Part 2)
Internet of Things (IoT) Christmas Special: Santa Detector (Part 3)
Internet of Things (IoT) Christmas Special: Santa Detector (Part 4)
Internet of Things (IoT) Christmas Special: Santa Detector (Part 5)
<<< Previous  | Next >>>

Sunday Dec 22, 2013

Internet of Things (IoT) Christmas Special: Santa Detector (Part 3)

Admiral Ackbar Santa thinks our Santa Detector is a trap. Well, he's right! We are setting up our Internet of Things (IoT) Santa Detector to catch Santa in the act on Christmas Eve to tell the world whether Santa Claus exists.

(I have a sneaky suspicion that we will detect Santa Claus on Christmas Eve and prove his existence. But, that's just a hunch... ;-) )

Admiral Ackbar Santa really shouldn't worry. We're not really going to try to trap Santa, just tweet when he's detected by our Java SE Embedded application.

So, you've followed the directions, so far, now you just need the Java source code for the Java SE Embedded app to run on your Raspberry Pi connected with a Parallax PIR sensor.

Here's the full Java source code that you'll need:
https://java.net/projects/orbit/downloads/download/SantaDetector.java

Here's a code excerpt from the full file above of Java SE Embedded code that uses the GPIO port on your Raspberry Pi connected to the Parallax PIR sensor to read in a value to detect if Santa is standing in front of the strategically located bait, er, um... I mean, plate of cookies and glass of milk:

//
// Init GPIO port(s) for input
//

// Open file handles to GPIO port unexport and export controls
FileWriter unexportFile = 
    new FileWriter("/sys/class/gpio/unexport");
FileWriter exportFile = 
    new FileWriter("/sys/class/gpio/export");
                
for (String gpioChannel : GpioChannels) {
    System.out.println("Activating GPIO port: "
		       + gpioChannel);

    // Reset the port
    File exportFileCheck = new File("/sys/class/gpio/gpio" + gpioChannel);
    if (exportFileCheck.exists()) {
	unexportFile.write(gpioChannel);
	unexportFile.flush();
    }

    // Set the port for use
    exportFile.write(gpioChannel);
    exportFile.flush();
    // Open file handle to input/output dir control of port
    FileWriter directionFile
	= new FileWriter("/sys/class/gpio/gpio"
			 + gpioChannel + "/direction");

    // Set port for input
    directionFile.write(GPIO_IN);
}
                
// Open RandomAccessFile handle for each GPIO port
for (int channum=0; channum < raf.length; channum++) {
    raf[channum] = new RandomAccessFile("/sys/class/gpio/gpio"
					+ GpioChannels[channum] + 
					"/value", "r");
}

//...


// Loop to keep reading sensor value
while (true) {
    int available;
            
	// Use RandomAccessFile handle to read in GPIO port value
	for (int channum=0; channum < raf.length; channum++) {
            
	    try {
		// Reset file seek pointer to read latest value 
		//   of GPIO port
		raf[channum].seek(0);
		raf[channum].read(inBytes);
	    } catch (IOException ioe) {
		ioe.printStackTrace();
	    }
                        
	    inLine = new String(inBytes);
            
	    // Check if "on" value was read
	    if (inLine.equals("1")) {

		// Specially mark value non-zero value
		gpioPortVal = 1;
		  
	    } else {
		// Else, no "on" value read
		gpioPortVal = 0;
	    }

	    System.out.println("Reading GPIO Port: " + 
			       GpioChannels[channum] +
			       "  Time: "+ timedateString + "  GPIO value = " + 
			       gpioPortVal);
	}
    }

So, as you can see in the code snippet above, the Java source code just keeps reading from the GPIO port where the PIR sensor is connected, whether it has a value of "0" (no motion detected) or "1" (motion detected), and that will tell us if Santa is there in front of the plate of cookies and glass of milk.

In the next blog post, we'll look at the Java code that will send out a Tweet when that happens, letting the cloud know when Santa has arrived at our location.

So, don't worry Admiral Ackbar Santa, it's all good! ;-)

See the full series of steps:
Internet of Things (IoT) Christmas Special: Santa Detector (Part 1)
Internet of Things (IoT) Christmas Special: Santa Detector (Part 2)
Internet of Things (IoT) Christmas Special: Santa Detector (Part 3)
Internet of Things (IoT) Christmas Special: Santa Detector (Part 4)
Internet of Things (IoT) Christmas Special: Santa Detector (Part 5)
<<< Previous  | Next >>>

Friday Dec 20, 2013

Internet of Things (IoT) Christmas Special: Santa Detector (Part 2)

Now, that you have all your parts, you should have this important part which is the motion sensor itself. It detects infrared motion and will light an internal LED and send a signal to the Java SE Embedded app when something (or someone like Santa Claus) passes in front of it.

The Raspberry Pi has enough power to also power this sensor, so you will next need to connect this part to your Raspberry Pi.

Just look at the next photo how it's done.

Flip the sensor over so that you can see the bottom of the circuit board where the labels are.

See: GPIO pin layout

Connect the left connector (OUT) to Pin #26 (GPIO07) on your Raspberry Pi GPIO bus. Connect the middle connector (VCC) to Pin #2 (+5 volts). And, connect the right connector (GND) to Pin #6 (GND) on your RPi.

And, that's it for the hardware part. Not too bad.

Next up we'll write a Java SE Embedded app to test the motion sensor. Santa won't have a chance this year... :-)

See the full series of steps:
Internet of Things (IoT) Christmas Special: Santa Detector (Part 1)
Internet of Things (IoT) Christmas Special: Santa Detector (Part 2)
Internet of Things (IoT) Christmas Special: Santa Detector (Part 3)
Internet of Things (IoT) Christmas Special: Santa Detector (Part 4)
Internet of Things (IoT) Christmas Special: Santa Detector (Part 5)
<<< Previous  | Next >>>

Thursday Dec 19, 2013

Internet of Things (IoT) Christmas Special: Santa Detector (Part 1)

Ho ho ho! It's time for an Internet of Things (IoT) Christmas Special project for Java SE Embedded on your Raspberry Pi. This one you can do with your kid. It's a Santa Detector, which was inspired by John Murphy's Arduino project.

This project will take a Parallax Passive Infra-Red sensor connected to your Raspberry Pi and a Java SE Embedded application code to send a Tweet when Santa has arrived at your house.

With this IoT Christmas Special project, there's going to be no way for Santa to sneak past your child this year. Heh, heh, heh... (or, should I say, "Ho, ho, ho"?) ;-)

Here is the parts list:

 1 Parallax PIR Sensor (Fry's #6726705)
 1 Raspberry Pi
 1 Milk and Cookies (for concealment)

So, go out and buy the parts above and come back here for the rest of the steps... "You better watch out, la-la-lala-laaa..."

See the full series of steps:
Internet of Things (IoT) Christmas Special: Santa Detector (Part 1)
Internet of Things (IoT) Christmas Special: Santa Detector (Part 2)
Internet of Things (IoT) Christmas Special: Santa Detector (Part 3)
Internet of Things (IoT) Christmas Special: Santa Detector (Part 4)
Internet of Things (IoT) Christmas Special: Santa Detector (Part 5)
<<< Previous  | Next >>>

Wednesday Dec 18, 2013

Why develop with Java SE Embedded on Raspberry Pi?

Why would you want to develop using Java SE Embedded technology on your Raspberry Pi? Why? Well, that question is like, "Why would you want to breathe in air?" It's just natural, of course.

But, if you're not convinced, check out this great article by Simon Ritter that appeared as a recent Electronic Design article.

See:

Java and RPi


Here's a quote:

 There are numerous reasons that make
 Java an attractive platform for 
 developing embedded type applications 
 using the Raspberry Pi:

 The very comprehensive set of included 
 class libraries. Java SE 7 has almost 
 4000 class libraries covering everything 
 from data structures to concurrency to 
 networking. This saves a lot of time by 
 not having to keep re-inventing the 
 wheel.
And, the big reason is that you'll want to use Java SE Embedded on your Raspberry Pi to follow along with my upcoming Internet of Things (IoT) Christmas Special. Now that's the best reason! ;-)

Thursday Dec 05, 2013

Happy Internet of Things (IoT) Hanukkah from Java SE Embedded!

Hope everyone has a happy Internet of Things (IoT) Hanukkah from Java SE Embedded and this Rasberry Pi running a Java SE Embedded app to light up the 8th night menorah light.

Here's the holiday Java code for your Internet of Things (IoT) menorah:

/*
 * Java Embedded Raspberry Pi GPIO app
 */

import java.io.FileWriter;
import java.io.File;

/**
 *
 * @author hinkmond
 */
public class JavaEmbMenorah {
    
    static final String GPIO_OUT = "out";
    static final String GPIO_ON = "1";
    static final String GPIO_OFF = "0";
    
    static String[] GpioChannels = 
    { "0", "1", "4", "17", "21", "22", "10", "9", "11" };

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        FileWriter[] commandChannels;
        
        try {
            
            /*** Init GPIO port for output ***/
            
            // Open file handles to GPIO port unexport and export controls
            FileWriter unexportFile = 
                    new FileWriter("/sys/class/gpio/unexport");
            FileWriter exportFile = 
                    new FileWriter("/sys/class/gpio/export");

            for (String gpioChannel : GpioChannels) {
                System.out.println(gpioChannel);
    
                // Reset the port
                File exportFileCheck = new File("/sys/class/gpio/gpio"+gpioChannel);
                if (exportFileCheck.exists()) {
                    unexportFile.write(gpioChannel);
                    unexportFile.flush();
                }
            
                // Set the port for use
                exportFile.write(gpioChannel);   
                exportFile.flush();

                // Open file handle to port input/output control
                FileWriter directionFile =
                    new FileWriter("/sys/class/gpio/gpio" + gpioChannel + 
                        "/direction");
            
                // Set port for output
                directionFile.write(GPIO_OUT);
                directionFile.flush();
            }
            
            /*** Send commands to GPIO port ***/
            
            commandChannels = new FileWriter[GpioChannels.length];
            
            for (int channum=0; channum < GpioChannels.length; channum++) {
                
                // Open file handle to issue commands to GPIO port
                commandChannels[channum] = 
                        new FileWriter("/sys/class/gpio/gpio" +
                        GpioChannels[channum] + "/value");
            }
            
            int channum = 0;
            int sleepPeriod = 1000; // (1 sec. in milliseconds)
            // Loop forever
            while (true) {
                
                if (++channum >= GpioChannels.length) {
                    channum = 0;
                }
                
                // Refresh Menorah Lights
                commandChannels[channum].write(GPIO_ON);
                commandChannels[channum].flush();
               
                
                // Wait for a while
                java.lang.Thread.sleep(sleepPeriod);
        
            }

        } catch (Exception exception) {
            exception.printStackTrace();
        }
    }
}

Monday Dec 02, 2013

Java Embedded Holiday Gift Idea: Choose PS4 with Java ME CDC, not Xbox One

Here's a holiday gift idea for the 2013 shopping season: When shopping for one of those new generation fancy-schmancy video game consoles, make sure to choose the Sony PS4, which has the Java ME CDC platform built into the PS4 Blu-ray player. The Java ME CDC platform (which the Java ME CDC team and I helped work on at Sun Microsystems, Inc. and now at Oracle) ships on many devices found on store shelves today, such as the PS4.

So, for commercially shipping (and profitable) Java products (such as Java ME CDC) on the PS4, make sure to pick the gift that comes with Java technology for your friends and family. Plus, the PS4 is a kick-b*tt console compared to the Xbox One, so you can't go wrong. ;-)

Happy Java Technology-Enabled Cyber Monday!

Wednesday Nov 27, 2013

Internet of Things (IoT) Thanksgiving Special: Turkey Tweeter (Part 6)

So, that's a wrap everyone. Hope you enjoyed the Internet of Things (IoT) Thanksgiving Special: Turkey Tweeter!

Leave me feedback on this project in the blog comments (open for 1 week), if you used it for your holiday bird, or if you just followed along and had fun reading. It's good to hear if you ran into any problems or have any questions about using Java SE Embedded for your own Internet of Things project. (Tech support [me] will be open for a few hours tomorrow if you have issues, but response time will vary according to which football game is on) :-)

So remember: Java technology is a great way to rapidly develop your own IoT applications.

Also, send links to your Twitter accounts if you get them working from your Raspberry Pi. I'll be sure to follow your Twitter feed of your own Java SE Embedded IoT device, and be sure to follow mine at: https://twitter.com/iottweet

A very Happy Thanksgiving (and Happy Hanukkah) to all!

Here are the full steps to this project:
Internet of Things (IoT) Thanksgiving Special: Turkey Tweeter (Part 1)
Internet of Things (IoT) Thanksgiving Special: Turkey Tweeter (Part 2)
Internet of Things (IoT) Thanksgiving Special: Turkey Tweeter (Part 3)
Internet of Things (IoT) Thanksgiving Special: Turkey Tweeter (Part 4)
Internet of Things (IoT) Thanksgiving Special: Turkey Tweeter (Part 5)

Happy Turkey Tweeting!

Monday Nov 25, 2013

Internet of Things (IoT) Thanksgiving Special: Turkey Tweeter (Part 4)

Now, on to the next step which is to write the Java SE Embedded code to automatically send an Internet of Things (IoT) tweet from your Raspberry Pi attached to your cooking turkey to a Twitter account. For this part you'll need to create your own Twitter app for your IoT Turkey, which is easy to do. Just follow the steps: here

After you are done with the above steps to create your own Twitter app, make note of the following settings from your Twitter app:

 1. OAuth setting: Consumer Key
 2. OAuth setting: Consumer Secret
 3. Access token: Access token
 4. Access token: Access token secret

You will use your Twitter app values from above in your Java Embedded program. Just replace the above values into the following Java Embedded code:

    // Application Defined Settings
    static String consumerKey = "XXXXXXXXXXXXXXXXXXXXXX";
    static String consumerSecret = 
            "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
    static String accessToken = 
            "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
    static String accessTokenSecret = 
            "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"; 
    
    static String requestURI = "https://api.twitter.com/1.1/statuses/update.json";

Next, here is the code to send the tweet:

    void tweetStatus(String statusStr) {

        boolean verboseFlag = true;
        String requestURIEnc = null;
        
        try {
            requestURIEnc = URLEncoder.encode(requestURI, "UTF-8");
        } catch (UnsupportedEncodingException uee) {
            uee.printStackTrace();
        }
        
        try {

            if (statusStr == null) {
              statusStr = "Tweet, tweet.  Hello world!";
            }

            // Construct encoded string, parameter encoded string, & data
            String statusEncStr = URLEncoder.encode(statusStr, "UTF-8");

            // Param encode status string twice: once for unsafe characters 
            //  String, once for escaping % for Signature base string
            String statusUnsafeEncStr = unsafeEncode(unsafeEncode(statusStr));

            String postData = "status="+statusEncStr;

            // First set the default cookie manager
            CookieHandler.setDefault(new CookieManager(null,
                    CookiePolicy.ACCEPT_ALL));

            // Send postData
            URL url = new URL("https://api.twitter.com/1.1/statuses/update.json");

            HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
            conn.setDoOutput(true);
            conn.setRequestMethod("POST");

            // Get current date time with Calendar()
            Calendar cal = Calendar.getInstance();
            String timeStr = String.
                    valueOf(cal.getTimeInMillis()).substring(0, 10);

            String basestring = "POST&" + requestURIEnc + 
                    "&oauth_consumer_key%3D" + consumerKey + 
                    "%26oauth_nonce%3D5bffa3b2711bbcdaa4f301" + timeStr + 
                    "%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D" 
                    + timeStr + "%26oauth_token%3D" + accessToken + 
                    "%26oauth_version%3D1.0" + "%26status%3D" + 
                    statusUnsafeEncStr;

            String secretsStr = consumerSecret+"&"+accessTokenSecret;
            SecretKeySpec keySpec = 
                    new SecretKeySpec(secretsStr.getBytes(),
                    "HmacSHA1");

            Mac mac = Mac.getInstance("HmacSHA1");
            mac.init(keySpec);
            byte[] result = mac.doFinal(basestring.getBytes());

            String signature = URLEncoder.encode(base64Encode(result), "UTF-8");

            String credentials = 
                    "oauth_consumer_key=\"" + consumerKey + "\"," +
                    "oauth_nonce=\"5bffa3b2711bbcdaa4f301" + timeStr + 
                    "\"," +
                    "oauth_signature=\"" + signature + "\"," +
                    "oauth_signature_method=\"HMAC-SHA1\"," +
                    "oauth_timestamp=\"" + timeStr + "\"," +
                    "oauth_token=\"" +
                    accessToken + "\"," +
                    "oauth_version=\"1.0\"";

            conn.addRequestProperty("Authorization", "OAuth " + credentials);

            String lenStr = String.valueOf(postData.length());
            conn.setRequestProperty("Content-Length", lenStr);
            conn.setRequestProperty("Content-Type", 
                    "application/x-www-form-urlencoded");

            // Do as if you're using Firefox 3.6.3
            conn.setRequestProperty("User-Agent", 
                    "Mozilla/5.0 (Windows; U; Windows NT 5.1; "+
                    "en-US; rv:1.9.2.3) Gecko/20100401"); 

            conn.connect();
            OutputStream output = conn.getOutputStream();

            output.write(postData.getBytes("UTF-8"));

            // Get the response
            InputStream response = conn.getInputStream();
            BufferedReader rd =
                    new BufferedReader(new InputStreamReader(response));
            String line;
            while ((line = rd.readLine()) != null) {
                if (verboseFlag) {
                    System.out.println(line);
                }
            }
            rd.close();

        } catch (Exception e) {
            e.printStackTrace();
        }

    }

And, here's some code for the supporting utility methods:

   public static String unsafeEncode(String input) {
        StringBuilder resultStr = new StringBuilder();
        for (char ch : input.toCharArray()) {
            if (isUnsafe(ch)) {
                resultStr.append('%');
                resultStr.append(toHex(ch / 16));
                resultStr.append(toHex(ch % 16));
            } else {
                resultStr.append(ch);
            }
        }
        return resultStr.toString();
    }

    private static char toHex(int ch) {
        return (char) (ch < 10 ? '0' + ch : 'A' + ch - 10);
    }

    private static boolean isUnsafe(char ch) {
        if (ch > 128 || ch < 0) {
            return true;
        }
        return "$&+,/:;=?@ \"<>#%{}|\\^~[]`'!_*".indexOf(ch) >= 0;
    }
    
    
    private final static char[] BASE64CHARS = 
            "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
            .toCharArray();

    private static int[]  intChars   = new int[128];
    
     /**
     * Translates the specified byte array into Base64 string.
     *
     * @param inputBuffer byte array (not null)
     * @return the translated Base64 string (not null)
     */
    public static String base64Encode(byte[] inputBuffer){
        
        // Check if intChars array needs to be init'd
        if (intChars.length == 0) {
            for(int index=0; index < BASE64CHARS.length; index++){
                intChars[BASE64CHARS[index]]= index;
            }
        }
        
        int bufferSize = inputBuffer.length;
        char[] charArray = new char[((bufferSize + 2) / 3) * 4];
        int charIndex = 0;
        int inputIndex = 0;
        while(inputIndex < bufferSize){
            byte byte0 = inputBuffer[inputIndex++];
            byte byte1 = (inputIndex < bufferSize) ? 
                    inputBuffer[inputIndex++] : 0;
            byte byte2 = (inputIndex < bufferSize) ? 
                    inputBuffer[inputIndex++] : 0;

            int mask = 0x3F;
            charArray[charIndex++] = BASE64CHARS[(byte0 >> 2) & mask];
            charArray[charIndex++] = BASE64CHARS[((byte0 << 4) | 
                    ((byte1 & 0xFF) >> 4)) & mask];
            charArray[charIndex++] = BASE64CHARS[((byte1 << 2) | 
                    ((byte2 & 0xFF) >> 6)) & mask];
            charArray[charIndex++] = BASE64CHARS[byte2 & mask];
        }
        
        switch(bufferSize % 3){
            case 1: charArray[--charIndex]  = '=';
            case 2: charArray[--charIndex]  = '=';
        }
        
        return new String(charArray);
    }

That's all you need to send tweets to your Twitter app using Java SE Embedded. Easy-peazy! Next, we'll put it all together, so that your Raspberry Pi takes the Vernier Go!Temp temperature readings from your roasting bird, and sends out tweet updates, plus a tweet to tell the Twitterverse when your turkey is done. That's something delicious! :-)

See the full series on the steps to this cool demo:
Internet of Things (IoT) Thanksgiving Special: Turkey Tweeter (Part 1)
Internet of Things (IoT) Thanksgiving Special: Turkey Tweeter (Part 2)
Internet of Things (IoT) Thanksgiving Special: Turkey Tweeter (Part 3)
Internet of Things (IoT) Thanksgiving Special: Turkey Tweeter (Part 4)
Internet of Things (IoT) Thanksgiving Special: Turkey Tweeter (Part 5)

Thursday Nov 21, 2013

Internet of Things (IoT) Thanksgiving Special: Turkey Tweeter (Part 3)

OK, sports fans. You've got your Vernier Go!Temp USB probe connected. It looks good with lsusb and you can see the /dev/ldusb0 device in your Raspberry Pi Linux shell.

So, how do you write a Java SE Embedded app to read in the turkey temp values. Well, as with most things, you search the Web and you can find how it was done previously in other non-Java inferior programming languages. ;-) Here's a great example in Python on the finninday.net site.

See: finniday.net Go!Teamp example in Python

It shows the reverse engineered byte format of the data coming over USB from the Vernier Go!Temp probe. Booyah! That's what we need to write a Java SE Embedded app. And, here it is...

/**
 *
 * @author hinkmond
 * Copyright © 2013 Oracle and/or its affiliates. All rights reserved.
 */
public class TurkeyTweeter {

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        Date date;
        FileInputStream fis = null;
        DataInputStream dis = null;
        byte   b[];
        
        double tempavg, c, f;
        int    samplecount=0, sequence=0, temp1=0, temp2=0, temp3=0;
        
        final double VERNIER_SCALING_FACTOR=126.74;
        final double VERNIER_CALIBRATION_OFFSET=5.4;

        b = new byte[8];

        // Loop to keep reading temperature
        while (true) {
            int available;

            try {
                fis = new FileInputStream("/dev/ldusb0");
                dis = new DataInputStream(fis);
            } catch (FileNotFoundException fnfe) {
                System.out.println("Cannot find temp sensor");
                fnfe.printStackTrace();
                System.exit(-1);
            }

            // Read 8 bytes from Vernier Go!Temp USB probe
            //   Format:
            //     Byte 0:   Sample Count
            //     Byte 1:   Sequence Index
            //     Byte 2-3: First temp sample
            //     Byte 4-5: Second temp sample
            //     Byte 6-7: Third temp sample
            try {
                if (dis != null) {
                    available = dis.read(b, 0, 8);
                    samplecount = b[0];
                    sequence = b[1];
                    temp1 = b[2] + b[3] * 256;
                    temp2 = b[4] + b[5] * 256;
                    temp3 = b[6] + b[7] * 256;
                }
            } catch (IOException ioe1) {
                System.out.println("Unable to get data from temp sensor");
                ioe1.printStackTrace();
            }
            
            tempavg = (temp1 + temp2 + temp3) / 3.0;
            c = tempavg / VERNIER_SCALING_FACTOR - VERNIER_CALIBRATION_OFFSET;
            
            // Convert from Fahrenheit to Celcius
            f = ((9.0/5.0) * c) + 32.0;
            
            double temperature = roundDouble(f);
            
            date = Calendar.getInstance().getTime();

            Format formatter = new SimpleDateFormat("E MMM d kk:mm:ss");
            String timedateString = formatter.format(date);

            System.out.println(timedateString+"  "+temperature);

            try {
                if (dis != null)
                    dis.close();
                if (fis != null)
                    fis.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                Thread.sleep(1000);
            } catch (InterruptedException ie) {
                ie.printStackTrace();
            }
        }
    }

   public static double roundDouble(double value) {
        double result = value * 100;
        result = Math.round(result);
        result = result / 100;
        return(result);
   }
}

Compile using javac, lather, rinse, repeat. And, here's the output running on the RPi (NOTE: Remember, you must run as root to access the /dev/ldusb0 device):

pi@raspberrypi ~ $ sudo java -jar TurkeyTweeter.jar
Thu Nov 21 16:42:59  71.59
Thu Nov 21 16:43:00  72.39
Thu Nov 21 16:43:01  72.39
Thu Nov 21 16:43:02  72.39
Thu Nov 21 16:43:03  72.39
Thu Nov 21 16:43:04  72.39
Thu Nov 21 16:43:05  72.39
Thu Nov 21 16:43:06  72.39
Thu Nov 21 16:43:07  72.39
Thu Nov 21 16:43:08  72.39
Thu Nov 21 16:43:09  72.39
...
As you can see, it's 72 degrees Fahrenheit in my office. The turkey won't be that temperature roasting in the oven on Thanksgiving, but we have now confirmed this part of the Turkey Tweeter works. Exciting, isn't it? :-) Next up, we will write the Java code to tweet out the values of our poor turkey as it cooks... (Yeah, poor turkey until it's inside my tummy. Then, it's yummy turkey!)

See the full series on the steps to this cool demo:
Internet of Things (IoT) Thanksgiving Special: Turkey Tweeter (Part 1)
Internet of Things (IoT) Thanksgiving Special: Turkey Tweeter (Part 2)
Internet of Things (IoT) Thanksgiving Special: Turkey Tweeter (Part 3)
Internet of Things (IoT) Thanksgiving Special: Turkey Tweeter (Part 4)
Internet of Things (IoT) Thanksgiving Special: Turkey Tweeter (Part 5)

Monday Nov 18, 2013

Internet of Things (IoT) Thanksgiving Special: Turkey Tweeter (Part 2)

By now you should have received your Vernier Go!Temp USB Temperature Probe and it is getting really close now to Turkey Day, so you want kick your Internet of Things (IoT) Turkey Tweeter project into high gear now.

First, we need to test the temperature probe before sticking it into unknown places, namely our delicious IoT bird on Thanksgiving. So, take your Go!Temp USB temperature probe and plug it into your Raspberry Pi device, just like in this photo.

See:

Connect Go!Temp Probe

If all went well on your Raspberry Pi, you should be able to bring up a terminal shell connected to your RPi and type "lsusb" to verify that the Go!Temp probe is now connected.

pi@raspberrypi ~ $ lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 002: ID 0424:9512 Standard Microsystems Corp.
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp.
Bus 001 Device 005: ID 08f7:0002 Vernier EasyTemp/Go!Temp

If your output looks like above, especially the last line where it says the Vernier Go!Temp was recognized and is connected as Device 005, you are golden.

One last check before we start to program using a Java SE Embedded app to grab the temperature readings is to make sure the /dev/ldusb0 device is present. So, type this command and make sure your output matches:

pi@raspberrypi ~ $ ls -l /dev/ldusb0
crw------T 1 root root 180, 176 Nov 18 17:25 /dev/ldusb0

If all that looks good, you're ready for the next step which is to write a Java SE Embedded app to read the temperature values, and eventually write code with IoT intelligence to tweet out the status of your turkey while it's cooking so that it becomes an Internet of Things connected bird on Twitter. Look for that in the next part of this series... Mmmmm... I can almost smell that turkey roasting... :-)

See the full series on the steps to this cool demo:
Internet of Things (IoT) Thanksgiving Special: Turkey Tweeter (Part 1)
Internet of Things (IoT) Thanksgiving Special: Turkey Tweeter (Part 2)
Internet of Things (IoT) Thanksgiving Special: Turkey Tweeter (Part 3)
Internet of Things (IoT) Thanksgiving Special: Turkey Tweeter (Part 4)
Internet of Things (IoT) Thanksgiving Special: Turkey Tweeter (Part 5)

Wednesday Nov 06, 2013

Internet of Things (IoT) Thanksgiving Special: Turkey Tweeter (Part 1)

It's time for the Internet of Things (ioT) Thanksgiving Special. This time we are going to work on a special Do-It-Yourself project to create an Internet of Things temperature probe to connect your Turkey Day turkey to the Internet by writing a Thanksgiving Day Java Embedded app for your Raspberry Pi which will send out tweets as it cooks in your oven.

If you're vegetarian, don't worry, you can follow along and just run the simulation of the Turkey Tweeter, or better yet, try a tofu version of the Turkey Tweeter.

Here is the parts list:

 1 Vernier Go!Temp USB Temperature Probe
 1 Uncooked Turkey
 1 Raspberry Pi (not Pumpkin Pie)
 1 Roll thermal reflective tape
You can buy the Vernier Go!Temp USB Temperature Probe for $39 from here: http://www.vernier.com/products/sensors/temperature-sensors/go-temp/. And, you can get the thermal reflective tape from any auto parts store. (Don't tell them what you need it for. Say it's for rebuilding your V-8 engine in your Dodge Hemi. Avoids the need for a long explanation and sounds cooler...) ;-)

The uncooked turkey can be found in your neighborhood grocery store. But, if you're making a vegetarian Tofurkey, you're on your own... The Java Embedded app will be the same, though (Java is vegan). :-)

So, grab all your parts and come back here for the next part of this project...

See the full series on the steps to this cool demo:
Internet of Things (IoT) Thanksgiving Special: Turkey Tweeter (Part 1)
Internet of Things (IoT) Thanksgiving Special: Turkey Tweeter (Part 2)
Internet of Things (IoT) Thanksgiving Special: Turkey Tweeter (Part 3)
Internet of Things (IoT) Thanksgiving Special: Turkey Tweeter (Part 4)
Internet of Things (IoT) Thanksgiving Special: Turkey Tweeter (Part 5)

About

Hinkmond Wong's blog on making the Internet of Things (IoT) smarter with Java Technologies

Search

Archives
« May 2015
SunMonTueWedThuFriSat
     
1
2
3
4
5
6
7
8
9
10
11
12
13
14
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
      
Today