<p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/ZLAir724UGA/aly.html" frameborder="0" scrolling="auto" width="100%" height="1500"></iframe></p>
說明
這一節實現Android掃碼綁定模組並通過阿里雲物聯網平台實現遠程通信控制.
概要:
APP和單片機設備分別作為設備以動態注冊方式連接阿里雲物聯網平台,然后通過規則引擎實現APP和設備之間通信.
此節教程是前面所有知識點的整合,希望用戶按部就班的學習了前面的內容,然后再學習此節.
APP頁面展示
雲平台顯示溫濕度數據
測試准備
1.打開這節的APP工程和單片機工程
2. 登錄自己的雲平台點擊產品的查看
3.打開動態注冊按鈕
4.查看自己產品的ProductSecret; ProductKey;
5.修改單片機程序里面的參數 ProductSecret; ProductKey;
6.修改Android程序里面的參數 ProductSecret; ProductKey;
配置規則引擎
1.規則引擎 ,雲產品流轉,創建規則
2.選擇編寫 SQL
3.添加操作
4.注意①自己填寫 ${TargetDevice}
5.啟動規則
確認單片機工作正常
1.修改完成以后編譯下載單片機程序,安裝好手機卡和天線
2.如果日志看到訂閱主題成功,說明已經自動注冊並接入了平台
3.在平台上可以看到在相應的產品下面注冊了設備
注:設備名字使用的是模組的IMEI號
確認Android工作正常
1.重新安裝APP,運行APP會彈出注冊頁面.
注:接入的設備的名字做成了需要用戶去填寫
2.填寫 111111(隨意哈) 后點擊 注冊設備
3.注冊成功將會跳轉到主頁(允許權限)
4.在平台上可以看到在相應的產品下面注冊了設備
開始整體測試
1.點擊APP右上方的菜單欄,選擇 掃一掃
2.掃描模組上面的二維碼
3.掃描成功以后將會在主頁面添加一個設備
4.點擊顯示的設備,進入設備控制頁面
5.點擊右上角的開關控制繼電器
6.用手拖動,可以看到板子上的燈隨着拖動顏色的變化而變化
用手拖動,可以看到板子上的燈隨着拖動顏色的變化而變化
整體通信流程說明
1,APP和設備通信協議(APP和設備通過自定義主題通信)
2.通信流程詳細說明
APP和單片機各自作為阿里雲的設備接入阿里雲服務器.
APP接入的名字為用戶注冊時填寫的名字;
單片機接入的名字為模組的IMEI號;
APP 添加設備的時候添加的模組的IMEI號.
假設APP注冊的設備的名字為: 111111
假設模組的IMEI為: 868591050594364
APP發布的主題: /a1m7er1nJbQ/111111/user/update
這個主題發給雲平台以后,經過了轉發規則里面的SQL語句
注: /a1m7er1nJbQ/+/user/update (里面的 + 代表任意)
APP發布的主題為 /a1m7er1nJbQ/111111/user/update 所以,符合條件.便會提取這個主題里面的消息.
APP發布的消息為:(以控制繼電器為例子)
{"TargetDevice":"868591050594364","DeviceName":"111111","data":"switch","bit":"1","status":"1"}
注:
TargetDevice 字段的值是APP添加的設備的名字
DeviceName 字段的值是APP本身設備的名字.
然后下面的配置是對提取的消息進行操作
發布到另一個 Topic /a1kalhdMH2Z/${TargetDevice}/user/get
${TargetDevice}意思是提取消息里面字段為 TargetDevice 的字段值,然后替換上面的 ${TargetDevice}
咱的消息是 {"TargetDevice":"868591050594364","DeviceName":"111111","data":"switch","bit":"1","status":"1"}
所以最終消息轉發給下面的主題(也就是單片機訂閱的主題)
/a1kalhdMH2Z/868591050594364/user/get
然后單片機就收到了消息 {"TargetDevice":"868591050594364","DeviceName":"111111","data":"switch","bit":"1","status":"1"}
單片機接收到消息以后,提取 "DeviceName":"111111"
然后用自己的發布主題發布消息
發布的主題: /a1kalhdMH2Z/868591050594364/user/update
發布的消息: {"TargetDevice":"111111","DeviceName":"868591050594364","data":"switch","bit":"1","status":"1"}
TargetDevice 字段的值改為了 111111
DeviceName 字段的值為單片機設備的名字 868591050594364
消息發給了服務器,然后經過轉發規則,同理 ,消息便會轉發給了APP
最后APP 提取消息里面的數據,就完成了通信
單片機程序說明
1.注冊,連接服務器
2.連接成功之后訂閱主題
3.在MQTT回調函數里面接收處理和返回消息
4.如果繼電器狀態改變,上報繼電器狀態
5.定時上報溫濕度數據(通過物模型主題上報到網頁端)
單片機程序細節說明
1.為使設備可以同時和與其綁定的APP實現通信控制,代碼中使用了 BufferRankOrder 記錄APP設備名稱
設備發送數據的時候輪訓把數據發給和自己綁定的APP.
關於為啥要記錄APP設備的信息?
因為如果多個用戶同時在控制,設備必須把數據返回給每一個控制的APP.
如果誰控制就返回給誰數據,就會出現誰控制誰的頁面有變化,其他人的控制頁面沒有變化的尷尬局面.
這對於產品而言就讓用戶難以接受.所以需要把數據返回給所有的APP.
但是也不能把所有的APP設備都記錄下來,因為不合理.
需要把這些APP做個優先等級排序.經常控制的要靠前,不經常的靠后,基本上沒影了的放到最后,直至丟棄
關於 BufferRankOrder https://www.cnblogs.com/yangfengwu/p/14164215.html
假設有5個APP和單片機通信,APP設備的名字分別為: "111111","222222","333333","444444","555555"
假設這5個設備依次和單片機通信,1-5 (誰最后和單片機通信就把誰放到第一個位置.)
那么這些名字在BufferRankOrder內存里面的排序 "555555","444444","333333","222222","111111"
哪個APP不經常和設備通信,那么這個APP最終將會被擠掉.最終只留下經常和設備通信的.
Android程序詳細說明
1.基本目錄說明
1.控制頁面
2.注冊頁面
3.sha計算mqtt密碼
4.使用Litepal存儲綁定的設備信息
5.正常運行時使用的MQTT程序
6.注冊設備時使用的MQTT程序
7.存儲注冊的信息
2.如果APP沒有注冊,跳轉到注冊設備頁面
3.點擊按鈕注冊設備,並把注冊信息存儲以后跳轉到主頁面
4.獲取注冊的數據,組合MQTT參數,並執行連接
5.點擊掃描二維碼,進入掃描頁面
7.掃碼成功,攜帶着數據跳轉到主頁
8.MainActivity在onNewIntent中接收返回的數據
9.把數據存儲到數據庫,並刷新頁面
10.點擊設備,攜帶着提取點擊的設備名字跳轉到控制頁面
10.獲取APP設備的productKey和deviceName,並拼接其自定義的主題
11.獲取傳遞進來的所點擊的設備的名字,組合開關控制數據
13.APP訂閱自身的自定義主題
14.定時請求設備數據
15.每隔300ms檢測RGB是否需要調整
16.點擊按鈕發送控制繼電器指令
17.接收數據