IoT Platform admite la comunicación por difusión, que permite enviar un mensaje a todos los dispositivos de un producto específico o a todos los dispositivos suscritos a un tema determinado. Los mensajes de difusión enviados desde su servidor empresarial solo los reciben los dispositivos en línea. Este tema proporciona un ejemplo sobre cómo difundir un mensaje a todos los dispositivos en línea.
Contexto
-
Difundir un mensaje a todos los dispositivos en línea de un producto
Su servidor empresarial invoca la operación de API PubBroadcast y pasa el ProductKey del producto destino junto con el MessageContent. Todos los dispositivos en línea del producto reciben el MessageContent en el tema de difusión
/sys/${productKey}/${deviceName}/broadcast/request/${MessageId}.El
MessageIddel tema de difusión es un identificador generado por IoT Platform. Una vez enviado correctamente el mensaje, IoT Platform devuelve este ID a su servidor empresarial como parte de la respuesta de la llamada a PubBroadcast.Por ejemplo, un fabricante con varias cerraduras inteligentes conectadas a IoT Platform puede usar un servidor empresarial para enviar un único comando a todas las cerraduras en línea y así invalidar una contraseña específica.

-
Difundir un mensaje a todos los dispositivos suscritos a un tema específico
Los dispositivos se suscriben al mismo tema de difusión. Su servidor empresarial invoca la operación de API PubBroadcast y pasa el ProductKey, el MessageContent y el nombre completo del tema de difusión. El nombre del tema debe tener el formato
/broadcast/${productKey}/custom-field. Todos los dispositivos en línea suscritos a este tema reciben el MessageContent.ImportanteLos temas de difusión se definen en el código del dispositivo durante el desarrollo. No es necesario crearlos en la consola de IoT Platform.
Un máximo de 1,000 dispositivos pueden suscribirse a un solo tema de difusión. Si tiene más dispositivos, debe segmentarlos en grupos. Por ejemplo, para difundir a 5,000 dispositivos, puede dividirlos en cinco grupos de 1,000. Luego debe invocar la operación
PubBroadcastcinco veces y establecer el campo personalizado engroup1,group2,group3,group4ygroup5, respectivamente. Cada grupo de dispositivos debe suscribirse a su tema correspondiente.
Para obtener más información sobre la operación de API de difusión, consulte PubBroadcast.
Límites
Los mensajes de difusión se envían únicamente a los dispositivos en línea dentro de un producto.
Al difundir mensajes a dispositivos en línea específicos mediante suscripción a temas, la frecuencia máxima de llamadas a la API de difusión es de una por segundo.
Al difundir mensajes a todos los dispositivos en línea de un producto, los dispositivos no necesitan suscribirse a un tema de difusión. La frecuencia máxima de llamadas a la API de difusión es de una por minuto.
El tamaño máximo del cuerpo de un mensaje de difusión es de 64 KB.
Los mensajes de difusión no están sujetos al límite de transacciones por segundo (TPS) de reenvío de datos de su
instancia
. Por ejemplo, si su instancia tiene un límite de TPS de 100 para el reenvío de datos y cuenta con 500 dispositivos en línea, una llamada de difusión entrega el mensaje a los 500 dispositivos, no solo a 100.
Preparar el entorno de desarrollo
Este ejemplo utiliza SDK de Java tanto para el dispositivo como para el servidor. Debe preparar un entorno de desarrollo de Java. Descargue e instale Java Development Kit (JDK) desde el sitio web oficial de Java.
Agregar dependencias de Maven
Cree un proyecto y agregue las siguientes dependencias de Maven al archivo pom.xml.
Las versiones del SDK de Java para IoT en el siguiente código son solo de referencia. Para obtener la información más reciente sobre dependencias, vaya a la
página.
<dependencies>
<dependency>
<groupId>com.aliyun.alink.linksdk</groupId>
<artifactId>iot-linkkit-java</artifactId>
<version>1.2.0.1</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.5.6</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-iot</artifactId>
<version>7.41.0</version>
</dependency>
<dependency>
<groupId>com.aliyun.openservices</groupId>
<artifactId>iot-client-message</artifactId>
<version>1.1.2</version>
</dependency>
</dependencies>
Crear un producto y dispositivos
Inicie sesión en la consola de IoT Platform.
En la página Overview, localice la instancia que desea gestionar y haga clic en el ID o el nombre de la instancia.
En el panel de navegación izquierdo, vaya a .
Haga clic en Create Product para crear un producto de Smart Lock. Para obtener más información, consulte Create a product.
En el panel de navegación izquierdo, vaya a y luego cree tres dispositivos para el producto Smart Lock. Para obtener más información, consulte Create multiple devices at a time.
Configurar el SDK del dispositivo
-
Conecte sus dispositivos a IoT Platform.
-
Configure las credenciales del dispositivo.
final String productKey = "<yourProductKey>"; final String deviceName = "<yourDeviceName>"; final String deviceSecret = "<yourDeviceSecret>"; final String region = "<yourRegionID>";Los parámetros productKey, deviceName y deviceSecret son las credenciales de su dispositivo. Para obtenerlas, vaya a la consola de IoT Platform, navegue hasta su instancia y vaya a . Localice el dispositivo y haga clic en View para ir a la página Device Details.
El parámetro region especifica la región del dispositivo. Para obtener información sobre cómo especificar una region, consulte Regions and zones.
-
Establezca los parámetros de inicialización, incluida la configuración de MQTT, la información del dispositivo y el estado inicial del dispositivo.
LinkKitInitParams params = new LinkKitInitParams(); // LinkKit uses MQTT as its underlying protocol. Configure the MQTT settings. IoTMqttClientConfig config = new IoTMqttClientConfig(); config.productKey = productKey; config.deviceName = deviceName; config.deviceSecret = deviceSecret; config.channelHost = productKey + ".iot-as-mqtt." + region + ".aliyuncs.com:1883"; // Specify the device information. 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;El parámetro channelHost es el endpoint de MQTT. Para obtener los endpoints de las instancias públicas y Enterprise Edition, consulte View and configure instance endpoints.
-
Inicialice la conexión.
// Establish the connection and set a listener for the connection result. LinkKit.getInstance().init(params, new ILinkKitConnectListener() { @Override public void onError(AError aError) { System.out.println("Init error:" + aError); } // The callback that is invoked after the initialization is complete. @Override public void onInitDone(InitResult initResult) { System.out.println("Init done:" + initResult); } });
-
-
En la función de devolución de llamada onInitDone, use el prefijo del tema para identificar los temas de difusión. El prefijo de un tema de difusión es
/sys/${productKey}/${deviceName}/broadcast/request/.public void onInitDone(InitResult initResult) { // Set the listener to listen for downstream messages. IConnectNotifyListener notifyListener = new IConnectNotifyListener() { // Define the callback that is invoked to process downstream messages. @Override public void onNotify(String connectId, String topic, AMessage aMessage) { // Filter broadcast messages. if(topic.startsWith(broadcastTopic)){ System.out.println( "received broadcast message from topic=" + topic + ",\npayload=" + 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); }
Configurar el SDK del servidor
Configure el SDK de Java del servidor para enviar mensajes de difusión.
-
Configure la información de autenticación.
String regionId = "<yourRegionID>"; String accessKey = "<yourAccessKey>"; String accessSecret = "<yourAccessSecret>"; final String productKey = "<yourProductKey>"; -
Configure el servidor para invocar la operación de API PubBroadcast y difundir un mensaje.
// Set client parameters. DefaultProfile profile = DefaultProfile.getProfile(regionId, accessKey, accessSecret); IAcsClient client = new DefaultAcsClient(profile); PubBroadcastRequest request = new PubBroadcastRequest(); // Set the ProductKey for the broadcast message. request.setProductKey(productKey); // Set the message content. The content must be Base64-encoded to prevent garbled characters. request.setMessageContent(Base64.encode("{\"pwd\":\"2892nd6Y\"}")); // Set the instance ID. request.setIotInstanceId("iot-cn-***"); -
Envíe el mensaje de difusión desde el servidor.
try { PubBroadcastResponse response = client.getAcsResponse(request); System.out.println("broadcast pub success: broadcastId =" + response.getMessageId()); } catch (Exception e) { System.out.println(e); }
Verificar los resultados
Ejecute el código del SDK del dispositivo en cada dispositivo para conectarlos. A continuación, ejecute el código del SDK del servidor para invocar la operación de API PubBroadcast y difundir un mensaje a los dispositivos.
El contenido del mensaje difundido desde el SDK del servidor es "{\"pwd\":\"2892nd6Y\"}".
Los registros locales de cada dispositivo muestran el mensaje de difusión recibido: {\"pwd\":\"2892nd6Y\"}.
Smart Lock 1:
2020-03-05 03:17:37.091 – null[MqttDefaulCallback.java] – messageArrived(74):MqttDefaulCallback:messageArrived,topi
[/sys/a1nTNJt9p39/MjxxxDR/broadcast/request/123546464900384256], msg = [{"pwd":"2892nd6Y"}],
2020-03-05 03:17:37.091 – null[PersistentEventDispatcher.java] – broadcastMessage(150):com.aliyun.alink.linksdk.cha
what=3
received broadcast message from topic=/sys/a1nTNJt9p39/MjxxxDR/broadcast/request/123546464900384256,
payload={"pwd":"2892nd6Y"}
Smart Lock 2:
2020-03-05 03:17:37.111 - null[MqttDefaulCallback.java] - messageArrived(74):MqttDefaulCallback:messageArrived,topic
[/sys/a1nTNJt9p39/W96JAyE7UBpxHkiFy2CG/broadcast/request/1235464464900384256] , msg = [{"pwd":"2892nd6Y"}],
2020-03-05 03:17:37.111 - null[PersistentEventDispatcher.java] - broadcastMessage(150):com.aliyun.alink.linksdk.chan
what=3
received broadcast message from topic=/sys/a1nTNJt9p39/W9xxx2CG/broadcast/request/1235464464900384256,
payload={"pwd":"2892nd6Y"}
Smart Lock 3:
2020-03-05 03:17:37.167 - null[MqttDefaulCallback.java] - messageArrived(74):MqttDefaultCallback:messageArrived,top
[/sys/a1nTNJt9p39/mBGagyPszmfRbKVzyqvZ/broadcast/request/1235464464900384256] , msg = [{"pwd":"2892nd6Y"}],
2020-03-05 03:17:37.167 - null[PersistentEventDispatcher.java] - broadcastMessage(150):com.aliyun.alink.linksdk.ch
what=3
received broadcast message from topic=/sys/a1nTNJt9p39/mlxxxxxxxxxxxvZ/broadcast/request/1235464464900384256,
payload={"pwd":"2892nd6Y"}
Apéndice: Demos
Descargue el código de muestra completo, que incluye ejemplos para los SDK del servidor y del dispositivo.
Difundir un mensaje a todos los dispositivos en línea: Descargar PubBroadcastDemo.
Difundir un mensaje a todos los dispositivos suscritos a un tema específico: Descargar BroadcastDemo.