原文
其他參考
1.Bluetooth基本概念
可以參考BlueCove這個實作JSR82的Project,裡面的這張圖對Bluetooth解說很清楚,可供參考。
Bluetooth Stack的部份在不同系統、程式語言上都是相同的,會有差異的只有頂層的Abstract API。
若想對Bluetooth整體軟硬体有仔細的了解可以參考「Bluetooth Application Programming with the Java APIs Essentials Edition」這本書。
2.Android Bluetooth開發基本需求
Android SDK 2.0以上(含2.0)版本。
支援Android 2.0的手機一隻(Android Emulater無法模擬Bluetooth,所以一定要有實體手機)。
3.實作參考文件
http://developer.android.com/guide/topics/wireless/bluetooth.html
http://www.anddev.org/serial_ove ... _client-t11106.html
一般來說,我們只會實作Bluetooth Client的程式去跟其它的Bluetooth硬體溝通取資料。連線方式大多是利用Serial Port Service方式去跟遠端的裝置溝通,所以相對應的UUID不能設錯,一定要設成下述範例這組UUID,不然會發生找不到Service的問題(附帶一提,這是假設一般遠端裝置有提供Serial Port Service,所以你才可以用這組UUID來進行通訊,如果遠端裝置比較特別就要去查硬體規格去看它提供的Service是哪些,找出對應的UUID)。
1
private static final UUID SERIAL_PORT_SERVICE_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
4.Android Bluetooth API目前的限制
目前只支援RFCOMM的方式進行通訊
5.實作參考範例
// 取自http://www.anddev.org/serial_ove ... _client-t11106.html裡的範例
package com.example.thinbtclient;
import java.io.IOException;
import java.io.OutputStream;
import java.util.UUID;
import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;
public class ThinBTClient extends Activity {
private static final String TAG = "THINBTCLIENT";
private static final boolean D = true;
private BluetoothAdapter mBluetoothAdapter = null;
private BluetoothSocket btSocket = null;
private OutputStream outStream = null;
// Well known SPP UUID (will *probably* map to
// RFCOMM channel 1 (default) if not in use);
// see comments in onResume().
private static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
// ==> hardcode your server's MAC address here <==
private static String address = "XX:XX:XX:XX:XX:XX";
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
if (D)
Log.e(TAG, "+++ ON CREATE +++");
mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if (mBluetoothAdapter == null) {
Toast.makeText(this,
"Bluetooth is not available.",
Toast.LENGTH_LONG).show();
finish();
return;
}
if (!mBluetoothAdapter.isEnabled()) {
Toast.makeText(this,
"Please enable your BT and re-run this program.",
Toast.LENGTH_LONG).show();
finish();
return;
}
if (D)
Log.e(TAG, "+++ DONE IN ON CREATE, GOT LOCAL BT ADAPTER +++");
}
@Override
public void onStart() {
super.onStart();
if (D)
Log.e(TAG, "++ ON START ++");
}
@Override
public void onResume() {
super.onResume();
if (D) {
Log.e(TAG, "+ ON RESUME +");
Log.e(TAG, "+ ABOUT TO ATTEMPT CLIENT CONNECT +");
}
// When this returns, it will 'know' about the server,
// via it's MAC address.
BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address);
// We need two things before we can successfully connect
// (authentication issues aside): a MAC address, which we
// already have, and an RFCOMM channel.
// Because RFCOMM channels (aka ports) are limited in
// number, Android doesn't allow you to use them directly;
// instead you request a RFCOMM mapping based on a service
// ID. In our case, we will use the well-known SPP Service
// ID. This ID is in UUID (GUID to you Microsofties)
// format. Given the UUID, Android will handle the
// mapping for you. Generally, this will return RFCOMM 1,
// but not always; it depends what other BlueTooth services
// are in use on your Android device.
try {
btSocket = device.createRfcommSocketToServiceRecord(MY_UUID);
} catch (IOException e) {
Log.e(TAG, "ON RESUME: Socket creation failed.", e);
}
// Discovery may be going on, e.g., if you're running a
// 'scan for devices' search from your handset's Bluetooth
// settings, so we call cancelDiscovery(). It doesn't hurt
// to call it, but it might hurt not to... discovery is a
// heavyweight process; you don't want it in progress when
// a connection attempt is made.
mBluetoothAdapter.cancelDiscovery();
// Blocking connect, for a simple client nothing else can
// happen until a successful connection is made, so we
// don't care if it blocks.
try {
btSocket.connect();
Log.e(TAG, "ON RESUME: BT connection established, data transfer link open.");
} catch (IOException e) {
try {
btSocket.close();
} catch (IOException e2) {
Log.e(TAG,"ON RESUME: Unable to close socket during connection failure", e2);
}
}
// Create a data stream so we can talk to server.
if (D)
Log.e(TAG, "+ ABOUT TO SAY SOMETHING TO SERVER +");
try {
outStream = btSocket.getOutputStream();
} catch (IOException e) {
Log.e(TAG, "ON RESUME: Output stream creation failed.", e);
}
String message = "Hello message from client to server.";
byte[] msgBuffer = message.getBytes();
try {
outStream.write(msgBuffer);
} catch (IOException e) {
Log.e(TAG, "ON RESUME: Exception during write.", e);
}
}
@Override
public void onPause() {
super.onPause();
if (D)
Log.e(TAG, "- ON PAUSE -");
if (outStream != null) {
try {
outStream.flush();
} catch (IOException e) {
Log.e(TAG, "ON PAUSE: Couldn't flush output stream.", e);
}
}
try {
btSocket.close();
} catch (IOException e2) {
Log.e(TAG, "ON PAUSE: Unable to close socket.", e2);
}
}
@Override
public void onStop() {
super.onStop();
if (D)
Log.e(TAG, "-- ON STOP --");
}
@Override
public void onDestroy() {
super.onDestroy();
if (D)
Log.e(TAG, "--- ON DESTROY ---");
}
}
AndroidManifest.xml裡的Permission設定加下述二行
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.BLUETOOTH" />
Android SDK 2.1裡的Bluetooh Sample (在 x:/android sdk安裝目錄/platforms/android-2.1/samples/BluetoothChat 裡面,或是到 http://developer.android.com/res ... oothChat/index.html 看範例,二者是一樣的東西)
http://code.google.com/p/apps-for-android/ 裡面有個 BTClickLinkCompete Sample,可經由SVN去下載回來看
----------------------------------------------------------------------
----------------------------------------------------------------------------------------------
Smartgpc@wretch.twbbs.org [教學]簡單藍芽實用介紹
藍芽與類型:
Class 1: 1mW (0dBm) ~ 100mW (20dBm)
Class 2: 0.25mW (-6dBm) ~ 2.5mW (4dBm), Normally at 1mW(0dBm)
Class 3: <= 1mW (0dBm)
以一般經驗來說Class 1可達100m,而Class 3可達10m,至於Class 2則需要看其功率的大小影響其通訊的距離.而且Class 1還必須依據RSSI告知對方調整TX Power.另外那如果一方是class 1 ,一方只有class 3,那傳輸距離還是受限 class 3 的功率,當然事實上距離會稍微長一點點,大約0-5公尺,因為Class 1的設備通常RF射頻設計較佳可以接收較弱的訊號,但實際用起來差異並不會太大.
此外人體內含70%的水 可以與2.4Ghz的訊號共振吸收,所以802.11b, 11g, Bluetooth等2.4Ghz的設備都很容易受人體遮蔽干擾,但如果RF射頻設計得當的話,很多折射訊號還是可以收得到干擾的狀況就可以改善.
藍芽與速度:
在資料傳輸上,藍芽以ACL(Asynchronous Connection-Less)的連線方式,提供最高下傳723.2kbps及上傳57.6kbps的非對稱性傳輸速率或433.9kbps的對稱性傳輸速率。在語音部分,以SCO(Synchronous Connection-Oriented)的連線方式,提供64kbps的傳輸速率。
參考資料:藍芽無線技術發展簡介/李永定 以及 Mobile01.com
-------------------------------------------------------------------------------------------------------
PTT notebook版精華區 轉自夢大140.116.250.3 P_Hamutaro
藍芽技術是一種 "短距離無線通訊技術" ,在 1994 年由易利信 ( Ericson ) 所提出,當時的目的是要研發出一種新的無線連結技術可以用在低耗電的消費裝置上。藍芽這個名字源自 "丹麥的維京國王",這個國王一統了丹麥和挪威的江山,而開發藍芽技術的小組也希望這個新的無線連結技術也能統一業界標準,因此就以這個國王的英文譯名「Blue Tooth」作為這個新技術的名稱,最後成為「Bluetooth」。
------------------------------------------------------------------
※補充
藍牙是 Bluetooth 的音譯。在英文中意思是“藍色的牙齒”,來源于西元 10 世紀丹麥一位國王Harald Bluetooth 的名字。他生于西元 908 年。他的名字來自于兩個丹麥詞,“ bla ”( 藍色的 )指的是深皮膚,以及“ tan ”指的是偉大人物。在他權力尖峰期曾統一過丹麥和挪威,建立過 Danes 王朝 。他在執政期間,將四分五裂的瑞典、芬蘭和丹麥統一起來,他像中國的成吉思汗和秦始皇。而愛立信公司用 Bluetooth為這種無線技術命名,有一統天下的含義,足以見他們對這一技術的信心。中國人按自己習慣,形象化的稱為“藍牙”,預示著“藍牙”技術能在人們的生活中生根、發芽和茁壯成長。
----------------------------------------------------------------
這種無線技術的特點是 "針對小型的短距網路" 設計,後來 Intel、IBM、Nokia 等公司相繼加入了這個技術陣容,成立了 "藍芽特別興趣群組" ( Bluetooth Special InterestGroup,簡稱 Bluetooth SIG ) ,目的在推廣藍芽技術並將其制定為 "開放的標準"。
相較於其他無線通訊技術,藍芽的優點包括:
一、資訊傳送安全度高,傳輸時每分鐘跳頻 1600 次,每個封包都在不同的頻率下傳輸,不易受到週邊環境干擾。
二、由於藍芽應用的是低功率,對人體傷害遠較手機或 Wareless Lan 為小。
三、低耗電,節省能源,適用在攜帶式裝置上。
四、不像紅外線需要兩個傳輸埠連成一直線,而且在有效範圍內可以穿過牆壁等屏障。
五、應用的範圍廣,有許多應用模式的規範都被定義在藍芽規格內。
藍芽的應用範圍可以分成三種類型:
一、是做為小型的區域網路,有藍芽的手機、PDA、筆記型電腦等可以很方便的互傳資料;
二、應用是取代現有的線路,例如現在使用最廣泛的藍芽耳機,其他原來需要用線(電線)連接的周邊裝置,如滑鼠、鍵盤、印表機等,也可以用藍芽裝置來取代。
三、資料/語音存取點的通訊,例如要用手機透過區域網路取存點連到 Internet 等等。
藍芽 Profiles
除了通訊協定外,藍芽規格也定義了跟使用模式有關的 Profile。這裏的 Profile 是指藍芽通訊在那一種用途下應該使用的通訊協定和相關的規範。不過因為藍芽 Profile 的種類繁多, SIG 認為藍芽裝置不需要也不可能支援所有的 Profile ,所以定義出四個最基本的 Profile:General Access Profile ( GAP )、Service Discovery Application Profile( SDAP )、Seriak Port Profile ( SPP )、與 General Object ExchangeProfile ( GOEP ) 。
所有的藍芽裝置都必須至少支援這四個 Profile 才能正常運作,而其他的 Profile 必須以這四個基本的 Profile 為基礎來發展。
---------------------------------------------------------------------
※再補充
Bluetooth,這個名詞的起源,有一說是以一位丹麥國王之子的名字命名,另一說是來自於 "一塊描述騎士精神的石碑拓文" ,同樣都是丹麥文。從英文直翻原本是「藍牙」,但為了強調這個技術及應用正在萌芽的意義,中文翻譯正名為「藍芽」。
BlueTooth是以一個小型化的無線及基頻模組晶片,裝置在終端器中,使用與微波爐相同的 2.4GHz附近免付費、免申請的無線電頻段,為避免此頻段電子裝置眾多相互干擾,因而以一千六百次高難度跳頻以及加密保密技術,傳輸速率在 432Kbps 到 721Kbps 不等,未來的版本將達 2Mbps。
藍芽是由 易利信( Ericsson ) 、諾基亞 ( Nokia )、英特爾 ( Intel ) 、IBM 及 Toshiba ( 東芝 )等五大廠商在去年( 1998 )五月發起,目前已有五百多家通訊、資訊、電子廠商響應,預定一九九九年下半年第一個產品問世,展望到二○○二年將有一億台的可攜式通訊、電腦及週邊使以藍芽為標準配備,在晶片技術方面,未來的趨勢將走向單一晶片化。
除了藍芽,今後也將常見到 Home RF、Wireless PC,這都是一種將家用電子產品間無線化連接的標準,不過與藍芽的協定有些許的差異,尤其Wireless PC這個字眼,帶有將無線通訊淋漓盡致應用在個人電腦上的廣大想像空間。
-----------------------------------------------------------------------
支援藍芽的產品,除了遵守 Bluetooth Profile 外,還必須通過 "藍芽認證".
而藍芽產品都有打上由兩個三角形組合成的「字母B」符號。
( 此符號彩色的為藍色底和白色線條 )
-------------------------------------------------------------------------------------------------------
藍牙正名新聞:
藍牙技術聯盟定 11 月為「藍牙音樂月」
藍牙 (Bluetooth) 技術的最新用途之一,是將音樂由行動電話串流至立體聲耳機播放。除了行動電話外,藍牙技術讓使用者透過相容藍牙的裝置如揚聲器、耳機、家庭和汽車的立體聲音響組合,收聽媒體播放器和個人電腦中的音樂,徹底擺脫線材的羈絆。藍牙技術聯盟 (Bluetooth Special Interest Group) 特別將十一月宣告為「藍牙音樂月」,向消費者展示以無線方式收聽 Hi-Fi 立體聲音樂的不同方法。
同時,為統一全球用語,即日起,藍牙技術聯盟(Bluetooth SIG)正式將 Bluetooth技術之繁體中文譯名更正為「藍牙」,日後媒體於相關 Bluetooth 技術報導時,使用「Bluetooth」或「藍牙」一詞。
相容 A2DP 音樂手機
根據 In-Stat Research 的調查顯示,串流音樂是電信業者最受消費者歡迎的多媒體服務。具備無線串流高品質音樂的藍牙裝置均設有 A2DP(Advanced Audio Distribution Profile)功能,以確保與其他具有相同功能裝置之間的相容性。市面上有多款新型號手機已支援 A2DP 功能,使消費者能下載歌曲至電話,再透過藍牙立體聲耳機或其他音樂播放裝置,無線收聽具 CD 品質的音色。
三星、LG、諾基亞與摩托羅拉等知名廠商,均推出具有 A2DP 功能的手機,最新型號包括 LG Chocolate、LG LX 550 及 Nokia 8810。
無線美聲 藍牙立體聲耳機
市面上目前有多款藍牙立體聲耳機,可讓使用者透過具有 A2DP 功能的裝置(如 MP3 播放器、個人電腦或 PDA)無線收聽立體聲音樂,其中多款型號更同時支援藍牙手機的撥號和接聽功能。當有來電時,音樂會暫停播放,使用者只需一按耳機上的按鈕,即可接聽來電。
利用藍牙立體聲耳機,使用者更可無線切換不同的裝置來源,例如具有藍牙立體聲配件的家庭音響組合、電腦或MP3播放器。其他數款新藍牙耳機還包括 Bluetake i-Phono mini BT450Rx、Bluetake i-Phono Plus BT420Rx、IOGEAR 藍牙立體聲耳機、Plantronics Pulsar 590A 藍牙立體聲耳機及 Jabra BT 620s。
------------------------------------------------------------------------------------------------------
其餘直接參考前人提供的參考資料或投影片整理而成,另有參考書籍資料 |