Tuesday, March 15, 2011

HOWTO: Use Google and Asterisk For Free Home Telephone Service

Recently I have been playing around with free VOIP solutions on my cellphone, and they were pretty neat.  However, they had a lot of jitter, dropped calls, and the occasional connection problem.  I wanted something truly stable with excellent call quality for work besides my cellphone.  Well, I have seen the light and found the answer, and it is a system that uses google talk (what you use to make phone calls from gchat) and google voice.  When it is done, you won't know the difference from your old telco, and it will be free.


BEFORE YOU START:

INGREDIENTS:
1 Linux server (it can be old and not-so powerful)
1 ATA (analog telephone adapter)*
1 or more phone handsets**
1 router with 2 free ports (for your Asterisk server and your analog telephone adapter)
1 google voice account that you don't typically log into for gmail or chatting

*For purposes of this guide, I suggest using the Grandstream HandyTone HT286

**I didn't have a home phone before I did this so I snagged a 3-handset answering system which connect through only one unit (as many these days do) and thus avoid any extra work inherent in connecting multiple phones through your existing home phone wiring.

WHAT YOU WILL GET:
When you are done, you will have a phone that acts like a phone and can call any number in the US and Canda for free or international numbers for pocket change.  You will receive calls to your google voice number on your phone.  You will get incoming phone numbers in your caller id, but you won't get names without a little extra work.  This is because the phone company provides this to you by querying their database.

You can take some extra steps so your Asterisk server has its own caller id database built from your google contacts, but that is outside the scope of this guide.  Many modern handsets (like mine) can check your stored contacts and show the associated names when those people call, so this wasn't a big enough deal to warrant the extra work for me.

WHAT YOU WON'T GET:
911 service!  Also, there is no guarantee Google will keep this free forever.  You also don't get some kludged-together solution where you have to use NAT-traversal or punch holes in your firewall with open ports since this uses native capabilities of Asterisk.  Because this method uses Asterisk by itself, you don't need FreePBX, PIAF (PBX In A Flash), or any other unnecessary extra software.


THE BIG PICTURE (literally):


HOWTO:

1.Set up Asterisk (AKA, the bulk of the work):

Make sure you have a Debian or Ubuntu computer with a static IP address.  You can set up a static IP in /etc/network/interfaces.  I would guess you can use Red Hat-like distros, but some of the locations, required packages, and commands may be a bit different so only go this route if you know what you are doing.   Also, stick to the darn guide.  If you try to get clever and just use the Asterisk package for your distro, it will be horribly outdated and not contain the functionality to do what you want.  You really need to compile it yourself until Asterisk 1.8+ is included in your Linux distribution.

1A.On your Linux box, follow the guide here but don't do step 5 or 6 since those are changes for devices with ARM processors, and I assume you are just using a standard non-ARM computer here.  Also, you don't have to install the second list of packages for FreePBX since you won't need it.  Note that your packages may be slightly different versions than those listed.  For example, on my Debian Squeeze system I found that the package libmysqlclient15-dev was now version 16.  Also, the forum thread in the next step (1B) talks about configuring only the minimum modules needed to run Asterisk, so you may want to reference it later if you need to tune Asterisk for very crappy hardware, but don't worry about that until you get it working.

1B.Next, go to this post and do steps 2-5 since you already did step 1. If you have a different ATA (analog telephone adapter) from what I suggested, then you will need to enter the configuration information as shown in step 6 and configure it on your own.

If you don't see a listing in Google Voice's Settings->Phones for your Google Chat account, then you need to first fire up gmail and dial a call with Google chat.  It should show up then.  

1C.After you finish up that guide, you will need to make some quick additional changes to conquer two issues I encountered.  As root, open /etc/asterisk/extensions.conf and add the following lines just after "exten => you@gmail.com, n,Set(CALLERID(name)=${DB(cidname/${CALLERID(num)})})".

Add these lines just after that line (with "you" replaced with your username):


Then restart your Asterisk server as root by executing /etc/init.d/asterisk restart.

The first new line rips the + sign off of incoming numbers so your phone's callerid will be able to handle them properly.  For example, my handset would show the number, but I couldn't return a call to a missed incoming call from my call log menu on the handset because it didn't recognize the +1-555-5555 format as a valid phone number.  This fixes such issues.

The other three lines let Asterisk pick up the phone while it is ringing, make it wait a very brief period, and then it sends a "1" tone to Google.  If you don't do something like this, incoming calls will be preceded by a message saying "Please press 1 to accept the call..." even if all such options are disabled on google voice.  Worse, pressing 1 didn't work for answering these calls.  If you don't want your phone to pick up calls when you don't answer, then you will need to do something a little different by having asterisk send 1 when you pick up a line based on the other method described here.

2. ATA Setup
2A.Grab your shiny new Handytone box, and connect it to power, ethernet, and your phone.  The manual for it is found here.

Pick up your handset and dial ***.  Then dial "01" to hear your IP address mode and 9 to toggle between dynamic and static.  I highly recommend a static IP.  After toggling to static, hit * to hear a readout of the Handytone's current IP address.   You can enter in a new one by typing 12 digits on the keypad (including any zero values).  You may need to reboot it after that.  You can do so by typing #, then 99, then 9.  After that, you can use a web browser on a computer connected to your router to access the web interface at the IP address you specified.

2B.On the web interface, type the default password "admin".

Click "basic settings" and enter an end-user password other than the default "123", then set the static configuration options making sure the IP is set to what you requested, and that subnet mask matches your router's (usually 255.255.255.0), and default router and DNS settings match your router's IP address for most users.  Also, set up your time info, and US folks in areas with DST should replace the Optional Rule with "3,2,7,2,0;11,1,7,2,0;60" so it follows the newer DST rules instead of the old ones preloaded on the device.  This will matter if you have a handset that resets its display time from the incoming line when you receive a call (as mine does).  Click "Update" when finished.



Click "advanced settings 1" and enter a new admin password in the first box (which you will use to login to the web interface in the future), your Asterix server's IP in the second and third boxes, and "101" in boxes 4 and 5.  If any STUN server options are turned on, deactivate them.  You can also fool around with the codec choices if you like.  I believe that the highest numbered G### options are the better ones.  Then click update (leaving all other settings alone on this page), and then click reboot.


No changes are needed on Advanced Settings 2.  If all goes well, after the reboot you can click status and see "Registered: Yes", and your Handytone won't flash red through the button on top intermittently.  Now make some calls and get some calls to try it out.  For me it is rock-solid stable even for 1hour+ teleconferences, and my Handy-tone is even plugged into a wireless network bridge since I was out of router ports.

After writing this, I figured out how to set your home area code as described here so you can dial local numbers with only seven digits.  Feel free to leave some comments praising me or asking for help. 

HOWTO: Setting up an SMB share on Debian Squeeze

Problem:
I needed to set up a Windows share on my new Debian box since I want it to be a file server for both Windows and Linux clients.   In addition, I wanted the server to be somewhat secure by requiring password access.  In this case, I set up a single shared directory and don't care about sharing /home directories.

Solution:

1.Make sure you have the necessary packages installed.  This will already be done if you selected file server in the Debian installation menu.

sudo apt-get install smbfs samba
 
2.In your /etc/samba/smb.conf file, make the following changes:

 Make sure you have "security = user" in there and uncommented.  It may be set to security = share by default.

In your "Share Definitions" section, set up a new share similar to the following:

[primary]
   comment = Guest access Share
   path = /mnt/primary
   writeable = yes
   valid users = @smb
   guest ok = no

This says that the share will be called "primary", the local path to the share directory is at /mnt/primary, authorized users can write, only users in the group smb are allowed, and anonymous guests cannot use this.

When you are done, save the file.  Then run testparm to see if there are any problems.  Lastly, restart the samba server with  /etc/init.d/samba restart.

3.Client Setup
On windows, choose map network drive from the "My Computer" screen.  Then enter \\debian_box_ip_address\share_name  eg: \\192.168.0.200\primary.  Then choose "login with different credentials" and enter your Linux  username/password.  Have fun.


Next I will cover nfs access.  NFS is what you will want to use for Linux client access.

Debian Networking Fiasco: udevd can't rename interface, file already exists

Recently I overhauled my FreeNAS fileserver and put debian on it so I could have a full-featured Linux distribution at the expense of more complex configuration.  That experience required resolving a number of issues.   This is the first of a series of issues and how I resolved them.  After I wrap up these issue posts, I will do a howto on using google voice and Asterisk for free calling.

Problem:
I get a message saying something like "udevd-work: Cant rename interface eth1-eth0 file already exists."  And the network interface wasn't working.  Also, this issue caused the box to hang for about one minute at boot.

Resolution:
The best I can determine, the onboard ethernet was brought up first, but the system then realized I was connecting through an ethernet adapter card and tried to move the second card to eth0 which was already assigned.  My solution was to prevent the on-board ethernet from starting up.

I could tell the networking was misconfiguring itself by removing the file /etc/udev/rules.d/70-persistent-net.rules and rebooting.  Everything would come up fine once, and then it would be messed up on the next reboot.

I ran lspci to determine what my network interfaces were, and I saw these two:
Ethernet controller: nVidia Corporation MCP77 Ethernet (rev a2)
Ethernet controller: Realtek Semiconductor Co., Ltd. RTL-8169 Gigabit Ethernet (rev 10)

The realtek is the one I want to use, but the nVidia one is the troublemaker.  So I googled to find out the module used by that ethernet controller.  The module was forcedeth.  Next I set about preventing that module from loading, and found this guide.

As root, I then created the suggested file using the command echo "blacklist forcedeth" > /etc/modprobe.d/forcedeth.conf

I then ran depmod -ae, and the system whined about the command.  Then I ran update-initramfs -tu

Lastly, I deleted /lib/udev/rules.d/70-persistent-net.rules in the hopes that a valid one would be produced.  After all that, I rebooted, and it worked fine.

Saturday, March 12, 2011

HOWTO: Free VOIP on Android Phone #2

Previously, I showed you how to get free voip with a combo of pbxes, google voice, and some other tools.   I since discovered there is an easier way that eliminates pbxes altogether which is described below.  Even more recently, I wrote a guide to setting up a high-quality and reliable solution for free home telephone using only Asterisk, an ATA, and Google Talk/Voice.

1.Get a free EKIGA sip address

Sign up for a SIP account with EKIGA here.

2.Get a free IPKALL number

Sign up for a phone number here.  Enter your sip account info for the account you registered in step 1.

3.Get or use your google voice account, and set it to forward to your IPKALL number.  More detail on this can be found in step 4 of the previous guide.

4.Get the "google voice dialer" (not google voice) and csipsimple apps for android.

In csipsimple, you follow the wizard launched by going to menu -> accounts -> add account -> worldwide providers -> ekiga.   It merely requires your ekiga login and password.  Now you are ready to receive calls to your IPKALL number (which will ring your ekiga sip address which will ring csipsimple).

To make free outgoing voip calls you need to configure the google voice dialer app with your google voice account info.  You can then customize the dialing to select when you want to make your calls with google voice callback to your IPKALL number.  Do not dial out with csipsimple through Ekiga itself since it will not work.  More detail on google voice callback app use can be found in step 5 of the previous guide (just replace any references to sipdroid with csipsimple as you read).

There you have it.  Free voip calling on your android cellphone with a relatively easy setup.  Have fun.

Coming soon, I am going to show you how to set up your own Asterisk 1.8+ server and get free high-quality, seamless VOIP at home using only google voice+talk and an analog telephone adapter.