Wireshark is a tool that performs packet and protocol analysis on a network. Packets are the virtual transport mechanism that moves are data from sender to receiver. Each packet has a header and payload – the header contains information about where the packet came from and where it’s going, as well as the protocols being used. The payload has our actual digitized data – parts of website, text, a section of photo, or a clip of audio from an MP3 or a phone call. If you don’t get all of the packets then a phone call may sound choppy or it may take a while to download a complete file. Wireshark allows you to take a look at the packets you are sending and receiving and learn a lot more about what it happening and what’s breaking down. Wireshark is not for the lighthearted, as the tool requires knowledge of protocols and a deep understanding of OSI, IP, and TCP/UDP at the very least. But, with time, Wireshark becomes invaluable to the troubleshooting process. I have relied on the tool for my work supporting Voice-over-IP (VoIP) and system and application connectivity. The only side-effect to Wireshark is that you will soon realize why it’s not a good idea to surf the web in a public spot (without a VPN or encryption).
The new version of Wireshark includes more protocols that it will decode, supports 64-bit Windows, and has GeoIP integrated support. Also, Wireshark works perfectly with my passive network cable. Visit www.wireshark.org to download the latest version and learn more about it.
I took the leap and bought an Arduino from LiquidWare. An arduino is an open-source microcontroller that has a processor, some digital I/O pins, and analog inputs. You can create little standalone programs that monitor inputs, control LEDs, and pretty much anything that you dream up. My favorite projects are ones that involve the Internet. A microcontroller is rather simple by itself, but what if it could use the web to get answers, send email, maybe update my Twitter status? That means there is a unlimited number of projects ahead – Microcontrollers collaboarating in cyberspace. The missing link for the web part is the ioBridge IO-204. I know you are no stranger to the the IO-204, but for those of you who have not heard. The IO-204 sits on my network and relays data from its channels to ioBridge.com servers and back into my network. It allows for remote control and monitoring without network configuration and programming. One of the expansion boards is a two-way serial board that accepts serial strings and connects them to APIs of web services that ioBridge interfaces to and sends back responses. For instance, I can send the commands, “[[[calc|9*9]]]” and this returns 81. OK, maybe not impressive on the surface, but that result came from Google Calculator. Anything Google Calculator can solve, your microcontroller has access to those results. For more examples, visit the Serial Web Services API on the wiki.
Message Center Project
I wanted to combine these two worlds with a sample project – maybe it will inspire you to come up with something better, spark some ideas that you have. I have my arduino measuring my outside temperature here in Pittsburgh, which is an analog input scaled to Fahrenheit. At any moment I can press a button and get the temperature on the LCD screen – no Internet required. Since I have been planning a work trip to Atlanta, I also wanted to compare my temperature with hot-lanta’s. So, my project solves that. Using the “weather command”, I am able to get the weather anywhere in the world by zip code or city name.
I added a few more things to the message center. With another button I can get the stock quote of Google. My strike price was $405, so I have been watching it close. If it gets below $405, I get an automatic email from my message center. The stock quote comes from the Yahoo Financials API.
I have one more button that emails me a secret message when it’s pressed. I put this in here for when my mom comes into my room from when I am on the road. It’s aptly label, do not press. Next time, I will hook it to a light sensor in the basement to catch her when she turns on my lights. I am sure you all have the same issues with your mom.
Source Code
The arduino requires some c-like programming and I wanted to include the sketch for you to steal and use for your projects. You will see how I send the serial commands from the arduino to the IO-204 using the UART serial connection (pins 0/1) and recieve and parse the incoming results. I use a SoftwareSerial port for the LCD results. The push buttons are software debounced and use pull-up resistors for solid digital connections. The LED’s linked to each button use a 330 ohm resistor to protect them. I was aided by the Arduino Inputs tutorial on Ladyada.net, Debounce Tutorial, and the iobridge Wiki / Forum. Please let me know if you have any questions, maybe I can help. I have learned a lot about handling strings on the arduino.
//
// Message Center using Arduino and the ioBridge IO-204
//
// An open-souce Shadowlord Project
// www.IamShadowlord.com
#include <SoftwareSerial.h>
// SoftwareSerial Pins
#define rxPin 2
#define txPin 3
// Setup Software Serial
SoftwareSerial softSerial = SoftwareSerial(rxPin, txPin);
// Global Setup
int middleLED = 11;
int rightLED = 10;
int leftLED = 12;
int leftButton = 5;
int leftButtonCurrent = LOW;
int leftButtonReading;
int leftButtonPrevious = HIGH;
long leftButtonTime = 0;
long leftButtonDebounce = 200;
int middleButton = 4;
int middleButtonCurrent = LOW;
int middleButtonReading;
int middleButtonPrevious = HIGH;
long middleButtonTime = 0;
long middleButtonDebounce = 200;
int rightButton = 6;
int rightButtonCurrent = LOW;
int rightButtonReading;
int rightButtonPrevious = HIGH;
long rightButtonTime = 0;
long rightButtonDebounce = 200;
int tempPin = 5;
int tempAnalog = 0;
int tempF = 0;
char* currentRequest = "";
// Start up program
voidsetup() {
pinMode(rxPin, INPUT);
pinMode(txPin, OUTPUT);
pinMode(leftLED, OUTPUT);
pinMode(middleLED, OUTPUT);
pinMode(rightLED, OUTPUT);
pinMode(leftButton, INPUT);
pinMode(middleButton, INPUT);
pinMode(rightButton, INPUT);
softSerial.begin(9600);
delay(100);
Serial.begin(9600);
delay(100);
Serial.flush();
delay(100);
// Setup LCD
clearLCD();
setBacklightBrightness(9);
delay(1000);
// Test LEDs
digitalWrite(leftLED, HIGH);
digitalWrite(middleLED, HIGH);
digitalWrite(rightLED, HIGH);
delay(1500);
digitalWrite(leftLED, LOW);
digitalWrite(middleLED, LOW);
digitalWrite(rightLED, LOW);
}
// Start main program loop
voidloop(){
// Get Analog Input and scale as temperature for ioBridge temperature sensor on arduino
tempAnalog = analogRead(tempPin);
tempF = tempAnalog / 6.875;
// Monitor left button status and debounce
leftButtonReading = digitalRead(leftButton);
if (leftButtonReading == HIGH && leftButtonPrevious == LOW &&
millis() - leftButtonTime > leftButtonDebounce) {
if (leftButtonCurrent == HIGH) leftButtonCurrent = LOW;
else {digitalWrite(leftLED, HIGH);
clearLCD();
delay(100);
softSerial.print("Outside: ");
delay(100);
softSerial.print(tempF);
delay(100);
moveCursor("02", "01");
delay(100);
softSerial.print("Atlanta: ");
leftButtonCurrent = LOW;
//Request temperature in Atlanta via ioBridge
Serial.print("[[[weather|Atlanta]]]");
digitalWrite(leftLED, LOW);
}
leftButtonTime = millis();
}
leftButtonPrevious = leftButtonReading;
// Monitor middle button status and debounce
middleButtonReading = digitalRead(middleButton);
if (middleButtonReading == HIGH && middleButtonPrevious == LOW &&
millis() - middleButtonTime > middleButtonDebounce) {
if (middleButtonCurrent == HIGH) middleButtonCurrent = LOW;
else {currentRequest = "Google";
digitalWrite(middleLED, HIGH);
clearLCD();delay(100);
softSerial.print("GOOG: $");
delay(100);
middleButtonCurrent = LOW;
//Request Google Stock Price via ioBridge
Serial.print("[[[stock|GOOG]]]");
digitalWrite(middleLED, LOW);
}
middleButtonTime = millis();
}
middleButtonPrevious = middleButtonReading;
// Monitor right button status and debounce
rightButtonReading = digitalRead(rightButton);
if (rightButtonReading == HIGH && rightButtonPrevious == LOW &&
millis() - rightButtonTime > rightButtonDebounce) {
if (rightButtonCurrent == HIGH) rightButtonCurrent = LOW;
else {
digitalWrite(rightLED, HIGH);
clearLCD();
delay(100);
softSerial.print("Alert: ");
delay(100);
rightButtonCurrent = LOW;
//Send email via ioBridge
Serial.print("[[[email|hans@nothans.com|Alert|Mom, is pressing your buttons]]]");
digitalWrite(rightLED, LOW);
}
rightButtonTime = millis();
}
rightButtonPrevious = rightButtonReading;
// Display serial messages
if(Serial.available() > 0){
delay(100);
char charIn = 0;
byte i = 0;
char stringIn[32] = "";
while(Serial.available()) {
charIn = Serial.read();
stringIn[i] = charIn;
i += 1;
}
if (currentRequest == "Google") {
softSerial.print(stringIn);
int stockPrice = atoi(stringIn);
delay(100);
moveCursor("02", "01");
delay(100);
stockPrice = stockPrice - 405;
softSerial.print("Change: $");
delay(100);
softSerial.print(stockPrice);
currentRequest = "";
}
elsesoftSerial.print(stringIn);
}
// End program loop
}
//
// ioBridge Serial LCD Functions and Parameters (for SoftwareSerial)
//void displayMessage(char* message){
softSerial.print(message);
}
void clearLCD(){
softSerial.print(0xFE, BYTE);
softSerial.print("Z");
}
void setBacklightBrightness(int level){
// level
// 0=Off -> 9=Brightest
softSerial.print(0xFE, BYTE);
softSerial.print("B");
softSerial.print(level);
}
void setBacklightTime(int level, byte seconds){
// level
// 0=Off -> 9=Brightest// seconds
// 01 = 1 seconds => 06 = 60 seconds
softSerial.print(0xFE, BYTE);
softSerial.print("T");
softSerial.print(level);
softSerial.print(seconds, BYTE);
}
void moveCursorHome(){
softSerial.print(0xFE, BYTE);
softSerial.print("H");
}
void turnCursorOn(){
softSerial.print(0xFE, BYTE);
softSerial.print("J");
}
void turnCursorOff(){
softSerial.print(0xFE, BYTE);
softSerial.print("K");
}
void turnBlinkingCursorOn(){
softSerial.print(0xFE, BYTE);
softSerial.print("P");
}
void turnBlinkingCursorOff(){
softSerial.print(0xFE, BYTE);
softSerial.print("Q");
}
void scrollMessage(int row, intspeed, char* message){
// row
// 1=First Line -> 2=Second Line// speed
// 0=Slowest -> 9=Fastest
softSerial.print(0xFE, BYTE);
softSerial.print("S");
softSerial.print(row);
softSerial.print(speed);
softSerial.print(message);
softSerial.print(0xFE, BYTE);
}
void moveCursor(char* row, char* column){
// row
// 01=First Line -> 02=Second Line// column
// 01=First Position -> 16=Last Position
softSerial.print(0xFE, BYTE);
softSerial.print("L");
softSerial.print(row);
softSerial.print(column);
}
void drawHorizontalGauge(int row, char* leftLabel, char* rightLabel, char* length){
// row
// 1=First Line -> 2=Second Line// leftLabel and rightLabel
// 2 character labels// length
// a=Empty -> k=Full (filled in from left to right)
softSerial.print(0xFE, BYTE);
softSerial.print("G");
softSerial.print(row);
softSerial.print(leftLabel);
softSerial.print(rightLabel);
softSerial.print(length);
}
void drawVerticalGauge(intheight){
// height
// 0=Bottom -> 8=Top (filled in from bottom to top)
softSerial.print(0xFE, BYTE);
softSerial.print("V");
softSerial.print(height);
}
Bonus Project
It’s simple, but I hacked together a power supply for the Arduino, which gets power from USB or a coaxial input from a transformer. I wanted to only run one brick, wall wart, so I hacked a USB cable. There are 4 wires in the USB cable (from pinouts.ru):
1
VCC
Red
+5 VDC
2
D-
White
Data -
3
D+
Green
Data +
4
GND
Black
Ground
The IO-204 has a regulated 5VDC and ground (up to 1A – 4A total draw depending on supply) on each channel, so using a terminal strip, I connected the VCC and GND to a cut in half USB cable.
Everything is going digital. I know, a profound statement, but the consequences of “digital” are a future riddled with software bugs, failures, and EMP induced outages (the EPT EMP to be exact). We rely on technology to get us through our days and we will be faced with crashes when we need technology the most.
“Clearblue” has released a digital version of their pregnancy tester. My girlfriend, completely fictional to make a point, and I were discussing the ramifications of a digital pregnancy test. One day the test will be dependent on an Operating System to drive the user interface. It might even have Windows on it.
In your critical moment, of whether you will be with child or have more time to yourself — unshackled by a disappointing version of yourself, the pregnancy tester will crash giving you an ambiguous result.
Take a glimpse of the future. You have been warned.
Death Tag is a full contact game using a McDonald’s straw and various projectiles – the most lethal of which is the Tic Tac – 1.5 calories of pain. This is Death Tag’s story with a video of my new Death Tag students – my nephews…Pass on the fun, er, the mayhem…You’re it!
I invented the game as a kid when I discovered that a Tic Tac and a McDonald’s straw had roughly the same diameter. A fresh Tic Tac fits almost perfectly into the straw. This principle makes the combination nearly lethal. Over the years, I have expanded on the design and have tested straws from every fast food chain in the United States and projectiles of all sorts.
The Straw
The McDonald’s straw has one of the largest diameters, with a straw from Starbucks a close second, and an In and Out Burger straw third (West coast glocking). Always have multiple straws on hand – you never know if you need back up muzzle loaders. Tic Tacs become sticky, so avoid copious spit.
The Projectile
The Tic Tac is a perfect fit to the McDonald’s straw. My independent testing proves that this combination is the most fierce with the highest muzzle velocity. The Tic Tac is the most accurate and longest shooting projectile I have used. It also leaves a white mark on your targets. There are two drawbacks though – stickiness and cost. Saliva + Tic Tac equals jammed barrel on occasion. I have recently switched to un-popped popcorn. This projectile is cheap and somewhat pointed to being your enemy to a swift submission. Popcorn also allows for some advanced techniques like “The Rain Maker”.
Techniques
Load the projectile, use your tongue to stop up one end of the straw. Build up some pressure and move your tongue. You can gets some serious distance and accurate shots this way.
“The Machine Gun” or “The Rain Maker” technique requires a cheek full of popcorn. Load up some popcorn and shuffle the kernels into the barrel while blowing. Make it rain destruction on your opponent.
Origin of the Name
Death Tag started picking up steam in the early 2000′s. I was on the road a lot and drove solo across the country many times. On a drive from Columbia, SC to Melbourne, FL, my friend Dale and I stopped at a truck stop. The trucker’s paradise had everything, a Micky D’s and convenient snacks. I bought up a supply of Tic Tacs and grabbed a handful of straws. I explained the premise to Dale and it soon involved us shooting cars out of the window. We assigned point values to certain objects that you hit. For example, the side a truck was 1,000 points, but a minivan is 5,000 points. A car window had the point value of 10,000 points and a road sign was 15,000 (since you could shot out and arc it – we called it the golden arch). The ultimate thing we shot was a Target sign on the side of tractor trailer – 50,000 points. The “freshmint” or white Tic Tacs also leaving a little white mark to be proof positive of a successful hit. We started calling it, “Death Tag” because we were surviving around the road, paying more attention to hitting our targets than driving safely.
A Word of Caution
It’s called Death Tag for a reason. Be careful, you could die, lose an eye, or leave a welt. I know it sounds fun, but I am a trained professional. I recommend discussing the side effects with a doctor and always wear proper eye protection.
The only reason to make the perfect cup of coffee is to enjoy the perfect cup of coffee. My life is filled with moments connected to coffee. Nothing was better than being in New Orleans and having a coffee at Cafe Du Monde. Or blitz chess at Seatle’s Best (while they were the best). And performing at a coffee shop on an Open Mic night with bad poets, mediocre musicians, and wannabe comedians.
These sentiments might not mean much to a to a person that doesn’t drink coffee (or tea), but I am sure you can find a parallel substance in your life. I am not talking about drinking coffee for the sake of drinking coffee, not the times you need it to wake up, but rather the experience of coffee. When you couple a perfect moment with the perfect cup, you create a truly great experience.
“It was a pleasant cafe, warm and clean and friendly, and I hung up my old water-proof on the coat rack to dry and put my worn and weathered felt hat on the rack above the bench and ordered a cafe au lait. The waiter brought it and I took out a notebook from the pocket of the coat and a pencil and started to write.” – Ernest Hemingway
I would rather have a brewed coffee or espresso vs. a latte or cappuccino. Certain large scaled coffee vendors have serialized the coffee drink to the point to where coffee is second to sugar. A Cafe Americano (espresso plus hot water) is about the best value (but I noticed Starbucks raises the price $.35 every quarter). I am not a purist but I am in it for the coffee taste. I am so much not a purist that sometimes I say “Expresso” when I am in the company of those who take it too far. I like to miss use words and see the retractions, most just simply ignore me.
What are the ingredients of the perfect cup of coffee? I am going to conclude that the situation is just as significant as the actual cup of coffee. Take away the experience and it probably would taste like it tastes from a truck stop in North Dakota. When I am home I meticulously attempt to make the perfect cup of coffee using apparatuses from all over the world.
Here is my approach to the pursuit of the perfect cup:
Invite a friend (or better yet have the friend make you coffee)
Have a notebook handy for those best ideas
Mute the mobile
Grind a whole bean roast (French is one of the best coffee tastes)