Làm thế nào để FreeSWITCH so sánh với Asterisk? Tại sao anh lại bắt đầu lại với một ứng dụng mới? Đây là những câu hỏi tôi đã được nghe rất nhiều thời gian gần đây vì vậy tôi quyết định để giải thích cho tất cả các chuyên gia điện thoại và những người đam mê cũng như những người quan tâm để biết làm thế nào hai ứng dụng so sánh và tương phản với nhau. Tôi có một số lượng lớn các kinh nghiệm với cả hai ứng dụng với khoảng 3 năm thực hiện phát triển dấu dưới thắt lưng của tôi và tốt, là tác giả của FreeSWITCH. Đầu tiên tôi sẽ cung cấp một ít lịch sử và kinh nghiệm của tôi với Asterisk, sau đó tôi sẽ cố gắng giải thích những động lực và phương pháp tiếp cận khác nhau tôi đã có FreeSWITCH. đầu tiên tôi đã cố gắng Asterisk trong năm 2003. Nó vẫn còn trước 1.0 và VoIP là vẫn còn rất mới với tôi . Tôi đã tải về và cài đặt nó và trong một vài phút, tôi đã được cù màu hồng trong giai điệu quay số phát ra từ điện thoại của tôi cắm vào mặt sau của máy tính của tôi. Tôi đã dành vài ngày tới chơi với kế hoạch quay số của tôi và kệ bộ não của tôi để suy nghĩ thứ mát mẻ tôi có thể làm với một chiếc điện thoại được nối với một máy tính Linux. Kể từ khi tôi đã thực hiện một số lượng rộng lớn của phát triển web trong cuộc sống quá khứ của tôi, tôi đã có tất cả các loại ý tưởng tiện lợi như phù hợp với người gọi id để số tài khoản của khách hàng và cố gắng đoán lý do tại sao họ đã kêu gọi vv Tôi cũng muốn di chuyển vào trong quay của tôi kế hoạch dựa trên mô hình kết hợp và bắt đầu hack mô-đun đầu tiên của tôi. Trước khi tôi biết điều đó tôi đã thực hiện cắt giảm đầu tiên của app_perl, bây giờ res_perl nơi tôi đã nhúng một thông dịch viên Perl5 trong Asterisk. Bây giờ tôi đã có ra khỏi hệ thống của tôi, tôi bắt đầu phát triển một cơ sở hạ tầng Asterisk định hướng để sử dụng cho hàng đợi cuộc gọi trong nước của chúng tôi . Tôi prototyped nó sử dụng app_queue và giao diện quản lý bây giờ tự hào gọi là "AMI" (viết tắt luôn luôn làm cho mọi việc mát âm thanh). Nó đã thực sự tuyệt vời! Bạn có thể gọi từ một số PSTN trên T1 và tham gia vào một hàng đợi cuộc gọi mà các đại lý của chúng tôi cũng gọi có thể phục vụ các cuộc gọi. "Điều này đá!" Tôi nghĩ đến bản thân mình khi tôi xem từ trang web ưa thích của tôi hiển thị tất cả các hàng đợi và những người đã được đăng nhập Nó thậm chí làm mới định kỳ bởi chính nó đã được lý do tại sao tôi đã rất ngạc nhiên khi biểu tượng nhỏ ở góc của trình duyệt của tôi là vẫn quay trong một thời gian. Đó là khi tôi lần đầu tiên nghe nó. Từ đó. Một trong tôi không bao giờ có thể quên, bế tắc. Đó là lần đầu tiên, nhưng nó không phải là cuối cùng. Tôi đã học được tất cả về chương trình gỡ rối GNU ngày hôm đó và đó chỉ là một trong nhiều sự cố. Bế tắc trong các ứng dụng hàng đợi. Bế tắc trong quản lý, tránh bế tắc trên giao diện điều khiển của tôi. Nó đã bắt đầu để có được với tôi một chút nhưng tôi vẫn tiếp tục. Bởi thời gian này tôi cũng khá quen thuộc với các phân khúc hạn Lỗi kẻ thù khác để phát triển máy tính. Sau thời gian khoảng một năm vật lộn với lỗi của tôi tìm thấy bản thân mình rất nhiều thành thạo ngôn ngữ lập trình C hơn tôi thậm chí tưởng tượng và gần Jedi kỹ năng tầm cỡ gỡ lỗi. Tôi đã có một nền tảng làm việc chạy một số dịch vụ trên một giá trị DS3 kênh TDM trải rộng trên 7 hộp dấu và tôi đã cho tấn mã cho dự án bao gồm một số toàn bộ các file trên mà tôi giữ bản quyền. http://www.cluecon.com/anthm.html Đến năm 2005, tôi đã khá nổi tiếng là một nhà phát triển dấu hoa thị. Họ thậm chí còn cảm ơn tôi trong cả hai tập tin TÍN DỤNG và trong cuốn sách, Asterisk, Tương lai của điện thoại. Tôi không chỉ có tấn của các ứng dụng cho dấu hoa thị trong cây, tôi đã có bộ sưu tập riêng của tôi về code họ không cần hoặc muốn trên trang web của riêng tôi. (Tuy nhiên hiện nay tại http://www.freeswitch.org/node/50) Mặc dù tất cả điều này tôi có thể không hoàn toàn thoát khỏi sự bế tắc và tai nạn. Tôi giấu vấn đề tốt với kịch bản khởi động lại và 7 cụm máy nhưng tôi không thể nhìn thấy một cách để mở rộng nền tảng của tôi nhiều hơn nữa. Tôi đã phải từ bỏ một số tính năng bởi vì họ chỉ sẽ không làm việc đúng dựa trên cách Asterisk được thiết kế. Asterisk sử dụng một thiết kế mô-đun nơi một tải lõi trung tâm chia sẻ đối tượng để mở rộng chức năng với các bit của mã được gọi là "mô-đun". Mô-đun được sử dụng để thực hiện các giao thức cụ thể như SIP, thêm các ứng dụng như IVRs tùy chỉnh và buộc trong giao diện bên ngoài khác như giao diện quản lý. Cốt lõi của Asterisk là một mô hình luồng nhưng rất bảo thủ. Kênh nguyên chỉ và các kênh truyền hình thực hiện một ứng dụng có chủ đề. Chân B của bất kỳ cuộc gọi chỉ hoạt động trong cùng một chủ đề như một chân và một cái gì đó khi xảy ra giống như một chuyển cuộc gọi kênh đầu tiên phải được chuyển sang một chế độ ren thường lần bao gồm một thực tế được gọi là kênh giả trang, một quá trình mà tất cả các ruột của một kênh bị rách từ một đối tượng bộ nhớ động và được đặt vào một. Một thực tế đã được một lần được mô tả trong mã nhận xét là "khó chịu". Cùng đi cho các hoạt động ngược lại các chủ đề đã được loại bỏ bằng cách nhân bản các kênh và cho phép các ban hang-up mà cũng cần hack cấu trúc cdr để tránh nhìn thấy nó như là một cuộc gọi mới. Người ta thường sẽ thấy 3 hoặc 4 kênh cho một cuộc gọi duy nhất trong một chuyển cuộc gọi vì điều này. / * XXX Đây là một hoạt động nghiêm túc wacked ra. Chúng ta đang chủ yếu đưa ruột của kênh nhân bản vào kênh ban đầu. Bắt đầu bằng cách giết chết các ban phụ trợ của kênh. Tôi không chắc chắn chúng ta sẽ tiếp tục chức năng này, bởi vì trong khi các tính năng là tốt đẹp, chi phí là rất cao về nastiness tinh khiết. XXX * / Điều này đã trở thành cách thực tế để kéo một kênh ra khỏi nắm của một chủ đề và nguồn gốc của nhiều đau đầu cho các nhà phát triển ứng dụng. Chương trình luồng không chắc chắn này là một trong những yếu tố thúc đẩy cho một viết lại. Asterisk sử dụng liên kết-danh sách để quản lý các kênh truyền hình mở của nó. Một danh sách liên kết là một loạt các bộ nhớ động xích lại với nhau bằng cách sử dụng một cấu trúc có một con trỏ đến kiểu riêng của nó như là một trong những thành viên cho phép bạn ngừng chuỗi các đối tượng và theo dõi chúng. Họ thực sự là một thực hành lập trình hữu ích nhưng khi được sử dụng trong một ứng dụng ren trở nên rất khó quản lý. Người ta phải sử dụng mutexes, một loại đèn giao thông cho chủ đề để đảm bảo chỉ có 1 chủ đề bao giờ có quyền ghi vào danh sách hoặc bạn có nguy cơ một sợi rách một liên kết từ một danh sách khác, trong khi đang đi qua nó. Điều này cũng dẫn đến tình huống khủng khiếp mà một thread có thể được phá hủy hoặc giả mạo một kênh khác, trong khi đang truy cập vào nó mà sẽ dẫn đến một lỗi phân khúc đó là một lỗi nghiêm trọng trong chương trình và làm cho nó ngay lập tức ngăn chặn đó, tất nhiên có nghĩa là trong nhiều trường hợp tất cả các cuộc gọi của bạn sẽ bị mất. Tất cả chúng ta đã nhìn thấy dòng chữ: "Tránh bế tắc ban đầu" thông điệp mà chủ yếu là một nỗ lực để khóa một kênh 10 lần và nếu vẫn không khóa, chỉ cần đi trước và quên khóa. Giao diện quản lý hoặc AMI có một khái niệm mà ổ cắm được sử dụng để kết nối các khách hàng được truyền vào các ứng dụng để cho module của bạn có thể truy cập trực tiếp vào nó và về cơ bản viết bất kỳ dữ liệu bạn muốn mà ổ cắm trong các hình thức quản lý sự kiện mà không phải là rất có cấu trúc và do đó các giao thức là rất khó khăn để phân tích. lõi Asterisk đã liên kết phụ thuộc vào một số module của nó có nghĩa là ứng dụng sẽ không bắt đầu nếu một mô-đun nào đó không có mặt vì cốt lõi là thực sự sử dụng một số các mã nhị phân từ các mô-đun đối tượng chia sẻ trực tiếp. Để thực hiện cuộc gọi trong dấu trong ít nhất là phiên bản 1.2 bạn không có sự lựa chọn nhưng để sử dụng app_dial và res_features vì mã thực sự sống trong những mô-đun. Việc xử lý để thiết lập một cuộc gọi và làm những việc như quay số forked thực sự cư trú trong app_dial không phải là cốt lõi, và res_features thực sự có chức năng cấp cao nhất là cầu nối âm thanh. Asterisk không có bảo vệ của API của nó. Phần lớn các chức năng và cấu trúc dữ liệu được công khai và có thể dễ dàng bị lạm dụng hoặc bỏ qua. Cốt lõi là tình trạng hỗn loạn với các giả định về các kênh có một mô tả tập tin, mà không phải là luôn luôn cần thiết trong thực tế nhưng là bắt buộc đối với bất kỳ kênh dấu hoa thị. Nhiều thuật toán này được lặp đi lặp lại trong suốt mã những cách hoàn toàn khác nhau với mỗi ứng dụng làm một cái gì đó khác nhau về hoạt động dường như giống hệt nhau. Đây chỉ là một bản tóm tắt ngắn gọn về các vấn đề hàng đầu tôi đã có với Asterisk. Tôi dành thời gian của tôi như là một coder, máy chủ của tôi để lưu trữ các kho CVS và phục vụ như một soái lỗi và bảo trì. Tôi đã tổ chức một cuộc gọi hội nghị hàng tuần để lên kế hoạch cho tương lai và giải quyết một số vấn đề tôi đã mô tả ở trên. Vấn đề là, khi nhìn vào danh sách dài của những thay đổi cơ bản sau đó nghĩ về bao nhiêu công việc nó sẽ mất và bao nhiêu mã có thể phải được tẩy xóa hoặc viết lại, động lực để giải quyết các vấn đề bắt đầu mờ dần. Tôi có thể nói không nhiều người sẽ được trên tàu với đề nghị của tôi để bắt đầu một chi nhánh 2.0 và viết lại mã. Đó là lý do tại sao trong mùa hè năm 2005, tôi quyết định tôi sẽ làm điều đó bản thân mình. trọng tâm chính của tôi trên FreeSWITCH đã được bắt đầu từ lõi và bẫy tất cả các chức năng phổ biến dưới mui xe và phơi bày nó trong một kim tự tháp với cấp độ cao hơn của ứng dụng. Như Asterisk, Apache Web Server rất nhiều cảm hứng cho tôi và tôi đã chọn để sử dụng một thiết kế mô-đun. Từ ngày đầu tiên các nguyên tắc cơ bản cơ bản tôi đã chọn để tuân thủ được rằng tất cả các kênh có chủ đề riêng của nó không có vấn đề gì nó đã làm và chủ đề đó sẽ sử dụng một chức năng máy nhà nước để điều hướng theo cách của mình thông qua cốt lõi. Điều này sẽ đảm bảo rằng tất cả các kênh sẽ đi theo con đường và nhà nước có thể dự đoán tương tự móc và ghi đè có thể được đặt vào máy để thêm chức năng quan trọng rất giống với cách các phương pháp và các lớp kế thừa hoạt động trong một hướng đối tượng ngôn ngữ lập trình. Đó không phải là dễ dàng. Hãy để tôi nói cho bạn. Tôi đã chia sẻ công bằng của tôi về những lỗi phân khúc và bế tắc trong khi mã hóa FreeSWITCH, (nhiều hơn của cựu hơn sau này tôi phải nói). Nhưng tôi xây dựng mã từ cốt lõi và đi từ đó. Vì tất cả các kênh hoạt động trong chủ đề của riêng mình và có những dịp mà bạn cần phải tương tác với họ, tôi sử dụng đọc / ghi khóa để các kênh có thể được đặt từ một thuật toán băm chứ không phải là một danh sách liên kết và có một đảm bảo tuyệt đối kênh không thể được truy cập hoặc đi xa trong khi một thread bên ngoài có tham chiếu đến
đang được dịch, vui lòng đợi..
