開放平臺-幫助中心
側邊欄目錄
新手指南
成為開發者
-
G7S使用者,直接通過G7S賬號授權登入
-
非G7S使用者,進行開發者賬號申請,稽核通過後使用開放平臺賬號登入
- 開發者賬號申請
在開發者賬號申請頁面[連結]完成相關資訊填寫,並提交。 - 資質認證
在我們確定了開發者的身份以後,會將稽核結果傳送到所申請的郵箱,如果稽核通過,郵件會附上您的賬號和密碼。
第一次登入,及時修改密碼後便可以進入操作介面。
資料申請
-
進入產品中心,在產品中心檢視需要使用的介面或者相關的推送資料,點選立即申請並提交稽核。然後進入控制檯便可以檢視到稽核的狀態,稽核通過後AccessID和Secret也將在控制檯展示。
-
您可通過AccessID和Secret獲取您想要的資料,具體使用方法請詳見開發指南的對應模組。
-
AccessID和Secret它們的作用是計算驗證簽名,請妥善保管,不要洩露。
開發指南
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]
程式報請求超時或讀寫超時?
- 首先請檢查下BaseURL是否填寫正確,DEMO環境的為demo.dsp.chinawayltd.com/altair/rest,生產環境的為:openapi.huoyunren.com
- 在所在伺服器或主機上PING一下BaseURL中的host,看能否PING通,PING不通的話請找網管處理。
- 若能PING通,請檢查下程式中設定的HTTP請求的讀寫超時的相關配置,嘗試配置超時時間多一點(如:10秒鐘)看看
- 經過以上操作還不行,可諮詢 張雙建 [email protected] 或 陳坤雲 [email protected]
介面響應資訊報 no permission, api can't access
- 先檢查下程式中的ACCESS_ID和SECRET_KEY是否填寫正確。
- 檢查呼叫業務介面的PATH是否填寫正確。
- 經過以上操作還不行,可諮詢張雙建 [email protected] 或 陳坤雲 [email protected]
介面響應資訊報auth failed:signature error
- 請嚴格參考demo程式中的程式碼進行簽名操作,閱覽使用者包中OpenAPI系統認證機制文件
介面響應資訊報wrong timestamp
- 先確認所在伺服器或主機時間是否是當前標準的北京時間
- timestamp時間格式應為毫秒長整型
- timestamp引數的值應放置在請求頭的X-G7-OpenAPI-Timestamp引數中
HTTP推送服務
服務接入
概述、使用場景及限制
G7提供的HTTP推送服務,是一種將車輛裝置資料實時傳送給資料使用方的服務。當裝置上傳資料後,推送服務會第一時間感知,在將資料整理打包後,通過HTTP鏈路傳送到訂閱事件資料的客戶,客戶接收資料後可根據自身業務自行處理資料。
HTTP推送服務適用於發生頻率較低的事件,比如進出區域、停留、超速等事件。對於一些發生頻率較高的事件,比如定位,推薦使用MQTT推送服務。接收限制:HTTP推送服務與客戶資料接收服務是緊耦合關聯的,推送服務的吞吐量嚴重依賴接收服務的響應速度,一旦接收服務響應速度過慢,就有可能造成推送服務的執行緒堆積,消耗大量資源無法釋放,最嚴重的情況使推送服務崩潰。所以,接收服務在接收到資料後,必須以最快的速度接收並返回接收結果。資料的業務邏輯處理請放入執行緒池,或者放入kafka中介軟體後再處理。如果接收服務響應速度過慢導致大量推送超時,或者接收服務不可用,為保護推送服務,當單一事件失敗超過20000條時,相關推送服務會自動關閉。關閉後可聯絡管理員重新開啟。
服務接入流程
-
申請:見對應資料申請,每個HTTP事件都需要單獨申請。
-
提供推送資料接收服務的HTTP回撥地址,推送服務將根據這個地址傳送資料,此時請保證接收服務已開發完成並上線。
推送接收與開發
開發準備
-
確保已經在產品中心-推送下完成了所需推送資料的申請並取得相應的AccessId/SecretKey
-
確保提供了推送資料接收服務的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 ,該叢集沒有任何限制。
- 第一次登陸時,MQTT伺服器建立客戶端clientId對應的session,在客戶端訂閱topic後,伺服器傳送當前topic的最新一條資料給客戶端(傳送最新一條的機制由MQTT協議規定)
- session的主要作用是管理topic的訪問情況,一個clientId對應一個session。如果客戶端關閉時選擇不清除session,那麼下次以相同clientId登陸後,伺服器將從上次訪問的位置傳送資料;否則,清除了session,伺服器傳送topic的最新一條資料給客戶端
- G7的MQTT伺服器session過期時間為3天,過期後客戶端重新連線伺服器,將從最新一條資料開始訪問,未消費的歷史資料在session過期時被伺服器自動清理。如要獲取超過3天的資料,請使用開放平臺訪問歷史資料的相關API
- 更多解釋請檢視MQTT規範http://mqtt.org/ 。
服務接入流程
- 申請:見資料申請,每個MQTT事件都需要單獨申請。
- 每種訂閱事件都對應一個clientId和topic,應用儲存後系統生成,接收服務連線MQTT伺服器時使用。
接收服務中會使用accessId和secret,它們的作用是連線MQTT伺服器時的許可權驗證,請妥善保管,不要洩露
推送接收與開發
開發準備
-
確保已經在產品中心-推送下完成了所需推送資料的申請並取得相應的AccessId/SecretKey,AccessId/SecretKey對應於連線MQTT伺服器時要求的user/password,在接收程式中會使用到。
-
平臺將為每一種事件訂閱生成一個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);
}