Redial Final Project: Hermes Ordering System

In my Redial class, we learned about the dark arts of telephony in an age of digital, packets, and VOIP.  Once we learned the basics of operating in an Asterisk telephony server environment, we moved on to how to write scripts in Ruby, bash, whatever to interact with Asterisk during a phonecall.  We set up our own Rackspace servers loaded up with Asterisk and used our professor’s script to install needed software on its Ubuntu instance.  I’ve saved that script to add extra stuff when I’m setting up a new Ubuntu server from scratch.  Ubuntu basic literacy is now attained.

That part was fun enough, but it started to get interesting when our badass professor, Chris Kairalla, published some code to Github for interacting with a web front-end in JavaScript by using socket.io, node.js, and a Ruby-Asterisk Gateway Interface script interfacing with calls placed to Asterisk. That’s when the realm of ideas greatly opened up.  Real-time interaction with the phone dialpad to control a screen, an Arduino, robots, electric switches, whatever.  And with the explosion of JavaScript and Node.js, it couldn’t have come at a better time.

Here are the class notes:  http://www.itp-redial.com/class/

And the Github repo: https://github.com/itp-redial/

I set out with confidence, knowing I could use Professor Kairalla’s brilliant tinyphone code, which provided the framework to facilitate an incoming call into a caller object that one could manipulate in the web page DOM.

My idea was to build a bar or restaurant menu displayed on screens around a bar which would let customers place orders by just pressing digits on their phone, instead of waiting on waitstaff or having a gimmicky touchscreen or table screen.  The orders would be tied to someone’s phone number so paying for bills wouldn’t require the awkward splitting up of the bill, and customers would be able to use a very personal device to them, their own cellphone, to control interaction in the bar/restaurant.  Orders could be processed quickly, verified afterwards, and immediately incorporated into a database which could provide business intelligence in the form of statistics on food orders, frequencies, favorites for each customer, etc. All in a scalable, modular framework such as Node.js + Express.

Previous blog documentation: post #1.

Demo video:

Screenshots of some functionality:

Initially I figured I’d follow advice and build out the API first.  For that, I’d need an admin dashboard to perform CRUD operations to build up the menu.  I’m pretty tired of having to build out AJAX and menus to add, remove, edit, etc. so I’ve started building a Node.js app with all that stuff built-in, including JSON operations and other common usage events so I don’t have to keep testing it.  Anyway, I got my menu add functions working so I quickly started adding all my favorite Stellas, Dark & Stormies, Mojitos, etc.

Then I spent most of my development time building an interface that could only use the dialpad numbers 1-9, 0, *, and #.  Because I was fairly ill-versed with JavaScript still, I actually ended up refactoring my interface about three or four times, each time becoming more and more modular, using JavaScript objects which contained each “menu” (i.e. a beer menu that would point to each individual beer’s screen, which would pass to another object that would fill out a screen to let you order the beer) pushed into an interface that had no more than 8-9 choices.  Then the screen would have to have text displayed large enough to read, yet still accomodate perhaps 3-4 simultaneous callers at once.

var menuFoodObj = {
	name : "Food/Drinks Menu",
	upMenu : "Main",
	currentMenu : "Food",
	id : "",
	p : ["", "Beer", "Wine", "Liquor", "Non-Alcoholic Drinks", "Water", "Burger", "Specials", "Chips & Salsa"],
	pClick : ["", "Beer", "Wine", "Liquor", "Other", "Water", "Burger", "Specials", "Chips"]
}

By the end of the refactoring though, I had a really nice (but still a little soupy) interface of JavaScript objects being pushed into the DOM by jQuery.  I learned OO JavaScript pretty well although I didn’t understand fully how to create new objects and then properly make methods for objects (I was declaring new functions within objects).  Since I did most of the development and testing just using the web browser and mouseclicks, I was happy when all my refactoring allowed me to easily map a phone’s keypresses to the interface interactions using jQuery’s .triggerHandler event.  My code is still quite soupy though, and I think I’m about ready to learn backbone.js for injecting data from models into a static template — it would have been perfect for this type of project where the layout remains mostly the same but the data changes frequently.  I’m happy, though, that it was easy for me to instantiate new user objects (e.g. user[1] = new User();) for the 4 users that Hermes currently supports.

I actually ran into a weird problem after I’d hooked in caller keypresses, which I thought at first was within the DOM.  Keypresses from my softphone (I used Zoiper to connect via SIP) were happening twice and I thought the click event handler was being called twice in the DOM.  This did not occur on normal phone calls over, say, a cellphone.  Further inspection saw two keypresses coming across in Asterisk:

 <SIP/general_sip-000000ae>AGI Rx << WAIT FOR DIGIT -1
 <SIP/general_sip-000000ae>AGI Tx >> 200 result=50
 <SIP/general_sip-000000ae>AGI Tx >> 200 result=50

Prof. Kairalla found that we were actually picking up feedback on my laptop from the call being made over the software.  Once we muted my laptop, the audio wasn’t being sent to the Asterisk server, which had been detecting the extra audio as what it assumed was an extra keypress.

I added an option to check news headlines from Google News’ API, which has been deprecated so will probably disappear soon?  The other bad thing about this was that you can’t really link to the body of an article since 1) Google News just provides the link and the source’s weak abstract and 2) news sources are so proprietary about people stealing their content.  APIs always leave a bad taste in my mouth because they’re hamstrung from the outset.  Anyway, there’s a definite art to creating headlines, as I learned in my previous job covering the news cycle, and most headlines are expertly packed with relevant info, enough for you to get an idea of things just at a glance.

I also added features for sending drinks/orders to another table, to facilitate social interaction within the bar.  Trivia can be played as well, though it wasn’t built into a central system where scores are kept.  Right now it just tests a user’s response against the correct answer and then generates a random question.  Another feature added was to flirt with other tables and send them messages.

I used Flowroute, which was super easy to set up in my sip.conf and extensions.conf for Asterisk, using Flowroute’s web-based cheatsheets for config settings unique to my account.  Very nice set-up screens there.

emailjs and Twilio

To process orders (when someone wishes to buy a beer, but he hasn’t received it yet) and tabs (for delivered food/drinks), I took advantage of node.js’s awesome modules and found emailjs, which lets you package up a JS object and send it as an email via SMTP to, say, gmail.  So when a customer places an order in Hermes, the order is sent via email to the company for later verification.  Easy, piece of cake.  Can be used with any SMTP server you have an account on and that has permissions.

Then Prof. Kairalla mentioned that it would be great if a customer received a text message thanking them after they close their tab.  So I bought a phone number on Twilio ($1/mo) and used the Twilio SMS API to package up another JS object with the tab details, and then have it again email the company but also text msg the caller with his closed tab details.  I actually had some problems with this and didn’t like the available Node.js modules (because they didn’t include examples for SMS), but luckily I found Dustin McQuay’s godsend blog post in which he posts some easy node.js code as a sendSMS() function, which I used to get my Twilio SMSs working.  I then had further problems but I found out I had pasted in the wrong Twilio auth token, so once I re-checked that, it then worked!  I feel as though the auth token changed because I funded my Twilio account, changing it from a free account to a paid one, and changing the token.  I assume?  Anyway, too much time wasted on that…

I also got a fraud alert from my credit card after trying to fund my Twilio.  Apparently they get a lot of fraudulent credit card funds, which makes sense since I’m pretty sure telephony and stuff related to it are havens for people trying to commit fraud, fake identities, and game systems.  But my credit card company cleared my purchase and I was fine within minutes.  Just thought it was worth mentioning.

Conclusion

I demo’d this in class and had 4 people call in.  They quickly broke it, but it was mostly the display of each person’s menu on the page.  That’s an easy UI fix.  I also found that I would need to make each person’s number more clearly visible so he’d know which interface he’d be working on.  But I felt like people were very quickly navigating through the menus and would learn it fairly quickly once they figured out it was just using a phone dialpad.  One thing that broke the demo was that the bottom bar (telling you how to use ‘*’, ‘0’, and ‘#’) got pushed down so people couldn’t see it.  Big problem there!

This app works hand in hand, I think, with my other app, Karaoke Flow.  I would love to create products to make the bar/restaurant/club/concert/dance party/rave/big gathering experience more enjoyable for people looking to have a kickass time and more profitable for the businesses providing it to them.

And I’m blown away with what is possible now with socket.io and Node.js.  All these projects I’ve wanted to do, like a web-based MUD to hook into Galapag.us, real-time chat, real-time flowing data, it’s now possible.  Love it.  And Redial…what a great class.  It’s recaptured the mystique of phones before they went smartphone, the weirdness and coolness of the phonebooth which has become a portal in pop culture (Doctor Who, The Matrix, Danger Mouse), and the fun of messing with somewhat quirky and buggy technology after it’s fallen out of vogue.  And to see how easy it is to set up a Vonage-like system!

Final Proposal for Redial: Hermes

My Redial class is awesome.  We’ve set up Rackspace servers with Asterisk telephony software and now we’re executing shell/ruby/php scripts through phonecalls which are now interacting with node.js servers to execute web site interfaces, Arduino RC car controls, etc.

I really want to focus on using node.js and socket.io with Asterisk/phonecalls for my final project.  So here’s what I propose:

Hermes

Hermes is an ordering interface for bars and restaurants.  When you sit down and order food, or when you’re standing at the bar trying to get a drink, you dial in with your phone to the establishment’s screen/s to place an order.

Say you sit down at a table and the table either has a built-in screen (like those old Pizza Hut arcade games where you could play Pac-Man using a joystick and buttons underneath the table surface), or it has a monitor or projection on the wall.  It will have a phone number for you to dial.  When you call in, it begins to interact in real-time with you both by voice and with on-screen instructions.  By pressing phone keys, you can place simple orders from simplified menus displayed on-screen.

Multiple people can dial in to the same line at the same table.  The screen will split depending on the number of people, allowing people to tie their orders to their phone number and to order independently of each other.

At the bar, when it’s packed, a projection above the bartender area will have a number to place calls.  The bartender can then cue drinks in the order they’re received in a fair way.  People can auto-order favorites or have drinks set to order every x minutes.  Complex group orders are handled digitally.

Multiple screens can be installed around the establishment so people don’t have to wander too far to place an order.

The screens can also be used for entertainment, as people could play phone trivia or mini-games via their phones, browse the news, change TV/music stations (handled via weak FM signal?), etc.

Why Hermes?

Hermes was recognized as the God of commerce and social interaction, and patron god to diplomats, messengers, and heralds:

Due to his constant mobility, he was considered the god of commerce and social intercourse, the wealth brought in business, especially sudden or unexpected enrichment, travel, roads and crossroads, borders and boundary conditions or transient, the changes from the threshold, agreements and contracts, friendship, hospitality, sexual intercourse, games, data, the draw, good luck, the sacrifices and the sacrificial animals, flocks and shepherds and the fertility of land and cattle. [Wikipedia]

Problems of a Hermes-Less World

  • Ordering food and drink is still a primitive process.  McDonalds has figured out how to move a lot of customers through quickly and efficiently with minimal job training.  But most restaurants and bars suffer from bad image and service because overworked waiters, waitresses, and bartenders can’t keep up with everyone’s needs 100% of the time, particularly when customers are fickle, intentionally hard to please at times, etc.  Streamlining the ordering process so that people can order as much food and drink as they would like, without inconveniencing themselves or waiting for some attention from an employee would increase business and increase consumer satisfaction.  There’s a problem when people discuss strategies to elbow their way into a bar just to maybe get a drink in 15 minutes, 15 minutes spent away from the party they came to attend.

Problems of a Hermes World

Hermes is not without its limitations.

  • Screen readability is limited by the size of the monitor, the customer’s ability to see clearly, the design of the interface, and how much text can be displayed at once.
  • There is also a problem linking orders to phones.  While something like Google Wallet, where one could pay via phone, would be preferable, at this point the phone number would only be an identity link to the customer and his order, and for reaching the customer afterwards for non-payment.  There are most likely large security/spoofing vulnerabilities in this approach unless a credit card number is somehow associated with the phone number.
  • Why would one find that dialing on a phone is a superior interface to asking a person, or using a touchscreen, or even using a custom web-app or mobile site to order?

Benefits

  • Tests with digital ordering systems seem to indicate people will order more food and drink if they can do it quickly, digitally, and without pause.  The systems seem to increase efficiency and overcome social shyness.
  • People strongly and affectionately associate with any actions involving their own phones, so using their phones as an ordering device empowers them.  It also is a potential bridge to have “preferences” that people can set and save with their “account”, linked through their phone number as identity.
  • Digital ordering produces a digital record, which is better for book-keeping and for validation of records in the event of disagreement between employees, customers, and management later.
  • Projections could be expanded upon — when people aren’t ordering food, they could be consuming news, shows, art installations, using Kinect-ish hands-free interfaces, messaging other tables, etc.  There is an exciting potential for linking different tables and screens with each other, via competition, flirting, or just networking or social lubrication.
  • Client interface consists of normal 1-0/*/# phone pad, can work with installed phones or smartphones or even simple cellphones, while all the customized, complex work can be handled server-side

Technology

  • Flowroute number linked to an Asterisk server installed on Rackspace
  • Asterisk dialplan forwarding to a ruby-agi script that sends data to a node.js instance
  • Node.js instance that takes incoming phone commands and passes instructions via socket.io (real-time, no polling) to the client that is installed on the projection/screen
  • jQuery/UI/AJAX/node.js client interface that handles order entry and routing, and can run multiple instances via the node.js cluster module, and can also forward to other instances for video, news, chat, etc. while keeping order entry instance CPU/memory load available just for order entry/processing

Long-Term

  • Tie-in to payment system/gateway?
  • Data saved into MongoDB
  • Employee and management interfaces to see stats on sales, database analysis, modify orders on the fly

Research Links

Redial Midterm: Gotta Take This

For my Redial midterm, I did something functionally pretty straight-forward.  Ever been in a situation where you’re talking to someone and you want to get out of it, like when that person is one of those folks who just keeps going and going and you haven’t said a word in ten minutes because they wouldn’t you talk?  Or if the conversation is so forced and awkward that you can’t stand it?

I’ve got an app for you.

It’s called Gotta Take This, although I think I pitched it originally as Panic Button.  I think I chose the former because it sounded a little less alarmist but still conveying the purpose.

What the app does is, upon opening it on your phone, it shows you a life preserver.  Tap on the preserver and casually exit to something else on your phone, like checking email.

Five minutes later (I set this to 1 minute for the demo), you’ll get an “Urgent Call” from a pre-set number.  When you answer it, an Asterisk dialplan takes over and plays, for my demo anyway, a long recorded message that gives you plenty of cover to have a quick conversation.

This gives you multiple opportunities to tell your present company, “Hey, uhh, I gotta take this…  It’s urgent/important/just a quick call/getting information.”

Now, once you’ve moved away with the call, you’re free to slink out of the place, or distractedly fall into a conversation with other people.

The app is made for Android with PhoneGap.  I got the icon from iconmaker.com.  The PhoneGap app’s button triggers jQuery Mobile to go to a ruby script I set up on ITP’s server, which generates a callfile with pre-set call information to be executed at a certain time in the future.

My ruby script, running via Sinatra:

require "rubygems"
require "sinatra"

# Main route  - this is the form where we take the input
get '/gottatakethis' do
  minutes = 1
  t = Time.now + (60 * minutes)
  # %H-%M-%S-%m-%d-%Y == 09-09-03-07-24-2006
  timeCallBack = t.strftime("%H-%M-%S-%m-%d-%Y")
  numbertocall = 15555555
  senderNum = 15555555

  # set the temp dir & filename & destination path to write from/save to
  temp_dir = "/tmp/"
  callfile = "call_" + timeCallBack + ".call"
  startcallfile = temp_dir + callfile
  end_dir = "/var/spool/asterisk/outgoing/"
  endcallfile = end_dir + callfile

  #write file to disk
  file = File.open(startcallfile,"w")
  file.puts("Channel: SIP/itp_jnctn/#{numbertocall}\n")
  file.puts("MaxRetries: 2\n")
  file.puts("RetryTime: 60\n")
  file.puts("WaitTime: 30\n")
  file.puts("Context: vt520_gtt\n")
  file.puts("Extension: 1\n")
  file.puts("CallerID: Urgent Call ")
  file.close

  #change file permission
  File.chmod(0777, startcallfile)
  FileUtils.chown(ENV['USER'],'asterisk',startcallfile)

  #move file to /var/spool/outgoing
  if (timeCallBack != "")
	timesplit = timeCallBack.split('-')
	ctime = Time.local(timesplit[5],timesplit[3],timesplit[4],timesplit[0],timesplit[1],timesplit[2])
	File.utime(ctime,ctime,startcallfile) #change file time to future date
  end
  FileUtils.mv(startcallfile,endcallfile)

  body = "Sent."
  body

And the relevant dialplan:

[vt520_gtt]
exten => s,1,Answer()
   same => n,Wait(3)
   same => n,Playback(/home/vt520/asterisk_sounds/soundfile)
   same => n,Hangup()

Redial Midterm Ideas

I’m not sure what to do for my Redial midterm at all.  We’re supposed to demonstrate our understanding of concepts we’ve learned in class, such as creating dialplans, routing within a dialplan, recording audio and playing it back, and interfacing with Ruby, PHP, the shell, and AJAX.

I think what interests me the most is doing some server-side scripting in the background to make the dial-in appear to be intelligent and interactive.  Mostly I am hung up technically and conceptually on not knowing how to do on-the-fly text-to-speech synthesis, to streamline creating an interactive dialplan.  I find not being able to have this functionality limits the extent to which I experiment with Asterisk, more than anything else.

So far I’ve just made some quick example dialplans, though I incorporated it into a puzzle I made, as well as added an extension that gives you Jeremy Lin’s points and assists in-game by scraping ESPN’s web site and returning the numbers.

My favorite telephony-related project so far is Big Screams, created by an ITP alumn, Elie Zananiri:

People call in to Big Screams and their phone number generates a unique creature who shows up on a big row of screens.  The caller then has to scream into his phone, and the loudness repels other creatures on-screen.  If someone pushes you off the screen, you get hung up and you can dial back in — since the creature is unique to your appearance, you look the same the next time you dial in, too.

Here are the ideas I’ve come up with so far.  I’m not usually this clueless when coming up with project ideas, but I’m just stumped on how I can take advantage of what a phone is good at and how I can build it within Asterisk/scripting.

  • Android app that lets you quickly and discreetly press a panic button so that it dials you in 5 minutes or whatever, so you can get out of an awkward situation.  “OH, LOOK, I HAVE A PHONECALL!  GOTTA GO!”
  • Something like Big Screams, where someone dials in, answers a series of questions, presses 0 through 9 (such as, rate yourself creativity-wise, 0-9), and then creates a character based on those entered variables, via Processing.  This might be more of a final project, in conjunction with my Nature of Code class.
  • Simon. Like the old toy that lit up in certain patterns that you had to repeat.  This could be done with tones and a dialpad.
  • Rock, paper, scissors, multi-player, having two players call in and the results displayed on a monitor.
  • System that, when you dial in, calls a random person in its database to link you two up.  It’s opt-in, and would be like a phone version of chatroulette.  Minus the penises.
  • Multi-User Domain (MUD) where you use the dialpad to move and use things.  So you can press 1 to move northwest.  5 to attack or use, # to block, * to exit.  Or whatever.  This one is pretty text-to-speech heavy, which discourages me.  Maybe it could move a character on a large monitor.  There could be an epic melee with multiple users?

 

That’s all I’ve got so far. :/

Redial: Playing with Asterisk & Voicemail

For Redial this week, I’m supposed to give a short presentation — I chose my topic to be dealing with phone security, operational security, basic cellphone theory, and the burners used in The Wire.  Should be fun.  I didn’t prepare any notes or make a slide presentation.

This week’s homework for Redial involved building a simple voicemail dialplan.  Here’s mine:

[vt520_week2hw]
;exten => s,1,Wait(1)
;exten => s,n,SayDigits(${CALLERID(num)})
; same => n,Playback(vm-num-i-have)
; same => n,SayDigits(9725107983)
; use Archer's joke voicemail sound
;exten => s,n,Playback(demo-echotest)
;exten => s,n,Echo()
;exten => s,n,Playback(demo-echodone)
;exten => s,n,Hangup()

[vt520]
exten => s,1,Wait(1)
;exten => s,n,Playback(tt-weasels)
exten => s,n,Playback(/home/vt520/asterisk_sounds/archer_voicemail)
exten => s,n,Goto(vt520-vm,s,1)

[vt520-vm]
; vm-review: Press 1 to accept this recording. Press 2 to listen to it. Press 3 to re-record your message.
exten => s,1,Voicemail(112@vt520_voicemail, u)
;exten => s,n,Record(asterisk-recording%d:ulaw)
exten => s,n,Playback(vm-review)
;exten => s,n,Festival('Press 1 to continue or 2 to change your message')
exten => s,n,WaitExten(10)
exten => s,n,Hangup()
;voicemail will go the a extension if * is hit during voicemail app
exten => a,1,VoiceMailMain(112@vt520_voicemail)
exten => a,n,Hangup()

exten => 1,1,Playback(queue-quantity1)
exten => 1,n,SayNumber(18)
exten => 1,n,Playback(queue-quantity2)
exten => 1,n,Hangup()

exten => 2,1,Playback(${RECORDED_FILE})
exten => 2,n,Playback(vm-review)
exten => 2,n,WaitExten(10)
exten => 2,n,Goto(vt520-vm,s,1)

Basically what is going on here is that when you dial in to my extension, it first plays back Sterling Archer’s elaborate voicemail hoax, as I’m not available to take the call:

I recorded the audio off a copy of the Archer episode using fraps, then exported it to WAV via Adobe Premiere after trimming down the sound clip.  Then I had to convert the WAV to a .sln file using the command:

sox archer_voicemail.wav -t raw -r 8000 -s -w -c 1 archer_voicemail.sln

…which I learned about through voip-info.org’s helpful wav conversion page.

I also found voip-info.org’s list of audio files and descriptions to be very useful for locating exactly which pre-recorded sound file would be appropriate.

Once the voicemail message plays, the system prompts the caller to record a message.  I wasn’t able to get recording to work, though I did in other experiments manage to get it to try to record and then email me with the voicemail details.  But this dialplan WILL allow you to confirm the message you left and will then move to another “extension” via a menu, before eventually hanging up.

I used a Goto function between the initial voicemail message and the rest of the dialplan so that later I could make it loop back to recording the message again if necessary.

Shout-out to Archer and the Archer show crew and cast for the voicemail.

Redial: First Class

My Redial class looks to be awesome.  A description:

New technologies, such as Voice over IP, and open source telephony applications, such as Asterisk, have opened the door for the development of interactive applications that use telephony for it’s traditional purpose — voice communications. This course explores the use of the telephone in interactive art, performance, social networking, and multimedia applications. Asterisk and low cost VoIP service are used to develop applications that can work over both telephone networks and the internet. Topics include: history of telephony, plain old telephone service (POTS), voice over IP (VoIP), interactive voice response systems (IVR), audio user interfaces, voice messaging systems (voicemail), text to speech and speech recognition, phreaking (telephone hacking), VoiceXML, conferencing and more.

What’s great about it is that it takes what used to be the standard technology when I was growing up (when I tied up the phone line by being online 24/7), and which has since cooled off so much that a lot of people hardly do voice calls except to narrow down to the exact location when meeting up, and has reappropriated the technology again towards a kind of underground hackerish playground.  Almost the way it used to be.  It also takes into account my past in the Army when I was doing communications interception stuff for military intelligence.

Phone rituals and usage have changed dramatically.  Cellphones have privatized and insulated communications from something that used a shared resource (payphones, house phones, party lines) and made it intimately individual (your phone is your digital you).  But there used to be a public phone infrastructure that you would share with other people on the street, in establishments, etc.  The Matrix reminded us of the metaphor.  You could use cellphones within the Matrix, but no infrastructure existed outside of it.  Cellphones within the Matrix only let you communicate with other people, but you needed a “physical” hardline in order to actually leave the Matrix back to the real world.

http://www.youtube.com/watch?v=rhcwd8qMP1E

What’s more, my classmate Phil, who is an international development sort along with myself (but he’s done way more in the field), pointed out that mobiles and the phone market are HUGE, in developing nations.  They are the premiere infrastructure for trading minutes, passing along money, talking with families.  It’s still the best way for diaspora families to stay in contact.  But for a first-world white society, the world of prepaid calling cards, throwaway burner phones, and international cost/minute plans are completely foreign.

Some poignant examples that came to mind when I thought of phone/PBX projects:

QuestionBox: A service in India where someone in a rural village without reliable phone or internet would press the button on a box, paging an operator in a city.  The villager can ask the operator to look up something, like raw good market prices, bus schedules, cricket scores, or, uh, I don’t know, googling Wikipedia for nyan cats.  What I like about it is it’s kind of like a 411 service for disconnected regions.  It also works well for areas where illiteracy is high, because it doesn’t require any reading to interpret the interface, the query, or the results.  Just requires one phone line of some sort, a power source, and a place to house the button and its equipment.  Some limitations may be on whether the operators speak the dialect of those who call in.


QB TED edit from Mike Paterson on Vimeo.

Nokia 100 & 101: Nokia just released a phone that’s about $30 for developing markets that is loaded with Nokia Life Tools.  As best as I can understand it (some of their documentation and marketing is pretty poor), the interface uses icons and pictures to convey meaning instead of using text, which makes it more useful for those who can’t read.

The above two projects I learned about as a result of the senior Yahoo!/Institute for the Study of Diplomacy researcher my year (when I was a junior researcher), Gaurav Mishra.  See his slides for the panel he had with Evgeny Morozov, Ivan Sigal, and Trebor Scholz:

The phone is said to have 25 days of standby power, and has a built-in flashlight.

More details on the Nokia phones, from Nokia’s site: link 1 & link 2.  And from another site: link 3.

Thus voice still has a valuable role in communication, despite the internet moving to a world of textual sharing and chat, and video consumption.  Until we can video chat each other with the same degree of ease that we transmit text, voice comms will have tons of sleeper applications.  And now that the server-end is available to mess with, perhaps we can get some more interesting backends that bring new uses for voice phones to the public, and to those who don’t have access to rich applications and data that we’re beginning to take for granted.

It also brings back the hacker mentality.  Free hacks that benefit the clever and creative?  The potential to serve a public good?  Sounds ripe for hacking!

Kevin Mitnick’s recent autobiography, Ghost in the Wires: My Adventures as the World’s Most-Wanted Hacker, was all about how he managed to social engineer access into internal networks so he could steal source code for cell phones, call routing software, etc.  He figured out how to clone cell phones and re-route calls long before even the engineers did, and certainly before the government was able to co-opt national communications.

My interest in this is primarily how servers are no longer just in the hands of specific companies, but now in those of anyone who can download Asterisk, maintain it, and write dialplans for it.  In the class, I’m looking forward to making some fun apps as well as learning how to secure my system against trolling.  I wonder if the class could become one where all the students are trying to punk each other?

So here’s a test dialplan I made to play with the ITP Asterisk server.  I took Prof. Kairalla’s default script but added a SayDigits() for my personal phone #, so someone dialing in to my extension could get my actual phone number (for class purposes).  I didn’t know which sound file to use because all there is is a list of sound filenames, not descriptions of what they mean.

exten => s,1,Wait(1)
exten => s,n,SayDigits(${CALLERID(num)})
same => n,Playback(vm-num-i-have)
same => n,SayDigits(5555550001)
; use Archer’s joke voicemail sound
;exten => s,n,Playback(demo-echotest)
;exten => s,n,Echo()
;exten => s,n,Playback(demo-echodone)
same => n,Hangup()

I had trouble finding a good web summary of what Applications were available and what they did.  Same for sound filenames.  Any help pointing me to the right locations for this?