จุดเด่นหลักของคลาส BluetoothSPP ที่เจ้าของบล็อกเขียนไว้ ก็คือสามารถเชื่อมต่ออุปกรณ์โดยอัตโนมัติได้ ทำให้ผู้ใช้ไม่ต้องมานั่งกดเชื่อมต่อเอง เพื่อให้ผู้ที่นำไปใช้งานสามารถประยุกต์เข้ากับแอปพลิเคชันของตนเองได้ไม่ยากมากนัก
ถ้าผู้ที่หลงเข้ามาอ่านคนใดยังไม่เคยอ่านพื้นฐานการใช้งานคลาสนี้มาก่อน แนะนำให้ไปอ่านมาก่อน [Android Code] การเชื่อมต่ออุปกรณ์ผ่านบลูทูธแบบง่ายๆโดยใช้ BluetoothSPP
สำหรับการเชื่อมต่อโดยอัตโนมัตินั้น เจ้าของบล็อกทำขึ้นมาเพื่อใช้งานกับอุปกรณ์ต่างๆโดยเฉพาะ อย่างพวกบอร์ดไมโครคอนโทรลเลอร์ที่สั่งงานผ่านบลูทูธอะไรทำนองนั้น เพราะว่าสามารถกำหนดชื่อของโมดูลบลูทูธไว้ตายตัวเลย แล้วก็ให้ผู้ใช้ไปทำการจับคู่เสียก่อน (Pair) พอเปิดแอปพลิเคชันขึ้นมาก็จะหาชื่อที่กำหนดไว้ในโปรแกรมแล้วไล่เชื่อมต่อไปทีละตัวเลย
จากรูปข้างบนนี้จะเห็นว่าเจ้าของบล็อกได้จับคู่อุปกรณ์ไว้แล้ว แต่อุปกรณ์ที่เจ้าของบล็อกพูดถึงนี้มีหลายตัว เจ้าของบล็อกจึงกำหนดชื่ออุปกรณ์แต่ละตัวให้มีชื่อนำหน้าเหมือนกันว่า IOIO แต่มีตัวเลขรหัสต่อท้ายที่ไม่เหมือนกัน ทำให้สามารถใช้การเชื่อมต่ออัตโนมัติเข้ามาช่วยได้
BluetoothSPP bt = new BluetoothSPP(this);
...
...
...
bt.autoConnect("Keyword");
จะเห็นว่าการเชื่อมต่อแบบอัตโนมัตินั้นใช้ไม่ยากเลย เรียกใช้งานด้วยคำสั่งเพียงคำสั่งเดียวเท่านั้น โดยสามารถกำหนด Keyword เพิ่มเข้าไปได้ว่าจะให้ Filter เฉพาะชื่อตัวไหนมาทำการเชื่อมต่อ เพราะถ้าดูจากรูปข้างบนจะเห็นว่ามีอุปกรณ์อื่นๆอย่าง Akexorcist-Nexus 10 กับ Pebble 340C ที่เจ้าของบล็อกไม่ต้องการให้แอปพลิเคชันไปทำการเชื่อมต่อ
ถ้าชื่อมันมีเหมือนกันตั้ง 3 อัน แต่เลขต่อท้ายต่างกัน จะต้องทำยังไงล่ะ?
ก็แค่กำหนด Keyword เป็นเฉพาะชื่อหน้าที่เหมือนกันก็จบแล้ว
bt.autoConnect("IOIO");
เท่านี้คลาส BluetoothSPP ก็จะ Filter เฉพาะชื่อที่มีคำว่า IOIO เท่านั้น ดังนั้นก็จะเหลือแค่อุปกรณ์เพียง 3 ตัวเท่านั้นคือ IOIO (00:01) กับ IOIO (02:50) แล้วก็ IOIO (08:30) เท่านั้น จากนั้นระบบก็จะไล่เชื่อมต่อทีละตัวไปเรื่อยๆ โดยเริ่มจาก IOIO (00:01) เพราะเรียงตามลำดับตัวอักษร ถ้าเชื่อมต่อสำเร็จก็จะหยุดเชื่อมต่ออัตโนมัติ แต่ถ้าเชื่อมต่อไม่สำเร็จ (อาจจะเพราะอุปกรณ์ตัวนั้นปิดอยู่ หรือมีปัญหาใดๆก็ตาม) ก็จะไปเชื่อมต่อที่ตัวถัดไปคือ IOIO (02:50) และถ้าเชื่อมต่อไม่ได้อีกก็จะไป IOIO (08:30) แต่ถ้ายังไม่ได้อีก ก็จะวนกลับมาที่ IOIO (00:01) แบบนี้ไปเรื่อยๆจนกว่าตัวใดตัวหนึ่งจะเชื่อมต่อได้
แต่ถ้าใช้คำสั่งเป็น
bt.autoConnect("");
ในเครื่องของผู้ใช้งานเคยจับคู่กับอุปกรณ์ตัวไหนๆไว้ มันก็จะไปไล่เชื่อมต่อทั้งหมดนั่นเอง
คำสั่ง autoConnect เจ้าของบล็อกแนะนำให้เรียกใช้งานไว้ในฟังก์ชัน setup โดยตัวอย่างนี้จะอ้างอิงคำสั่งมาจากบทความ [Android Code] การเชื่อมต่ออุปกรณ์ผ่านบลูทูธแบบง่ายๆโดยใช้ BluetoothSPP โดยตัดคำสั่งบางอย่างที่ไม่จำเป็นออก แล้วเพิ่มคำสั่ง autoConnect เข้าไปที่ท้ายสุดของฟังก์ชัน setup
Main.java
package app.akexorcist.bluetoothsppautoconnect;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
import app.akexorcist.bluetoothspp.BluetoothSPP;
import app.akexorcist.bluetoothspp.BluetoothState;
import app.akexorcist.bluetoothspp.DeviceList;
import app.akexorcist.bluetoothspp.BluetoothSPP.AutoConnectionListener;
import app.akexorcist.bluetoothspp.BluetoothSPP.BluetoothConnectionListener;
public class Main extends Activity {
BluetoothSPP bt;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
bt = new BluetoothSPP(this);
if(!bt.isBluetoothAvailable()) {
Toast.makeText(getApplicationContext(), "Bluetooth is not available"
, Toast.LENGTH_SHORT).show();
finish();
}
bt.setBluetoothConnectionListener(new BluetoothConnectionListener() {
public void onDeviceConnected(String name, String address) {
Toast.makeText(getApplicationContext(), "Connected to " + name
, Toast.LENGTH_SHORT).show();
}
public void onDeviceDisconnected() {
Toast.makeText(getApplicationContext(), "Connection lost"
, Toast.LENGTH_SHORT).show();
}
public void onDeviceConnectionFailed() {
Log.i("Check", "Unable to connect");
}
});
bt.setAutoConnectionListener(new AutoConnectionListener() {
public void onNewConnection(String name, String address) {
Log.i("Check", "New Connection - " + name + " - " + address);
}
public void onAutoConnectionStarted() {
Log.i("Check", "Auto connection started");
}
});
Button btnConnect = (Button)findViewById(R.id.btnConnect);
btnConnect.setOnClickListener(new OnClickListener(){
public void onClick(View v){
if(bt.getServiceState() == BluetoothState.STATE_CONNECTED) {
bt.disconnect();
} else {
Intent intent = new Intent(getApplicationContext(), DeviceList.class);
startActivityForResult(intent, BluetoothState.REQUEST_CONNECT_DEVICE);
}
}
});
}
public void onDestroy() {
super.onDestroy();
bt.stopService();
}
public void onStart() {
super.onStart();
if(!bt.isBluetoothEnabled()) {
bt.enable();
} else {
if(!bt.isServiceAvailable()) {
bt.setupService();
bt.startService(BluetoothState.DEVICE_OTHER);
setup();
}
}
}
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if(requestCode == BluetoothState.REQUEST_CONNECT_DEVICE) {
if(resultCode == Activity.RESULT_OK)
bt.connect(data);
} else if(requestCode == BluetoothState.REQUEST_ENABLE_BT) {
if(resultCode == Activity.RESULT_OK) {
bt.setupService();
} else {
Toast.makeText(getApplicationContext(), "Bluetooth was not enabled."
, Toast.LENGTH_SHORT).show();
finish();
}
}
}
public void setup() {
Button btnSend = (Button)findViewById(R.id.btnSend);
btnSend.setOnClickListener(new OnClickListener(){
public void onClick(View v){
bt.send("Text", true);
}
});
bt.autoConnect("IOIO");
}
}
main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<Button
android:id="@+id/btnSend"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:text="Send" />
<Button
android:id="@+id/btnConnect"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:text="Connect" />
</RelativeLayout>
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="app.akexorcist.bluetoothsppautoconnect"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="19" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="app.akexorcist.bluetoothsppautoconnect.Main"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
ตอนทดสอบให้ดูการทำงานของ Auto Connection เป็นหลัก โดยผลลัพธ์ของการทำงานจะอยู่ใน LogCat เป็นหลัก และจะแสดงเป็น Toast ก็ต่อเมื่อเชื่อมต่อได้แล้วเท่านั้น
สำหรับผู้ที่หลงเข้ามาอ่านคนใดต้องการไฟล์ตัวอย่างสามารถดาวน์โหลดได้จาก
BluetoothSPP Auto Connect [GitHub]
BluetoothSPP Auto Connect [Google Drive]
BluetoothSPP Auto Connect [Sleeping For Less]
บทความที่เกี่ยวข้อง
• เปลี่ยนเรื่องบลูทูธให้เป็นเรื่องง่ายด้วย BluetoothSPP Library
• การเชื่อมต่ออุปกรณ์ผ่านบลูทูธแบบง่ายๆโดยใช้ BluetoothSPP
• การใช้งาน Listener สำหรับบลูทูธใน BluetoothSPP
• การสร้างหน้าเลือกอุปกรณ์ที่จะเชื่อมต่อสำหรับ BluetoothSPP