O IoT Platform suporta comunicação broadcast, que permite enviar uma mensagem para todos os dispositivos de um produto específico ou para todos os dispositivos inscritos em um tópico determinado. Apenas os dispositivos online recebem as mensagens broadcast enviadas pelo servidor de negócios. Este tópico apresenta um exemplo de como transmitir uma mensagem para todos os dispositivos online.
Informações básicas
-
Transmissão de mensagem para todos os dispositivos online de um produto
O servidor de negócios chama a operação da API PubBroadcast e passa o ProductKey do produto de destino e o MessageContent. Todos os dispositivos online do produto recebem o MessageContent no tópico de broadcast
/sys/${productKey}/${deviceName}/broadcast/request/${MessageId}.O
MessageIdpresente no tópico de broadcast é um ID gerado pelo IoT Platform. Após o envio bem-sucedido da mensagem, o IoT Platform retorna esse ID ao servidor de negócios como parte da resposta da chamada PubBroadcast.Por exemplo, um fabricante com várias fechaduras inteligentes conectadas ao IoT Platform pode usar um servidor de negócios para enviar um único comando a todas as fechaduras online e invalidar uma senha específica.

-
Transmissão de mensagem para todos os dispositivos inscritos em um tópico específico
Os dispositivos se inscrevem no mesmo tópico de broadcast. O servidor de negócios chama a operação da API PubBroadcast e passa o ProductKey, o MessageContent e o nome completo do tópico de broadcast. O nome do tópico deve seguir o formato
/broadcast/${productKey}/custom-field. Todos os dispositivos online inscritos nesse tópico recebem o MessageContent.ImportanteOs tópicos de broadcast são definidos no código do dispositivo durante o desenvolvimento. Não é necessário criá-los no console do IoT Platform.
Um único tópico de broadcast aceita no máximo 1.000 dispositivos inscritos. Se houver mais dispositivos, segmente-os em grupos. Por exemplo, para transmitir para 5.000 dispositivos, divida-os em cinco grupos de 1.000. Em seguida, chame a operação
PubBroadcastcinco vezes e defina o campo personalizado comogroup1,group2,group3,group4egroup5, respectivamente. Cada grupo de dispositivos deve se inscrever em seu tópico correspondente.
Para obter mais informações sobre a operação da API de broadcast, consulte PubBroadcast.
Limites
As mensagens de broadcast são enviadas apenas para dispositivos online de um produto.
Na transmissão de mensagens para dispositivos online específicos por inscrição em tópico, a frequência máxima de chamadas da API de broadcast é de uma vez por segundo.
Na transmissão de mensagens para todos os dispositivos online de um produto, não é necessária a inscrição em um tópico de broadcast. A frequência máxima de chamadas da API de broadcast é de uma vez por minuto.
O tamanho máximo do corpo de uma mensagem de broadcast é de 64 KB.
As mensagens de broadcast não estão sujeitas ao limite de Transações Por Segundo (TPS) de encaminhamento de dados da sua
instância
. Por exemplo, se sua instância tiver um limite de TPS de 100 para encaminhamento de dados e você possuir 500 dispositivos online, uma chamada de broadcast entregará a mensagem para todos os 500 dispositivos, e não apenas para 100.
Preparar o ambiente de desenvolvimento
Este exemplo utiliza SDKs Java tanto para o dispositivo quanto para o servidor. Prepare um ambiente de desenvolvimento Java. Baixe e instale o Java Development Kit (JDK) no site oficial do Java.
Adicionar dependências do Maven
Crie um projeto e adicione as seguintes dependências do Maven ao arquivo pom.xml.
As versões do IoT Java SDK no código abaixo servem apenas como referência. Para obter as informações mais recentes sobre dependências, acesse a página do
.
<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>
Criar um produto e dispositivos
Faça login no console do IoT Platform.
Na página Overview, localize a instância que deseja gerenciar e clique em ID ou no nome da instância.
No painel de navegação à esquerda, escolha .
Clique em Create Product para criar um produto Smart Lock. Para mais detalhes, consulte Criar um produto.
No painel de navegação à esquerda, escolha e crie três dispositivos para o produto Smart Lock. Para mais detalhes, consulte Criar vários dispositivos de uma só vez.
Configurar o SDK do dispositivo
-
Conecte seus dispositivos ao IoT Platform.
-
Configure as credenciais do dispositivo.
final String productKey = "<yourProductKey>"; final String deviceName = "<yourDeviceName>"; final String deviceSecret = "<yourDeviceSecret>"; final String region = "<yourRegionID>";Os parâmetros productKey, deviceName e deviceSecret correspondem às credenciais do dispositivo. Para obtê-los, acesse o console do IoT Platform, navegue até sua instância e escolha . Localize o dispositivo e clique em View para acessar a página Device Details.
O parâmetro region especifica a região do dispositivo. Para saber como definir uma region, consulte Regiões e zonas.
-
Defina os parâmetros de inicialização, incluindo configurações MQTT, informações do dispositivo e status inicial do 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;O channelHost é o endpoint MQTT. Para obter endpoints de instâncias públicas e Enterprise Edition, consulte Visualizar e configurar endpoints de instância.
-
Inicialize a conexão.
// 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); } });
-
-
Na função de callback onInitDone, utilize o prefixo do tópico para identificar tópicos de broadcast. O prefixo de um tópico de broadcast é
/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 o SDK do servidor
Configure o SDK Java do lado do servidor para enviar mensagens de broadcast.
-
Configure as informações de autenticação.
String regionId = "<yourRegionID>"; String accessKey = "<yourAccessKey>"; String accessSecret = "<yourAccessSecret>"; final String productKey = "<yourProductKey>"; -
Configure o servidor para chamar a operação da API PubBroadcast e transmitir uma mensagem.
// 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-***"); -
Envie a mensagem de broadcast a partir do servidor.
try { PubBroadcastResponse response = client.getAcsResponse(request); System.out.println("broadcast pub success: broadcastId =" + response.getMessageId()); } catch (Exception e) { System.out.println(e); }
Verificar os resultados
Execute o código do SDK do dispositivo em cada dispositivo para conectá-los. Em seguida, execute o código do SDK do servidor para chamar a operação da API PubBroadcast e transmitir uma mensagem para os dispositivos.
O conteúdo da mensagem transmitida pelo SDK do servidor é "{\"pwd\":\"2892nd6Y\"}".
Os logs locais em cada dispositivo mostram a mensagem de broadcast recebida: {\"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: Demonstrações
Baixe o código de exemplo completo, que inclui exemplos para os SDKs do servidor e do dispositivo.
Transmitir uma mensagem para todos os dispositivos online: Baixar PubBroadcastDemo.
Transmitir uma mensagem para todos os dispositivos inscritos em um tópico específico: Baixar BroadcastDemo.