久久婷婷香蕉热狠狠综合,精品无码国产自产拍在线观看蜜,寡妇房东在做爰3,中文字幕日本人妻久久久免费,国产成人精品三上悠亚久久

當前位置:首頁 > 嵌入式培訓 > 嵌入式學習 > 講師博文 > Android藍牙(ya)調試助手實(shi)現(xian)

Android藍牙調(diao)試助手實現 時間:2018-08-15      來源:未知(zhi)

藍(lan)(lan)牙(ya)( Bluetooth ):是一種(zhong)無(wu)線技(ji)術標(biao)準(zhun),可(ke)實現固(gu)定設(she)備、移動(dong)設(she)備和樓(lou)宇個人域網之間(jian)的(de)短距離數(shu)據(ju)交換(huan)(使用2.4—2.485GHz的(de)ISM波段的(de)UHF無(wu)線電(dian)波)。藍(lan)(lan)牙(ya)技(ji)術初由電(dian)信巨頭愛立信公司于(yu)1994年創制,當(dang)時(shi)是作為RS232數(shu)據(ju)線的(de)替(ti)代(dai)方案。藍(lan)(lan)牙(ya)可(ke)連接多(duo)個設(she)備,克(ke)服了數(shu)據(ju)同步(bu)的(de)難題。

藍牙4.0是(shi)2012年(nian)新藍牙版本(ben),是(shi)3.0的升級版本(ben);較3.0版本(ben)更(geng)省(sheng)電、成本(ben)低(di)、3毫(hao)秒低(di)延遲、超長有效連接距離、AES-128加密等(deng);通(tong)常用(yong)在(zai)藍牙耳機、藍牙音(yin)箱等(deng)設(she)備上。

本(ben)項(xiang)目是基于藍牙4.0的(de)(de)(de)串(chuan)口調(diao)試助手(shou)。主要應(ying)用在(zai)攜帶藍牙4.0的(de)(de)(de)設備(bei)上,功能是主動掃描周邊的(de)(de)(de)藍牙設備(bei),連接成功后(hou),模塊(kuai)所發(fa)送(song)的(de)(de)(de)數據會顯示(shi)在(zai)對應(ying)的(de)(de)(de)區(qu)域。同時,還(huan)能夠向模塊(kuai)發(fa)送(song)信息。接受和發(fa)送(song)的(de)(de)(de)信息都(dou)可以(yi)選(xuan)擇為十六(liu)進制(zhi)。

第 1 章 使用說明

軟件共(gong)分為三個部分:數據接收區(qu),數據發送區(qu),設備掃(sao)描區(qu)。

點(dian)擊搜(sou)索,軟(ruan)件會開始進行周邊藍牙設備(bei)的掃描,需要(yao)等待(dai)五分(fen)鐘。

掃描完成(cheng)后,設備(bei)會在(zai)右側顯示(shi)出來(lai),點擊設備(bei)就可以連接。

這是結(jie)婚搜到的(de)(de)數據就會顯示在左(zuo)側,當不需要的(de)(de)時候,點(dian)擊右下角的(de)(de)斷開,就可以中斷和設備(bei)的(de)(de)連(lian)接(jie)。

第 2 章 環境搭建

2.1 Android 開發環境的安裝與配置

Android應用軟件開發(fa)需要的開發(fa)環(huan)境在路徑“光盤\Android應用開發(fa)環(huan)境\”下(xia):

JDK: JDK\JDK8\jdk-8u5-windows-i586.exe(32bit)或者jdk-8u5-windows-x64.exe(64bit)

(從JDK 8.0開始不支持Windows XP操作系統,使(shi)用Windows XP的(de)用戶可以使(shi)用JDK7目(mu)錄(lu)下的(de)內容)

ADT: adt-bundle-windows-x86.7z(32bit)或者adt-bundle-windows-x86_64.7z(64bit)

以下(xia)主要介紹在Windows環境下(xia)搭建(jian)Android開(kai)發環境的步(bu)驟和(he)注(zhu)意(yi)事項。

2.2 安裝JDK和配置Java開發環境

雙擊(ji)JDK\JDK8\jdk-8u5-windows-i586.exe(32bit操(cao)作系(xi)(xi)統)或者jdk-8u5-windows-x64.exe(64bit操(cao)作系(xi)(xi)統)進行安(an)裝(zhuang)(從JDK 8.0開始不(bu)支(zhi)持(chi)Windows XP操(cao)作系(xi)(xi)統,使用Windows XP的用戶可以使用JDK7目錄下(xia)的內(nei)(nei)容選擇代(dai)替JDK8目錄下(xia)的內(nei)(nei)容)。接受許可證(zheng),選擇需要安(an)裝(zhuang)的組件和安(an)裝(zhuang)路徑后,單擊(ji)“下(xia)一步”按鈕(niu),完成安(an)裝(zhuang)過程。

安裝完成后,利用以下步驟檢(jian)查(cha)安裝是(shi)否成功:打開Windows CMD窗(chuang)口,在CMD窗(chuang)口中輸入java –version命令,如果屏幕出(chu)現下圖所(suo)示的代(dai)碼信息,說明JDK安裝成功。

XP下(xia)安裝JDK7如下(xia):

非XP下安裝JDK8如下:

2.3 解壓adt-bundle-windows

JDK安裝(zhuang)成功(gong)后,使用軟件解壓ADT目錄下的adt-bundle-windows-x86.7z(32bit)或者(zhe)adt-bundle-windows-x86_64.7z(64bit)。

注意:解壓路徑不包含中文;

2.4 運行Eclipse

解壓完畢后,直接執行其中的eclipse\eclipse.exe文(wen)件,Eclipse可以自動找到用戶(hu)前(qian)期安(an)裝(zhuang)的JDK路(lu)徑。

2.5 配置Eclipse

運行解壓目錄(lu)(lu)下的eclipse\eclipse.exe,為自己(ji)選擇(ze)一個工作目錄(lu)(lu)Workspace,不要有中文(wen)路徑(jing),不選擇(ze)默認也(ye)可以。

需(xu)要為Eclipse關聯SDK的(de)(de)安裝路徑(jing),即解壓路徑(jing)下(xia)的(de)(de)sdk目錄。在Eclipse中,點(dian)擊(ji)Window->Preferences,會看到其中添加了Android的(de)(de)配(pei)置(zhi),按圖所(suo)示的(de)(de)操(cao)作,然后(hou)點(dian)擊(ji)Apply,后(hou)點(dian)擊(ji)OK即可。

完成以上步驟(zou)后,設置Eclipse環境

勾選(xuan)(xuan)Android相關的工(gong)具,點(dian)擊OK(如果(guo)已經勾選(xuan)(xuan),則不理(li)會)。

第 3 章 源碼編譯

3.1 導入源碼

打開Eclipse環境,選擇File->Import。

然后(hou),導入(ru)光盤(pan)資料中(zhong)(zhong)的“BlueHelper”工程,勾(gou)選下圖中(zhong)(zhong)的選項(xiang)。

點擊finish完成(cheng)工程的導入

3.2 運行程序

注意:如果在調試(shi)開(kai)發(fa)板的(de)時候,出現ADB連接不上(shang)的(de)問題(已知華清遠見FSPAD723開(kai)源平板),可以(yi)試(shi)著(zhu)替換Android SDK的(de)ADB工具(把光盤\Android應用(yong)開(kai)發(fa)環(huan)境\ADB\ADB1.0.26\下的(de)4個文件拷貝到用(yong)戶(hu)ADT解壓目錄(lu)下的(de)sdk\platform-tools中)

開(kai)(kai)發期間,在實際的(de)設備(bei)上(shang)運(yun)(yun)行(xing)Android程序(xu)(xu)與(yu)在模擬(ni)器上(shang)運(yun)(yun)行(xing)該程序(xu)(xu)的(de)效果(guo)幾(ji)乎(hu)相同,需要做的(de)就(jiu)是(shi)用USB電纜(lan)連(lian)接手機(ji)與(yu)計(ji)算機(ji),并(bing)安裝一(yi)個對應的(de)設備(bei)驅動(dong)程序(xu)(xu)。如(ru)果(guo)模擬(ni)器窗口(kou)已打開(kai)(kai),請將其關閉。只(zhi)要將開(kai)(kai)發平(ping)臺通過USB下載線與(yu)計(ji)算機(ji)相連(lian),應用程序(xu)(xu)就(jiu)會(hui)在開(kai)(kai)發平(ping)臺上(shang)加載并(bing)運(yun)(yun)行(xing)。

在Eclipse中(zhong)選擇“Run” →“Run”(或(huo)Debug)命(ming)令(或(huo)者在工程(cheng)上點(dian)擊(ji)右(you)鍵),這(zhe)時會彈(dan)出一(yi)個(ge)窗口,讓你選擇用模擬(ni)器還是手(shou)(shou)機(ji)來(lai)顯示,如(ru)果選擇手(shou)(shou)機(ji),即可在手(shou)(shou)機(ji)上運行該程(cheng)序。

第 4 章 詳細設計

4.1 BlueTool藍牙工具

藍牙(ya)4.0采用(yong)了新的協議,與2.0并不通用(yong),所以這里封裝了工具類來進行(xing)數據(ju)的溝通。

 BluetoothGatt類是連接(jie)遠程設備返回(hui)的代理類,我(wo)們需要用這個(ge)類來(lai)進行服務和特征(zheng)值(zhi)得獲取。

NormalText Code

private BluetoothGatt bluetoothGatt = null;

 private BluetoothAdapter bluetoothAdapter = null;

private BluetoothGattService bluetoothService = null;

private BluetoothGattCharacteristic characteristic = null;

這里定(ding)義的(de)(de)UUID是連接特定(ding)的(de)(de)服(fu)務(wu)和特征(zheng)值,如(ru)果有需要的(de)(de)話,可(ke)以(yi)在這里進行更改來(lai)實現別的(de)(de)需求。

NormalText Code

public static String serviceUUID = "00001234-0000-1000-8000-00805f9b34fb";

public static String characteristicUUID = "0000fff6-0000-1000-8000-00805f9b34fb";

連(lian)接藍(lan)牙的第一(yi)步(bu),需要先掃(sao)描(miao)(miao)設備(bei),這(zhe)里給出掃(sao)描(miao)(miao)的方法(fa),需要調用協議(yi)中已經實(shi)現(xian)的方法(fa)startLeScan()來獲(huo)得設備(bei),之后,再(zai)通過(guo)stopLeScan()函(han)數來停止掃(sao)描(miao)(miao)。

NormalText Code

// 搜索設備并(bing)添加到列(lie)表中

public Boolean SearchToList() {// 打(da)開(kai)藍牙,搜索設(she)備

if (bluetoothAdapter != null) {

 if (bluetoothAdapter.getState() == BluetoothAdapter.STATE_OFF) {

// 打開藍牙

bluetoothAdapter.enable();

log.E("打開藍牙!");

// 搜索設(she)備

bluetoothAdapter.startLeScan(scanCallback);

log.E("開始(shi)搜索!");

return true;

} else {

// 搜(sou)索設備

bluetoothAdapter.startLeScan(scanCallback);

log.E("開始搜索!");

return true;

}

} else {

log.E("bluetoothAdapter == null");

return false;

}

}

當startLeScan()掃描到設備(bei)(bei)的(de)時(shi)候,會回調(diao)下面的(de)這個函數,我們要(yao)做的(de)就(jiu)是在這個函數中將掃描到的(de)設備(bei)(bei)添加進設備(bei)(bei)列表就(jiu)行(xing)。

NormalText Code

private BluetoothAdapter.LeScanCallback scanCallback = new BluetoothAdapter.LeScanCallback() {

@Override

public void onLeScan(final BluetoothDevice device, int rssi,

byte[] scanRecord) {

if ((device != null) && (deviceList != null)) {

if ((Isrepeat(device, deviceList) == false)

&& (device.getName() != null)) {

deviceList.add(device);

deviceName.add(device.getName());

deviceAddr.add(device.getAddress());

}

}

}

};

連接完(wan)成(cheng)后,需要獲得特征值進行讀寫操作(zuo)。

NormalText Code

// 連接設備并獲得特征值

public synchronized boolean BLEConnect(BluetoothDevice remoteDev) {

if (remoteDev == null) {

return false;

}

bluetoothGatt = remoteDev.connectGatt(context, false, gattCallback);

return true;

}

當(dang)(dang)connectGatt函(han)數(shu)(shu)(shu)返回(hui)之后(hou),會(hui)回(hui)調BluetoothGattCallback 變量當(dang)(dang)中(zhong)的(de)onConnectionStateChange函(han)數(shu)(shu)(shu),然后(hou)在(zai)這個(ge)(ge)(ge)函(han)數(shu)(shu)(shu)中(zhong),我(wo)們要繼續調用(yong)discoverServices這個(ge)(ge)(ge)函(han)數(shu)(shu)(shu)來(lai)發現設(she)備(bei)所提供的(de)服務。當(dang)(dang)discoverServices被調用(yong)的(de)時(shi)候,也會(hui)進行onServicesDiscovered這個(ge)(ge)(ge)函(han)數(shu)(shu)(shu)的(de)回(hui)調。在(zai)這個(ge)(ge)(ge)函(han)數(shu)(shu)(shu)中(zhong),如果我(wo)們想要讀取設(she)備(bei)的(de)數(shu)(shu)(shu)據,需要通(tong)過setCharacteristicNotification來(lai)設(she)定接受(shou)通(tong)知,這樣,當(dang)(dang)設(she)備(bei)有數(shu)(shu)(shu)據傳過來(lai)的(de)時(shi)候,會(hui)自動通(tong)知程序(xu),我(wo)們只需要在(zai)onCharacteristicChanged中(zhong)將返回(hui)的(de)數(shu)(shu)(shu)據取出來(lai)就行。

NormalText Code

private final BluetoothGattCallback gattCallback = new BluetoothGattCallback() {

@Override

 public void onConnectionStateChange(BluetoothGatt gatt, int status,

int newState) {

if (bluetoothGatt != null) {

if (newState == BluetoothProfile.STATE_CONNECTED) {

log.E("連(lian)接成功(gong)!");

handler.sendEmptyMessage(3);

gatt.discoverServices();

} else if (newState == BluetoothProfile.STATE_DISCONNECTED) {

log.E("連接斷開!");

handler.sendEmptyMessage(4);

}

}

}

@Override

 public void onServicesDiscovered(BluetoothGatt gatt, int status) {

if (gatt != null) {

bluetoothService = gatt

.getService(UUID.fromString(serviceUUID));

if (bluetoothService != null) {

characteristic = bluetoothService.getCharacteristic(UUID

.fromString(characteristicUUID));

if (characteristic != null) {

bluetoothGatt.setCharacteristicNotification(

characteristic, true);

// bluetoothGatt.readCharacteristic(characteristic);

} else {

log.E("characteristic == null");

}

} else {

log.E("bluetoothService == null");

}

}

}

@Override

public void onCharacteristicChanged(BluetoothGatt gatt,

BluetoothGattCharacteristic characteristic) {

 // log.E("onCharacteristicChanged");

readDate = characteristic.getValue();

if ((readDate != null) && (readDate.length > 0)) {

 // log.E("接(jie)收數據成功!" + printHex(readDate) + "-" +

// readDate.length);

handler.sendEmptyMessage(1);

handler.sendEmptyMessage(2);

} else {

log.E("接(jie)收數據失敗!");

}

}

@Override

public void onCharacteristicWrite(BluetoothGatt gatt,

BluetoothGattCharacteristic characteristic, int status) {

log.E("onCharacteristicWrite" + "-" + status);

}

@Override

public void onCharacteristicRead(BluetoothGatt gatt,

BluetoothGattCharacteristic characteristic, int status) {

log.E("onCharacteristicRead" + "-" + status);

};

};

4.2 Bluehelper調試助手

主界面的(de)程序,是通過Handler機制進行消息的(de)傳遞的(de)。

NormalText Code

@SuppressLint("HandlerLeak")

private final Handler handler = new Handler() {

@Override

public void handleMessage(Message msg) {

switch (msg.what) {

case 0:// 刷(shua)新搜(sou)索(suo)列表(biao)

devices = blue.GetdeviceName();

adapter.clear();

for (int i = 0; i < devices.size(); i++) {

adapter.add(blue.GetdeviceName().get(i) + " : "

+ blue.GetdeviceAddr().get(i));

}

adapter.notifyDataSetChanged();

break;

case 1:// 更新接收界面

if (hexrece.isChecked()) {

txtrece.append(printHex(BlueTool.readDate) + " \n");

} else {

txtrece.append(BlueTool.readDate.toString() + " \n");

}

scroll.fullScroll(ScrollView.FOCUS_DOWN);// 滾動到底

break;

case 2:// 持續(xu)讀取數據

if (threadon == false) {

threadon = true;

// new readThread().start();

}

break;

case 3:// 改變按(an)鈕

close.setVisibility(0);

Toast.makeText(Bluehelper.this, "連接(jie)成(cheng)功(gong)".toString(),

Toast.LENGTH_SHORT).show();

break;

case 4:// 改變按(an)鈕

close.setVisibility(4);

Toast.makeText(Bluehelper.this, &quot;連(lian)接斷開".toString(),

Toast.LENGTH_SHORT).show();

break;

case 5:// 改變按鈕

Toast.makeText(Bluehelper.this, "沒有搜索(suo)到設備".toString(),

Toast.LENGTH_SHORT).show();

break;

case 10:// 改變按鈕

Toast.makeText(Bluehelper.this, msg.obj.toString(),

Toast.LENGTH_SHORT).show();

break;

default:

break;

}

}

};

在(zai)onCreate函(han)數(shu)中(zhong),我們需要設定界面中(zhong)各個(ge)按鍵(jian)的回調函(han)數(shu)。

NormalText Code

adapter = new ArrayAdapter(Bluehelper.this,

android.R.layout.simple_list_item_1, new ArrayList());

list.setAdapter(adapter);

list.setOnItemClickListener(new OnItemClickListener() {

@Override

public void onItemClick(AdapterViewparent, View view,

int position, long id) {

if (close.getVisibility() == 4) {

// log.E("點擊(ji)位置:" + position);

new connectThread(position).start();

}

}

});

search.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

new searchThread().start();

}

});

close.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

if (blue != null) {

blue.Quit();

}

close.setVisibility(4);

}

});

clear.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

txtrece.setText("");

}

});

send.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

if (close.getVisibility() == 0) {

if (txtsend.getText().toString().length() > 0) {

if (hexsend.isChecked()) {

 blue.write(BlueTool.StrToByte(txtsend.getText()

.toString()));

} else {

blue.write(txtsend.getText().toString().getBytes());

}

}

} else {

Toast.makeText(Bluehelper.this, "請先(xian)連接設(she)備(bei)".toString(),

Toast.LENGTH_SHORT).show();

}

}

});

searchThread 連接(jie)線程,主要工作就是調用藍牙工具中(zhong)的SearchToList,等(deng)待掃描(miao)5s后(hou),再停(ting)止(zhi)掃描(miao)。

NormalText Code

class searchThread extends Thread {

@Override

public void run() {

// log.E("開始藍牙搜索(suo)。。。。。");

Message msg = new Message();

msg.what = 10;

msg.obj = "開始搜(sou)索。。。";

handler.sendMessage(msg);

blue.Clear();

handler.sendEmptyMessage(0);

Boolean on = blue.SearchToList();

try {

sleep(5000);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

blue.Disserach();

if (blue.GetdeviceName().size() > 0) {

log.E("搜索到(dao)的設備(bei):" + blue.GetdeviceName());

if (true == on) {

handler.sendEmptyMessage(0);

} else {

log.E("搜(sou)索異常!");

}

} else {

log.E("沒有搜索到(dao)設備!");

handler.sendEmptyMessage(5);

}

}

}

上一篇:主流嵌入式操作系統有哪些

下一篇:數模轉換(芯片PCF8591)

熱(re)點文章推薦
華清學員就業榜單
高(gao)薪學(xue)員經驗(yan)分(fen)享
熱點新(xin)聞推薦
前臺專線:010-82525158 企(qi)業培訓(xun)洽談專線:010-82525379 院校合作洽談(tan)專(zhuan)線:010-82525379 Copyright © 2004-2022 北京華清遠見科技集團有限公司 版權所有 ,,京公海網安備11010802025203號

回到頂部