1. 程式人生 > >IoT-阿里雲物接入套件

IoT-阿里雲物接入套件

IoT Hub

IoT Hub幫助裝置連線阿里雲IoT服務,IoT Hub支援PUB/SUB與RRPC兩種通訊方式,其中PUB/SUB是基於Topic進行的訊息路由。IoT Hub具有以下特點:

  • 高效能擴充套件:支援線性動態擴充套件,可以支撐十億裝置同時連線
  • 全鏈路加密:整個通訊鏈路以RSA,AES加密,保證資料傳輸安全
  • 訊息實時到達:當裝置與IoT Hub成功建立資料通道後,兩者間將保持長連線,以減少握手時間,保證訊息實時達到
  • 支援資料透傳:IoT Hub支援將資料以二進位制透傳的方式傳到自己伺服器上,不儲存裝置資料,從而保證資料的安全可控性
  • 支援多種通訊協議:IoT Hub支援RRPC和PUB/SUB兩種通訊模式
  • 支援多種裝置接入協議:支援裝置使用CoAP、MQTT、HTTPS協議接入物聯網平臺

阿里雲物接入,IoT服務建立

接下來介紹以下阿里雲物聯網套件接入情況,首先要開通物聯網套件服務,阿里雲的物聯網套件的收費情況和百度天工類似,都是以流量(訊息條數進行收費的),並且每月百萬條內的訊息都是免費,因此研究成本很低,只要花時間即可。
第一步,建立產品,阿里雲的產品泛指一批具有相同功能的裝置,建立產品是為了批量管理裝置。建立產品分基礎版和高階版,高階版有更多的功能,可以考慮直接建立高階版。節點型別分裝置和閘道器,裝置表示下面掛載的是裝置,閘道器則掛載的是閘道器,閘道器下面可以繼續掛載裝置,閘道器相當於多了一個分組。


第二步,給產品新增Topic,阿里雲預設給了三個Topic,當然我們也可以定義自己的Topic類,在產品檢視頁面,選擇訊息通訊,就可以定義Topic類了。定義Topic時,和百度天工定義策略一樣,也需要指定許可權,這裡也是有兩種:釋出、訂閱

第三步,建立裝置,建立時首選要選擇一個產品,裝置是掛在產品下面的。然後就可以建立裝置了,裝置建立成功後,介面會彈出一個三元組資料提示:ProductKey(建立產品時生成)、DeviceName(建立裝置時填寫)、DeviceSecret(裝置建立成功後生成,可以在裝置中修改),在MQTT的客戶端端,我們進行裝置接入時,需要通過這個三元組進行認證。

終端裝置物接入

阿里雲的IoT接入可以自己使用MQTT協議自己實現,也可以使用阿里雲提供的SDK包,目前阿里雲支援SDK的版本有:Java、Python、PHP和.Net,其實SDK裡面也是對標準MQTT協議的封裝而已。

假如自己實現,maven依賴:

<dependency>
   <groupId>org.eclipse.paho</groupId>
   <artifactId>org.eclipse.paho.client.mqttv3</artifactId>
   <version>1.1.0</version>
</dependency>
<dependency>
   <groupId>com.alibaba</groupId>
   <artifactId>fastjson</artifactId>
   <version>1.2.28</version>
</dependency>

簡單客戶端連線IoT實現:

/**
 * aliyun.com Inc.
 * Copyright (c) 2004-2017 All Rights Reserved.
 */
package com.aliyun.iot.demo.iothub;

import java.net.InetAddress;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.ThreadPoolExecutor.CallerRunsPolicy;
import java.util.concurrent.TimeUnit;

import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;

import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
import org.eclipse.paho.client.mqttv3.IMqttMessageListener;
import org.eclipse.paho.client.mqttv3.MqttCallback;
import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;

import com.aliyun.iot.util.LogUtil;
import com.aliyun.iot.util.SignUtil;

/**
 * IoT套件JAVA版裝置接入demo
 */
public class SimpleClient4IOT {

   /******這裡是客戶端需要的引數即前面說的三元組*******/
    public static String deviceName = "thing001";
    public static String productKey = "b1s2DQ7udsJ";
    public static String secret = "C9LncnlHEYAErdxM0GnubaOURApmrRDle";

    //用於測試的topic
    private static String subTopic = "/" + productKey + "/" + deviceName + "/get";
    private static String pubTopic = "/" + productKey + "/" + deviceName + "/update";

    public static void main(String... strings) throws Exception {
        //客戶端裝置自己的一個標記,建議是MAC或SN,不能為空,32字元內
        String clientId = InetAddress.getLocalHost().getHostAddress();

        //裝置認證
        Map<String, String> params = new HashMap<String, String>();
        params.put("productKey", productKey); //這個是對應使用者在控制檯註冊的 裝置productkey
        params.put("deviceName", deviceName); //這個是對應使用者在控制檯註冊的 裝置name
        params.put("clientId", clientId);
        String t = System.currentTimeMillis() + "";
        params.put("timestamp", t);

        //MQTT伺服器地址,TLS連線使用ssl開頭
        String targetServer = "ssl://" + productKey + ".iot-as-mqtt.cn-shanghai.aliyuncs.com:1883";

        //客戶端ID格式,兩個||之間的內容為裝置端自定義的標記,字元範圍[0-9][a-z][A-Z]
        String mqttclientId = clientId + "|securemode=2,signmethod=hmacsha1,timestamp=" + t + "|";
        String mqttUsername = deviceName + "&" + productKey; //mqtt使用者名稱格式
        String mqttPassword = SignUtil.sign(params, secret, "hmacsha1"); //簽名

        System.err.println("mqttclientId=" + mqttclientId);

        connectMqtt(targetServer, mqttclientId, mqttUsername, mqttPassword, deviceName);
    }

    public static void connectMqtt(String url, String clientId, String mqttUsername,
                                   String mqttPassword, final String deviceName) throws Exception {
        MemoryPersistence persistence = new MemoryPersistence();
        SSLSocketFactory socketFactory = createSSLSocket();
        final MqttClient sampleClient = new MqttClient(url, clientId, persistence);
        MqttConnectOptions connOpts = new MqttConnectOptions();
        connOpts.setMqttVersion(4); // MQTT 3.1.1
        connOpts.setSocketFactory(socketFactory);

        //設定是否自動重連
        connOpts.setAutomaticReconnect(true);

        //如果是true,那麼清理所有離線訊息,即QoS1或者2的所有未接收內容
        connOpts.setCleanSession(false);

        connOpts.setUserName(mqttUsername);
        connOpts.setPassword(mqttPassword.toCharArray());
        connOpts.setKeepAliveInterval(65);

        LogUtil.print(clientId + "進行連線, 目的地: " + url);
        sampleClient.connect(connOpts);

        sampleClient.setCallback(new MqttCallback() {
            @Override
            public void connectionLost(Throwable cause) {
                LogUtil.print("連線失敗,原因:" + cause);
                cause.printStackTrace();
            }

            @Override
            public void messageArrived(String topic, MqttMessage message) throws Exception {
                LogUtil.print("接收到訊息,來至Topic [" + topic + "] , 內容是:["
                    + new String(message.getPayload(), "UTF-8") + "],  ");
            }

            @Override
            public void deliveryComplete(IMqttDeliveryToken token) {
                //如果是QoS0的訊息,token.resp是沒有回覆的
                LogUtil.print("訊息傳送成功! " + ((token == null || token.getResponse() == null) ? "null"
                    : token.getResponse().getKey()));
            }
        });
        LogUtil.print("連線成功:---");

        //這裡測試傳送一條訊息
        String content = "{'content':'msg from :" + clientId + "," + System.currentTimeMillis() + "'}";

        MqttMessage message = new MqttMessage(content.getBytes("utf-8"));
        message.setQos(0);
        //System.out.println(System.currentTimeMillis() + "訊息釋出:---");
        sampleClient.publish(pubTopic, message);

        //一次訂閱永久生效 
        //這個是第一種訂閱topic方式,回撥到統一的callback
        sampleClient.subscribe(subTopic);

        //這個是第二種訂閱方式, 訂閱某個topic,有獨立的callback
        //sampleClient.subscribe(subTopic, new IMqttMessageListener() {
        //    @Override
        //    public void messageArrived(String topic, MqttMessage message) throws Exception {
        //
        //        LogUtil.print("收到訊息:" + message + ",topic=" + topic);
        //    }
        //});

        //回覆RRPC響應
        final ExecutorService executorService = new ThreadPoolExecutor(2,
            4, 600, TimeUnit.SECONDS,
            new ArrayBlockingQueue<Runnable>(100), new CallerRunsPolicy());

        String reqTopic = "/sys/" + productKey + "/" + deviceName + "/rrpc/request/+";
        sampleClient.subscribe(reqTopic, new IMqttMessageListener() {
            @Override
            public void messageArrived(String topic, MqttMessage message) throws Exception {
                LogUtil.print("收到請求:" + message + ", topic=" + topic);
                String messageId = topic.substring(topic.lastIndexOf('/') + 1);
                final String respTopic = "/sys/" + productKey + "/" + deviceName + "/rrpc/response/" + messageId;
                String content = "hello world";
                final MqttMessage response = new MqttMessage(content.getBytes());
                response.setQos(0); //RRPC只支援QoS0
                //不能在回撥執行緒中呼叫publish,會阻塞執行緒,所以使用執行緒池
                executorService.submit(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            sampleClient.publish(respTopic, response);
                            LogUtil.print("回覆響應成功,topic=" + respTopic);
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                });
            }
        });
    }

    private static SSLSocketFactory createSSLSocket() throws Exception {
        SSLContext context = SSLContext.getInstance("TLSV1.2");
        context.init(null, new TrustManager[] {new ALiyunIotX509TrustManager()}, null);
        SSLSocketFactory socketFactory = context.getSocketFactory();
        return socketFactory;
    }
}

相關推薦

IoT-阿里接入

IoT HubIoT Hub幫助裝置連線阿里雲IoT服務,IoT Hub支援PUB/SUB與RRPC兩種通訊方式,其中PUB/SUB是基於Topic進行的訊息路由。IoT Hub具有以下特點:高效能擴充套件:支援線性動態擴充套件,可以支撐十億裝置同時連線全鏈路加密:整個通訊鏈

國內聯網平臺(2)——阿里聯網

                     國內物聯網平臺(2)——阿里雲物聯網套件  作者:馬智 架構 資料通道 為裝置和物聯網應用程式提供釋出和接收訊息的安

樂鑫ESP8266EX連線阿里聯網指南

一、軟硬體準備 windows 環境用來編譯&燒寫&執行等操作的必須環境。ESP8266 裝置 二、阿里雲物聯網套件 根據阿里官方文件,在阿里雲平臺建立產品,建立裝置,同時自動產生 product key, device name, device secr

AT指令連線阿里聯網

    在《勱領M0M1系列WIFI模組——AT指令進行MQTT協議通訊》一文中,我們已經實現了連線標準MQTT伺服器的功能。而阿里雲物聯網套件與標準MQTT的伺服器的區別在於,登入方式的安全的認證方式更復雜,而通訊方式是完成相同的。所以通過我們反覆對的AT指令的優化,目前使

ESP8266連線阿里聯網(一)

一、SDK準備 ├── bin // 存放編譯後生成的檔案 ├── esp8266-rtos-sdk // esp8266 rtos 核

國內聯網平臺初探(二) ——阿裏聯網

black pps 協議方法 size 20px 安全認證 合法性 時間 payload 架構 數據通道 為設備和物聯網應用程序提供發布和接收消息的安全通道。數據通道目前支持CCP協議和MQTT協議。 用戶可以基於CCP協議實現Pub/Sub異步通信,也可以使用遠程調

阿里接入mqtt的python版本

一、參考 您可以使用我們的DEMO進行快速移植,如果不用我們DEMO,完全使用開源MQTT包自主接入(若使用第三方程式碼, 阿里雲不提供技術支援),可以參考以下流程: 如果使用TLS,需要 下載根證書 使用MQTT客戶端連線伺服器,如果您自主接入可以使用開源MQTT

使用 Python3 接入阿里聯網平臺(原物聯網

阿里雲官方提供的 DEMO,無Python接入 阿里雲物聯網平臺(原物聯網套件) 的例子,不便於我們在電腦端做虛擬終端的相關測試,本文介紹一種基於使用Python3、MQTT-TCP連線通訊 接入阿里雲物聯網平臺(原物聯網套件)。 開發語言:Python3.5 開發環境:

阿里聯網三維視覺化(ThingJS)使用初體驗

本文主要的目標是使用阿里雲的雲產品 - 物聯網套件三維視覺化 開始 準備工作 進入下載頁面下載頁面,點選“模型編輯器下載” 安裝模型編輯器下載 安裝完畢,啟動模型編輯器下載,啟動後介面如下所示 選擇新建場景,開啟場景自建 建立模型 基礎操作

十分鐘接入阿里聯網平臺

物聯網平臺是阿里雲針對物聯網領域開發人員推出的一款裝置管理平臺。高效能IoT Hub實現裝置與雲端穩定通訊,全球多節點部署有效降低通訊延時,多重防護能力保障裝置雲端安全。此外,物聯網平臺還提供豐富的裝置管理功能、穩定可靠的資料儲存能力,以及規則引擎。使用規則引擎,您僅需在Web上配置簡單規則,即可將

阿里聯網平,Android臺接入問題(couldn't find "libcoap.so")

FATAL EXCEPTION: main Process: com.houkew.projection, PID: 25826

手機秒變IoT裝置?——巧妙利用阿里聯網平臺

作者序 什麼?嵌入五行程式碼可以實現使用者定位,使用者線上數量統計,還能和雲端訊息互動! 沒錯得益於阿里雲物聯網套件建立裝置免費,訊息收費也只有百萬訊息三塊六(先使用後付費,不滿不要錢),尤其對於學生黨來說,基本是用不了這麼多,也就意味著免費!(學生黨福音[手動滑稽]) Talk is cheap

百度開放接入IoT--Java客戶端

給出一個百度雲開放平臺的Java客戶端示例程式碼,進行了一點點修改 以上一篇寫的文章中的websocket客戶端為釋出者。訂閱者我們用百度的示例Java程式 訂閱者的客戶端程式碼如下: pac

阿里IoT+YF3300】15.阿里聯網小程式構建

       2013年8月,“輕應用”概念提出,但是僅僅活躍四年隨後淡出 ,直到2017年1月9號藉助微信小程式成功續命。一時間,以微信小程式和支付寶小程式為代表的輕應用解決方案迅速貫穿多個環節,成為“萬物互聯”的雛形載

基於阿里聯網平臺實現的簡易出入監控

本文通過一個簡單例項,主要介紹瞭如何使用樹莓派快速接入阿里雲iot platform,並實現了一個簡易的監控人員出入並拍照上送釘釘群的場景 場景 在公司大門入口處布點樹莓派和紅外感應,實現出入口人員出入時,自動拍照並上送釘釘群機器人 準備 物料準備 樹莓派 HC-SR501 人體紅外

基於阿里聯網平臺,我們這樣實現簡易出入監控

本文通過一個簡單例項,主要介紹瞭如何使用樹莓派快速接入阿里雲iot platform,並實現了一個簡易的監控人員出入並拍照上送釘釘群的場景 場景 在公司大門入口處布點樹莓派和紅外感應,實現出入口人員出入時,自動拍照並上送釘釘群機器人 準備 物料準備

阿里聯網平臺體驗(樹莓派+Python篇)

阿里雲物聯網平臺體驗(樹莓派+Python篇) 雖然對阿里雲物聯網平臺比較熟悉了,從一開始就有幸參與了飛鳳平臺(Link Develop 一站式開發平臺的前身)的一些偏硬體接入的工作。但是同時也見證了阿里雲物聯網團隊從幾十人到數百人的迅速擴張,其物聯網平臺所承載的內容也急速膨脹,物聯網開發套件基礎版、飛鳳、

阿里聯網邊緣計算載入MQTT驅動

寫在前面     本文在LinkEdge快速入門樣例驅動的基礎上,載入了MQTT訂閱的客戶端,使得邊緣端容器可以通過MQTT獲得外部資料。 1. 系統需求 物聯網邊緣計算平臺,又名Link IoT Edge[1]。在物聯網邊緣計算幫助文件中的 

阿里聯網平臺專題講座

物聯網平臺是阿里雲面向物聯網領域開發人員推出的裝置管理平臺,旨在幫助開發者搭建資料通道,方便終端(如感測器、執行器、嵌入式裝置、智慧家電等)和雲端進行雙向通訊。 傳統企業基於物聯網進行業務創新,通過運營裝置資料來實現效益的提升。這樣的做法基本上已經是行業的共識,大勢所趨。但是企業的物聯網轉型或者

走進阿里聯網

阿里雲IoT,致力於實現萬物互聯的美好世界,為生態合作伙伴提供基於雲邊端一體化、人工智慧、安全的物聯網基礎平臺和內容服務能力平臺,通過該平臺高效連線、管理裝置的同時,開放的能力使生態合作伙伴更高效、低成本地構建各種創新的物聯網應用場景。 阿里雲IoT推出的Link Platform、Link E