Kode contoh Java untuk menghubungkan perangkat ke IoT Platform melalui HTTP.
IoT Platform mendukung koneksi perangkat melalui HTTP (koneksi HTTPS).
Contoh Java ini mencakup konfigurasi dan perhitungan signature di sisi perangkat untuk terhubung ke IoT Platform melalui HTTP.
Catatan Koneksi HTTP hanya didukung di wilayah China (Shanghai).
Konfigurasi pom.xml
Tambahkan dependensi berikut ke pom.xml untuk mengimpor paket Alibaba fastjson.
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.83</version>
</dependency>
Kode contoh
Kode berikut menghubungkan perangkat ke IoT Platform melalui HTTP.
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.Set;
import java.util.SortedMap;
import java.util.TreeMap;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import javax.net.ssl.HttpsURLConnection;
import com.alibaba.fastjson.JSONObject;
/**
* Perangkat terhubung ke Alibaba Cloud IoT Platform melalui HTTP.
* Untuk informasi lebih lanjut tentang spesifikasi protokol, lihat "Spesifikasi Protokol HTTP".
* Untuk informasi lebih lanjut tentang format data, lihat "Koneksi HTTPS".
*/
public class IotHttpClient {
// ID wilayah. Contoh menggunakan China (Shanghai).
private static String regionId = "cn-shanghai";
// Metode enkripsi. Algoritma Message Authentication Code (MAC) dapat berupa HmacMD5 atau HmacSHA1. Algoritma harus sama dengan nilai signmethod.
private static final String HMAC_ALGORITHM = "hmacsha1";
// Token berlaku selama 7 hari. Dapatkan token baru setelah masa berlakunya habis.
private String token = null;
/**
* Menginisialisasi client HTTP.
*
* @param productKey Kunci produk.
* @param deviceName Nama perangkat.
* @param deviceSecret Rahasia perangkat.
*/
public void conenct(String productKey, String deviceName, String deviceSecret) {
try {
// URL registrasi.
URL url = new URL("https://iot-as-http." + regionId + ".aliyuncs.com/auth");
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-type", "application/json");
conn.setDoOutput(true);
conn.setDoInput(true);
// Mendapatkan aliran output dari objek URLConnection.
PrintWriter out = new PrintWriter(conn.getOutputStream());
// Mengirim parameter permintaan.
out.print(authBody(productKey, deviceName, deviceSecret));
// Membersihkan buffer aliran output.
out.flush();
// Mendapatkan aliran input dari objek URLConnection.
BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
// Membaca respons dari URL.
String result = "";
String line = "";
while ((line = in.readLine()) != null) {
result += line;
}
System.out.println("----- auth result -----");
System.out.println(result);
// Menutup aliran input dan output.
in.close();
out.close();
conn.disconnect();
// Mendapatkan token.
JSONObject json = JSONObject.parseObject(result);
if (json.getIntValue("code") == 0) {
token = json.getJSONObject("info").getString("token");
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* Mengirim pesan.
*
* @param topic Topik tujuan pengiriman pesan.
* @param payload Konten pesan.
*/
public void publish(String topic, byte[] payload) {
try {
// URL registrasi.
URL url = new URL("https://iot-as-http." + regionId + ".aliyuncs.com/topic" + topic);
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-type", "application/octet-stream");
conn.setRequestProperty("password", token);
conn.setDoOutput(true);
conn.setDoInput(true);
// Mendapatkan aliran output dari objek URLConnection.
BufferedOutputStream out = new BufferedOutputStream(conn.getOutputStream());
out.write(payload);
out.flush();
// Mendapatkan aliran input dari objek URLConnection.
BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
// Membaca respons dari URL.
String result = "";
String line = "";
while ((line = in.readLine()) != null) {
result += line;
}
System.out.println("----- publish result -----");
System.out.println(result);
// Menutup aliran input dan output.
in.close();
out.close();
conn.disconnect();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* Menghasilkan konten permintaan otentikasi.
*
* @param params Parameter otentikasi.
* @return Body pesan permintaan otentikasi.
*/
private String authBody(String productKey, String deviceName, String deviceSecret) {
// Membuat permintaan otentikasi.
JSONObject body = new JSONObject();
body.put("productKey", productKey);
body.put("deviceName", deviceName);
body.put("clientId", productKey + "." + deviceName);
body.put("timestamp", String.valueOf(System.currentTimeMillis()));
body.put("signmethod", HMAC_ALGORITHM);
body.put("version", "default");
body.put("sign", sign(body, deviceSecret));
System.out.println("----- auth body -----");
System.out.println(body.toJSONString());
return body.toJSONString();
}
/**
* Menandatangani permintaan di sisi perangkat.
*
* @param params Parameter yang akan ditandatangani.
* @param deviceSecret Rahasia perangkat.
* @return Signature dalam bentuk string heksadesimal.
*/
private String sign(JSONObject params, String deviceSecret) {
// Mengurutkan parameter permintaan secara alfabetis.
Set<String> keys = getSortedKeys(params);
// Mengecualikan sign, signmethod, dan version.
keys.remove("sign");
keys.remove("signmethod");
keys.remove("version");
// Merangkai teks biasa untuk penandatanganan.
StringBuffer content = new StringBuffer();
for (String key : keys) {
content.append(key);
content.append(params.getString(key));
}
// Menghitung signature.
String sign = encrypt(content.toString(), deviceSecret);
System.out.println("sign content=" + content);
System.out.println("sign result=" + sign);
return sign;
}
/**
* Mendapatkan himpunan kunci terurut dari objek JSON.
*
* @param json Objek JSON yang akan diurutkan.
* @return Himpunan kunci terurut.
*/
private Set<String> getSortedKeys(JSONObject json) {
SortedMap<String, String> map = new TreeMap<String, String>();
for (String key : json.keySet()) {
String value = json.getString(key);
map.put(key, value);
}
return map.keySet();
}
/**
* Mengenkripsi data menggunakan HMAC_ALGORITHM.
*
* @param content Teks biasa.
* @param secret Kunci.
* @return Teks terenkripsi.
*/
private String encrypt(String content, String secret) {
try {
byte[] text = content.getBytes(StandardCharsets.UTF_8);
byte[] key = secret.getBytes(StandardCharsets.UTF_8);
SecretKeySpec secretKey = new SecretKeySpec(key, HMAC_ALGORITHM);
Mac mac = Mac.getInstance(secretKey.getAlgorithm());
mac.init(secretKey);
return byte2hex(mac.doFinal(text));
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* Mengonversi larik biner menjadi string heksadesimal.
*
* @param b Larik biner.
* @return String heksadesimal.
*/
private String byte2hex(byte[] b) {
StringBuffer sb = new StringBuffer();
for (int n = 0; b != null && n < b.length; n++) {
String stmp = Integer.toHexString(b[n] & 0XFF);
if (stmp.length() == 1) {
sb.append('0');
}
sb.append(stmp);
}
return sb.toString().toUpperCase();
}
public static void main(String[] args) {
String productKey = "your-productKey";
String deviceName = "your-deviceName";
String deviceSecret = "your-deviceSecret";
IotHttpClient client = new IotHttpClient();
client.conenct(productKey, deviceName, deviceSecret);
// Topik tujuan pengiriman pesan. Sesuaikan topik di Konsol. Perangkat harus memiliki izin untuk memublikasikan pesan ke topik tersebut.
String updateTopic = "/" + productKey + "/" + deviceName + "/user/update";
client.publish(updateTopic, "hello http".getBytes(StandardCharsets.UTF_8));
client.publish(updateTopic, new byte[] { 0x01, 0x02, 0x03 });
}
}