Discover millions of ebooks, audiobooks, and so much more with a free trial

Only £10.99/month after trial. Cancel anytime.

Asterisk 1.4 : The Professional’s Guide
Asterisk 1.4 : The Professional’s Guide
Asterisk 1.4 : The Professional’s Guide
Ebook613 pages4 hours

Asterisk 1.4 : The Professional’s Guide

Rating: 0 out of 5 stars

()

Read preview

About this ebook

Employing a comprehensive handbook-style approach, this easy-to-follow book shows the reader various means of implementing the power of Asterisk in a commercial environment. In next to no time, the reader will gain a deeper understanding of many of the issues faced by Asterisk consultants and the solutions they believe work best. Primarily aimed at Asterisk Professionals, this book provides real-world insight for Asterisk Network Administrators and System Implementers in the commercial environment. This book is not for newcomers to Asterisk. Readers are expected to be experienced with installing and administering Asterisk systems.
LanguageEnglish
Release dateAug 10, 2009
ISBN9781847194398
Asterisk 1.4 : The Professional’s Guide

Related to Asterisk 1.4

Related ebooks

Information Technology For You

View More

Related articles

Reviews for Asterisk 1.4

Rating: 0 out of 5 stars
0 ratings

0 ratings0 reviews

What did you think?

Tap to rate

Review must be at least 10 words

    Book preview

    Asterisk 1.4 - Colman Carpenter

    Table of Contents

    Asterisk 1.4

    Credits

    Foreword

    About the Authors

    About the Reviewers

    Preface

    Reviewing the basics

    No compromise

    What this book covers

    Onwards

    Conventions

    Reader feedback

    Customer support

    Downloading the example code for the book

    Errata

    Piracy

    Questions

    1. The Dialplan

    Dialplan location

    Extensions and contexts

    Pattern matching

    Why use contexts?

    Call barring made simple

    Time and day call routing

    Variables

    Inheritance of channel variables through the dialplan

    Using the AstDB

    Dialplan features and additions

    func_devstate

    What can we use the DEVSTATE() function for?

    Outgoing trunk selection

    Calling extensions

    Setting lights

    Boosting outgoing call capacity

    Using multiple broadband lines

    Configuration overview

    Setting up the routing in Linux

    Configuring Asterisk

    Explanation of the macro

    Downsides

    System() application

    Summary

    2. Network Considerations when Implementing Asterisk

    Centralized and distributed installations

    Centralized installations

    Distributed solutions

    Latency and jitter

    Jitterbuffer

    Echo

    Do your homework

    SLAs are for everyone

    Achieving the goal

    Backups

    To share or not to share

    Ensuring quality

    When things go wrong

    Red

    Amber

    Green

    Increasing resilience

    Summary

    3. Call Routing with Asterisk

    Routing methods

    Where to start

    Internal calls

    Local calls

    National calls

    International calls

    Alternative options

    ENUM

    DUNDi

    Types of routing

    Routing techniques

    Summary

    4. Call Centers—Queues and Recording

    Asterisk queues

    Queue gotchas

    A practical queue

    Using queues to cascade calls

    Call recording—the issues

    Show-stoppers

    VoIP recording approaches

    Impact of VoIP on recording systems

    Hardware convergence

    Distributed call centers

    Home working

    VoIP recording challenges

    Routing

    Bandwidth

    Encryption

    Solutions

    Asterisk call center solutions

    How VICIDIAL works

    Handling inbound calls

    Installation

    Timing sources

    Scalability

    Summary

    5. Asterisk and Speech Technology

    Why speech-enable?

    Types of speech technologies

    Automatic Speech Recognition (ASR)

    Isolated Word Recognition

    Connected Word Recognition

    Natural Language Recognition

    Text-to-Speech (TTS)

    Speaker Verification and Identification (SVI)

    MRCP

    Implementation considerations

    ASR and Asterisk

    Installing LumenVox speech recognition with Asterisk

    Checking that things are working

    SpeechCreate()

    SpeechLoadGrammar (yesno,/etc/lumenvox/Lang/BuiltinGrammars/ABNFBoolean.gram)

    SpeechActivateGrammar(yesno)

    SpeechBackground(beep)

    Verbose(1,Result was ${SPEECH_TEXT(0)})

    Verbose(1,Confidence was ${SPEECH_SCORE(0)})

    SpeechStart()

    SpeechDeactivateGrammar(label)

    SpeechUnloadGrammar(label)

    SpeechDestroy()

    ${SPEECH(results)}

    Grammar files

    Implementation advice for ASR

    TTS with Asterisk

    Implementation advice for TTS

    Summary

    6. Call Accounting and Billing

    Call Data Records (CDRs)

    CDR frontends

    Call accounting

    Providing termination billing

    Every little helps

    Selecting a billing platform

    Introducing A2Billing

    Reasons to consider A2Billing

    A2Billing requirements

    Monitoring usage

    Coding for A2Billing

    Billing gotcha!

    High call volumes

    Other high-call-volume solutions

    SER/OpenSER

    FreeSWITCH

    Summary

    7. Resilience and Stability

    Increasing availability

    Stability

    Network

    Cables

    Switches and routers

    Endpoints

    Telephony switches and gateways

    Server

    Environment

    Dealing with failure

    Network resilience

    Server

    High availability

    Ultra Monkey

    Telephony switches/gateways

    Redfone foneBRIDGE2

    Junghanns ISDNguard

    Endpoints

    Round robin DNS

    Say hello to Rsync

    Limiting the number of calls per server

    Summary

    8. Localization and Practical Security

    Tones

    Time and date and localization

    Changing the language of system prompts

    Local telephony interfaces

    Analog

    Digital

    Localizing caller ID signaling on Digium analog interfaces

    Checklist

    Practical security

    Out of hours

    Summary

    9. Interfacing with Traditional Analog and Digital Telephony

    Analog

    Digital

    ISDN BRI (Basic Rate Interface)

    ISDN PRI (Primary Rate Interface)

    Choices, choices

    Using external adaptors

    Using cards

    Installing a Digium card

    Card installation—physical

    Installing the DAHDI software

    Configuring the DAHDI files to enable the card

    What about the other cards?

    framing

    coding

    Troubleshooting with Digium cards

    Summary

    10. Integrating Asterisk with Wireless Technologies

    Why integrate Asterisk with wireless technologies?

    Wireless technology overview

    Wi-Fi (only) phones

    SIP desk phones with a wireless link

    Dual-mode (GSM and SIP) phones and PDA/smart phones

    SIP/DECT phones

    Connecting Asterisk to mobile networks

    Why connect to mobile networks?

    The GSM gateway (box)

    The GSM card

    Configuring wireless devices

    Configuring Asterisk to work with wireless technologies

    Deployment choices

    Neat money saving tricks

    Calling a mobile phone

    Avoiding those nasty roaming charges that arise from receiving calls

    Summary

    11. Graphical User Interfaces

    Reasons for going GUI

    Good to GUI

    Ease of administration

    Access to enhanced features

    Easier upgrade process

    Standardized code

    GUI, phooey!

    Performance

    Stability

    Restricted functions

    FreePBX

    How it works

    Installation

    Configuration

    Extensions

    Inbound routes

    Outbound routes

    Trunks

    Other records

    Summary

    A. Selling Your Solution

    In the beginning ...

    Drivers for changing phone systems

    A word on cost

    Generating interest

    Alliances

    Advertising

    Search engines

    Become an expert

    Relationship marketing

    Email as a marketing tool

    Tracking prospects

    Converting the prospect into a sale

    Determining your customer's hardware requirements

    Choosing the right phones

    Tales of woe

    Aastra

    Linksys

    Siemens Gigaset IP DECT phones

    Snom M3

    Remote support

    Make it secure

    Do's and don'ts

    The do's

    First impressions

    Get brochures printed

    Take notes

    Send the quote in a timely manner

    Follow up the quote

    Target the decision makers, but don't ignore IT

    The don'ts

    You don't need a fancy office

    Don't cut corners on the solution

    Don't under price

    Don't have a huge margin on handsets

    Don't supply a PC as the phone server

    Summary

    B. Sample Email Content

    What is VoIP?

    Why should I consider VoIP?

    Cost savings

    Call costs

    Line rental costs

    Wiring costs

    Reduced infrastructure costs

    Centralized management

    System integration

    Unified messaging

    Reliability

    Closed and open systems

    Superior sound

    Fallback solutions

    Broadcasting calls

    A number for life

    Number porting

    Local numbers

    About XYZ

    Our philosophy

    Our passion

    C. Sample Appointment Sheet

    Index

    Asterisk 1.4

    The Professional's Guide

    Colman Carpenter

    Ian Plain

    David Duffett

    Nik Middleton


    Asterisk 1.4

    The Professional's Guide

    Copyright © 2009 Packt Publishing

    All rights reserved. No part of this book may be reproduced, stored in a retrieval system, or transmitted in any form or by any means, without the prior written permission of the publisher, except in the case of brief quotations embedded in critical articles or reviews.

    Every effort has been made in the preparation of this book to ensure the accuracy of the information presented. However, the information contained in this book is sold without warranty, either express or implied. Neither the authors, nor Packt Publishing, and its dealers and distributors will be held liable for any damages caused or alleged to be caused directly or indirectly by this book.

    Packt Publishing has endeavored to provide trademark information about all of the companies and products mentioned in this book by the appropriate use of capitals. However, Packt Publishing cannot guarantee the accuracy of this information.

    First published: August 2009

    Production Reference: 1030809

    Published by Packt Publishing Ltd.

    32 Lincoln Road

    Olton

    Birmingham, B27 6PA, UK.

    ISBN 978-1-847194-38-1

    www.packtpub.com

    Cover Image by Vinayak Chittar (<[email protected]>)

    Credits

    Authors

    Colman Carpenter

    David Duffett

    Nik Middleton

    Ian Plain

    Reviewers

    Ian Plain

    Jared Smith

    Philippe Lindheimer

    Acquisition Editor

    James Lumsden

    Technical Editors

    Gagandeep Singh

    Charumathi Sankaran

    Indexer

    Rekha Nair

    Editorial Team Leader

    Gagandeep Singh

    Project Team Leader

    Lata Basantani

    Project Coordinator

    Neelkanth Mehta

    Proofreader

    Laura Booth

    Production Coordinator

    Aparna Bhagat

    Cover Work

    Aparna Bhagat

    Foreword

    Watching Asterisk move from being a personal coding project to a community of tens of thousands of programmers and millions of users has been quite the ride so far! Asterisk is only now hitting its prime, and there are so many more things that creative people are going to do with the code. The growth of the project over the years has stunned and pleased me, and it's amazing that well-written and comprehensive books like this now exist to help more advanced users navigate the waters of larger and more complex Asterisk installations. Asterisk installations are now huge, both in numbers of locations and the unimaginably large size of many of those locations—thousands or tens of thousands of users! Asterisk implementations are rarely limited by the capability of the software but more often by not knowing how to utilize it. Books like this play an important role in getting the experience of those who have already done in the hands of those who want to do.

    Hopefully the knowledge here allows you to continue your adventure with Asterisk, moving from the basics of PBX construction to having the ability to quickly implement advanced call logic processes and work with the more exotic telephony and VoIP interfaces. The motto of There's more than one way to do it! is almost always true with Asterisk—this book seems to contain an excellent cross-section of at least one of those ways to do it (whatever it happens to be for your application) and you'll quickly think of many other ways once you've mastered the methods shown.

    The authors here have really shown some excellent detailed explanations of how to use Asterisk, and I hope this provides the incentive for you, the reader, to experiment in more wide-ranging ways with Asterisk once you've understood the basics. Most of the Asterisk community has learned with hands-on experimentation, and it's great to see more encouragement of this type of learning as is contained in these pages. Kudos to the authors, especially David Duffett, who has been involved with Asterisk for so long and has taught so many people their first dialplan routines (and hopefully has left them uninjured from his famous habit of throwing candy at people who give correct answers in class or in his talks).

    Soon you'll be doing least-cost-routing, integrating your instant messenger system with your mobile phone calls, controlling robots with voice commands via your phone, or dreaming up a new company based on some voice-based service that nobody has tapped into yet. And the best thing about Asterisk is that it remains open source—if you come up with a feature or enhancement that you think must be in Asterisk, then the good news is that it can be! Become a member of the Asterisk community, and your contributed code could be included. We all anxiously await your book, your product, or just your involvement with the Asterisk community.

    Mark Spencer

    Chairman and CTO of Digium

    About the Authors

    Colman Carpenter is the MD of Voicespan, a Kent-based company that offers Asterisk-based systems to the SME market across the UK. He is an IT professional of over 20 years standing, with experience in diverse areas such as IBM mid-range software development, Lotus Notes and Domino consultancy, Data Management, E-marketing consultancy, IT Management, Project Management, Wordpress Website Design, and lately, Asterisk consultancy. He is a qualified PRINCE2 practitioner.

    Voicespan (http://www.voicespan.co.uk) offers Asterisk-based systems as the cornerstone of a holistic VoIP-telephony service for SMEs. They offer companies a one-stop shop for implementing a VoIP-capable system, encompassing Asterisk-based systems, endpoints, trunks, telephony interfaces and network equipment, and the consultancy necessary to bring it all together into a coherent whole. This is his first book.

    I would like to thank my wife, Hazel, and daughters, Caiti and Fay, for their support during the writing of this book. At times it seemed like you believed more than I in my ability to do so!

    David Duffett delivers Asterisk training and consultancy around the world through his own company (TeleSpeak Limited, www.telespeak.co.uk), in addition to designing and delivering training for a number of companies, including Digium, Inc.

    A keen Asterisk enthusiast, David also enjoys podcasting, radio presenting, and teaching public-speaking skills. He is a Chartered Engineer with experience in fields including Air Traffic Control communications, Wireless Local Loop, Mobile Networks, VoIP, and Asterisk. David has been in the telecoms sector for nearly 20 years and has had a number of computer telephony, VoIP, and Asterisk articles published through various industry publications and web sites.

    Nik Middleton has been in wide-area communications since the mid-eighties. He spent most of the nineties working in the US, where he developed a shareware Microsoft mail to SMTP/POP3 connector that sold some 287,000 copies. He spent six years working for DuPont in VA, developing remote monitoring systems for their global Lycra business. In late 2000, he returned to the UK where he held various senior positions in British Telecom, LogicaCMG, and Computer Science Corp.

    In 2005, tired of working in London, he set up his own company (Noble Solutions) providing VoIP solutions in rural Devon, where he now lives with his wife Georgina and three children, Mathew, Vicky, and Isabel. A keen amateur pilot, his favorite place when not in the office is flying over the beautiful Devon countryside.

    Ian Plain has worked in the telecoms industry since 1981 and has designed some of the largest PBX networks in the UK. Since the late 1990s, he has been involved with VoIP initially for links between systems, and with IP PBX systems since 1999. Since 2003, he has been running a telecoms consultancy based near Bath in the UK, working primarily on high-availability Asterisk-based solutions for corporate customers.

    About the Reviewers

    Ian Plain: Please see the entry in About the Authors.

    Jared Smith is the Training Manager for Digium, Inc. As a long time Asterisk user, contributor, and evangelist, he has spent the last several years helping the Asterisk community. Jared is a dynamic and knowledgeable instructor with several years of experience in leading various Asterisk training classes.

    He is also co-author of Asterisk: The Future of Telephony, O'Reilly Media and regularly writes other Asterisk documentation as well.

    Jared holds a Bachelors of Science degree in Computer Engineering from the Utah State University and currently lives in Virginia with his wife and two children.

    Philippe Lindheimer is the project leader and primary developer of FreePBX and serves as the Open Source Community Director at Bandwidth.com, the corporate sponsor of the FreePBX project (the most widely deployed Asterisk-based PBX/GUI open-source application in the world). He cofounded and runs the Open Telephony Training Seminar providing FreePBX/Asterisk technical and marketing training to resellers and end users. Originally with Hewlett Packard, he has been in the engineering industry for over two decades, working on a range of technical consulting roles with many Fortune 500 Companies.

    He has a BS (Hons) in EE/CS from the University of Colorado, Boulder. He now lives in the Seattle, WA area.

    Preface

    This book is a sequel to Building Telephony Systems with Asterisk, which started you on a journey to the summit of Asterisk knowledge, taking you from base camp to camp two, from being a complete Asterisk newbie to a competent telephony system builder and manager. Now it's time to push to the top, to take your telephony knowledge to a point where you can build high-performance, resilient, and professional PBXs using the most popular open source telephony software in the world—Asterisk.

    In that book, the focus was very much on installing and configuring Asterisk for a number of common scenarios, including both home and office use. This it achieved admirably, so you may now wonder why another book is needed. Well, there are three main reasons for writing this book. Firstly, Asterisk is such a highly-capable and configurable telephony engine that the 150-odd pages in the book necessarily had to exclude discussion of some of the more advanced features, which we now have the opportunity to explore. Secondly, Asterisk is invariably implemented as part of an IP network, and further examination of network considerations is warranted. Finally, like all popular open source software, Asterisk is constantly being updated, and while this book still assumes the version 1.4 of Asterisk is in use, we do point out any differences in version 1.6 where relevant, such as the change from Zaptel to DAHDI.

    Therefore, the goal of this book is to give you enough knowledge to build and install a telephony system with Asterisk at its core, which will stand comparison with the market-leading commercial IP-enabled systems. Whether you are building such a system as a result of an internal company requirement, or you plan to offer it as an element of a commercial package to customers, this book will take you through all the areas that require consideration. On reading this book you will also be in a position to understand the real-life issues you are likely to experience when deploying such a system, both technical and otherwise.

    By its very nature, Asterisk demands that much of the focus of this book be on the technical aspects of building your professional system. However, as with most IT implementations, success will also rely on soft issues such as managing expectations, understanding and meeting the customer's particular needs, and ensuring delivery is on time and up to the budget. Hence, where appropriate, we make mention of the non-technical aspects that may make a difference to your deployment.

    To achieve our goal, this book will build on knowledge already gained by reinforcing that learning and adding extra skills covering:

    Security

    Networks

    Large-scale considerations

    Resilience

    Scalability

    Integration with complementary products

    Commercial aspects

    Reviewing the basics

    If you have not already done so, it is recommended that you read Building Telephony Systems with Asterisk, or achieve a good degree of competence in building basic Asterisk PBXs through other means. These could include commercial training courses (see www.digium.com/en/training for further details) or openly available internet resources such as the excellent VoIP wiki at http://www.voip-info.org.

    While most people with a day-to-day exposure to Asterisk systems should stand to gain much from this book, it has been written in the expectation that you will possess the following Asterisk skills and experience, ideally gained through text file configuration:

    Connecting Asterisk to analogue and digital PSTN lines, and VoIP services

    Configuring different types of terminal equipment (phones, communication devices, other PBXs)

    Installing Asterisk, Zaptel and LibPRI

    Configuring features (Voicemail, Music On Hold, Queues, Conference Rooms, and so on)

    Creating a dialplan, including call distribution

    CDRs, call monitoring and recording

    Backups and restores

    Basic security and load balancing

    Once equipped with this knowledge you stand to gain the maximum from the topics covered in this book, enabling you to build professional Asterisk systems to be deployed internally, or to form the cornerstone of a commercial offering.

    No compromise

    In this book you will, hopefully, learn many new things. At its conclusion you will have the knowledge to build and successfully implement systems that combine great performance, resilience and stability. In order to do so, we will mainly consider pure Asterisk systems that require a deep understanding of the dialplan and configuration files without the safety-net of a GUI in between. Think of it as learning to become a great car mechanic. You can certainly be a good mechanic earning a good living by learning how to use a laptop plugged into an engine management system. But if you want to take that extra step to being a true master of the trade then you need to understand at a very deep level just how the internal combustion engine works. So it is with Asterisk. It is perfectly feasible to put very good solutions together using GUI-based systems such as the Digium-owned Switchvox, Trixbox (formerly Asterisk@Home) or PBX in a Flash, but to construct the best systems you will need to understand what is happening under the hood so that you can tweak them appropriately to achieve or exceed the customers' expectations.

    One advantage of eschewing the GUI approach is a potential increase in performance and scalability through the use of a highly-optimized dialplan and a reduction in applications running on the server. However, there are many situations where a GUI is at least as appropriate, particularly if the customer wishes to carry out day-to-day management tasks. Therefore, in Chapter 12 we look at the implications of choosing a GUI-based solution over a vanilla system.

    Note

    To follow the trusted network of Asterisk developers please visit: www.asteriskpro.co.uk

    What this book covers

    As a result of reading this book, you can expect to build on existing knowledge and gain new skills. Each chapter covers a particular topic, but throughout there is a focus on building an Asterisk system that can form the cornerstone of a serious commercial product, capable of matching or even exceeding the performance of well-known licensed products.

    Chapter 1 talks about dialplan techniques including modular implementations by using macros, contexts, and so on to both refine the dialplan and improve the security of the system. It also discusses the use of the devstate() function.

    Chapter 2 discusses customer network requirements and offers some good advice about potential issues within the customer network and how to resolve them, including the use of VLANs and Quality of Service.

    Chapter 3 looks at routing in general, including Least Cost Routing (local, national, and international GSM gateways), fall-back routing, alternate routing, and so on. ENUM and DUNDi are also explained within this context.

    Chapter 4 considers call center requirements, including queues, agents, call distribution strategies, performance monitoring and call recording issues. An Asterisk-based call center solution, VICIDIAL, is also discussed in some detail.

    Chapter 5 introduces speech technology in the form of ASR, TTS, and SVI; followed by implementation advice and examples. Both Lumenvox and Cepstral packages are explored in detail.

    Chapter 6 looks at methods that can be used to implement call accounting and billing solutions for Asterisk. In particular, Asterisk-stat and A2Billing are explored.

    Chapter 7 discusses resilience and stability, giving you a guide to implementing highly-available Asterisk solutions for mission-critical applications. Use of failover and load-balancing techniques are explored.

    Chapter 8 explores the comprehensive localization options within Asterisk, and also suggests some easily deployed security measures.

    Chapter 9 considers interfaces with traditional analogue and digital telephony, giving more in-depth explanations of Libpri and DAHDI (formerly Zaptel), and discussing implementation considerations.

    Chapter 10 tackles the good and bad points of using wireless technologies with Asterisk, covering Wi-Fi, dual-mode and DECT handsets. Some suggestions on routing via cell/mobile networks are also offered.

    Chapter 11 looks at the good and bad points of Asterisk Graphical User Interfaces (GUIs), focusing on one of the most popular incarnations, FreePBX.

    In Appendix A we also explore some of the softer skills required when selling Asterisk-based solutions, suggesting some sales strategies that can help you in a commercial environment.

    In Appendix B you will find information you might want to include in sample emails when pitching.

    In Appendix C you will find a sample appointment sheet which can be used as a template.

    Onwards

    So now our campsite has been packed away and it is time for the next part of our journey to begin, for those first purposeful steps to be taken towards the summit. We will start in Chapter 1 by looking at the heart of any Asterisk system, the dialplan. You will already have significant knowledge in this area, but we are about to show you some of the techniques that are used in systems with thousands of extensions that handle many tens of thousands of calls per day. Without these techniques, a dialplan can become an unholy mess as system size increases. However, using these techniques will ensure that complexity is avoided and performance is maintained.

    Conventions

    In this book, you will find a number of styles of text that distinguish between different kinds of information. Here are some examples of these styles, and an explanation of their meaning.

    Code words in text are shown as follows: We can include other contexts through the use of the include directive.

    A block of code is set as follows:

    exten => s,1,Dial(Zap/1,30)

    exten => s,n,Goto(s-${DIALSTATUS},1)

    exten => s,n,Hangup()

    exten => s-NOANSWER,1,Voicemail(100,u)

    exten => s-BUSY,1,Voicemail(100,b)

    exten => i,1,Voicemail(0,s)

    When we wish to draw your attention to a particular part of a code block, the relevant lines or items are set in bold:

    [default]

    exten => s,1,Dial(Zap/1|30)

    exten => s,2,Voicemail(u100)

    exten => s,102,Voicemail(b100)

     

    exten => i,1,Voicemail(s0)

    Any command-line input or output is written as follows:

    # cp /usr/src/asterisk-addons/configs/cdr_mysql.conf.sample

    /etc/asterisk/cdr_mysql.conf

    New terms and important words are shown in bold. Words that you see on the screen, in menus or dialog boxes for example, appear in the text like this: clicking the Next button moves you to the next screen.

    Note

    Warnings or important notes appear in a box like this.

    Note

    Tips and tricks appear like this.

    Reader feedback

    Feedback from our readers is always welcome. Let us know what you think about this book—what you liked or may have disliked. Reader feedback is important for us to develop titles that you really get the most out of.

    To send us general feedback, simply send an email to <[email protected]>, and mention the book title via the subject of your message.

    If there is a book that you need and would like to see us publish, please send us a note in the SUGGEST A TITLE form on www.packtpub.com or email

    Enjoying the preview?
    Page 1 of 1