Topik ini menjelaskan cara menghubungkan perangkat ke IoT Platform menggunakan HTTP.
Anda dapat menghubungkan perangkat ke IoT Platform menggunakan HTTP. Untuk informasi lebih lanjut, lihat Membuat koneksi melalui HTTPS.
Topik ini menggunakan kode contoh yang dikembangkan berdasarkan SDK perangkat untuk Java untuk menghubungkan perangkat dengan IoT Platform. Sebelum menetapkan koneksi, Anda harus menentukan parameter yang diperlukan, seperti parameter permintaan dan informasi sertifikat perangkat.
Catatan
Fitur ini hanya tersedia di wilayah Tiongkok (Shanghai).
Konfigurasikan file pom.xml
Tambahkan dependensi berikut ke file 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 menunjukkan cara menghubungkan perangkat ke IoT Platform dan mengaktifkan komunikasi data.
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;
/**
* Hubungkan perangkat ke IoT Platform dengan menggunakan HTTP.
* Untuk informasi lebih lanjut tentang protokol HTTP, lihat standar HTTP.
* Untuk informasi lebih lanjut tentang format data, lihat Membuat koneksi melalui HTTP.
*/
public class IotHttpClient {
// ID wilayah. Hanya wilayah Tiongkok (Shanghai) yang tersedia.
private static String regionId = "cn-shanghai";
// Tentukan algoritma enkripsi. Atur parameter HMAC_ALGORITHM ke hmacsha1 atau hmacmd5. Nilai yang Anda atur harus sama dengan nilai parameter signmethod.
private static final String HMAC_ALGORITHM = "hmacsha1";
// Masa berlaku token adalah tujuh hari. Setelah token kedaluwarsa, Anda harus memperoleh token baru.
private String token = null;
/**
* Inisialisasi klien HTTP.
*
* @param productKey Kunci produk.
* @param deviceName Nama perangkat.
* @param deviceSecret Kunci perangkat.
*/
public void conenct(String productKey, String deviceName, String deviceSecret) {
try {
// Titik akhir untuk autentikasi.
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);
// Dapatkan aliran keluaran objek URLConnection.
PrintWriter out = new PrintWriter(conn.getOutputStream());
// Kirim parameter permintaan.
out.print(authBody(productKey, deviceName, deviceSecret));
// Cetak isi cache.
out.flush();
// Dapatkan aliran masukan objek URLConnection.
BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
// Dapatkan respons dari titik akhir.
String result = "";
String line = "";
while ((line = in.readLine()) != null) {
result += line;
}
System.out.println("----- hasil auth -----");
System.out.println(result);
// Tutup aliran masukan dan keluaran.
in.close();
out.close();
conn.disconnect();
// Dapatkan token.
JSONObject json = JSONObject.parseObject(result);
if (json.getIntValue("code") == 0) {
token = json.getJSONObject("info").getString("token");
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* Kirim pesan.
*
@param topic Topik tempat pesan dikirim.
* @param payload Isi pesan.
*/
public void publish(String topic, byte[] payload) {
try {
// Tentukan titik akhir topik tempat pesan dikirim.
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);
// Dapatkan aliran keluaran objek URLConnection.
BufferedOutputStream out = new BufferedOutputStream(conn.getOutputStream());
out.write(payload);
out.flush();
// Dapatkan aliran masukan objek URLConnection.
BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
// Dapatkan respons dari titik akhir.
String result = "";
String line = "";
while ((line = in.readLine()) != null) {
result += line;
}
System.out.println("----- hasil publikasi -----");
System.out.println(result);
// Tutup aliran masukan dan keluaran.
in.close();
out.close();
conn.disconnect();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* Hasilkan parameter yang diperlukan untuk autentikasi.
*
* @param params Parameter yang diperlukan untuk autentikasi.
* @return Pesan yang mencakup permintaan autentikasi.
*/
private String authBody(String productKey, String deviceName, String deviceSecret) {
// Buat permintaan autentikasi.
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("----- body auth -----");
System.out.println(body.toJSONString());
return body.toJSONString();
}
/**
* Hasilkan tanda tangan untuk perangkat
*
* @param params Parameter yang diperlukan yang dapat Anda gunakan untuk menghasilkan tanda tangan
* @param deviceSecret Kunci perangkat
* @return Tanda tangan dalam format heksadesimal.
*/
private String sign(JSONObject params, String deviceSecret) {
// Urutkan parameter permintaan secara alfabetis.
Set<String> keys = getSortedKeys(params);
// Hapus parameter sign, signmethod, dan version.
keys.remove("sign");
keys.remove("signmethod");
keys.remove("version");
// Dapatkan teks biasa dari tanda tangan
StringBuffer content = new StringBuffer();
for (String key : keys) {
content.append(key);
content.append(params.getString(key));
}
// Hasilkan tanda tangan
String sign = encrypt(content.toString(), deviceSecret);
System.out.println("konten tanda tangan=" + content);
System.out.println("hasil tanda tangan=" + sign);
return sign;
}
/**
* Konversikan objek JSON menjadi set pasangan kunci-nilai.
*
* @param json Objek JSON yang akan dikonversi.
* @return Set pasangan kunci-nilai yang dikonversi dari objek JSON.
*/
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();
}
/**
* Tentukan metode enkripsi dalam parameter HMAC_ALGORITHM.
*
* @param content Teks biasa.
* @param secret Kunci enkripsi.
* @return Teks sandi.
*/
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;
}
}
/**
* Konversikan 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 = "The productKey of your device";
String deviceName = "The deviceName of your device";
String deviceSecret = "The deviceSecret of your device";
IotHttpClient client = new IotHttpClient();
client.conenct(productKey, deviceName, deviceSecret);
// Topik tempat pesan dikirim. Di konsol IoT Platform, Anda dapat membuat topik kustom dan memberikan izin publikasi kepada perangkat.
String updateTopic = "/" + productKey + "/" + deviceName + "/user/update";
client.publish(updateTopic, "hello http".getBytes(StandardCharsets.UTF_8));
client.publish(updateTopic, new byte[] { 0x01, 0x02, 0x03 });
}
}