① 手機藍牙與單片機的通信如何實現
一、准備工作:
1.一款帶串口的單片機。
2.USB轉串口模塊(自己焊接的,所以很醜,當然也可以用學習板上的串口部分)。
3.藍牙轉串口模塊。
4.如果你的手機系統是android的,下載個android藍牙調試助手。
5.電腦上安裝一個串口調試助手。
6.若干杜邦線等。
二、調試工作
萬事俱備,只欠東風。
1.調試藍牙模塊
用杜邦線連接USB轉串口模塊和藍牙模塊。
串口模塊 藍牙模塊。
VCC--------->VCC。
TXD---------->RXD。
RXD<----------TXD。
GND--------->GND。
打開手機藍牙助手,連接到該藍牙模塊,成功後隨便輸入一些字元,就會在電腦上看到串口助手上有顯示該字元,前提是串口的波特率和藍牙模塊的波特率對應(默認是9600)。
2.調試單片機的串口
還是用杜邦線連接USB轉串口模塊和單片機,在電腦上打開串口調試助手調試。
接線方式參考調試藍牙模塊。
單片機的程序就不說了,這里假設已經做好了。如果正常則會看到預期效果。
三、連接工作
把藍牙模塊和單片機模塊連接起來,然後打開藍牙調試助手,連接藍牙模塊發送數據。
這個時候,就好像你在電腦上用串口助手給單片機發送數據一樣。
單片機(Single-Chip Microcomputer)是一種集成電路晶元,是採用超大規模集成電路技術把具有數據處理能力的中央處理器CPU、隨機存儲器RAM、只讀存儲器ROM、多種I/O口和中斷系統、定時器/計數器等功能(可能還包括顯示驅動電路、脈寬調制電路、模擬多路轉換器、A/D轉換器等電路)集成到一塊矽片上構成的一個小而完善的微型計算機系統。
在工業控制領域廣泛應用。從上世紀80年代,由當時的4位、8位單片機,發展到現在的300M的高速單片機。
② Android 藍牙開發(一)
普通藍牙設備官方文檔
Android 平台包含藍牙網路堆棧支持 ,憑藉此支持,設備能以無線方式與其他藍牙設備交換數據。應用框架提供了通過 Android Bluetooth API 訪問藍牙功能的途徑。使用 Bluetooth API Android 應用可以執行下面的操作:
傳統藍牙適用於電池使用強度較大的操作,例如 Android 設備之間的流傳輸和通信等。針對具有低功耗要求的藍牙設備,Android 4.3(API 18)中引入了面向低功耗藍牙的 API 支持。
使用 Android Bluetooth API 來完成使用藍牙進行通信的四項主要任務: 設置藍牙 、 查找局部區域內的配對設備或可用設備 、 連接設備 ,以及在 設備之間傳輸數據 。
關於藍牙的 API 在 android.bluetooth 包中,下面介紹一下和藍牙相關的主要類:
在 BluetoothProfile IPC 客戶端連接到服務(即,運行特定配置文件的內部服務)或斷開服務連接時向其發送通知的介面。
使用藍牙必須聲明許可權 BLUETOOTH 才可以執行藍牙通信。
1、獲取藍牙適配器
例如:我們可以查詢所有已配對的設備,然後使用 ArrayAdapter 向用戶顯示每台設備的名稱:
要發起連接僅需要知道目標藍牙設備的 Mac 地址就可以了。
注意 執行 discovery 對於藍牙適配器來說是一個非常繁重的過程,並且會消耗大量資源。在找到要連接的設備後, 要確保使用 cancelDiscovery() 來停止發現,然後嘗試連接 。如果您已經和某台設備進行連接,那麼這個時候執行發現操作會大幅度的減少此連接可用的帶寬!因此不應該在處於連接狀態的時候執行發現操作!
例如:
在連接之前如果兩個設備沒有配對,則系統會自動發出配對請求。
伺服器套接字接受連接的基本過程
放在子線程中去執行。
例子:
客戶端連接的基本過程
調用 connect() 的時候要確保客戶端沒有執行發現操作。如果執行了會大幅度降低連接的速度,增加失敗的可能。
例子
在連接之前調用 cancleDiscovery() 在進行連接之前應該始終調用這個方法,而且調用的時候無需檢測是否正在掃描。
過程:
從 Android 3.0 開始, Bluetooth API 便支持使用藍牙配置文件。藍牙配置文件是適用於設備間藍牙通信的無線介面規范。
1、藍牙配置文件就是設備間通信(藍牙設備)的一種規范
免提配置文件便是一個示例,對於連接到無線耳機的手機,兩台設備都必須支持免提配置文件。我們也可以通過實現介面 BluetoothProfile 來寫入自己的類來支持特定的藍牙配置文件。Android API 提供了以下的幾種藍牙配置文件的實現:
2、使用配置文件的基本步驟
創建 HDP 應用:
關於普通藍牙設備和普通藍牙設備之間的連接通信
關於藍牙設備和藍牙儀器(藍牙耳機、電子秤等等類似產品)
這種之間的通信是通過配置文件代理來實現的。
都有一個對應的配置文件代理類。具體的操作是通過這個對象來完成。
參考: https://mp.weixin.qq.com/s?__biz=MzU5NzA2NjQzMg==&mid=2247484128&idx=1&sn=&scene=21#wechat_redirect
③ Android開發之藍牙(Bluetooth)
在上一篇中有介紹了Wifi與網路連接處理
Android開發之WiFi與網路連接處理
下面,來繼續說說Android中藍牙的基本使用。
Bluetooth是目前使用的最廣泛的無線通訊協議之一,主要針對短距離設備通訊(10米),常用於連接耳機、滑鼠和移動通訊設備等。
值得一提的是:
android4.2新增了部分新功能,但是對於Bluetooth熟悉的人或許開始頭疼了,那就是Android4.2引入了一個新的藍牙協議棧針BLE。谷歌和Broadcom之間的合作,開發新的藍牙協議棧,取代了基於堆棧的Bluez。因此市場上出現了老設備的兼容問題,很多藍牙設備在android4.2手機上不能正常使用。
BluetoothAdapter簡單點來說就是代表了本設備(手機、電腦等)的藍牙適配器對象。
first:we need permission
要操作藍牙,先要在AndroidManifest.xml里加入許可權
**下面來看看如何使用藍牙。 **↓↓↓****
Demo已就緒:
返回值:如果設備具備藍牙功能,返回BluetoothAdapter 實例;否則,返回null對象。
打開藍牙設備的方式:
1.直接調用函數enable()去打開藍牙設備 ;
2.系統API去打開藍牙設備,該方式會彈出一個對話框樣式的Activity供用戶選擇是否打開藍牙設備。
注意: 1.如果藍牙已經開啟,不會彈出該Activity界面。2.在目前大多數Android手機中,是不支持在飛行模式下開啟藍牙的。如果藍牙已經開啟,那麼藍牙的開關 ,狀態會隨著飛行模式的狀態而發生改變。
1. 搜索藍牙設備
使用BluetoothAdapter的startDiscovery()方法來搜索藍牙設備
startDiscovery()方法是一個非同步方法,調用後會立即返回。該方法會進行對其他藍牙設備的搜索,該過程會持續12秒。該方法調用後,搜索過程實際上是在一個System Service中進行的,所以可以調用cancelDiscovery()方法來停止搜索(該方法可以在未執行discovery請求時調用)。
系統開始搜索藍牙設備
^( *  ̄(oo) ̄ ) ^ 系統會發送以下三個廣播:
2.掃描設備
3.定義廣播接收器接收搜索結果
4.注冊廣播
獲取附近的藍牙設備
第一步建立連接:首先Android sdk(2.0以上版本)支持的藍牙連接是通過BluetoothSocket建立連接,服務端BluetoothServerSocket和客戶端(BluetoothSocket)需指定同樣的UUID,才能建立連接,因為建立連接的方法會阻塞線程,所以伺服器端和客戶端都應啟動新線程連接。
(這里的服務端和客戶端是相對來說的)
兩個藍牙設備之間的連接,則必須實現服務端與客戶端的機制。
當兩個設備在同一個RFCOMM channel下分別擁有一個連接的BluetoothSocket,這兩個設備才可以說是建立了連接。
服務端設備與客戶端設備獲取BluetoothSocket的途徑是不同的。
1,服務端設備是通過accepted一個incoming connection來獲取的,
2,客戶端設備則是通過打開一個到服務端的RFCOMM channel來獲取的。
服務端
通過調用BluetoothAdapter的(String, UUID)方法來獲取BluetoothServerSocket(UUID用於客戶端與服務端之間的配對)
客戶端
調用BluetoothService的(UUID)方法獲取BluetoothSocket(該UUID應該同於服務端的UUID)。
調用BluetoothSocket的connect()方法(該方法為block方法),如果UUID同服務端的UUID匹配,並且連接被服務端accept,則connect()方法返回。
數據傳遞,通過以上操作,就已經建立的BluetoothSocket連接了,數據傳遞無非是通過流的形式
獲取流
該類就是關於遠程藍牙設備的一個描述。通過它可以和本地藍牙設備---BluetoothAdapter連接通信。
好多東西我也不知道怎麼描述,下面給出Demo:
剛好有剛學習的小夥伴問我ListView怎麼用,那我就用ListView。
源碼:
RairDemo
GitHub: https://github.com/Rairmmd/android-demo
Coding: https://coding.net/u/Rair/p/RairDemo/git
④ 蘋果手機和沒卡的安卓手機怎麼藍牙互傳軟體
蘋果使用藍牙將照片發送到安卓手機。下面是怎麼做的。1.首先打開蘋果手機桌面的菜單欄,在菜單欄中打開接受「隔空投送」選項。2.打開後會彈出一個框。找到並單擊選擇「所有人」選項。3.打開兩部手機,找到手機里的設置,點擊進入設置界面,打開安卓和蘋果手機的藍牙。4.打開藍牙界面中的藍牙開關。5.最後回到蘋果手機桌面,點擊照片進入圖庫。選擇要發送的圖片,通過藍牙發送到要發送的安卓手機。
蘋果是怎麼用藍牙把東西傳到安卓手機上的?使用藍牙文件交換!你可以在finder- application或者launchpad- other中找到。對於安卓系統,一般可以通過藍牙傳輸。我自己測試過。希望給個好評,謝謝!
不,蘋果是蘋果圈外面的擋箭牌。可以發在線qq之類的。
1.IOS和android不能通過藍牙互相通信。2.一般通過雙方手機的app分享圖片比較方便,比如微信、手機QQ、雲盤等。3.您也可以通過連接電腦進行傳輸。第一代iPhone由蘋果前CEO史蒂夫·喬布斯於2007年1月9日發布,2007年6月29日正式發布。第二代iPhone3G於2008年6月10日由美國蘋果公司掌門人史蒂夫·喬布斯在蘋果全球開發者大會上正式發布。第三代iPhone3Gs由蘋果公司於2009年6月9日在WWDC2009上正式發布。2013年9月10日發布第七代iPhone 5s和iPhone 5c,同年9月20日正式發布。第八代iPhone 6和iPhone 6 Plus於2014年9月10日發布,中國大陸銷售時間定於10月17日。第九代iPhone 6s和iPhone 6s Plus於北京時間2015年9月10日正式發布。2015年9月12日15: 00開始接受預訂,2015年9月25日正式上線。中國是首批國家之一。第十代iPhone 7和iPhone 7 Plus於北京時間2016年9月8日發布,起售價5388元。2017年3月21日,蘋果推出特別版iPhone 7和iPhone 7 Plus,外觀為動人的紅色,起售價6188元。第十一代iPhone 8、iPhone 8 Plus、iPhone X於北京時間2017年9月13日發布。4.7英寸iPhone 8,5.5英寸iPhone 8 Plus和5.8英寸iPhone X,iPhone 8起價5888元,iPhone 8 Plus起價6688元。9月22日正式上線。iPhone X於10月27日預訂,11月3日上市。64G版8388元,頂配256GB版9688元。望採納!
⑤ 安卓怎樣連接兩個藍牙
手機連接兩個藍牙設備在系統和更新設置中進行操作。
以手機華為P40為例,手機連接兩個藍牙設備的步驟分為3步,具體操作如下
1.點擊系統和更新
在設置界面中,點擊打開系統和更新。
2.選擇開發人員選項
在系統和更新界面中,點擊開發人員選項。
3.修改藍牙連接個數
在開發人員選項界面中,點擊最大藍牙音頻連接個數,選擇兩個即可。
我們在使用藍牙設備的時候,通常可能是一對一的情況。但是如果你想讓他與多個設備連接應該怎麼用呢?
首先我們先確定一下藍牙是否有這個功能,因為比較低版本的藍牙就沒有一對多的功能。
另外就是在藍牙開啟的情況下,我們與一部設備連接,同時再長按開關鍵,還可以繼續尋找另一個設備。
這個時候我們就會聽到藍牙傳來的提示間,這就表示找到配對的設備,可以連接。
連接完成第一個設備以後,我們再按同樣的方法打開第二個設備,讓系統自動找到藍牙配對。
這樣設備與藍牙之間就找尋配對成功,當我們使用的時候,就會看到藍牙列表裡的設備。
如果此時不需要連接兩個的話,把藍牙一個關掉即可,這樣兩個與一個都可以正常使用。
⑥ android藍牙BLE(三) —— 廣播
在藍牙開發中,有些情況是不需要連接的,只要外設廣播自己的數據即可,例如蘋果的 ibeacon 。自 Android 5.0 更新藍牙API後,手機可以作為外設廣播數據。
廣播包有兩種:
其中 廣播包是每個外設都必須廣播的,而響應包是可選的 。每個廣播包的長度必須是 31個位元組 ,如果不到 31個位元組 ,則剩下的全用 0 填充 補全,這部分的數據是無效的
廣播包中包含若干個廣播數據單元,廣播數據單元也稱為 AD Structure 。
廣播數據單元 = 長度值Length + AD type + AD Data。
長度值 Length 只佔 一個位元組 ,並且位於廣播數據單元的 第一個位元組 。
概念的東西有些抽象,先看看下面的廣播報文:
0x代表這串字元串是十六進制的字元串。 兩位十六進制數代表一個位元組 。因為兩個字元組成的十六進制字元串最大為 FF ,即255,而Java中byte類型的取值范圍是-128到127,剛好可以表示一個255的大小。所以兩個十六進制的字元串表示一個位元組。
繼續查看報文內容,開始讀取第一個廣播數據單元。讀取 第一個 位元組: 0x07 ,轉換為十進制就是7,即表示後面的7個位元組是這個廣播數據單元的數據內容。超過這7個位元組的數據內容後,表示是一個新的廣播數據單元。
而第二個廣播數據單元,第一個位元組的值是 0x16 ,轉換為十進制就是22,表示後面22個位元組為第二個廣播數據單元。
在廣播數據單元的 數據部分 中, 第一個位元組 代表 數據類型 (AD type),決定數據部分表示的是什麼數據。(即廣播數據單元第二個位元組為AD type)
AD Type 的類型如下:
這bit 1~7分別代表著發送該廣播的藍牙晶元的物理連接狀態。當bit的值為1時,表示支持該功能。
例:
藍牙廣播的數據格式大致講了一下,有助於下面的廣播操作的理解。
先看看廣播設置( AdvertiseSettings )如何定義:
(1)、通過 AdvertiseSettings.Builder#setAdvertiseMode() 設置廣播模式。其中有3種模式:
(2)、通過 AdvertiseSettings.Builder#setAdvertiseMode() 設置廣播發射功率。共有4種功率模式:
(3)、通過 AdvertiseSettings.Builder#setTimeout() 設置持續廣播的時間,單位為毫秒。最多180000毫秒。當值為0則無時間限制,持續廣播,除非調用 BluetoothLeAdvertiser#stopAdvertising() 停止廣播。
(4)、通過 AdvertiseSettings.Builder#setConnectable() 設置該廣播是否可以連接的。
之前說過,外設必須廣播廣播包,掃描包是可選。但添加掃描包也意味著廣播更多得數據,即可廣播62個位元組。
可見無論是廣播包還是掃描包,其廣播的內容都是用 AdvertiseData 類封裝的。
(1)、 AdvertiseData.Builder#setIncludeDeviceName() 方法,可以設置廣播包中是否包含藍牙的名稱。
(2)、 AdvertiseData.Builder#setIncludeTxPowerLevel() 方法,可以設置廣播包中是否包含藍牙的發射功率。
(3)、 AdvertiseData.Builder#addService UUID (Parcel UUID ) 方法,可以設置特定的 UUID 在廣播包中。
(4)、 AdvertiseData.Builder#addServiceData(Parcel UUID ,byte[]) 方法,可以設置特定的 UUID 和其數據在廣播包中。
(5)、 AdvertiseData.Builder#addManufacturerData(int,byte[]) 方法,可以設置特定廠商Id和其數據在廣播包中。
從 AdvertiseData.Builder 的設置中可以看出,如果一個外設需要在不連接的情況下對外廣播數據,其數據可以存儲在 UUID 對應的數據中,也可以存儲在廠商數據中。但由於廠商ID是需要由Bluetooth SIG進行分配的,廠商間一般都將數據設置在廠商數據。
另外可以通過 BluetoothAdapter#setName() 設置廣播的名稱
先看一個例子,我們分別在 廣播包 和 掃描包 中設置 AdvertiseData.Builder 的 每一種廣播報文參數 ,得到一下報文內容:
(1)、Type = 0x01 表示設備LE物理連接。
(2)、Type = 0x09 表示設備的全名
(3)、Type = 0x03 表示完整的16bit UUID 。其值為0xFFF7。
(4)、Type = 0xFF 表示廠商數據。前兩個位元組表示廠商ID,即廠商ID為0x11。後面的為廠商數據,具體由用戶自行定義。
(5)、Type = 0x16 表示16 bit UUID 的數據,所以前兩個位元組為 UUID ,即 UUID 為0xF117,後續為 UUID 對應的數據,具體由用戶自行定義。
最後繼承 AdvertiseCallback 自定義廣播回調。
初始化完畢上面的對象後,就可以進行廣播:
廣播主要是通過 BluetoothLeAdvertiser#startAdvertising() 方法實現,但在之前需要先獲取 BluetoothLeAdvertiser 對象。
BluetoothLeAdvertiser 對象存在兩個情況獲取為Null:
所以在調用 BluetoothAdapter#getBluetoothLeAdvertiser() 前,需要先調用判斷藍牙已開啟,並判斷在 BluetoothAdapter 中獲取的 BluetoothLeAdvertiser 是否為空(測試過某些華為手機 mBluetoothAdapter.() 為 false , 但是能發送ble廣播)。
與廣播成對出現就是 BluetoothLeAdvertiser.stopAdvertising() 停止廣播了,傳入開啟廣播時傳遞的廣播回調對象,即可關閉廣播:
雖然通過廣播告知外邊自身擁有這些Service,但手機自身並沒有初始化Gattd的Service。導致外部的中心設備連接手機後,並不能找到對應的 GATT Service 和 獲取對應的數據。
Service類型有兩個級別:
創建 BluetoothGattService 時,傳入兩個參數: UUID 和Service類型:
我們都知道Gatt中, Service 的下一級是 Characteristic , Characteristic 是最小的通信單元,通過對 Characteristic 進行讀寫操作來進行通信。
特徵屬性表示該 BluetoothGattCharacteristic 擁有什麼功能,即能對 BluetoothGattCharacteristic 進行什麼操作。其中主要有3種:
許可權屬性用於配置該特徵值所具有的功能。主要兩種:
Characteristic 下還有 Descriptor ,初始化 BluetoothGattDescriptor 時傳入: Descriptor UUID 和 許可權屬性
為 Service 添加 Characteristic ,為 Characteristic 添加 Descriptor :
通過藍牙管理器 mBluetoothManager 獲取 Gatt Server ,用來添加 Gatt Service 。添加完 Gatt Service 後,外部中心設備連接手機時,將能獲取到對應的 GATT Service 和 獲取對應的數據
定義 Gatt Server 回調。當中心設備連接該手機外設、修改特徵值、讀取特徵值等情況時,會得到相應情況的回調。
最後開啟廣播後,用nRF連接後看到的特徵值信息如下圖所示:(加多了一個只能都的特徵值)
android藍牙BLE(一) —— 掃描
android藍牙BLE(二) —— 通信
android藍牙BLE(三) —— 廣播
android藍牙BLE(四) —— 實戰