本次實驗的目的是將樹莓派設置爲一個物聯網終端,經過微信小程序能夠控制樹莓派,實現蜂鳴器的開關。html
微信小程序界面以下所示,點擊這個開關,就能夠控制蜂鳴器。java
項目地址:https://github.com/xiaohuiduan/IotForTecentBeepandroid
在這裏我將樹莓派接的是GPIO_00
,使用的樹莓派是樹莓派4B版本。不一樣的樹莓派的GPIO接口可能不一樣,能夠根據本身的須要按狀況考慮。git
實物圖以下所示,VCC——3.3V ,GND ——GND,IO——GPIO_00(低電平觸發)github
編程語言使用的是Java,也就是說將使用Java實現騰訊雲IOT平臺的鏈接和樹莓派GPIO口的控制。使用的IDE是IntelliJ IDEA
。apache
Tecent IOT開發平臺的官方參考文檔網址:https://cloud.tencent.com/document/product/1081,不過我的以爲其文檔對於Java SDK的描述不夠詳細,建議去看其 Demo 源碼才能明白其工做流程。編程
騰訊雲IOT開發平臺的項目結構以下所示:分爲兩層——項目
和 產品
。在使用其平臺的時候,既須要建立project,也須要建立product。json
咱們能夠將項目理解爲智能家居整個系統,所以在項目中有不少產品,好比說智能空調,智能報警器等等產品。而在空調中有溫度、溼度等屬性,同時也有着開關等控制器。小程序
而在這篇博客中,項目名稱是物聯網實訓,產品名爲樹莓派,可是樹莓派只有一個功能——控制蜂鳴器。也就是說,沒有屬性,只有控制器。windows
打開網址:https://console.cloud.tencent.com/iotexplorer新建項目,項目名稱隨意就行,建立好項目後,進入項目,而後建立產品。
建立產品的選項以下:
物聯網設備,之因此叫物聯網,是由於你們想把傳感器得到的數據放在雲端,或者經過雲端去控制物聯網設備。那麼放什麼數據,控制什麼功能,則須要咱們去定義。這裏選擇控制樹莓派上面的蜂鳴器,所以只須要定義蜂鳴器便可。
在騰訊IOT中,可使用新建功能
定義這些功能。選擇屬性,數據類型選擇布爾型(由於只有控制蜂鳴器的開/關)。請記住這個標識符beep_switch
,這個將在後面的代碼中用到。
關於功能類型的不一樣,能夠參考下面的表格。(不過在我的看來,在他的官方 Demo 中,不管是物聯設備的數據(好比說溫度溼度),仍是物聯網的控制(好比說燈的開關),它都定義成爲了屬性。也就是說,儘管 蜂鳴器的開關 是人爲下發的控制,可是仍是定義爲屬性。至於事件和行爲有什麼做用,我也不清楚……)
如下來自官方文檔
功能元素 功能描述 功能標識符 屬性 用於描述設備的實時狀態,支持讀取和設置,如模式、亮度、開關等。 PropertiesId 事件 用於描述設備運行時的事件,包括告警、信息和故障等三種事件類型,可添加多個輸出參數,如環境傳感器檢測到空氣質量不好,空調異常告警等。 EventId 行爲 用於描述複雜的業務邏輯,可添加多個調用參數和返回參數,用於讓設備執行某項特定的任務,例如,開鎖動做須要知道是哪一個用戶在什麼時間開鎖,鎖的狀態如何等。 ActionId
點擊下一步,進入設備開發。
由於這裏使用的是Java SDK進行開發,沒有使用模組也沒有基於OS開發,所以直接點擊下一步。
點擊下一步就到了微信小程序配置。
騰訊IOT平臺相比較於其餘平臺,有一個很大的特色就是能夠很好的支持小程序。也就是說,在開發的階段,就可使用小程序去驗證設備的功能。而且這個微信小程序不須要本身寫樣式代碼,只須要進行簡單的配置,就能夠直接從小程序上面看到物聯網設備的數據。
由於這裏咱們使用的數據很簡單,只有開關,因此隨便配置一下面板便可。
這裏面板類型選擇標準面板,簡單的配置一下開關便可,效果圖如右圖所示。
保存退出以後,就進入到新建設備功能頁面。
新建設備`的意義:建立一個設備表明啓動了一個帳號(這個設備會提供一個密鑰),咱們的設備使用這個密鑰,就可讓咱們的設備鏈接騰訊雲IOT平臺進行數據交互。
從現實意義來講,就是我手中有一個樹莓派,我須要讓它鏈接騰訊雲IOT平臺,就須要帳號密碼,因此就須要建立一個設備。
新建設備的步驟以下所示:
點擊 my_pi ,進入設備管理。
設備管理界面以下所示:
設備信息:這裏面是設備的一些基本屬性,其中經過設備名稱
,設備密鑰
,和產品ID
就能夠惟必定位一個設備
,而後對其進行操做。
設備日誌:設備日誌裏面保存着設備的上行和下行數據。
在線調試:經過在線調試,能夠模擬設備的行爲,或者對設備下發控制命令。
可使用在線的調試功能對物聯網設備進行功能下發。(好比說下發開關數據,控制蜂鳴器的開關)
能夠在設備中看到物聯網設備與雲平臺之間的上行和下行數據。
🆗,以上的全部就是騰訊IOT平臺的介紹,經過上面的操做,就能夠建立一個設備,得到其name,key,id,而後對其進行開發。
針對於樹莓派開發,相信你們聽過最多的都是Python開發,使用Python去控制樹莓派的GPIO口,可是,由於騰訊提供的平臺沒有Python的SDK,所以,只能選擇Java去控制樹莓派的GPIO口。
Pi4j是一個專門用來控制樹莓派GPIO口的設備。關於使用安裝能夠去看樹莓派---JAVA操做GPIO(不過基本上比較新的樹莓派系統都不須要安裝了)。
由於咱們是在Windows平臺開發而後在樹莓派上面運行Java程序(打包成jar運行),所以須要在樹莓派上面安裝Java環境(不過通常來講樹莓派都自帶了Java環境)。
使用IDEA建立maven項目。
經過上述操做就建立一個Java maven項目。
而後配置maven文件,也就是pom.xml
,在其中導入依賴庫,以及進行配置。
具體配置以下:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <build> <plugins> <plugin> <artifactId>maven-assembly-plugin</artifactId> <configuration> <appendAssemblyId>false</appendAssemblyId> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <archive> <manifest> <!--注意,此處必須是main()方法對應類的完整路徑 --> <mainClass>Main</mainClass> </manifest> </archive> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>assembly</goal> </goals> </execution> </executions> </plugin> </plugins> </build> <!-- 生成的包名--> <groupId>org.example</groupId> <artifactId>IotForTecentBeep</artifactId> <version>1.0-SNAPSHOT</version> <!-- 添加依賴庫--> <dependencies> <!-- 騰訊IOT庫--> <dependency> <groupId>com.tencent.iot.explorer</groupId> <artifactId>explorer-device-java</artifactId> <version>1.0.0</version> </dependency> <!-- 樹莓派GPIO 庫--> <dependency> <groupId>com.pi4j</groupId> <artifactId>pi4j-core</artifactId> <version>1.2</version> </dependency> </dependencies> </project>
在項目的目錄下面添加data.json文件。
data.json須要存放一些數據。這個數據實際上就是自定義功能的json數據,從頁面複製以後粘貼到data.json文件中便可。
使用Java編寫代碼,具體的解釋能夠看代碼中間的註釋。不過要注意,須要根據本身的設備狀況更改以下的信息。
同時,在這個地方須要根據本身的狀況修改。(儘管在雲平臺中定義的是布爾型數據,可是實際上騰訊雲發送過來的是int類型數據。)
在代碼中要注意,必須先訂閱(也就是執行subscribeTopic
函數),纔可以進行接收到平臺發送過來的數據。
import com.pi4j.io.gpio.*; import com.tencent.iot.explorer.device.java.common.Status; import com.tencent.iot.explorer.device.java.data_template.TXDataTemplateDownStreamCallBack; import com.tencent.iot.explorer.device.java.mqtt.TXMqttActionCallBack; import com.tencent.iot.explorer.device.java.server.samples.data_template.DataTemplateSample; import org.eclipse.paho.client.mqttv3.IMqttToken; import org.eclipse.paho.client.mqttv3.MqttMessage; import org.json.JSONObject; /** * @author XiaoHui */ public class Main { /** * IOT平臺URL */ public static String mBrokerURL = "ssl://iotcloud-mqtt.gz.tencentdevices.com:8883"; /** * 產品ID */ public static String mProductID = "64ONICJ3N8"; /** * 設備名稱 */ public static String mDevName = "my_pi"; /** * 設備密鑰 */ public static String mDevPSK = "1ktYq8uojYiuJgX7iZxAoQ=="; /** * 儲存屬性的json文件名 */ public static String mJsonFileName = "data.json"; private static DataTemplateSample mDataTemplateSample; /** * 得到GPIO的控制器 */ public static final GpioController gpio = GpioFactory.getInstance(); /** * GPIO輸出,使用GPIO_00 ,默認輸出爲High */ public static final GpioPinDigitalOutput beep = gpio.provisionDigitalOutputPin(RaspiPin.GPIO_00, "beep", PinState.HIGH); public static void main(String[] args) { // CallBack 表明的是MQTT協議的回調函數,MyDownCallback表明的是IOT平臺下發消息的回調 mDataTemplateSample = new DataTemplateSample(mBrokerURL, mProductID, mDevName, mDevPSK, null, null, new CallBack(), mJsonFileName, new MyDownCallback()); // 進行鏈接 mDataTemplateSample.connect(); // 進行訂閱,只有訂閱後,消息才能下發。 mDataTemplateSample.subscribeTopic(); mDataTemplateSample.propertyClearControl(); } /** * MQTT的回調函數,能夠不用管 */ public static class CallBack extends TXMqttActionCallBack { @Override public void onConnectCompleted(Status status, boolean reconnect, Object userContext, String msg) { } @Override public void onConnectionLost(Throwable cause) { } @Override public void onDisconnectCompleted(Status status, Object userContext, String msg) { } @Override public void onPublishCompleted(Status status, IMqttToken token, Object userContext, String errMsg) { } @Override public void onSubscribeCompleted(Status status, IMqttToken asyncActionToken, Object userContext, String errMsg) { } @Override public void onMessageReceived(final String topic, final MqttMessage message) { } } /** * 實現下行消息處理的回調接口 */ private static class MyDownCallback extends TXDataTemplateDownStreamCallBack { @Override public void onReplyCallBack(String msg) { } @Override public void onGetStatusReplyCallBack(JSONObject data) { } /** * 在微信小程序點擊關閉按鈕後,IOT平臺會向樹莓派發送命令消息,此命令消息會在這這裏進行回調 * beep是低電平觸發!!!!!!!!!!!! * * @param msg 接收到的消息。 * @return */ @Override public JSONObject onControlCallBack(JSONObject msg) { // 得到開關的數據,beep_switch是開關的標識符。儘管咱們在雲平臺中定義的是布爾型數據,可是實際上騰訊雲發送過來的是int類型數據。 int power = msg.getInt("beep_switch"); // 打開開關 if (power == 1) { beep.low(); System.out.println("打開"); } else { // 關閉蜂鳴器 beep.high(); System.out.println("關閉"); } // 返回消息 JSONObject result = new JSONObject(); result.put("code", 0); result.put("status", "ok"); return result; } @Override public JSONObject onActionCallBack(String actionId, JSONObject params) { return null; } } }
由於咱們的代碼是在windows上面編譯的,所以須要將其編譯成jar文件,這個也就是以前配置pom.xml
文件的緣由。IDEA上面編譯仍是挺簡單的,以下圖所示:
通過如上的操做咱們就將項目編譯成了jar包,jar包在target目錄下。
將編譯好的jar文件放到樹莓派中,使用VNC或者XShell皆可。而後在jar包文件目錄下使用以下命令:
java -jar 包名
這次項目生成的包名爲IotForTecentBeep-1.0-SNAPSHOT.jar
,所以命令以下所示:
當程序運行起來的時候,就能夠在微信小程序或者在線調試工具中對蜂鳴器進行控制。
前面說了,能夠是用微信小程序對開發的物聯網設備進行開發調試,而後在以下的頁面獲得設備的二維碼。
而後打開」騰訊連連「小程序,對二維碼進行掃描,便可將設備加入。
點擊中間的按鈕就能夠實現對蜂鳴器的控制了!!!
相比較於上一篇騰訊IOT安卓開發初探,這一次實現消息的下發接收控制。不過有一說一,官方文檔是真的坑,連一個比較詳細的說明文檔都沒有,還得本身一個一個Debug,查看爲何消息發送失敗,查看爲何沒有接收到下發的消息……
GitHub:https://github.com/xiaohuiduan/IotForTecentBeep