單片機(jī)藍(lán)牙app開(kāi)發(fā)(手機(jī)連接單片機(jī)藍(lán)牙模塊的APP)
今天給各位分享單片機(jī)藍(lán)牙app開(kāi)發(fā)的知識(shí),其中也會(huì)對(duì)手機(jī)連接單片機(jī)藍(lán)牙模塊的APP進(jìn)行解釋?zhuān)绻芘銮山鉀Q你現(xiàn)在面臨的問(wèn)題,別忘了關(guān)注本站,現(xiàn)在開(kāi)始吧!
Android 低功耗藍(lán)牙(Ble) 開(kāi)發(fā)總結(jié)
Android 從 4.3(API Level 18) 開(kāi)始支持低功耗藍(lán)牙,但是只支持作為中心設(shè)備(Central)模式,這就意味著 Android 設(shè)備只能主動(dòng)掃描和鏈接其他外圍設(shè)備(Peripheral)。從 Android 5.0(API Level 21) 開(kāi)始兩種模式都支持。
低功耗藍(lán)牙開(kāi)發(fā)算是較偏技術(shù),實(shí)際開(kāi)發(fā)中坑是比較多的,網(wǎng)上有很多文章介紹使用和經(jīng)驗(yàn)總結(jié),但是有些問(wèn)題答案不好找,甚至有些誤導(dǎo)人,比如 :獲取已經(jīng)連接的藍(lán)牙,有的是通過(guò)反射,一大堆判斷,然而并不是對(duì)所有手機(jī)有用,關(guān)于Ble傳輸速率問(wèn)題的解決,都是默認(rèn)Android每次只能發(fā)送20個(gè)字節(jié),然而也并不是,,,下面進(jìn)入正文。
這里用的是 Android5.0 新增的掃描API,
這里說(shuō)一下,如果做藍(lán)牙設(shè)備管理頁(yè)面,可能區(qū)分是否是已連接的設(shè)備,網(wǎng)上又通過(guò)反射或其他挺麻煩的操作,也不見(jiàn)得獲取到,官方Api 就有提供
與外圍設(shè)備交互經(jīng)常每次發(fā)的數(shù)據(jù)大于 mtu的,需要做分包處理,接收數(shù)據(jù)也要判斷數(shù)據(jù)的完整性最后才返回原數(shù)據(jù)做處理,所以一般交互最少包含包長(zhǎng)度,和包校驗(yàn)碼和原數(shù)據(jù)。當(dāng)然也可以加包頭,指令還有其他完整性校驗(yàn)。下面分享幾個(gè)公用方法:
我自己封裝的一個(gè)BleUtil ,因?yàn)樯婕案緲I(yè)務(wù)關(guān)聯(lián)性太強(qiáng)(主要是傳輸包的協(xié)議不同)就先不開(kāi)源出來(lái)了,如果這邊文章對(duì)大家有幫助反饋不錯(cuò),我會(huì)考慮上傳個(gè)demo到github供大家使用,
在這先給大家推薦一個(gè)不錯(cuò) Demo ,里面除了沒(méi)有分包,協(xié)議,和傳輸速率?;镜墓δ芏加校艺{(diào)試數(shù)據(jù)到打印到界面上了。最主要是它可以用兩個(gè)個(gè)手機(jī)一個(gè)當(dāng)中心設(shè)備一個(gè)當(dāng)外圍設(shè)備調(diào)試。
首先傳輸速率優(yōu)化有兩個(gè)方向,1 外圍設(shè)備傳輸?shù)紸ndroid 。2 Android傳輸?shù)酵鈬O(shè)備。
我在開(kāi)發(fā)中首先先使用上面那位仁兄的demo調(diào)試,兩個(gè)Android 設(shè)備調(diào)試不延時(shí),上一個(gè)成功馬上下一個(gè),最多一秒發(fā)11個(gè)20字節(jié)的包。
后來(lái)和我們的藍(lán)牙設(shè)備調(diào)試時(shí)發(fā)現(xiàn)發(fā)送特別快,但是數(shù)據(jù)不完整,他藍(lán)牙模塊接收成功了,但是透?jìng)鲾?shù)據(jù)到芯片處理時(shí)發(fā)現(xiàn)不完整,我們的硬件小伙伴說(shuō)因?yàn)?波特率 限制(差不多每10字節(jié)透?jìng)饕臅r(shí)1ms)和藍(lán)牙模塊的buff (打印時(shí)是最多100byte,100打印的)限制,就算藍(lán)牙模塊每包都告訴你接收成功,也是沒(méi)透?jìng)魍昃陀纸邮樟恕:髞?lái)通過(guò)調(diào)試每次發(fā)20K數(shù)據(jù),最后是 Android 發(fā)是 20字節(jié)/130ms 穩(wěn)定。給Android 發(fā)是 20字節(jié)/ 8ms 。 (天殺的20字節(jié),網(wǎng)上都是說(shuō)20字節(jié)最多了)
后來(lái)看了國(guó)外一家物聯(lián)網(wǎng)公司總結(jié)的 Ble 吞吐量的文章(上面有連接),知道Android 每個(gè)延時(shí)是可以連續(xù)接收6個(gè)包的。就改為 120字節(jié)/ 16ms (為啥是16ms,不是每次間隔要6個(gè)包嗎,怎么像間隔兩次,這時(shí)因?yàn)椴ㄌ芈视绊?,多?個(gè)包100字節(jié),差不多 我們的單片機(jī)透?jìng)鞯剿{(lán)牙模塊要多耗時(shí)不到10ms )
而Android 發(fā)數(shù)據(jù)可以申請(qǐng) 我們?cè)O(shè)備的mtu 來(lái)得到最多每次能發(fā)多少字節(jié)。延時(shí)還是130ms,即:241字節(jié)/ 130ms 提高12倍,這個(gè)速度還可以。
根據(jù)藍(lán)牙BLE協(xié)議, 物理層physical layer的傳輸速率是1Mbps,相當(dāng)于每秒125K字節(jié)。事實(shí)上,其只是基準(zhǔn)傳輸速率,協(xié)議規(guī)定BLE不能連續(xù)不斷地傳輸數(shù)據(jù)包,否則就不能稱(chēng)為低功耗藍(lán)牙了。連續(xù)傳輸自然會(huì)帶來(lái)高功耗。所以,藍(lán)牙的最高傳輸速率并不由物理層的工作頻率決定的。
在實(shí)際的操作過(guò)程中,如果主機(jī)連線(xiàn)不斷地發(fā)送數(shù)據(jù)包,要么丟包嚴(yán)重要么連接出現(xiàn)異常而斷開(kāi)。
在BLE里面,傳輸速度受其連接參數(shù)所影響。連接參數(shù)定義如下:
1)連接間隔。藍(lán)牙基帶是跳頻工作的,主機(jī)和從機(jī)會(huì)商定多長(zhǎng)時(shí)間進(jìn)行跳頻連接,連接上才能進(jìn)行數(shù)據(jù)傳輸。這個(gè)連接和廣播狀態(tài)和連接狀態(tài)的連接不是一樣的意思。主機(jī)在從機(jī)廣播時(shí)進(jìn)行連接是應(yīng)用層的主動(dòng)軟件行為。而跳頻過(guò)程中的連接是藍(lán)牙基帶協(xié)議的規(guī)定,完全由硬件控制,對(duì)應(yīng)用層透明。明顯,如果這個(gè)連接間隔時(shí)間越短,那么傳輸?shù)乃俣染驮龃?。連接上傳完數(shù)據(jù)后,藍(lán)牙基帶即進(jìn)入休眠狀態(tài),保證低功耗。其是1.25毫秒一個(gè)單位。
2)連接延遲。其是為了低功耗考慮,允許從機(jī)在跳頻過(guò)程中不理會(huì)主機(jī)的跳頻指令,繼續(xù)睡眠一段時(shí)間。而主機(jī)不能因?yàn)閺臋C(jī)睡眠而認(rèn)為其斷開(kāi)連接了。其是1.25毫秒一個(gè)單位。明顯,這個(gè)數(shù)值越小,傳輸速度也高。
藍(lán)牙BLE協(xié)議規(guī)定連接參數(shù)最小是5,即7.25毫秒;而Android手機(jī)規(guī)定連接參數(shù)最小是8,即10毫秒。iOS規(guī)定是16,即20毫秒。
連接參數(shù)完全由主機(jī)決定,但從機(jī)可以發(fā)出更新參數(shù)申請(qǐng),主機(jī)可以接受也可以拒絕。android手機(jī)一部接受,而ios比較嚴(yán)格,拒絕的概率比較高。
參考:
在iOS和Android上最大化BLE吞吐量
最大化BLE吞吐量第2部分:使用更大的ATT MTU
關(guān)于單片機(jī)通過(guò)藍(lán)牙將數(shù)據(jù)傳輸給手機(jī),并在app上面顯示出來(lái)怎么實(shí)現(xiàn)?
首先是藍(lán)牙通信,我想指出,如果你用的是藍(lán)牙模塊的話(huà),那么它的單片機(jī)程序與串口的單片機(jī)程序差不多一樣,只要你會(huì)串口操作,藍(lán)牙也就解決了,如果不是用的藍(lán)牙模塊,另當(dāng)別論。
然后是接受端手機(jī)這邊,你應(yīng)該懂一些java東西,知道怎么調(diào)用底層程序,編寫(xiě)讀取串口程序,根據(jù)發(fā)送的協(xié)議,把接受的數(shù)據(jù)轉(zhuǎn)化為十進(jìn)制就可以了.
擴(kuò)展資料
單片機(jī)采用51系列單片機(jī)用C51語(yǔ)言編寫(xiě),通過(guò)sprintf構(gòu)造JSON格式文件通過(guò)藍(lán)牙串口模塊發(fā)送到安卓手機(jī),簡(jiǎn)要代碼如下:
sprintf(msg,"{\"RR\":\"%02x\"}\0",(unsigned int )RRtemp);
Serial_print(msg);
這里涉及到Serial_print()函數(shù)如下:
void Serial_print(char *msg)
{
while (*msg != '\0') {
S2BUF = *msg;
while ((S2CON S2TI) == 0);
S2CON = ~S2TI;
msg++;
}
}
用java編個(gè)控制空調(diào)開(kāi)關(guān)的andriod軟件,用單片機(jī)紅外線(xiàn)控制空調(diào),手機(jī)端用藍(lán)牙與單片機(jī)連接,軟件如何編程?
這不是一個(gè)人能做的 這設(shè)計(jì)到多個(gè)領(lǐng)域:
要為你這個(gè)功能寫(xiě)一個(gè)app應(yīng)用,就是一個(gè)小工具,一般是用java
單片機(jī)編程和開(kāi)發(fā),和藍(lán)牙模塊通訊,和紅外通訊,一般用C和匯編開(kāi)發(fā)
如果涉及藍(lán)牙協(xié)議和通訊格式 還需要處理android系統(tǒng),在linux平臺(tái)操作
你一個(gè)人是做不了這么多事情的,方案公司做這個(gè)東東都要一個(gè)月
怎么實(shí)現(xiàn)手機(jī)APP與單片機(jī)(搭載藍(lán)牙的單片機(jī)) 之間的數(shù)據(jù)傳遞 手機(jī)軟件可以接收來(lái)自單片機(jī)的數(shù)據(jù)并顯示
把串口藍(lán)牙模塊接在單片機(jī)上,再?gòu)氖謾C(jī)操作藍(lán)牙配對(duì)鏈接,就可以實(shí)現(xiàn)單片機(jī)和手機(jī)上的藍(lán)牙串口app互發(fā)數(shù)據(jù)了,數(shù)據(jù)直發(fā) 沒(méi)有協(xié)議
藍(lán)牙開(kāi)發(fā)與應(yīng)用的困惑?
藍(lán)牙是一套通訊標(biāo)準(zhǔn),你上面說(shuō)的配置、協(xié)議都是藍(lán)牙協(xié)議的一部分,協(xié)議內(nèi)部的術(shù)語(yǔ)而已,某些部分能改某些不能,
簡(jiǎn)單來(lái)說(shuō),如果你拿到一個(gè)芯片,芯片廠(chǎng)商會(huì)給你一些軟件固件,這些固件里面就實(shí)現(xiàn)了藍(lán)牙相關(guān)的(你上面說(shuō)的)配置和協(xié)議等,如果你只是做藍(lán)牙應(yīng)用的話(huà),通常只需要按照廠(chǎng)商給的資料調(diào)用一些接口就行了,不要去改動(dòng)內(nèi)部的東西。
至于你說(shuō)的“藍(lán)牙配置”,簡(jiǎn)單解釋就是不同的“配置”提供不同的功能,而且不同的藍(lán)牙設(shè)備應(yīng)用場(chǎng)合、資源都不一樣,所以對(duì)于一個(gè)具體的藍(lán)牙設(shè)備來(lái)說(shuō),可以有某些“配置”,可以去掉某些“配置”(當(dāng)然有些配置是強(qiáng)制的,如gap),總之這是為了讓更多的設(shè)備支持藍(lán)牙而做的模塊化設(shè)計(jì)而已
在單片機(jī)上使用藍(lán)牙模塊控制手機(jī)app可以嗎?
當(dāng)然可以了。你看你是需要達(dá)到什么功能,是單片機(jī)控制手機(jī),還是手機(jī)控制單片機(jī)?通過(guò)藍(lán)牙模塊可以達(dá)到數(shù)據(jù)交互。
在單片機(jī)端藍(lán)牙模塊等于一個(gè)串口。
在手機(jī)APP端開(kāi)啟藍(lán)牙客戶(hù)端,進(jìn)行數(shù)據(jù)處理即可。
關(guān)于單片機(jī)藍(lán)牙app開(kāi)發(fā)和手機(jī)連接單片機(jī)藍(lán)牙模塊的APP的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。