chan_cellphone Asterisk Channel Driver to allow Bluetooth Cell/Mobile Phones and Headsets to be used as FXO devices. Features :- Multiple cell phones can be connected. Multiple headsets can be connected. Asterisk automatically connects to each cell phone / headset when it comes in range. CLI Command to discover bluetooth devices. Inbound calls on the cell network to the cell phones are handled by Asterisk, just like inbound calls on a Zap channel. CLI passed through on inbound calls. Dial outbound on a cell phone using Dial(CELL/device/nnnnnnn) in the dialplan. Dial a headset using Dial(CELL/device) in the dialplan. Application CellStatus can be used in the dialplan to see if a cell phone is connected. Supports devicestate for dialplan hinting. Supports Inbound and Outbound SMS. Using chan_cellphone :- In order to use chan_cellphone, you must have a working bluetooth subsystem on your Asterisk box. This means a working bluetooth adapter, and the BlueZ packages. Any bluetooth adapter supported by the Linux kernel will do, including usb bluetooth dongles. The BlueZ package you need is bluez-utils. If you are using a GUI then you might want to install bluez-pin also. You also need libbluetooth, and libbluetooth-dev if you are compiling Asterisk from source. You need to get bluetooth working with your phone before attempting to use chan_cellphone. This means 'pairing' your phone with your Asterisk box. I dont describe how to do this here as the process differs from distro to distro. You only need to pair once. However, the easist way to pair, is to use you cell phone to search for bluetooth devices, select your Asterisk box and enter the requested PIN. See www.bluez.org for other details about setting up Bluetooth under Linux. Assuming you have bluetooth working ok:- Load chan_cellphone.so Search for your Bluetooth Cell Phones using the CLI command 'cell search'. Be patient with this command as it will take 8 - 10 seconds to do the discovery. Headsets will generally have to be put into 'pairing' mode before they will show up here. This will return something like the following :- *CLI> cell search Address Name Usable Type Port 00:12:56:90:6E:00 LG TU500 Yes Phone 4 00:80:C8:35:52:78 Toaster No Headset 0 00:0B:9E:11:74:A5 Hello II Plus Yes Headset 1 00:0F:86:0E:AE:42 Daves Blackberry Yes Phone 7 This is a list of all bluetooth devices seen and whether or not they are usable with chan_cellphone. The Address field contains the 'bd address' of the cell phone. This is like an ethernet mac address. The Name field is whatever is configured into the phone as its name. The Usable field tells you whether or not the device supports the Bluetooth Handsfree Profile or Headset profile. The Type field tells you whether the device is usable as a Phone line (FXO) or a headset (FXS) The Port field is the number to put in the configuration file. Choose which device(s) you want to use and edit /etc/asterisk/cellphone.conf. There is a sample included with the Asterisk source under configs/cellphone.conf.sample. Assuming we want to use both devices above, cellphone.conf needs to look like this :- =================================================================================== ; ; cellphone.conf ; [general] interval=60 ; Number of seconds between trying to connect to devices. ; The following is a list of the devices we deal with. ; Every device listed below will be available for calls in and out of Asterisk. ; Discovered devices not in this list are not available. ; Use the CLI command 'cell search' to discover devices. ; Use the CLI command 'cell show devices' to see device status. ; ; To place a call use Dial(CELL/[device]/NNN.....) in your dialplan. [dave] address=00:12:56:90:6E:00 port=4 context=incoming-mobile [headset] address=00:0B:9E:11:74:A5 port=1 type=headset =================================================================================== Be sure to configure the right bd address and port number from the search. If you want inbound calls on a device to go to a specific context, add a context= line, otherwise the default will be used. The 'id' of the device [bitinbrackets] can be anything you like, just make the unique. If your are configuring a Headset be sure to include the type=headset line, if left out it defaults to phone. Having done this, unload chan_cellphone and load it again. The CLI command 'cell show devices' can be used at any time to show the status of configured devices, and whether or no the device is capable of sending / receiving SMS via bluetooth. *CLI> cell show devices ID Address Connected State SMS blackberry 00:0F:86:0E:AE:42 Yes Free Yes dave 00:12:56:90:6E:00 Yes Free No headset 00:0B:9E:11:74:A5 Yes Free No *CLI> All being well Asterisk will now try and establish a connection to each configured device. If it cant it will retry after 'interval' seconds, infinately. This means that as your cell phone comes into range and goes out of range, Asterisk will automatically connect and disconnect from it. You dont need to worry about it. As each phone is connected you will see a message on the Asterisk console :- Loaded chan_cellphone.so => (Bluetooth Cellphone Driver) -- Bluetooth Device blackberry has connected. -- Bluetooth Device dave has connected. If someone calls your cell phone now, Asterisk will handle the call and it will be sent into the context you specified, or the default context. Mostly likely this means some SIP phone somewhere will ring, pick it up and take the call. To make outbound calls, add something to you Dialplan like the following :- (modify to suit) ; Calls via TU500 exten => _9X.,1,Dial(CELL/dave/${EXTEN:1},45) exten => _9X.,n,Hangup ; Calls via Blackberry exten => _8X.,1,Dial(CELL/blackberry/${EXTEN:1},45) exten => _8X.,n,Hangup Pick up a SIP phone and dial 9 and the call vill go via the device 'dave' in cellphone.conf. To incoming calls to a headset do something like this :- [incoming-context] exten => s,1,Dial(CELL/headset,30) exten => s,n,Hangup() To dial out on a headset, you need to use some other mechanism, because the headset is not likely to have all the needed buttons on it. res_clioriginate is good for this :- *CLI> originate CELL/headset extension NNNNN@context This will call your headset, once you answer Asterisk will call NNNNN at context context Dialplan hints :- chan_cellphone supports 'device status' so you can do somthing like exten => 1234,hint,SIP/30&CELL/dave&CELL/blackberry CellStatus Application :- chan_cellphone also registers and application named CellStatus. You can use this in your Dialplan to determine the 'state' of a cell phone. For example, suppose you wanted to call dave's extension, but only if he was in the office. You could test to see if his cell phone was attached to Asterisk, if it is dial his extension, otherwise dial his cell phone. exten => 40,1,CellStatus(dave,DAVECELL) exten => 40,2,GotoIf($["${DAVECELL}" = "1"]?3:5) exten => 40,3,Dial(ZAP/g1/0427466412,45,tT) exten => 40,4,Hangup exten => 40,5,Dial(SIP/40,45,tT) exten => 40,6,Hangup CellStatus sets the value of the given variable to :- 1 = Disconnected. i.e. Cell Phone not in range of Asterisk, or turned off etc etc 2 = Connected and Not on a call. i.e. Free 3 = Connected and on a call. i.e. Busy SMS Sending / Receiving If Asterisk has detected your cell phone is capable of SMS via bluetooth, you will be able to send and receive SMS. Incoming SMS's cause Asterisk to create an inbound call to the context you defined in cellphone.conf or the default context if you did not define one. The call will start at extension 'sms'. Two channel variables will be available, SMSSRC = the number of the originator of the SMS and SMSTXT which is the text of the SMS. This is not a voice call, so grab the values of the variables and hang the call up. So, to handle incoming SMS's, do something like the following in your dialplan [incoming-mobile] exten => sms,1,Verbose(Incoming SMS from ${SMSSRC} ${SMSTXT}) exten => sms,n,Hangup() The above will just print the message on the console. If you use res_jabber, you could do something like this :- [incoming-mobile] exten => sms,1,JabberSend(transport,user@jabber.somewhere.com,SMS from ${SMSRC} ${SMSTXT}) exten => sms,2,Hangup() To send an SMS, use the application CellSendSMS like the following :- exten => 99,1,CellSendSMS(dave,0427123456,Hello World) This will send 'Hello World' via device 'dave' to '0427123456' Debugging :- Different phone manufacturers have different interpretations of the Bluetooth Handsfree Profile Spec. This means that not all phones work the same way, particularly in the connection setup / initialisation sequence. I've tried to make chan_cellphone as general as possible, but it may need modification to support some phone i've never tested. The RIM Blackberry 7250 works extremely well. So does the LG TU500. Some phones, most notably Sony Ericsson 'T' series, dont quite conform to the Bluetooth HFP spec. chan_cellphone will detect these and adapt accordingly. The T-610 and T-630 have been tested and work fine. If your phone doesnt behave has expected, turn on Asterisk debugging with 'core set debug 1'. This will log a bunch of debug messages indicating what the phone is doing, importantly the rfcomm conversation between Asterisk and the phone. This can be used to sort out what your phone is doing and make chan_cellphone support it. Be aware also, that just about all cell phones behave differently. For example my LG TU500 wont dial unless the phone is a the 'idle' screen. i.e. if the phone is showing a 'menu' on the display, when you dial via Asterisk, the call will not work. chan_cellphone handles this, but there may be other phones that do other things too... Important: Watch what your cell phone is doing the first few times. Asterisk wont make random calls but if chan_cellphone fails to hangup for some reason and you get a huge bill from your telco, dont blame me. Feedback, Support, Please can you make Cell Phone X work... etc :- email me at david.bowerman at gmail.com or dseeb_ on #asterisk & #asterisk-dev irc.