1. 程式人生 > >開放平臺-幫助中心

開放平臺-幫助中心

側邊欄目錄

新手指南

成為開發者

  • G7S使用者,直接通過G7S賬號授權登入

  • 非G7S使用者,進行開發者賬號申請,稽核通過後使用開放平臺賬號登入

  1. 開發者賬號申請
    在開發者賬號申請頁面[連結]完成相關資訊填寫,並提交。
  2. 資質認證
    在我們確定了開發者的身份以後,會將稽核結果傳送到所申請的郵箱,如果稽核通過,郵件會附上您的賬號和密碼。
    第一次登入,及時修改密碼後便可以進入操作介面。

資料申請

  • 進入產品中心,在產品中心檢視需要使用的介面或者相關的推送資料,點選立即申請並提交稽核。然後進入控制檯便可以檢視到稽核的狀態,稽核通過後AccessIDSecret也將在控制檯展示。

  • 您可通過AccessIDSecret獲取您想要的資料,具體使用方法請詳見開發指南的對應模組。

  • AccessIDSecret它們的作用是計算驗證簽名,請妥善保管,不要洩露


開發指南

RestAPI


開發準備

確保已經在產品中心-Rest API下完成了所需API的申請並取得相應的AccessId/SecretKey

SDK下載及文件

為方便開發者除錯和接入開放平臺產品 API,這裡為您介紹開發工具包,讓您快速獲取SDK 並開始呼叫。

適用範圍 語言 下載
openAPI C#/ java / php / python open-sdk

下面以java的sdk舉例進行聯調說明:

  • 首先將SDK工程匯入到IDE中,用匯入maven工程的方式進行即可。
    • 依賴環境

      • JDK版本1.8及以上
      • maven版本3.3.9及以上
    • MyEclipse匯入後的工程結構:
      在這裡插入圖片描述

    • Intellj IDEA匯入後的工程結構:
      在這裡插入圖片描述

    • 程式入口可參照<openapi-sdk-demo-java\src\test\java\com\chinawayltd\altair\demo>目錄下的Demo.java檔案:
      在這裡插入圖片描述

配置引數說明:

	//APP KEY(申請接入碼後給出的AccessID)
    private final static String ACCESS_ID = "02co9r";
    // APP金鑰(申請接入碼後給出的SecretKey)
    private final static String SECRET_KEY = "EZRUPGx1PY99WSYE1GO7eEoXaOAniP14";

    /** API域名(服務訪問的地址)
    *  demo環境為:demo.dsp.chinawayltd.com/altair/rest
    *  生產環境為:openapi.huoyunren.com
    */
    private final static String BaseURL = "demo.dsp.chinawayltd.com/altair/rest";
    //請求path(openAPI文件中給出的業務介面的路徑)
    String path = "/v1/base/truck/history_location";

根據openAPI業務介面的請求型別的不同,如Get和Post,這個在具體的介面文件中有,其介面引數傳遞方式也有所區別。

  • Get請求是將引數組裝到map中,然後設定到request物件中,詳情可參考Demo.java中的程式碼:
//GET請求的query
Map<String, String> querys = new HashMap<>();
querys.put("plate_num", "部A11110");
querys.put("from", "2017-11-25 00:00:00");
querys.put("to", "2017-11-30 00:00:00");
request.setQueries(querys);
  • Post請求需要將請求的引數序列化成Json字串,然後傳遞給業務介面。詳情可參考Demo.java中的postJson方法:
  public void postJson() throws Exception {
        //請求path(openAPI文件中給出的業務介面的路徑)
        String path = "/v1/base/current/full_currents";
        //Body內容(請求引數)
        String body = "{\n" +
                "\"carnum\": \"川A12345\",\n" +
                "\"longitude\": \"104.07134\",\n" +
                "\"latitude\": \"30.54013\"\n" +
                "}";
        System.out.println(body);
        Map<String, String> headers = new HashMap<String, String>();
        headers.put(HttpHeader.HTTP_HEADER_CONTENT_MD5, MessageDigestUtil.base64AndMD5(body));
        //(POST/PUT請求必選)請求Body內容格式
        headers.put(HttpHeader.HTTP_HEADER_CONTENT_TYPE, ContentType.CONTENT_TYPE_JSON);
//        headers.put("d-header1", "header1Value");
//        headers.put("X-G7-Ca-a-header1", "header1Value");
//        headers.put("X-G7-Ca-b-header2", "header2Value");
        headers.put(HttpHeader.HTTP_HEADER_G7_TIMESTAMP, "" + System.currentTimeMillis());


        Request request = new Request(Method.POST_JSON, HttpSchema.HTTP + BaseURL, path, ACCESS_ID, SECRET_KEY, Constants.DEFAULT_TIMEOUT);
        request.setHeaders(headers);
        request.setJsonStrBody(body);

        //呼叫服務端
        Response response = Client.execute(request);
        LOG.info(response.getBody());
    }

常見問題(FAQ)

  • 諮詢問題必看:若檢查到最後仍無法解決問題時,進行諮詢的時候,請將請求的 ACCESS_ID 、SECRET_KEY、PATH以及請求響應返回的結果JSON字串用文字格式發出,請勿截圖。可諮詢張雙建 [email protected] 或陳坤雲 [email protected]
程式報請求超時或讀寫超時?
  1. 首先請檢查下BaseURL是否填寫正確,DEMO環境的為demo.dsp.chinawayltd.com/altair/rest,生產環境的為:openapi.huoyunren.com
  2. 在所在伺服器或主機上PING一下BaseURL中的host,看能否PING通,PING不通的話請找網管處理。
  3. 若能PING通,請檢查下程式中設定的HTTP請求的讀寫超時的相關配置,嘗試配置超時時間多一點(如:10秒鐘)看看
  4. 經過以上操作還不行,可諮詢 張雙建 [email protected] 或 陳坤雲 [email protected]
介面響應資訊報 no permission, api can't access
  1. 先檢查下程式中的ACCESS_ID和SECRET_KEY是否填寫正確。
  2. 檢查呼叫業務介面的PATH是否填寫正確。
  3. 經過以上操作還不行,可諮詢張雙建 [email protected] 或 陳坤雲 [email protected]
介面響應資訊報auth failed:signature error
  • 請嚴格參考demo程式中的程式碼進行簽名操作,閱覽使用者包中OpenAPI系統認證機制文件
介面響應資訊報wrong timestamp
  1. 先確認所在伺服器或主機時間是否是當前標準的北京時間
  2. timestamp時間格式應為毫秒長整型
  3. timestamp引數的值應放置在請求頭的X-G7-OpenAPI-Timestamp引數中

HTTP推送服務

服務接入

概述、使用場景及限制

G7提供的HTTP推送服務,是一種將車輛裝置資料實時傳送給資料使用方的服務。當裝置上傳資料後,推送服務會第一時間感知,在將資料整理打包後,通過HTTP鏈路傳送到訂閱事件資料的客戶,客戶接收資料後可根據自身業務自行處理資料。

HTTP推送服務適用於發生頻率較低的事件,比如進出區域、停留、超速等事件。對於一些發生頻率較高的事件,比如定位,推薦使用MQTT推送服務。接收限制:HTTP推送服務與客戶資料接收服務是緊耦合關聯的,推送服務的吞吐量嚴重依賴接收服務的響應速度,一旦接收服務響應速度過慢,就有可能造成推送服務的執行緒堆積,消耗大量資源無法釋放,最嚴重的情況使推送服務崩潰。所以,接收服務在接收到資料後,必須以最快的速度接收並返回接收結果。資料的業務邏輯處理請放入執行緒池,或者放入kafka中介軟體後再處理。如果接收服務響應速度過慢導致大量推送超時,或者接收服務不可用,為保護推送服務,當單一事件失敗超過20000條時,相關推送服務會自動關閉。關閉後可聯絡管理員重新開啟。

服務接入流程

  1. 申請:見對應資料申請,每個HTTP事件都需要單獨申請。

  2. 提供推送資料接收服務的HTTP回撥地址,推送服務將根據這個地址傳送資料,此時請保證接收服務已開發完成並上線。

推送接收與開發

開發準備

  1. 確保已經在產品中心-推送下完成了所需推送資料的申請並取得相應的AccessId/SecretKey

  2. 確保提供了推送資料接收服務的HTTP回撥地址,推送資料接收服務是一種web應用程式,須提供一個回撥地址,由推送服務將事件資料通過回撥地址傳送到接收服務。

接收服務的HTTP請求規範

接收服務的HTTP請求須滿足如下格式:

method: POST 
content-type: application/json; charset=UTF-8

接收服務HTTP請求的header包含如下資訊:

Authorization: g7ac {Timestamp} {AccessId}:{Signature}
欄位名 描述
Timestamp 時間戳(ms)
AccessId 由使用者申請
Signature 簽名字串,具體演算法見章節3

推送服務推送的事件資料放置在接收服務HTTP請求的body中,具體格式請參考《推送事件》

簽名演算法

Signature = Base64(HMAC_SHA1({SecretKey}, UTF_8_Encoding_Of(StringToSign)));
StringToSign = HTTP-Verb + "\n" + content_MD5 + "\n" + Content-Type + "\n" + Timestamp + "\n" + {回撥uri}

StringToSign相關欄位

欄位 描述
HTTP-Verb HTTP請求的方法,如__GET/POST__
content_MD5 對HTTP請求的body做MD5, 然後結果轉成__小寫__
Content-Type 這裡固定成application/json; charset=UTF-8
回撥uri 資源路徑(注意:不是URL)

Signature相關欄位

欄位 描述
SecretKey 由使用者申請和AccessId配對的secret

簽名演算法示例

引數:

HTTP-Verb = POST
//content即Http請求body部分,返回的事件資料以json的方式存在
content = {"code":null,"msg":null,"event":"rangeEvent","pushTime":1509075000048,"data":{"code":"00893","carnum":"閩ADF518",
"driverName":"","driverno":"","eventid":895172472687300608,"gpsno":"90016335","imei":"107015090016335","intTruckId":null,
"latitude":45.311760757237025,"longitude":130.97304330793787,"media":0,"nextId":0,"oid":"38B4BF2984F17FC77198E3556F5ECE3D48",
"orgcode":"2007XM","pointName":"467A雞西分部","time":1502260718000,"type":2}}

//對content進行md5計算後的結果
content_MD5 = 315ecbaf920e7b98f62cc65fc4bda933
Content-Type = application/json; charset=UTF-8
Timestamp = 1509075000048
回撥地址 = http://localhost:9516/zuul/push/test
回撥uri = /zuul/push/test

//AccessId和SecretKey由G7分配,是對G7對資料訪問許可權的控制方式,請妥善保管,不要洩漏給第三方
AccessId = SR2DUNk
SecretKey = 7abc2fe88c955e067a1a5e913bbac741048ac76a

計算過程:

//StringToSign = HTTP-Verb + "\n" + content_MD5 + "\n" + Content-Type + "\n" + Timestamp + "\n" + {回撥uri}
StringToSign = POST\n315ecbaf920e7b98f62cc65fc4bda933\napplication/json; charset=UTF-8\n1509075000048\n/zuul/push/test

//Signature = Base64(HMAC_SHA1({SecretKey}, UTF_8_Encoding_Of(StringToSign)))
Signature = cFj2cHeLMdxNCUoX/8cIvBWngYw=

//Authorization: g7ac {Timestamp} {AccessId}:{Signature}
Authorization=g7ac 1509075000048 SR2DUNk:cFj2cHeLMdxNCUoX/8cIvBWngYw=

結果:

//計算完成後放入http的head中
Authorization: g7ac 1509075000048 SR2DUNk:cFj2cHeLMdxNCUoX/8cIvBWngYw=

接收服務HTTP請求返回結果格式

返回型別:content-type: application/json; charset=UTF-8

返回值格式:

{
	"code": 0,
	"msg" : "ok"
}
欄位 描述
code 0表示成功,其他數字表示失敗
msg 成功或失敗的描述

:如果推送失敗,則會在兩小時內重試3次


MQTT推送服務

服務接入需知

概述、使用場景及限制

G7提供的MQTT推送服務,是一種將車輛裝置資料實時傳送給資料使用方的服務。 當裝置上傳資料後,推送服務會第一時間感知,在將資料整理打包後,傳送至MQTT伺服器,客戶資料接收服務從MQTT伺服器獲取資料,然後客戶根據自身業務自行處理資料。

MQTT推送服務使用MQTT伺服器將推送服務和接收服務解耦,為高併發高可用提供保障,並支援資料的短暫快取,適用於各種發生頻率的事件。G7優先推薦使用MQTT推送服務。

MQTT協議及伺服器

測試伺服器地址:tcp://123.56.0.101:1993
正式伺服器地址:tcp://openapi.huoyunren.com:1883
以上兩個伺服器都是需要使用者驗證的,且只能接收規定topic的資料。如果需要開發用MQTT伺服器,可以使用EMQ提供的服務叢集q.emqtt.com:1883 ,該叢集沒有任何限制。

  1. 第一次登陸時,MQTT伺服器建立客戶端clientId對應的session,在客戶端訂閱topic後,伺服器傳送當前topic的最新一條資料給客戶端(傳送最新一條的機制由MQTT協議規定)
  2. session的主要作用是管理topic的訪問情況,一個clientId對應一個session。如果客戶端關閉時選擇不清除session,那麼下次以相同clientId登陸後,伺服器將從上次訪問的位置傳送資料;否則,清除了session,伺服器傳送topic的最新一條資料給客戶端
  3. G7的MQTT伺服器session過期時間為3天,過期後客戶端重新連線伺服器,將從最新一條資料開始訪問,未消費的歷史資料在session過期時被伺服器自動清理。如要獲取超過3天的資料,請使用開放平臺訪問歷史資料的相關API
  4. 更多解釋請檢視MQTT規範http://mqtt.org/

服務接入流程

  1. 申請:見資料申請,每個MQTT事件都需要單獨申請。
  2. 每種訂閱事件都對應一個clientId和topic,應用儲存後系統生成,接收服務連線MQTT伺服器時使用。
    接收服務中會使用accessId和secret,它們的作用是連線MQTT伺服器時的許可權驗證,請妥善保管,不要洩露

推送接收與開發

開發準備

  1. 確保已經在產品中心-推送下完成了所需推送資料的申請並取得相應的AccessId/SecretKeyAccessId/SecretKey對應於連線MQTT伺服器時要求的user/password,在接收程式中會使用到。

  2. 平臺將為每一種事件訂閱生成一個topic和clientId,在接收服務中會使用到。支援的事件和事件的資料結構請檢視《推送事件》

接收服務開發

推送資料接收程式是一種包含MQTT客戶端的應用程式,對開發語言沒有限制,只要支援MQTT協議即可。 目前接受程式只能訂閱MQTT伺服器資料,不能向MQTT伺服器傳送資料。 下面使用java的開源MQTT客戶端paho對資料接收程式進行說明(程式碼中的accessId/secretKey/clientId/topic均為虛構)

引入paho依賴
<dependency>
    <groupId>org.eclipse.paho</groupId>
    <artifactId>org.eclipse.paho.client.mqttv3</artifactId>
    <version>1.2.0</version>
</dependency>
建立MQTT連線

建立連線的時候需使用AccessId、secret、topic、clientId均為系統分配,其中AccessId對應客戶端的user,secret對應客戶端的password。

String user         = "u8vngl";//user為accessId
String password     = "xxxxxx";//password為secretKey
String topic        = "u8vngl/rangeEvent";
int qos             = 1;//qos2消耗較大,請使用1或0
String broker       = "tcp://123.56.0.101:1993";//mqtt伺服器地址
String clientId     = "200061/u8vngl/rangeEvent";
//qos為1或2時,mqttclient使用
MemoryPersistence persistence = new MemoryPersistence();

try {
    MqttClient client = new MqttClient(broker, clientId, persistence);
    MqttConnectOptions connOpts = new MqttConnectOptions();
    connOpts.setUserName(user);
    connOpts.setPassword(password.toCharArray());
    //cleanSession為false時,下次以相同clientId登入將可以獲取儲存的所有訊息
    //如果為true,將獲取到retained標記的最後一條訊息
    connOpts.setCleanSession(false);
    connOpts.setAutomaticReconnect(true);//設定自動重連
            
    client.setCallback(new MqttCallback());//獲取訂閱訊息
    client.connect(connOpts);
    client.subscribe(topic, qos);//訂閱topic
} catch(MqttException me) {
    me.printStackTrace();
}
獲取訂閱訊息

paho的訊息獲取通過實現MqttCallback介面,MqttCallback介面通過messageArrived方法獲取訊息

@Override
public void messageArrived(String topic, MqttMessage message) throws Exception {
    //messge的處理請放入其他執行緒中,在該方法中消耗時間過多將影響qos為1或2的響應,使伺服器認為未成功投遞訊息
    System.out.println("topic:" + topic + " msg:" + message);
}

常見問題