色偷偷偷亚洲综合网另类,亚洲欧美另类在线观看,欧美午夜激情在线,久久久精品一区

當(dāng)前位置:首頁(yè) > 嵌入式培訓(xùn) > 嵌入式學(xué)習(xí) > 講師博文 > Android藍(lán)牙調(diào)試助手實(shí)現(xiàn)

Android藍(lán)牙調(diào)試助手實(shí)現(xiàn) 時(shí)間:2018-08-15      來(lái)源:未知

藍(lán)牙( Bluetooth ):是一種無(wú)線技術(shù)標(biāo)準(zhǔn),可實(shí)現(xiàn)固定設(shè)備、移動(dòng)設(shè)備和樓宇個(gè)人域網(wǎng)之間的短距離數(shù)據(jù)交換(使用2.4—2.485GHz的ISM波段的UHF無(wú)線電波)。藍(lán)牙技術(shù)初由電信巨頭愛立信公司于1994年創(chuàng)制,當(dāng)時(shí)是作為RS232數(shù)據(jù)線的替代方案。藍(lán)牙可連接多個(gè)設(shè)備,克服了數(shù)據(jù)同步的難題。

藍(lán)牙4.0是2012年新藍(lán)牙版本,是3.0的升級(jí)版本;較3.0版本更省電、成本低、3毫秒低延遲、超長(zhǎng)有效連接距離、AES-128加密等;通常用在藍(lán)牙耳機(jī)、藍(lán)牙音箱等設(shè)備上。

本項(xiàng)目是基于藍(lán)牙4.0的串口調(diào)試助手。主要應(yīng)用在攜帶藍(lán)牙4.0的設(shè)備上,功能是主動(dòng)掃描周邊的藍(lán)牙設(shè)備,連接成功后,模塊所發(fā)送的數(shù)據(jù)會(huì)顯示在對(duì)應(yīng)的區(qū)域。同時(shí),還能夠向模塊發(fā)送信息。接受和發(fā)送的信息都可以選擇為十六進(jìn)制。

第 1 章 使用說(shuō)明

軟件共分為三個(gè)部分:數(shù)據(jù)接收區(qū),數(shù)據(jù)發(fā)送區(qū),設(shè)備掃描區(qū)。

點(diǎn)擊搜索,軟件會(huì)開始進(jìn)行周邊藍(lán)牙設(shè)備的掃描,需要等待五分鐘。

掃描完成后,設(shè)備會(huì)在右側(cè)顯示出來(lái),點(diǎn)擊設(shè)備就可以連接。

這是結(jié)婚搜到的數(shù)據(jù)就會(huì)顯示在左側(cè),當(dāng)不需要的時(shí)候,點(diǎn)擊右下角的斷開,就可以中斷和設(shè)備的連接。

第 2 章 環(huán)境搭建

2.1 Android 開發(fā)環(huán)境的安裝與配置

Android應(yīng)用軟件開發(fā)需要的開發(fā)環(huán)境在路徑“光盤\Android應(yīng)用開發(fā)環(huán)境\”下:

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

(從JDK 8.0開始不支持Windows XP操作系統(tǒng),使用Windows XP的用戶可以使用JDK7目錄下的內(nèi)容)

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

以下主要介紹在Windows環(huán)境下搭建Android開發(fā)環(huán)境的步驟和注意事項(xiàng)。

2.2 安裝JDK和配置Java開發(fā)環(huán)境

雙擊JDK\JDK8\jdk-8u5-windows-i586.exe(32bit操作系統(tǒng))或者jdk-8u5-windows-x64.exe(64bit操作系統(tǒng))進(jìn)行安裝(從JDK 8.0開始不支持Windows XP操作系統(tǒng),使用Windows XP的用戶可以使用JDK7目錄下的內(nèi)容選擇代替JDK8目錄下的內(nèi)容)。接受許可證,選擇需要安裝的組件和安裝路徑后,單擊“下一步”按鈕,完成安裝過(guò)程。

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

XP下安裝JDK7如下:

非XP下安裝JDK8如下:

2.3 解壓adt-bundle-windows

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

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

2.4 運(yùn)行Eclipse

解壓完畢后,直接執(zhí)行其中的eclipse\eclipse.exe文件,Eclipse可以自動(dòng)找到用戶前期安裝的JDK路徑。

2.5 配置Eclipse

運(yùn)行解壓目錄下的eclipse\eclipse.exe,為自己選擇一個(gè)工作目錄Workspace,不要有中文路徑,不選擇默認(rèn)也可以。

需要為Eclipse關(guān)聯(lián)SDK的安裝路徑,即解壓路徑下的sdk目錄。在Eclipse中,點(diǎn)擊Window->Preferences,會(huì)看到其中添加了Android的配置,按圖所示的操作,然后點(diǎn)擊Apply,后點(diǎn)擊OK即可。

完成以上步驟后,設(shè)置Eclipse環(huán)境

勾選Android相關(guān)的工具,點(diǎn)擊OK(如果已經(jīng)勾選,則不理會(huì))。

第 3 章 源碼編譯

3.1 導(dǎo)入源碼

打開Eclipse環(huán)境,選擇File->Import。

然后,導(dǎo)入光盤資料中的“BlueHelper”工程,勾選下圖中的選項(xiàng)。

點(diǎn)擊finish完成工程的導(dǎo)入

3.2 運(yùn)行程序

注意:如果在調(diào)試開發(fā)板的時(shí)候,出現(xiàn)ADB連接不上的問(wèn)題(已知華清遠(yuǎn)見FSPAD723開源平板),可以試著替換Android SDK的ADB工具(把光盤\Android應(yīng)用開發(fā)環(huán)境\ADB\ADB1.0.26\下的4個(gè)文件拷貝到用戶ADT解壓目錄下的sdk\platform-tools中)

開發(fā)期間,在實(shí)際的設(shè)備上運(yùn)行Android程序與在模擬器上運(yùn)行該程序的效果幾乎相同,需要做的就是用USB電纜連接手機(jī)與計(jì)算機(jī),并安裝一個(gè)對(duì)應(yīng)的設(shè)備驅(qū)動(dòng)程序。如果模擬器窗口已打開,請(qǐng)將其關(guān)閉。只要將開發(fā)平臺(tái)通過(guò)USB下載線與計(jì)算機(jī)相連,應(yīng)用程序就會(huì)在開發(fā)平臺(tái)上加載并運(yùn)行。

在Eclipse中選擇“Run” →“Run”(或Debug)命令(或者在工程上點(diǎn)擊右鍵),這時(shí)會(huì)彈出一個(gè)窗口,讓你選擇用模擬器還是手機(jī)來(lái)顯示,如果選擇手機(jī),即可在手機(jī)上運(yùn)行該程序。

第 4 章 詳細(xì)設(shè)計(jì)

4.1 BlueTool藍(lán)牙工具

藍(lán)牙4.0采用了新的協(xié)議,與2.0并不通用,所以這里封裝了工具類來(lái)進(jìn)行數(shù)據(jù)的溝通。

BluetoothGatt類是連接遠(yuǎn)程設(shè)備返回的代理類,我們需要用這個(gè)類來(lái)進(jìn)行服務(wù)和特征值得獲取。

NormalText Code

private BluetoothGatt bluetoothGatt = null;

private BluetoothAdapter bluetoothAdapter = null;

private BluetoothGattService bluetoothService = null;

private BluetoothGattCharacteristic characteristic = null;

這里定義的UUID是連接特定的服務(wù)和特征值,如果有需要的話,可以在這里進(jìn)行更改來(lái)實(shí)現(xiàn)別的需求。

NormalText Code

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

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

連接藍(lán)牙的第一步,需要先掃描設(shè)備,這里給出掃描的方法,需要調(diào)用協(xié)議中已經(jīng)實(shí)現(xiàn)的方法startLeScan()來(lái)獲得設(shè)備,之后,再通過(guò)stopLeScan()函數(shù)來(lái)停止掃描。

NormalText Code

// 搜索設(shè)備并添加到列表中

public Boolean SearchToList() {// 打開藍(lán)牙,搜索設(shè)備

if (bluetoothAdapter != null) {

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

// 打開藍(lán)牙

bluetoothAdapter.enable();

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

// 搜索設(shè)備

bluetoothAdapter.startLeScan(scanCallback);

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

return true;

} else {

// 搜索設(shè)備

bluetoothAdapter.startLeScan(scanCallback);

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

return true;

}

} else {

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

return false;

}

}

當(dāng)startLeScan()掃描到設(shè)備的時(shí)候,會(huì)回調(diào)下面的這個(gè)函數(shù),我們要做的就是在這個(gè)函數(shù)中將掃描到的設(shè)備添加進(jìn)設(shè)備列表就行。

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());

}

}

}

};

連接完成后,需要獲得特征值進(jìn)行讀寫操作。

NormalText Code

// 連接設(shè)備并獲得特征值

public synchronized boolean BLEConnect(BluetoothDevice remoteDev) {

if (remoteDev == null) {

return false;

}

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

return true;

}

當(dāng)connectGatt函數(shù)返回之后,會(huì)回調(diào)BluetoothGattCallback 變量當(dāng)中的onConnectionStateChange函數(shù),然后在這個(gè)函數(shù)中,我們要繼續(xù)調(diào)用discoverServices這個(gè)函數(shù)來(lái)發(fā)現(xiàn)設(shè)備所提供的服務(wù)。當(dāng)discoverServices被調(diào)用的時(shí)候,也會(huì)進(jìn)行onServicesDiscovered這個(gè)函數(shù)的回調(diào)。在這個(gè)函數(shù)中,如果我們想要讀取設(shè)備的數(shù)據(jù),需要通過(guò)setCharacteristicNotification來(lái)設(shè)定接受通知,這樣,當(dāng)設(shè)備有數(shù)據(jù)傳過(guò)來(lái)的時(shí)候,會(huì)自動(dòng)通知程序,我們只需要在onCharacteristicChanged中將返回的數(shù)據(jù)取出來(lái)就行。

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("連接成功!");

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("接收數(shù)據(jù)成功!" + printHex(readDate) + "-" +

// readDate.length);

handler.sendEmptyMessage(1);

handler.sendEmptyMessage(2);

} else {

log.E("接收數(shù)據(jù)失敗!");

}

}

@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調(diào)試助手

主界面的程序,是通過(guò)Handler機(jī)制進(jìn)行消息的傳遞的。

NormalText Code

@SuppressLint("HandlerLeak")

private final Handler handler = new Handler() {

@Override

public void handleMessage(Message msg) {

switch (msg.what) {

case 0:// 刷新搜索列表

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);// 滾動(dòng)到底

break;

case 2:// 持續(xù)讀取數(shù)據(jù)

if (threadon == false) {

threadon = true;

// new readThread().start();

}

break;

case 3:// 改變按鈕

close.setVisibility(0);

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

Toast.LENGTH_SHORT).show();

break;

case 4:// 改變按鈕

close.setVisibility(4);

Toast.makeText(Bluehelper.this, "連接斷開".toString(),

Toast.LENGTH_SHORT).show();

break;

case 5:// 改變按鈕

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

Toast.LENGTH_SHORT).show();

break;

case 10:// 改變按鈕

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

Toast.LENGTH_SHORT).show();

break;

default:

break;

}

}

};

在onCreate函數(shù)中,我們需要設(shè)定界面中各個(gè)按鍵的回調(diào)函數(shù)。

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("點(diǎn)擊位置:" + 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, "請(qǐng)先連接設(shè)備".toString(),

Toast.LENGTH_SHORT).show();

}

}

});

searchThread 連接線程,主要工作就是調(diào)用藍(lán)牙工具中的SearchToList,等待掃描5s后,再停止掃描。

NormalText Code

class searchThread extends Thread {

@Override

public void run() {

// log.E("開始藍(lán)牙搜索。。。。。");

Message msg = new Message();

msg.what = 10;

msg.obj = "開始搜索。。。";

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("搜索到的設(shè)備:" + blue.GetdeviceName());

if (true == on) {

handler.sendEmptyMessage(0);

} else {

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

}

} else {

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

handler.sendEmptyMessage(5);

}

}

}

上一篇:主流嵌入式操作系統(tǒng)有哪些

下一篇:數(shù)模轉(zhuǎn)換(芯片PCF8591)

熱點(diǎn)文章推薦
華清學(xué)員就業(yè)榜單
高薪學(xué)員經(jīng)驗(yàn)分享
熱點(diǎn)新聞推薦
前臺(tái)專線:010-82525158 企業(yè)培訓(xùn)洽談專線:010-82525379 院校合作洽談專線:010-82525379 Copyright © 2004-2022 北京華清遠(yuǎn)見科技集團(tuán)有限公司 版權(quán)所有 ,京ICP備16055225號(hào)-5京公海網(wǎng)安備11010802025203號(hào)

回到頂部

色偷偷偷亚洲综合网另类,亚洲欧美另类在线观看,欧美午夜激情在线,久久久精品一区
主站蜘蛛池模板: 中文字幕亚洲欧美| 久久国内精品一国内精品| 亚洲a∨日韩av高清在线观看| 国产精品久久久久久一区二区 | 韩国19禁主播vip福利视频| 精品久久久国产精品999| 欧美国产视频一区二区| 97人人做人人爱| 日韩av免费在线播放| 国产啪精品视频网站| 亚洲淫片在线视频| 亚洲欧洲av一区二区| 在线成人激情视频| 欧美日本精品在线| 高清欧美一区二区三区| 国产精品1234| 亚洲成色777777女色窝| 国产一区二区三区18 | 亚洲国产精品网站| 久久国产精品久久久久久久久久| 欧美成人一二三| 97超碰国产精品女人人人爽| 国产精品成人免费电影| 亚洲最大av在线| 日韩中文字幕在线看| 久久久久久成人精品| 国产精品一区=区| 亚洲欧美一区二区激情| 激情懂色av一区av二区av| 91av在线不卡| 亚洲直播在线一区| 日韩视频中文字幕| 97精品国产97久久久久久免费| 国产一区二区丝袜| 一区二区三区天堂av| 色综合久久久888| 成人黄色午夜影院| www.久久草.com| 91国产精品91| 亚洲精品动漫100p| 丁香五六月婷婷久久激情|