Cihazların MQTT yayımla/abone ol ve AMQP sunucu tarafı aboneliği aracılığıyla IoT Platform ile iş sunucuları arasında mesaj alışverişi yapmak için özel konuları nasıl kullandığını öğrenin. Konular; sistem konuları, TSL model konuları ve özel konular olarak sınıflandırılır. Özel konular konsolda tanımlanmalıdır.
Arka plan bilgileri
Bu örnekte elektronik bir termometre, özel bir konuya abone olarak talimatlar alır ve başka bir konuya mesaj yayımlayarak sıcaklık verilerini bildirir. IoT Platform, verileri AMQP sunucu tarafı aboneliği aracılığıyla bir kullanıcı sunucusuna iletir. Sunucu, termometrenin hassasiyetini uzaktan yapılandırmak için Pub işlemi çağrısı yapar.

Geliştirme ortamı hazırlama
Bu örnekte Java SDK kullanılmaktadır. Resmi Java web sitesinden bir Java geliştirme ortamı indirin ve yükleyin.
Gerekli bileşenler:
İşletim sistemi: 64 bit Windows 10
JDK sürümü: JDK 8
Tümleşik geliştirme ortamı (IDE): IntelliJ IDEA Community Edition
Ürün ve cihaz oluşturma
IoT Platform konsolu üzerinde oturum açın.
Overview sayfasında yönetmek istediğiniz örneği bulun ve örnek kimliğine veya örnek adına tıklayın.
Sol gezinme bölmesinde seçeneğini belirleyin.
-
Bir termometre ürünü oluşturmak ve Productkey değerini (örneğin
a1uzcH0****) almak için Create Product seçeneğine tıklayın. Ürün oluşturulduktan sonra ürünün yanındaki View seçeneğine tıklayın.
-
Product Details sayfasında Topic Categories sekmesine tıklayın ve ardından özel bir konu kategorisi eklemek için Custom Topic seçeneğine tıklayın.
İletişim için özel konuları kullanma.
Bu örnekte aşağıdaki konu kategorileri gereklidir:
Cihazın mesaj yayımlayacağı konu: /a1uzcH0****/${deviceName}/user/devmsg (Yayımla izniyle).
Cihazın mesajlara abone olacağı konu: /a1uzcH0****/${deviceName}/user/cloudmsg (Abone Ol izniyle).
-
Server-side Subscription sekmesine tıklayın ve ardından AMQP sunucu tarafı aboneliğini yapılandırmak için Create Subscription seçeneğine tıklayın. Device Upstream Notification mesajlarını Default Consumer Group grubuna abone edin.
Device Upstream Notification özel konu ve TSL model mesajlarını içerir. AMQP sunucu tarafı aboneliğini yapılandırma.
-
Sol gezinme bölmesinde seçeneğini belirleyin. Ardından oluşturduğunuz termometre ürününe device1 adlı bir cihaz ekleyin. ProductKey, DeviceName ve DeviceSecret dahil olmak üzere cihaz sertifika bilgilerini alın.
Cihazın sunucuya mesaj göndermesini yapılandırma
Aşağıdaki şekilde cihazın sunucuya nasıl mesaj gönderdiği gösterilmektedir.

Sunucuyu ve cihazı aşağıdaki gibi yapılandırın:
-
AMQP istemcinizi IoT Platform'a bağlayın ve cihaz mesajlarını dinlemek üzere yapılandırın. Java SDK kullanarak AMQP istemcisini IoT Platform'a bağlama.
ÖnemliAMQP istemcisinin tüketici grubu, cihazla aynı IoT Platform örneğinde olmalıdır.
-
Cihazı IoT Platform'a bağlamak ve cihazın mesaj göndermesini sağlamak için cihaz SDK'sını yapılandırın.
-
Cihazın kimliğini doğrulamak için parametreleri yapılandırın.
final String productKey = "a1uzcH0****"; final String deviceName = "device1"; final String deviceSecret = "uwMTmVAMnxB****"; final String region = "cn-shanghai"; final String iotInstanceId = "iot-2w****";Aşağıdaki parametreleri yapılandırın:
Parametre
Örnek
Açıklama
productKey
a1uzcH0****
Cihaz sertifika bilgileri. Bu bilgilere IoT Platform konsolundaki Device Details sayfasından ulaşabilirsiniz.Cihaz ayrıntılarını görüntüleme.
deviceName
device1
deviceSecret
uwMTmVAMnxB****
region
cn-shanghai
IoT Platform örneğinizin bölge kimliği. Bölgeler ve alanlar.
iotInstanceId
iot-2w****
Cihazın ait olduğu örneğin kimliği.
Örnek kimliğini IoT Platform konsolundaki Overview sayfasında görüntüleyebilirsiniz.
Örnek kimliği görüntüleniyorsa bu parametreyi belirtmeniz gerekir.
Örneğiniz için bir Overview veya kimlik oluşturulmamışsa parametre için boş bir dize (
iotInstanceId = "") belirtin.
-
MQTT, cihaz ve TSL model parametreleriyle bağlantıyı başlatın.
LinkKitInitParams params = new LinkKitInitParams(); // Configure the MQTT connection parameters. Link SDK uses the MQTT protocol. IoTMqttClientConfig config = new IoTMqttClientConfig(); config.productKey = productKey; config.deviceName = deviceName; config.deviceSecret = deviceSecret; config.channelHost = productKey + ".iot-as-mqtt." + region + ".aliyuncs.com:1883"; // Configure the device parameters. DeviceInfo deviceInfo = new DeviceInfo(); deviceInfo.productKey = productKey; deviceInfo.deviceName = deviceName; deviceInfo.deviceSecret = deviceSecret; // Specify the initial status of the device. Map<String, ValueWrapper> propertyValues = new HashMap<String, ValueWrapper>(); params.mqttClientConfig = config; params.deviceInfo = deviceInfo; params.propertyValues = propertyValues;Aşağıdaki parametreleri değiştirin:
Parametre
Örnek
Açıklama
config.channelHost
config.channelHost = productKey + ".iot-as-mqtt." + region + ".aliyuncs.com:1883";MQTT bağlantıları için alan adı.
Eski genel örnek:
config.channelHost = productKey + ".iot-as-mqtt." + region + ".aliyuncs.com:1883";.Yeni genel örnek ve Enterprise Edition örneği:
config.channelHost = iotInstanceId + ".mqtt.iothub.aliyuncs.com:1883";.
-
Bağlantıyı başlatın.
//Connect and configure the callback function that is invoked after the connection is established. LinkKit.getInstance().init(params, new ILinkKitConnectListener() { @Override public void onError(AError aError) { System.out.println("Init error:" + aError); } // Implement the callback function. @Override public void onInitDone(InitResult initResult) { System.out.println("Init done:" + initResult); } }); -
Cihazdan bir mesaj gönderin.
Cihaz bağlandıktan sonra onInitDone işlevini değiştirerek özel konuya bir mesaj yayımlayın:
@Override public void onInitDone(InitResult initResult) { // Specify the topic to which the message is published and the message content. MqttPublishRequest request = new MqttPublishRequest(); request.topic = "/" + productKey + "/" + deviceName + "/user/devmsg"; request.qos = 0; request.payloadObj = "{\"temperature\":35.0, \"time\":\"sometime\"}"; // Publish the message and configure the callback functions that are used after the message is published. LinkKit.getInstance().publish(request, new IConnectSendListener() { @Override public void onResponse(ARequest aRequest, AResponse aResponse) { System.out.println("onResponse:" + aResponse.getData()); } @Override public void onFailure(ARequest aRequest, AError aError) { System.out.println("onFailure:" + aError.getCode() + aError.getMsg()); } }); }Aşağıdaki parametreleri yapılandırın:
Parametre
Örnek
Açıklama
request.topic
"/" + productKey + "/" + deviceName + "/user/devmsg"
Cihazın Yayımla iznine sahip olduğu özel konu.
request.payloadObj
"{\"temperature\":35.0, \"time\":\"sometime\"}"
Mesajın içeriği.Sunucu aşağıdaki mesajı alır:
Message {payload={"temperature":35.0, "time":"sometime"}, topic='/a1uzcH0****/device1/user/devmsg', messageId='1131755639450642944', qos=0, generateTime=1558666546105}
-
Sunucunun cihaza mesaj göndermesini yapılandırma
Aşağıdaki şekilde sunucunun cihaza nasıl mesaj gönderdiği gösterilmektedir.

-
Cihaz SDK'sını özel bir konuya abone olacak şekilde yapılandırın.
Cihaz kimlik doğrulaması ve bağlantı kurulumu için Cihazın sunucuya mesaj göndermesini yapılandırma bölümündeki kodu yeniden kullanın.
Cihazı özel konuya abone olacak şekilde yapılandırın:
Aşağıdaki kodu kullanarak bir konuya abone olun:
// Implement the callback function. @Override public void onInitDone(InitResult initResult) { // Specify the topic to which the device subscribes. MqttSubscribeRequest request = new MqttSubscribeRequest(); request.topic = "/" + productKey + "/" + deviceName + "/user/cloudmsg"; request.isSubscribe = true; // Send a subscription request and configure the callback functions that are invoked after the subscription succeeds or fails. LinkKit.getInstance().subscribe(request, new IConnectSubscribeListener() { @Override public void onSuccess() { System.out.println(""); } @Override public void onFailure(AError aError) { } }); // Configure a listener for downstream messages. IConnectNotifyListener notifyListener = new IConnectNotifyListener() { // Configure the callback function that is used after the downstream messages are received. @Override public void onNotify(String connectId, String topic, AMessage aMessage) { System.out.println( "received message from " + topic + ":" + new String((byte[])aMessage.getData())); } @Override public boolean shouldHandle(String s, String s1) { return false; } @Override public void onConnectStateChange(String s, ConnectState connectState) { } }; LinkKit.getInstance().registerOnNotifyListener(notifyListener); }request.topicdeğerini Abone Ol iznine sahip özel bir konu olarak ayarlayın. -
Cihaza mesaj yayımlamak için cloud SDK'yı kullanarak Pub işlemi çağrısı yapın. Pub. Java SDK kullanma.
-
Cihazın kimliğini doğrulamak için parametreleri yapılandırın.
String regionId = "cn-shanghai"; String accessKey = "LTAI****"; String accessSecret = "********"; final String productKey = "a1uzcH0****"; final String deviceName = "device1"; final String iotInstanceId = "iot-2w****";Aşağıdaki parametreleri değiştirin:
Parametre
Örnek
Açıklama
accessKey
LTAI****
Alibaba Cloud hesabınızın AccessKey ID ve AccessKey Secret değerleri.
IoT Platform konsolunda oturum açın, profil resminin üzerine gelin ve AccessKey ID ile AccessKey Secret değerlerini almak için AccessKey Management seçeneğine tıklayın.
NotBir RAM kullanıcısı kullanıyorsanız RAM kullanıcısına AliyunIOTFullAccess izin ilkesini eklemeniz gerekir. Bu ilke, RAM kullanıcısının IoT Platform kaynaklarını yönetmesine olanak tanır. AliyunIOTFullAccess izin ilkesini RAM kullanıcısına eklemezseniz IoT Platform bağlantısı başarısız olur. Bir RAM kullanıcısına izin verme hakkında daha fazla bilgi için bkz. RAM kullanıcısı erişimi.
accessSecret
****
productKey
a1uzcH0****
Cihaz sertifika bilgileri. Bu bilgilere IoT Platform konsolundaki Device Details sayfasından ulaşabilirsiniz.Cihaz ayrıntılarını görüntüleme.
deviceName
device1
region
cn-shanghai
IoT Platform örneğinizin bölge kimliği. Bölgeler ve alanlar.
iotInstanceId
iot-2w****
Cihazın ait olduğu örneğin kimliği.
Örnek kimliğini IoT Platform konsolundaki Overview sayfasında görüntüleyebilirsiniz.
Örnek kimliği görüntüleniyorsa bu parametreyi belirtmeniz gerekir.
Örneğiniz için bir Overview veya kimlik oluşturulmamışsa parametre için boş bir dize (
iotInstanceId = "") belirtin.
-
Bağlantı parametrelerini yapılandırın.
//Configure the client parameters. DefaultProfile profile = DefaultProfile.getProfile(regionId, accessKey, accessSecret); IAcsClient client = new DefaultAcsClient(profile); -
Mesaj yayımlama parametrelerini yapılandırın.
PubRequest request = new PubRequest(); request.setIotInstanceId(iotInstanceId); request.setQos(0); // Specify the topic to which the message is published. request.setTopicFullName("/" + productKey + "/" + deviceName + "/user/cloudmsg"); request.setProductKey(productKey); // Configure the MessageContent parameter. The message content must be encoded in Base64. Otherwise, the message content is displayed as garbled characters. request.setMessageContent(Base64.encode("{\"accuracy\":0.001,\"time\":now}"));Parametreleri gereksinimlerinize göre yapılandırın. Pub.
-
Mesajı yayımlayın.
try { PubResponse response = client.getAcsResponse(request); System.out.println("pub success?:" + response.getSuccess()); } catch (Exception e) { System.out.println(e); }Cihaz şunu alır:
msg = [{"accuracy":0.001,"time":now}]
-
Ek: Örnek kod
Parametreleri iş gereksinimlerinize uygun şekilde değiştirin.
Cloud SDK ve cihaz SDK örnek kodları için Pub/Sub demosunu indirin.
Bir AMQP istemcisini IoT Platform'a aşağıdaki SDK kılavuzlarını kullanarak bağlayın: