基於微信公衆平臺的智能硬件/智能設備APP開發詳解

智能硬件APP開發,一般分三種形式, Andriod、ios、H5,而常見的H5開發常見的又屬 APICloud SDK、微信應用開發。有的開發者,自己擅長移動端語言開發、或者是會使用常見的開源框架,便選擇寫原生APP或者是混合APP

下面帶你們來看看,如何爲智能硬件寫微信應用開發。
一、需準備的工具:前端

  • 公衆號的原始IDjava

  • 設備的二維碼android

  • 一臺設備ios

注意,不能申請訂閱號(不支持微信認證)。咱們將申請一個服務號,而且完成認證操做,而後才能開啓「設備功能」模塊,最後添加一個產品。web

二、設備綁定tomcat

三、業務服務器的搭建服務器

 

——————詳細概述————————

一、準備好工具後:微信

  • 公衆號的原始IDwebsocket

  • 設備的二維碼框架

  • 一臺設備

 

 

你得有臺設備吧?

 

微信接入前,需保證,設備能正常地與機智雲進行通信,設備的具體開發流程以下。

Alt text

注意,在WIFI模塊中,寫入AirKiss時,須要配置公衆號的原始ID。也就說,除了將機智雲的product_key寫入MCU之外,還須要將公衆號原始ID寫入WIFI固件中。關於固件的燒錄,廠商或者小夥伴們若有困難,能夠尋求機智雲 · 客服MM的幫助。

設備二維碼

微信客戶端APP能夠經過掃描二維碼添加設備。設備二維碼相關信息請點擊這裏。設置內容以下:

Alt text

設備受權

設備不但要在WIFI固件中寫入公衆號原始ID(注意,不是APPID),還要將全部設備的Mac地址,登記到微信服務器上。一開始,微信只給你100個配額,也就是說,你只能受權100個設備。

受權的方法,就是向微信的接口,發送一次請求,具體請看微信文檔-設備受權。

不少小夥伴反應,受權常常失敗,咱們這裏給出一組基於WIFI通信的示例,你們能夠參考:

Alt text

注意:12位xxxxxxxxxxxx,表明設備的Mac地址,id是指設備ID,也就是機智雲的did。但由於設備必須在上線後,機智雲纔會分配一個did,因此,咱們並沒有法預知did是什麼。一般的作法是:將id和mac,都設置爲設備的Mac值。

auth_key能夠不填,設置爲空字符串,但不能沒有這個字段。

op_type爲0時,表示添加一臺設備,後面須要跟着product_id字段(產品ID,在公衆號的「設備功能」中,添加產品後,會有這個id)。op_type爲1時,表示更新一臺設備,此時不須要product_id字段。

批量受權時,記得更新頂部的:device_num。

這樣,咱們硬件(設備)層面的準備工做,就完成啦。

階段性成果

好了,到這步,你能夠稍微的獎勵一下本身,享受一下階段性的成果啦!

打開你的微信(確保是wifi連接狀態),掃一掃你的產品二維碼。

Alt text

下面有兩個按鈕,綠色的按鈕,是啓動微信的AirKiss,將WIFI的帳號密碼,發送給設備的WIFI模塊。

部分設備須要啓動匹配模式,才能配置上網。通常先啓動設備的匹配模式,再使用微信的配置功能。配置完成後,會自動跳轉到設備搜索界面。

在搜索界面,若是前面準備工做到位了,你必定能發現設備(不論是否綁定過)。點擊發現的設備,而後綁定。微信會自動跳轉到公衆號頁面。而後,你能夠在微信的設置頁面中,發現多了一個項目:設備。

固然,上面的操做,只是實現綁定操做。下面的教程將介紹如何監控設備的數據點。

簡化操做的SDK

爲了簡化開發者的操做,咱們將一些必要的API封裝成了兩個SDK: Java-SDK 以及 js-SDK。它們分別用於後臺和前端頁面,各自封裝了機智雲的OpenAPI 以及 WebSocket。

這兩個SDK,將大大的簡化了API的操做,幫咱們接管了token和用戶管理,咱們只須要調用相關方法,便可實現設備的綁定和解綁。

SDK,能夠在本文的附件中下載。

業務服務器的搭建

設備沒問題了,咱們如今須要的是,操控設備自己的功能。

因爲設備已經與機智雲正常的通信,所以,對設備的操做,其實就是如何與機智雲交互。

機智雲設備綁定

如今,用戶已經在微信中綁定了設備,他但願看到,設備在線狀態。怎麼辦?

咱們使用微信的OpenId,做爲惟一標識,生成匿名用戶。何時註冊匿名用戶呢?微信綁定設備時候,將推送一條設備綁定事件消息到咱們的業務服務器。咱們在這個時候,將同時完成註冊匿名用戶,以及綁定用戶/設備的操做。

Alt text

微信在綁定時,發送這麼一條事件消息:

Alt text

咱們須要的是其中的OpenID和Mac,而後咱們調用機智雲的Java-SDK:

 

DeviceInfo deviceInfo = OpenApi.bindDevice(

wechatOpenId,

gizwitsAppId,

gizwitsProductKey,

gizwitsProductSecret,

mac,

deviceAlias,

deviceRemark)

參數名 類型 說明
wechatOpenId String 微信中的OpenId,也就是機智雲中註冊的匿名用戶
gizwitsAppId String 機智雲產品所綁定的APP的id
gizwitsProductKey String 機智雲的產品key
gizwitsProductSecret String 機智雲的產品Secret
mac String 設備的Mac地址
deviceAlias String 設備的別名
deviceRemark String 設備的備註

這個方法,一次性解決了兩個問題:註冊匿名用戶,綁定用戶/設備。相對的,也要設定不少參數。全部的參數都是String類型。

其中deviceAlias(設備別名)以及deviceRemark(設備備註)均可以填空字符串「」。gizwitsProductKey就是你在開發者中心建立的產品。

Alt text

而gizwitsProductSecret,則是該產品對應的密匙,在產品的詳細信息中能夠找到。

Alt text

gizwitsAppId是機智雲中,APP的Id。因爲一個產品,多是多個APP操做的,好比iOS的APP,Android的APP,網站Web應用,甚至微信這樣的輕應用,都算是一個APP。所以,在建立產品後,你還能夠在爲產品綁定一個或多個APP。這裏的gizwitsAppId就是咱們所綁定APP的Id了。注意,APP必須綁定在產品上,才能使用。

當你調用該方法,就能實現註冊匿名用戶,已經將用戶/設備綁定的操做了。是否是很方便呢?固然,爲了方便起見,你還能夠進一步封裝這個SDK。這裏就不展開了。

機智雲設備解綁

解綁操做也是相似的邏輯。當微信推送一條解綁事件消息,咱們就會進行解綁操做。一樣調用SDK:

 

Boolean isSuccess = OpenApi.unbindDevice(wechatOpenId, gizwitsAppId, gizwitsDid);

參數名 屬性 說明
WechatOpenId String 微信中的OpenId,也就是機智雲中註冊的匿名用戶
gizwitsAppId String 機智雲產品所綁定的APP的id

獲知設備的在線狀態

 

Boolean isOnline = OpenApi.getDeviceOnlineStatus(wechatOpenId, gizwitsAppId, gizwitsDid);

參數名 屬性 說明
wechatOpenId String 微信中的OpenId,也就是機智雲中註冊的匿名用戶
gizwitsAppId String 機智雲產品所綁定的APP的id
gizwitsDid String 機智雲中的設備ID,對應Mac,設備重置時會從新註冊

代碼樣例

Alt text

請注意,在服務器部署的時候,部分開發者會發現部署失敗。tomcat中的catalina日誌會報錯:

 

javax.net.ssl.SSLException:java.security.ProviderException:java.security.KeyException

這是由於SDK中採用了Https的方式進行訪問。

解決方法是:升級服務器環境中的庫:nss。

微信頁面操做設備

好了,咱們如今已經綁定了設備,而且也能知道設備的在線的狀態了。可是具體如何操做咱們的設備?一個良好的體驗,固然是具備交互頁面的。
下面咱們就一步步的搭建一個交互頁面,來監控咱們的設備吧!

獲取OpenId

用戶點擊頁面,咱們如何知道是哪一個用戶呢?咱們須要獲取當前用戶的OpenId來識別時哪一個用戶。如何獲取呢?詳細能夠看微信的官方文檔。

簡單的來講,咱們向微信的服務器發送受權請求,微信會判斷咱們請求的URL,是不是受權的域名,若是驗證經過,就會轉發到咱們的URL,而且帶上幾個參數。

其中最重要的參數,是code,咱們經過Code能夠獲取OpenId。而後,咱們再將OpenId返回到頁面中。

Alt text

鏈接機智雲的WebSocket

對於訪問機智雲的WebSocket,咱們已經封裝成了一個JS-SDK。你們只須要引入到頁面便可。

初始化gizwits服務

首先是,構建一個gizwits服務:

Alt text

這個gizwits服務,會負責接下來全部的操做,包括:鏈接設備,讀取設備的數據點,操做設備等。

參數名 屬性 說明
ApiHost String websocket的目標API域名
CommType String 協議格式:custom(自定義協議); attrs_v4(標準數據點協議)
wechatOpenId String 當前訪問的微信用戶OpenId
GizwitsAppId String 機智雲產品所綁定的APP的id

固然,此時gizwits服務,並無運行起來,咱們還須要初始化操做。但在操做以前,咱們能夠選擇配置一個回調函數,它會在初始化結束後,自動運行。

Alt text

當執行gizwits.init()的時候,就會初始化gizwits服務,而且將匿名用戶OpenId綁定的全部設備,放置在回調函數的devices中。

而咱們要作的操做,都應該寫在回調函數gizwits.onInit裏面。

devices列表中的每一個設備,都會有六個屬性,分別是product_key(產品的Key), dev_alias(設備別名),did(設備ID),mac,is_online(在線狀態), remark(設備備註)。咱們能夠根據狀況來使用。

設備列表

Alt text

上面的操做中,咱們已經獲取到了設備列表。通常來講,客戶可能擁有多個設備,所以,咱們在這一步,就能夠羅列一個設備列表,由用戶本身決定,來操做哪臺設備。

鏈接設備

想要操做具體哪臺設備,咱們就去鏈接哪臺設備:gizwits.connect(did)。固然鏈接成功後,也有一個回調函數:gizwits.onConnected。此回調函數沒有傳入值。

注意,鏈接設備以前,必須先初始化。

初始化和鏈接設備,並不是同步操做,所以,若是隻是簡單的前後執行,可能會出錯。所以,建議能夠將鏈接設備的操做,放在初始化的回調函數中,保證執行的前後關係。

鏈接成功後,咱們就能夠收到設備上報的數據了。上報的數據經過回調函數:gizwits.onReceivedAttrs。該回調函數會有一個回調值(參數),這個回調值的格式以下:

Alt text

上面的操做中,咱們已經獲取到了設備列表。通常來講,客戶可能擁有多個設備,所以,咱們在這一步,就能夠羅列一個設備列表,由用戶本身決定,來操做哪臺設備。

鏈接設備

想要操做具體哪臺設備,咱們就去鏈接哪臺設備:gizwits.connect(did)。固然鏈接成功後,也有一個回調函數:gizwits.onConnected。此回調函數沒有傳入值。

注意,鏈接設備以前,必須先初始化。

初始化和鏈接設備,並不是同步操做,所以,若是隻是簡單的前後執行,可能會出錯。所以,建議能夠將鏈接設備的操做,放在初始化的回調函數中,保證執行的前後關係。

鏈接成功後,咱們就能夠收到設備上報的數據了。上報的數據經過回調函數:gizwits.onReceivedAttrs。該回調函數會有一個回調值(參數),這個回調值的格式以下:

Alt text

手動讀取:設備數據點

獲取設備的數據點,也很簡單,只需調用gizwits.read()方法,不須要任何參數。調用此方法,能夠立刻獲取一次,一樣,數據也是經過回調函數 gizwits.onReceivedAttrs,或者gizwits.onReceivedRaw來獲取。

鏈接錯誤

當websocket鏈接錯誤時,會調用gizwits.onError函數,若有須要,能夠重寫該函數;回調值是錯誤信息:

 

gizwits.onError = function(value){

console.log("error!!!!:::::", value.toString());

}

設備上下線

當設備發生上線,或者下線的事件時,gizwits服務,會調用gizwits.onOnlineStatusChanged 回調函數.

回調值有兩個參數:did和在線狀態(is_online)。

 

gizwits.onOnlineStatusChanged = function(value) {

alert("設備上下線通知,did=", value.did);

alert("設備上下線通知,is_online=", value.is_online);

}

控制設備

最後是,設備的遠程控制。

遠程控制的調用方法,若是commType=custom,則使用gizwitsws.send(command)方法,若是commType=attrs_v4,則使用gizwitsws.write(command)方法。

遠程控制的值,若是commType=custom,請輸入p0,例如[,,…];若是commType=attrs_v4,請輸入datapoints,例如{「power」:true}。

下面是遠程控制RBG燈的代碼樣例:

 

var command = '{"LED_R": 0, "LED_G": 0, "LED_B": 0}';

gizwits.write(did, JSON.parse(command));

固然,使用控制設備的前提是,咱們已經鏈接上了一臺設備。

結語

至此,咱們已經實現了微信接入的核心部分。在此教程中,Java-SDK與js-SDK爲咱們帶來了很大的,咱們幾乎不用關心如何調用機智雲的API和websocket,而是直接調用SDK的方法就能夠了。

最後,但願你們能多多反饋意見,爲更加便捷的開發貢獻一份力量。

相關文章
相關標籤/搜索