童話故事 --- 藍牙通信 --- 連接手機和嵌入式設備

来源:http://www.cnblogs.com/micemik/archive/2017/10/17/7679916.html
-Advertisement-
Play Games

介紹了藉助藍牙SPP服務實現手機和嵌入式設備通信的基本原理和實現流程。 ...


 

高飛狗:

"常常的想,現在的你"

布魯托:

"哈羅!高飛!心情不錯嘛!"

高飛狗:

"嗨!又遇到難題了,百思不得其解,頭昏眼花的,心情糟透了!"

布魯托:

"又在研究什麼高科技項目?"

高飛狗:

"根本算不上什麼高科技,我有一個PM2.5監測裝置,就是能夠測量與記錄環境溫度、濕度和顆粒物濃度的東東,受應用條件的限制,沒有配備顯示屏,為了能夠在現場對其進行配置、管理並獲取測量數據,想在這個裝置上連接一個藍牙模塊,然後藉助手機通過藍牙通信實現這些功能。"

布魯托:

"藍牙通信是很成熟的技術,應該不難解決。"

高飛狗:

"在手機上當然很容易就搜索到我的藍牙模塊併成功進行了配對,但是接下來如何開發一個AppPM2.5監測裝置通信,我是一頭霧水啊!"

布魯托:

"開發手機App,用Android Studio就可以。"

高飛狗:

"Android Studio開發出來的App無法在iOS上運行。再說,我只會C++語言,而Android Studio要用java語言開發。"

布魯托:

"我們不妨去找找黛絲博士,聽聽她有什麼高見。"

高飛狗:

"又去找她? 挺不好意思的。"

布魯托:

"黛絲博士是個熱心人,樂於助人,上次咱倆去求助,她一點架子都沒有,而且她對你的態度大為好轉,難道你沒瞧出來? 沒準人家天天盼著你去問問題呢!"

高飛狗:

"真的嗎?你看出來轉機來了?我還有機會?"

布魯托:

"咱們這就走吧!"

高飛狗和布魯托再次來到黛絲家並按下了門鈴,"叮鈴鈴叮鈴鈴"。

黛絲:

"誰呀? 啊哦!是你們兩位,快請進!"

"快請坐,喝點咖啡還是綠茶?"

高飛狗:

"不用這麼客氣。黛絲,今天來又得麻煩你。"

黛絲:

"是什麼事呀?"

高飛狗:

"我想用C++開發一個手機App,通過藍牙通信管理我的PM2.5監測裝置,而且這個App必須在AndroidiOS上都能運行。"

黛絲:

"這有什麼難的呀。"

高飛狗:

"我就是不知該如何下手,一點思路都沒有。"

黛絲:

"最近剛剛做了一個類似的項目,正好跟你們說說,對我來說也算溫習所學知識吧。"

布魯托:

"您太謙虛了!"

黛絲:

"咱們先說藍牙通信的原理,然後再說具體實現吧。"

"藍牙通信和TCP/UDP的原理基本相同,幾乎如出一轍。參見下表。"

 

通信特征

TCP/UDP通信

藍牙通信

通信模式

客戶端-伺服器模式

客戶端-伺服器模式

通信端點

TCP

服務

通信端點標識方法

TCP埠號,是16位二進位數

服務UUID,是128位二進位數

客戶端通信過程

創建客戶端Socket

連接伺服器

發送數據

接收數據

創建客戶端Socket

連接伺服器

發送數據

接收數據

 

黛絲:

"看見了吧,與TCP/UDP相比,區別僅僅在於,藍牙用服務代替,用服務UUID代替埠號,且服務UUID較長。"

"用手機App管理嵌入式設備,手機就是客戶端,嵌入式設備上的藍牙模塊就是伺服器。"

高飛狗:

"真的是一目瞭然!"

黛絲:

"TCP/UDP標准定義了一組固定的埠對應一組標準化服務。例如,TCP80用於Web服務;TCP21用於FTP服務。"

"類似地,藍牙標準也定義了一組固定的服務UUID對應一組標準化服務。"參見下表:

 

藍牙服務名稱

服務UUID

Serial Port

00001101-0000-1000-8000-00805F9B34FB

LAN Access Using PPP

00001102-0000-1000-8000-00805F9B34FB

DialupNetworking

00001103-0000-1000-8000-00805F9B34FB

OBEXObjectPush

00001105-0000-1000-8000-00805F9B34FB

OBEXFileTransfer

00001106-0000-1000-8000-00805F9B34FB

Cordless Telephony

00001109-0000-1000-8000-00805F9B34FB

Audio Source

0000110A-0000-1000-8000-00805F9B34FB

 

黛絲:

"由於藍牙服務UUID太長,就用16進位數表達,遵循8-4-4-4-12的方法表示。"

"藍牙通信與TCP/UDP通信的關鍵不同在於,藍牙伺服器都有一個SDP服務,也就是服務發現服務,供客戶端查詢藍牙伺服器能夠提供哪些服務。"

"通常,用於嵌入式設備的藍牙模塊都提供Serial Port服務,簡稱SPP,然後提供一個UART連接嵌入式設備",如下圖所示。

 

黛絲:

"由此,手機App與嵌入式設備通信的基本流程如下(假設藍牙模塊已經與手機配對完畢)

步驟1:選擇要進行通信的藍牙模塊

步驟2:查詢藍牙模塊的服務。通常已配對的藍牙設備的服務列表已緩存在手機里。

步驟3:如果存在SPP服務,恭喜你!

步驟4:用SPP服務UUID創建一個客戶端Socket

步驟5:用客戶端Socket連接藍牙模塊。

步驟6:調用客戶端SocketSendData()發送數據給藍牙模塊,藍牙模塊會將收到的數據通過UART轉發給嵌入式設備。

步驟7:如果嵌入式設備發送數據給藍牙模塊,藍牙模塊會轉發給手機,手機會緩存這些數據,App可調用客戶端SocketReceiveData()接收數據。"

黛絲:

"藍牙通信的原理就是這樣的。"

高飛狗:

"黛絲,你講得太明白了,今晚我一定要好好請請你、親親你!

黛絲:

"你就知道邪思歪想!"

高飛狗:

"那具體如何實現呢?"

黛絲:

"具體實現方法也很簡單。我們只要選擇Rad Studio作為開發工具,用C++編寫一套源代碼就可以生成適用於AndroidiOS上運行的App,是不是很酷?"

"有關Rad Studio就不在此累述,GUI界面的設計也很簡單,我們聚焦如何通過藍牙進行數據收發。"

 

藉助藍牙SPP服務,實現手機與嵌入式設備之間的通信

1:本文旨在明晰藍牙通信原理,僅列出扼要代碼,如需完整代碼,可聯繫本人。

2:確保已開啟手機藍牙

3:確保藍牙模塊已在手機的已配對設備列表中。

// 取得並保存藍牙管理器對象

TBluetoothManager *BtManager = TBluetoothManager::Current;

 

// 取得並保存藍牙適配器對象

BtAdapter = BtManager ->CurrentAdapter;

 

// 取得已配對的藍牙設備列表

TBluetoothDeviceList *PairedDevices = BtManager ->GetPairedDevices();

 

// 將藍牙設備列表顯示在組合框cbPairedDevices(代碼略)

 

// 獲取組合框中被選中的藍牙設備對象

TBluetoothDevice * SelDevice = PairedDevices ->Items[cbPairedDevices->ItemIndex];

 

// 獲取該藍牙設備的服務列表

TBluetoothServiceList * ListServices = SelDevice->GetServices();

 

// 在服務列表中查詢是否支持SPP服務(代碼略)

 

// 若支持SPP服務

 

// SPP服務UUID創建一個客戶端Socket

TBluetoothSocket *BtSocket = SelDevice ->CreateClientSocket(StringToGUID(SPP_GUI), false);

 

// 用客戶端Socket連接藍牙模塊。

BtSocket ->Connect();

 

// 調用客戶端SocketSendData()發送數據給藍牙模塊,藍牙模塊會將收到的數據通過UART轉發給嵌入式設備。

BtSocket ->SendData(DataArray); // DataArray是一個數組

 

// 如果嵌入式設備發送數據給藍牙模塊,藍牙模塊會轉發給手機,手機會緩存這些數據,App可調用客戶端SocketReceiveData()接收數據。"

BtSocket->ReceiveData(50); // 接收數據,限時等待50ms

 

黛絲:

"以上就是手機App與藍牙模塊間收發數據的基本流程及其實現。"

高飛狗:

"黛絲,你講得太深入淺出了!啊哦,快到飯點了,我請你吃個便飯,聊表謝意!"

黛絲:

"已經有人約我吃飯了,你們就趕緊回去試驗,有什麼問題隨時Call我。"


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 通過上一篇文章 "我的three.js學習記錄(一)" 基本上是入門了three.js,但是這不夠3D,這次我希望能把之前做的demo弄出來,然後通過例子來分析操作步驟。 1. 示例 上圖是之前做的一個demo,有點醜,希望不要介意。 這個主要是外面一層包裹著 "天空盒" , 然後裡面是一個由開頂的 ...
  • 今天看了技術大牛的博客,於是想跟蹤學習有關他發表的文章,發現必須要註冊一個博客才能關註,於是就加入了博客園,註冊了一個博客。希望通過博客的平臺記錄自己每天學到的新技術,也可以分享一些自己的心得。 ...
  • es7
    es7 es7只有兩個新特性: 1. Array.prototype.includes() 用於判斷元素是否在數組內 用法: 其實, 和`Array.prototype.indexOf() 1`大致相同,但有幾點不同: 1. includes可以檢測出NaN,而indexOf不可以 [1,NaN]. ...
  • 今天給組件添加一個小功能,需要點擊界面空白部分關閉當前組件,找了好一會兒,發現主要是jquery的方法,js原生幾乎沒有,崩潰。。好不容易弄出來了,就給自己做個筆記吧,ps:我用的react 要用到的方法: 1.contains:就是判斷某個元素是不是選定元素的子元素(或本身); 鏈接:https: ...
  • 前端Js框架彙總 概述: 有些日子沒有正襟危坐寫博客了,互聯網飛速發展的時代,技術更新迭代的速度也在加快。看著Java、Js、Swift在各領域心花路放,也是煞是羡慕。尋了尋.net的消息,也是振奮人心,.net core 1,mono,xamarin等等,但大多都還在狂吼的階段。其實一直以來對技術 ...
  • JavaScript筆記(第一章,第二章) 第一章: <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <script type="text/javascript" src="lesson2.js"></sc ...
  • 最近有個客戶想要做一個熱點圖片,但我對動畫沒有太多的接觸,經過這幾天的研究和上網查找資料,終於作了出序列幀動畫。 圖片地址:圖片下載 代碼如下: 之後我也在網上找了一些案例,我把文件放在這裡,有興趣的朋友可以看看 序列幀動畫下載 第一個是自己寫的案例 , 第二三個是在網上找別人的但是原網我忘了(日後 ...
  • 實現目標 先來一張微信功能截圖看看要做什麼 其實就是有一個目的地,點擊目的地的時候彈出可選擇的應用進行導航。 大腦動一下,要實現這個功能應該大體分成兩步: 底部菜單這裡用PopupWindow來做。 實現 1、菜單顯示 PopupWindow支持傳入view進行彈出展示,所有我們直接寫一個菜單佈局, ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...