Cách sử dụng Airmobi

Hướng dẫn lập trình với ThriftAPI


Airmobi Thrift API là gì

Airmobi đã cung cấp API Thrift cho các trường hợp sử dụng kết hợp với phần mềm CI (Continuous Integration) như Jenkins, cho phép thực hiện tự động kiểm thử trên các thiết bị thực sự. API hỗ trợ các ngôn ngữ như Java, PHP, Ruby và Perl.

Trước đây, khi thuê thiết bị thực, người dùng chỉ có thể thuê bằng cách thủ công thông qua phần mềm client. Điều này đồng nghĩa với việc khi tích hợp với CI như Jenkins, người dùng phải thủ công thuê thiết bị trước. Tuy nhiên, với việc cung cấp API Thrift của Airmobi, bất kỳ chương trình nào cũng có thể sử dụng các chức năng của Airmobi, từ đó tự động hóa hoàn toàn các quy trình trước đây đã thủ công.

<Trường hợp sử dụng API>

  1. Xây dựng hệ thống cho phép thuê thiết bị thực và thực hiện kiểm thử tự động thông qua adb ảo mỗi khi mã được commit, lấy kết quả và ghi lại quá trình kiểm thử dưới dạng file video bằng cách sử dụng API ghi lại.
  2. Xây dựng hệ thống tự động chụp trang web của trang web của công ty thành hình ảnh và gửi email cho nhóm vận hành mỗi khi có một model mới được ra mắt.
Airmobi Thrift APIとは

Cách hoạt động của Airmobi Thrift API

Airmobi Thrift API được cung cấp thông qua cơ chế của Apache Thrift. Thrift ban đầu được Facebook phát triển để liên kết các máy chủ viết bằng các ngôn ngữ khác nhau với nhau, sau đó được đóng góp cho Apache và hiện vẫn đang tiếp tục phát triển. Hiện nay, nó cho phép phát triển các chương trình liên kết với Evernote API, Hadoop và nhiều hơn nữa bằng cách sử dụng Thrift.
http://ja.wikipedia.org/wiki/Apache_Thrift : Apache Thrift là một công cụ cho phép tạo ra các thư viện tự động cho nhiều ngôn ngữ lập trình chỉ bằng việc tạo tệp thrift làm định nghĩa API. Hơn nữa, định nghĩa Thrift hỗ trợ các cấu trúc, kiểu liệt kê, ngoại lệ và tạo ra các thư viện dễ sử dụng dựa trên các kiểu tĩnh. Để tạo chương trình liên kết bằng Thrift với Airmobi, bạn cần thực hiện theo các bước dưới đây.

Airmobi Thrift APIの仕組み

Quy trình sử dụng Airmobi Thrift API

Airmobi Thrift API được cung cấp dưới dạng tệp thrift thay vì thư viện (tệp dll, tệp jar, v.v.) cho mỗi ngôn ngữ, do đó bạn có thể sử dụng nó với bất kỳ ngôn ngữ nào được hỗ trợ bởi Thrift. ※Nếu bạn muốn sử dụng tệp thrift, bạn có thể tải xuống từ đây. Để sử dụng, bạn cần thực hiện các bước sau để tạo thư viện cho ngôn ngữ lập trình mong muốn, sau đó khởi động máy chủ API Thrift và chạy chương trình liên kết.

  1. Biên dịch tệp định nghĩa “AirmobiAPI.thrift (tệp định nghĩa API Thrift của Airmobi)” bằng trình biên dịch thrift để tạo thư viện cho ngôn ngữ mong muốn từ định nghĩa.
  2. Tải các thư viện phụ thuộc cần thiết khi chạy Thrift
  3. Tạo chương trình bằng Airmobi Thrift API
  4. Khởi động máy chủ API Thrift của Airmobi trên máy tính cá nhân.
  5. Chạy chương trình liên kết đã phát triển.

Danh sách Thrift API được cung cấp

Ví dụ sử dụng API với một chương trình đơn giản

Giới thiệu

Trong hướng dẫn này, chúng tôi sẽ sử dụng Airmobi Thrift API để tạo chương trình thuê thiết bị và chụp trang web. Hướng dẫn này giả định cấu hình bên dưới, vì vậy vui lòng đọc nó cho phù hợp với môi trường của bạn.

  • Hệ điều hành: Windows 7
  • Môi trường thực hiện Java:Java8(JDK8u362-b09)
  • Môi trường xây dựng: Maven

Tạo một dự án Maven trống

Để sử dụng thư viện do Thrift tạo ra, bạn sẽ cần một thư viện mà Thrift phụ thuộc vào. Mặc dù có thể tải xuống từng thư viện theo cách thủ công từ mỗi trang web nhưng việc này rất tốn thời gian, vì vậy trong hướng dẫn này, chúng ta sẽ tạo một dự án Maven và thiết lập các thư viện phụ thuộc trong pom.xml để chúng tự động tải xuống. Vui lòng tạo dự án Maven bên dưới.

  • groupdId: nttr.rtk.example
  • artifactId: rtk-example
  • version: bất kỳ

Sau đó, thêm libthrift vào pom.xml của dự án Maven mà bạn đã tạo và đặt thư viện phụ thuộc. Vì nó sẽ được biên dịch và thực thi bằng Java8 (JDK8u362-b09), nên trong pom.xml, cũng đặt maven-compiler-plugin để xây dựng bằng Java8 (JDK8u362-b09). Cuối cùng, pom.xml sẽ có dạng như bên dưới.

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>nttr.rtk.example</groupId>
<artifactId>rtk-example</artifactId>
<version>1.0</version>
<dependencies>
<dependency>
<groupId>org.apache.thrift</groupId>
<artifactId>libthrift</artifactId>
<version>0.9.1</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
</plugins>
</build>
</project>

Tạo html đặc tả API từ AirmobiAPI.thrift

Từ trang Apache Thrift, hãy tải xuống trình biên dịch tiết kiệm (thrift-0.9.1.exe), trình biên dịch này tạo HTML đặc tả API từ các tệp tiết kiệm và lưu nó vào thư mục gốc của dự án Maven mà bạn đã tạo trước đó. http://thrift.apache.org/download Sau đó, lưu tệp tiết kiệm API TestKit Thrift từ xa (AirmobiAPI.thrift) vào thư mục gốc của dự án Maven, rồi thực hiện lệnh bên dưới để tạo html.

Command

thrift-0.9.1.exe -out src/main/java --gen html AirmobiAPI.thrift

Tạo thư viện cho Java từ AirmobiAPI.thrift

Tương tự như trước, hãy chạy lệnh sau từ tệp tiết kiệm đã lưu (AirmobiAPI.thrift) để tạo mã nguồn của thư viện Java.

Command

thrift-0.9.1.exe -out src/main/java --gen java AirmobiAPI.thrift

Tạo chương trình liên kết mẫu

Bạn thực sự có thể thuê một thiết bị và tham gia chương trình để chụp trang web di động của Google. Lưu mã nguồn bên dưới dưới dạng <thư mục gốc của dự án Maven>

/src/main/java/example/Main.java. Trước khi lưu, hãy thay đổi USER_NAME và PASSWORD thành thông tin tài khoản của chính bạn.

package example;

import java.io.File;
import java.util.Arrays;
import java.util.List;

import javax.swing.JFileChooser;

import nttr.rtk.thrift.Device;
import nttr.rtk.thrift.DeviceService;
import nttr.rtk.thrift.MainService;
import nttr.rtk.thrift.ServicePorts;

import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.transport.TSocket;

public class Main {
public static void main(String[] args) throws Exception {
String USER_NAME = "<ユーザ名>";
String PASSWORD = "<パスワード>";

System.out.println("Connect to main service");
TSocket mainServiceTransport = new TSocket("localhost", ServicePorts.MAIN_SERVICE_PORT.getValue());
mainServiceTransport.open();
MainService.Client mainServiceClient = new MainService.Client(new TBinaryProtocol(mainServiceTransport));

System.out.println("Login");
mainServiceClient.login(USER_NAME, PASSWORD);

while (true) {
System.out.println("Get device list");
List<Device> devices = mainServiceClient.getDevices();
if (devices.isEmpty()) {
Thread.sleep(1000);
continue;
}

Device device = devices.get(0);

System.out.println("Connect to device service");
TSocket deviceServiceTransport = new TSocket("localhost", ServicePorts.DEVICE_SERVICE_PORT.getValue());
deviceServiceTransport.open();

System.out.println("Rent a device");
DeviceService.Client deviceServiceClient = new DeviceService.Client(new TBinaryProtocol(deviceServiceTransport));
deviceServiceClient.open(device.getDeviceId());

System.out.println("Capturing web pages");
String myDocumentDirectoryPath = new JFileChooser().getFileSystemView().getDefaultDirectory().toString();
deviceServiceClient.captureWebPages(Arrays.asList("http://www.google.co.jp"), new File(myDocumentDirectoryPath,
"tmp").getAbsolutePath());
break;
}
}
}

Khởi động máy chủ API TestKit Thrift từ xa

Khi sử dụng Airmobi Thrift API, cần phải khởi động một máy chủ trung gian (sau đây gọi là Thrift Server) giữa máy chủ Airmobi. Các chương trình liên kết sử dụng Airmobi Thrift API sẽ thực hiện giao tiếp với máy chủ Airmobi thông qua Thrift Server. Airmobi Thrift API mang lại các lợi ích sau đây nhờ sử dụng máy chủ trung gian:

  • Khi sử dụng các API tạo file như API ghi hình, thay vì tải file kết quả từ máy chủ, file sẽ được trực tiếp ghi vào hệ thống file địa phương, giảm thời gian chờ đợi và giảm tải cho mạng.
  • Mặc dù nhiều ngôn ngữ lập trình được hỗ trợ bởi Thrift không thể thực hiện mã hóa thông tin liên lạc qua SSL, việc máy chủ trung gian mã hóa giao tiếp với máy chủ Airmobi giúp thực hiện giao tiếp một cách an toàn. Bạn có thể http://wiki.apache.org/thrift/LibraryFeatures?action=show&redirect=LanguageSupport
  • Các tính năng đặc biệt như chức năng adb ảo có sẵn.

Tuy nhiên, cách khởi động Thrift Server khác nhau giữa Windows và OS X.

Đối với phiên bản Windows 32-bit: Mở Command Prompt và nhập lệnh sau đây để thực hiện.

"<Airmobiをインストールしたディレクトリ>ThriftApiServer.exe"

Đối với phiên bản Windows 64bit: Mở Command Prompt và nhập lệnh sau đây để thực hiện.

"c:Program Files (x86)/Airmobi/ThriftApiServer.exe"

Đối với OS X: Khởi động terminal và nhập lệnh sau để thực thi.

$ cd "/Applications/Airmobi.app/Contents/MacOS" ; java -cp "../Java/*" -Dconf.directory.company.name=nttr nttr.rtk.MainForThriftServer

Thực hiện chương trình liên kết mẫu

Hãy thực thi lớp Main mà bạn đã tạo trước đó. Khi thực thi, việc thuê bao thực sự sẽ được thực hiện và vé thuê thiết bị sẽ bị trừ lưu lượng, vì vậy hãy lưu ý.

Giải thích về chương trình liên kết mẫu

Máy chủ Thrift đang lắng nghe trên hai cổng, mỗi cổng là cổng tiếp nhận cho dịch vụ chính và dịch vụ thiết bị. Dịch vụ chính cung cấp các chức năng liên quan đến tổng quát như danh sách thiết bị.

  • Chức năng đăng nhập/đăng xuất
  • Chức năng lấy danh sách các thiết bị và thông tin chi tiết cho từng thiết bị
  • Chức năng thay đổi cài đặt tự động thuê bao

Dịch vụ thiết bị cung cấp các chức năng liên quan đến thiết bị sau đây:

  • Chức năng thuê bao thiết bị
  • Chức năng lấy trạng thái của thiết bị
  • Chức năng cài đặt ứng dụng
  • Chức năng chụp ảnh màn hình
  • Chức năng ghi hình màn hình
  • Chức năng chụp ảnh trang web
  • Chức năng bật/tắt WiFi
  • Chức năng xoay màn hình
  • Chức năng adb ảo
  • Chức năng thiết lập cục bộ

Dịch vụ chính và dịch vụ thiết bị đang chờ kết nối trên các cổng riêng biệt, nhưng mỗi kết nối Thrift đến các cổng này sẽ chia sẻ một context chung. Do đó, sau khi đăng nhập thông qua dịch vụ chính, bạn sẽ sử dụng dịch vụ thiết bị. Vì vậy, chỉ có thể đăng nhập một tài khoản duy nhất trong một quá trình của máy chủ Thrift, vui lòng lưu ý. Dựa trên những điều trên, chúng ta sẽ xem xét chương trình liên kết mẫu đã nói trước đó. Đầu tiên, bạn sẽ kết nối với cổng của dịch vụ chính trên máy chủ Thrift đã khởi động tại máy cục bộ.

・・・中略・・・
TSocket mainServiceTransport = new TSocket("localhost", ServicePorts.MAIN_SERVICE_PORT.getValue());
mainServiceTransport.open();
・・・中略・・・

Sau đó, bạn sẽ kết nối sử dụng giao thức Binary của Thrift và tạo ra một thể hiện của client sử dụng các lớp được tạo thông qua trình biên dịch Thrift. (Thrift hỗ trợ nhiều giao thức giao tiếp giữa server và client, nhưng với máy chủ Thrift, bạn chỉ có thể kết nối qua giao thức Binary phổ biến nhất.)

・・・中略・・・
System.out.println("Login");
mainServiceClient.login(USER_NAME, PASSWORD);
・・・中略・・・

Khi đăng nhập hoàn tất, bạn sẽ có thể lấy được danh sách các thiết bị. Tuy nhiên, vì danh sách thiết bị được cập nhật một cách không đồng bộ, có thể sẽ có thời điểm danh sách này hoàn toàn trống không. Vì vậy, trong trường hợp danh sách thiết bị rỗng, mã lệnh sẽ chờ đợi một giây trước khi thử lấy danh sách lại.

・・・中略・・・
while (true) {
System.out.println("Get device list");
List<Device> devices = mainServiceClient.getDevices();
if (devices.isEmpty()) {
Thread.sleep(1000);
continue;
}
・・・中略・・・

Nếu danh sách thiết bị cho thuê không trống, hãy lấy thiết bị cho thuê đầu tiên.

 ・・・中略・・・
Device device = devices.get(0);
・・・中略・・・

Kết nối với dịch vụ thiết bị để thuê thiết bị đầu tiên.

 ・・・中略・・・
System.out.println("Connect to device service");
TSocket deviceServiceTransport = new TSocket("localhost", ServicePorts.DEVICE_SERVICE_PORT.getValue());
deviceServiceTransport.open();
・・・中略・・・

Qua kết nối Thrift đã kết nối với dịch vụ thiết bị, bạn có thể thực hiện việc thuê bao thiết bị bằng cách gọi phương thức open và chỉ định ID của thiết bị. Khi thuê bao được thực hiện, kết nối Thrift này sẽ trở thành kết nối Thrift được liên kết với thiết bị đã chỉ định.

 ・・・中略・・・
System.out.println("Rent a device");
DeviceService.Client deviceServiceClient = new DeviceService.Client(new TBinaryProtocol(deviceServiceTransport));
deviceServiceClient.open(device.getDeviceId());
・・・中略・・・

Chỉ định URL, chụp trang web và thoát khỏi chương trình.

 ・・・中略・・・
System.out.println("Capturing web pages");
String myDocumentDirectoryPath = new JFileChooser().getFileSystemView().getDefaultDirectory().toString();
deviceServiceClient.captureWebPages(Arrays.asList("http://www.google.co.jp"), new File(myDocumentDirectoryPath,
"tmp").getAbsolutePath());
break;
}
・・・中略・・・

Trong chương trình liên kết mẫu, phương thức close không được thực hiện một cách rõ ràng, nhưng máy chủ Thrift sẽ tự động giải phóng tài nguyên khi kết nối Thrift bị ngắt. Thiết bị sẽ ở trạng thái “đang hoạt động” trên ứng dụng phiên bản PC từ lúc open cho đến khi close. Khi thực hiện close, thiết bị sẽ chuyển sang trạng thái “có thể khởi động”, và bạn có thể gọi lại phương thức open từ chương trình khác cho đến khi thời gian thuê bao kết thúc. Lưu ý rằng nếu bạn không thực hiện close sau khi đã open, thời gian thuê bao sẽ được tự động gia hạn trên máy chủ Thrift. Thời gian gia hạn tự động mặc định là ba giờ, nhưng bạn có thể chỉ định thời gian tự động gia hạn tối đa thông qua phương thức setMaxRentalMinutes của dịch vụ chính. Mặc dù mẫu này chỉ thực hiện chụp ảnh trang web, dịch vụ thiết bị cung cấp nhiều chức năng khác nhau như ghi hình, adb ảo, v.v., vì vậy hãy sử dụng chúng tùy theo mục đích của bạn.