3.2.1 Nền tảng hệ điều hành Android
Android được phát triển bởi tập đoàn Google, phiên bản đầu tiên ra mắt năm 2008. Được xây dựng trên một nền tảng mở và một bộ thư viện đa năng, mạnh mẽ với nguyên lý mở. Android đã nhanh chóng được cộng đồng lập trình viên hưởng ứng mạnh mẽ. Nền tảng android có nhiều tính năng nổi bật:
Android là một hệ điều hành nhân Linux, đảm bảo sự tương tác phần cứng, bộ nhớ, điều khiển các tiến trình tối ưu cho các thiết bị di động.
Bộ ứng dụng khung cho phép sử dụng lại và thay thế các thành phần riêng lẻ.
Máy ảo Dalvik được tối ưu cho các thiết bị di động và chạy các ứng dụng lập trình java.
Các thư viện phát triển ứng dụng mã nguồn mở như SQLite, Webkit ,OpenGL và trình quản lý đa phương tiện.
Hỗ trợ camera, GPS, ....
Bộ phát triển ứng dụng SDK đầy đủ gồm thiết bị giả lập, công cụ sửa lỗi, tích hợp với các IDE: eclipse, Android studio ...
Android cung cấp một tập hợp đầy đủ các phần mềm cho các thiết bị di động bao gồm hệ điều hành, khung ứng dụng, các ứng dụng cơ bản và đặc biệt là máy ảo Dalvik. Dalvik là máy ảo giúp các ứng dụng java chạy được trên các thiết bị động Android. Nó chạy các ứng dụng đã được chuyển đổi thành một file thực thi Dalvik (dex). Định dạng phù hợp cho các hệ thống mà thường bị hạn chế về bộ nhớ và tốc độ xử lý. Dalvik đã được thiết kế và viết bởi Dan Bornstein, người đã đặt tên cho nó sau khi đến thăm một ngôi làng đánh cá nhỏ có tên là Dalvik ở đảo Eyjafijour, nơi mà một số tổ tiên của ông sinh sống. Từ góc nhìn của một nhà phát triển, Dalvik trông giống như máy ảo Java (Java Virtual Machine) nhưng thực tế thì hoàn toàn khác. Khi nhà phát triển viết một ứng dụng dành cho Android, anh ta thực hiện các đoạn mã trong môi trường Java. Sau đó, nó sẽ được biên dịch sang các bytecode của Java, tuy nhiên để thực thi được ứng dụng này trên Android thì nhà phát triển phải thực thi một công cụ có tên là dex. Đây là công cụ dùng để chuyển đổi bytecode sang một dạng gọi là dex bytecode. "Dex" là từ viết tắt của "Dalvik executable" đóng vai trò như cơ chế ảo thực thi các ứng dụng Android. Dưới đây là kiến trúc phân tầng của hệ điều hành Android:
Android bao gồm 4 thành phần:
Hệ điều hành
Android dựa trên Linux phiên bản 2.6 cho hệ thống dịch vụ cốt lõi như bảo mật(security), quản lý bộ nhớ(memory management), quản lý tiến trình (process management), Ngăn nhớ mạng (network stack), và mô hình điều khiển (driver model). Nhân Linux hoạt động như một lớp trừu tượng hóa giữa phần cứng và phần còn lại của phần mềm stack. Trong android tầng hệ điều hành (Kernel) sẽ có nhiệm vụ giao tiếp với phần cứng và nhận nhiệm vụ điều khiển xử lý thông tin từ các tầng trên. Các driver quan trọng của android trên tầng này như: Camera deiver, wifi driver, Audio driver, IPC driver , Power management…
Hình 3.1 Kiến trúc của hệ điều hành Android
Thư viện và các giao diện lập trình ứng dụng
Android bao gồm một tập hợp các thư viện C/C++ được sử dụng bởi nhiều thành phần khác nhau trong hệ thống Android. Điều này được thể hiện thông qua nền tảng ứng dụng Android. Một số các thư viện cơ bản được liệt kê dưới đây:
System C library: Bộ thư viện C (libc) chuẩn cung cấp các phương thức điều khiển cho các thiết bị nhúng linux.
Media Libraries – Bộ mã nguồn mở hỗ trợ việc phát và ghi âm với nhiều định dạng như MPEG4, H.264, MP3, AAC, AMR, JPG, và PNG.
Surface Manager – Quản lý việc truy xuất vào hệ thống hiển thị
LibWebCore – Thư viện cho việc phát triển wen trên di động hoặc thiết bị
nhúng.
SGL – Thư viện đồ họa 2D.
FreeType – xử lý ảnh mức thấp như bitmap.
SQLite – Bộ cơ sở dự liệu dùng cho các ứng dụng di động.
Android Runtime
Android bao gồm một tập hợp các thư viện cơ bản mà cung cấp hầu hết các chức năng có sẵn trong các thư viện lõi của ngôn ngữ lập trình Java. Tất cả các ứng dụng Android đều chạy trong tiến trình riêng. Máy ảo Dalvik đã được viết để cho một thiết bị có thể chạy nhiều máy ảo hiệu quả. Các VM Dalvik thực thi các tập tin thực thi Dalvik (dex). Định dạng được tối ưu hóa cho bộ nhớ tối thiểu. VM là dựa trên register-based, và chạy các lớp đã được biên dịch bởi một trình biên dịch Java để chuyển đổi thành các định dạng dex. Các VM Dalvik dựa vào nhân Linux cho các chức năng cơ bản như luồng và quản lý bộ nhớ thấp
Khung ứng dụng
Bằng cách cung cấp một nền tảng phát triển mở, Android cung cấp cho các nhà phát triển khả năng xây dựng các ứng dụng cực kỳ phong phú và sáng tạo. Nhà phát triển được tự do tận dụng các thiết bị phần cứng, thông tin địa điểm truy cập, các dịch vụ chạy nền, thiết lập hệ thống báo động, thêm các thông báo để các thanh trạng thái. Nhà phát triển có thể truy cập vào các API cùng một khuôn khổ được sử dụng bởi các ứng dụng lõi. Các kiến trúc ứng dụng được thiết kế để đơn giản hóa việc sử dụng lại các thành phần. Cơ chế này cho phép các thành phần tương tự sẽ được thay thế bởi người sử dụng.
Cơ bản tất cả các ứng dụng là một bộ các dịch vụ và các hệ thống, bao gồm: Một tập hợp rất nhiều các View có khả năng kế thừa lẫn nhau dùng để thiết kế phần giao diện ứng dụng như: gridview, tableview, linearlayout,…
Một “Notifycation Manager” cho phép tất cả các ứng dụng hiển thị các custom alerts trong status bar.
Một “Content Provider” cho phép các ứng dụng có thể truy xuất dữ liệu từ các ứng dụng khác (chẳng hạn như Contacts) hoặc là chia sẻ dữ liệu giữa các ứng dụng đó.
Một “Resource Manager” cung cấp truy xuất tới các tài nguyên không phải là mã nguồn, chẳng hạn như: localized strings, graphics, and layout files.
Activity Maanager được dùng để quản lý chu trình sống của ứng dụng và điều hướng các activity.
Ứng dụng
Android được tích hợp sẵn một số ứng dụng cần thiết cơ bản như: contacts, browser, camera, Phone,… Tất cả các ứng dụng chạy trên hệ điều hành Android đều được viết bằng Java.
Một tính năng nổi bật nữa phải nói đến là bộ thư viện Android SKD google cung cấp cho các lập trình viên được trang bị đầy đủ hầu hết các tính năng của một thiết bị thật để phát triển các ứng dụng của mình trên nền android. Tuy nhiên, một số đã bị giới hạn như là kết nối qua cổng USB, camera và video, nghe phone, nguồn điện giả lập và bluetooth... Android SDK và Plugin Eclipse được gọi là một Android Deverloper Tool (ADT).
3.2.2 Ngôn ngữ lập trình .
Do ứng được phát triển trên cả tầng application và tầng native nên ngôn ngữ lập trình được sử dụng là java và C++. Dưới đây là các ngôn ngữ lập trình được sử dụng để phát triển ứng dụng.
AIDL (Android Interface Define Language)
Các ứng dụng trên tầng Application được phát triển bằng Java. Khi hai tiến trình chạy trên các luồng khác nhau thì sẽ không thể truy cập lẫn nhau được.
Nếu muốn truy cập chéo nhau thì ta phải dùng ADIL. Cơ chế của ADIL là cho phép các tiến trình có thể giao tiếp với nhau thông qua các proxy. Các proxy hoạt động dựa trên cơ chế của binder IPC. Các đối tượng ảo là Stub và Proxy được tạo ra để thực hiện các lời gọi hàm và truyền đối số.
Hình3.2 Cơ chế Proxy trong AIDL
Tồn tại một interface để có thể gọi đến các Caller và callee trong mỗi tiến trình. Proxy và stub là một lớp được tạo ra bên trong các interface cho phép các tiến trình có thể giao tiếp chéo nhau thông qua chúng.
Hình 3.3 ADIL trong ứng dụng RDS
JNI là một nền tảng của Java, là một interface trung gian cho phép kết nối ứng dụng Java với các ứng dụng hoặc thư viện viết bằng ngôn ngữ C/C++.
Hình 3.4 Cơ chế hoạt động của JNI
3.3 Kiến trúc hệ thống:
3.3.1 Sơ đồ tổng quan toàn hệ thống.
Từ góc nhìn tổng quan ta có thể thấy rõ các khối trong hệ thống, vị trí và mối liên hệ giữa chúng.
Các thông tin RDS được mã hóa và điều chế cùng với sóng FM trước khi truyền đi. Sở dĩ bản tin RDS có thể truyền liên tục và đồng thời cùng các bản tin phát thanh mà không ảnh hưởng đến việc phát sóng là vì thông tin RDS được truyền trên một sóng mang phụ 57KHz, các tín hiệu khác stereo nằm ở dải tần cao hơn dải tần nghe được (tai người nghe được trong dải tần từ 20Hz đến 20KHz) và kết quả là nó không ảnh hưởng đến tín hiệu mono bình thường.
3.3.2 Sơ đồ chức năng tương tác của phần mềm
3.4 Thiết kế chi tiết:
3.4.1 Mô hình giao tiếp của các tầng trong hệ thống FM
Hình 3.7 Mô hình giao tiếp của các module trong hệ thống[8]
FM application and FM driver giao tiếp với nhau thông qua tầng Java APIs. FM host đã phát hành một FM java apis để có thể điểu khiển được driver của FM. Các interface này cho phép tầng ứng dụng có thể giao tiếp với tầng FM kernel thông qua JNI. Tầng JNI sẽ chuyển đổi Java api để có thể gọi được thư viện C.
Thư viện C này sẽ lần lượt giao tiếp với V4L2 driver thông qua các interface của V4L2 như hình bên dưới.
Hình 3.8 Kết nối giữa tầng FM application và FM driver.[8]
Việc triển khai FM host trên android không tận dụng bất kì mã nguồn nào của các hệ điều hành khác. Thay vào đó Fm driver sử dụng kiến trúc FM V4L2. Các interface hiện có của FM V4L2 được triển khai cho FM driver và chúng có nhiệm vụ mở rộng các tính năng không được hỗ trợ trên bản hiện tại ví dụ như: khởi tạo và nâng hiệu năng của hệ thống...
Hình 3.9 Kiến trúc của FM V4L2 [8]
Kiến trúc cụ thể của FM host controller interface (FM HCI ) sẽ được mô tả chi tiết ở Hình 3.10 bên dưới.
Hình 3.10 Kiến trúc của FM host. [8]
Việc triển khai FM HCI bao gồm thành phần chính là aCPU và cCPU. Trong aCPU (FM Host) sẽ có các khối chính như hình vẽ trên.
FM HCI (Host controller interface) giao tiếp với FM command/events thông qua WCN-SS.
FM host driver được tích hợp vào V4L2 kernel driver.
FM middleware cung cấp các APIs cho tầng app có thể sử dụng các tính năng cơ bản của FM.
Khối thứ hai trong kiến trúc FM host là cCPU (FM controller).
Radio contron sẽ giao tiếp với phần cứng của radio và điều khiển hoạt động của nó.
RDS Filtering proc: RDS sẽ xử lý và lọc ra những khối dữ liệu RDS và gửi chúng cho máy chủ. Đồng thời nó cũng thực thi các chức năng để lọc ra những dữ liệu không mong muốn dựa trên bộ lọc được cung cấp bởi máy chủ.
FM HCI sẽ cung cấp một giao thức để định nghĩa các tập lệnh khác nhau và các sự kiện thay đổi giữa các FM host và FM controller để cho phép các máy chủ có thể cấu hình và điều khiển hoạt động của FM controller.
Hai khối aCPU và cCPU trong FM giao tiếp với nhau thông qua một physical Bus như UART, USB, SPI, SMD (share memory) hoặc SD.
3.4.2 Lưu đồ giải thuật lấy thông tin RDS thông qua hệ thống FM
Hình 3.12 Lưu đồ thuật toán bản tin hiển thị RDS
3.4.3 Phương thức và cơ chế truyền nhận bản tin RDS giữa các tầng
Trước khi đi tìm hiểu về phương thức và cơ chế chuyền nhận thông tin hiển thị RDS, ta sẽ tìm hiểu chi tiết cấu trúc định dạng các bản tin RDS.
Đầu tiên là cấu trúc khung dữ liệu.
Thành phần lớn nhất gọi là một ‘Group‘. Kích thước của nó gồm 104 bit. Mỗi group chia ra thành 4 block với kích thước thành phần là 26 bit.
Định dạng bản tin gồm các trường cơ bản sau:
Hình 3.14 Định dạng bản tin [1]
Pi code: programme Identification code 16 bit
Group type code: 4 bit group type code cho mỗi group
Group 0A B: / Turning và switching AF, PS infomation
Hình 3.16 Cấu trúc trường PS [1] Group 1A/B: Progamme item number
Froup 2A/B: Radio text
TP: Traffic programme identificatin code 1 bit TPY: Programme type Code 5 bit
Checkword – Offset N: 10 bits
Các bản tin RDS được tách ra từ sóng FM giải mã và gửi lên tầng trên theo cơ chế handler data Call
Hình 3.18 Sơ đồ cơ chế truyền nhận bản tin RDS
Hình 3.19 Luồng gửi nhận bản tin RDS ở tầng kernel
Phươg thức handle_rt_event() được chạy trên một thread độc lập có nhiệm vụ cập nhật liên tục bản bản tin radio text. Dữ liệu rt nhận được sẽ được lưu vào trong bộ đệm raw_rds [ST_BUF_SIZE]. Dữ liệu rds thu được thông qua hàm RDSDataReceived() gửi lên tầng trên.
Hình 3.20 Luồng gửi nhận bản tin RDS tại tầng native Framework
Dữ liệu rds được gửi lên tầng application thông qua JNI.
Method CallbaclToJava () sẽ nhận dữ liệu đươc truyền hàm RDSReceive (). Tầng native app sẽ nhận được dữ liệu thông qua cơ chế Notify event.
Từ trên tầng Application sẽ ghi đè hàm onRDSReceive () để có thể thể nhận được bản tin RDS
3.5 ĐÁNH GIÁ KẾT QUẢ 3.5.1 Kết quả thử nghiệm 3.5.1 Kết quả thử nghiệm
Cài đặt chương trình
Bước 1: Sao chép bộ cài của phần mềm RDS.apk vào bộ nhớ điện thoại
Hình 3.23 Các bước cài đặt phần mềm
Bước 2: Kích đúp vào gói và chọn “Install„
Bước 3: Hoàn thành và biểu tượng sẽ sinh ra ngoài màn hình
Các bản tin được giải mã từ hệ thống FM
Sử dụng adb command để kiểm tra các bản tin thông báo từ dưới kernel. Bước 1: chạy lênh “adb start-server“ để khởi động adb.
Bước 2: Sử dụng cmd: adb logcat –vtime | find “RDS“ và adb shell cat | proc | kmsg để kiểm tra các thông báo từ tầng kernel gửi lên
Demo phần mềm
Giao diện chính của phần mềm.
Hình 3.26 Giao diện chính của phần mềm
Quá trình Turning và scan kênh
Hình 3.27 Quá trình tìm kiếm kênh
Turn ON
Hiển thị thông tin PS (Programme service), RT (Radio text).
Hình 3.28 Giao diện hiển thông thông tin RDS
Lưu danh sách kênh yêu thích
Hình 3.29 Giao diện danh sách kênh yêu thích
PS
KẾT LUẬN VÀ ĐỊNH HƯỚNG PHÁT TRIỂN Các vấn đề đã làm được
Trong thời gian nghiên cứu và thực hiện đồ án em đã đạt được các kết quả: Nghiên cứu về giao thức RDS nắm vững được nguyên lý mã hóa và giải mã bản tin RDS.
Ứng dụng lý thuyết đã nghiên cứu về RDS để thiết kế và phát triển thành công một ứng dụng có thể thu sóng FM và giải mã bản tin RDS để hiển thị trên màn hình điện thoại di động.
Phát triển mô đun lưu lại các kênh yêu thích của người dùng.
Phát triển thêm tính năng dò kệnh tự động giúp người dùng tìm ra các kênh có tín hiệu tốt.
Tối ưu hóa mã nguồn để tăng hiệu năng của phần mềm.
Đơn giản hóa giao diện phần mềm để thân thiện với người dùng.
Định hướng trong tương lai
Luận văn chủ yếu mới sử dụng được các bản tin hiển thị chứ chưa tận dụng được các bản tin điều khiển của RDS. Còn rất nhiều ứng dụng hữu ích nếu sử dụng được bản tin điều khiển này. Trong tương lai tác giả sẽ nghiên cứu sâu hơn về bản tin điều khiển RDS, tìm hiểu cấu trúc bản tin và áp dụng lên phần mềm của mình để