Este tópico descreve como configurar uma assinatura do lado do servidor para enviar notificações de alteração de status do dispositivo de um produto para uma fila da Simple Message Queue (antigo MNS) (SMQ). Seu servidor pode receber essas notificações ao escutar a fila MNS.
Pré-requisitos
-
Verifique se os seguintes serviços da Alibaba Cloud estão ativados:
-
Prepare um ambiente de desenvolvimento. Este exemplo utiliza o seguinte ambiente Java:
Sistema operacional: Windows 10 de 64 bits
Versão do JDK: JDK 8
Ambiente de desenvolvimento integrado (IDE): IntelliJ IDEA Community Edition
Configure uma assinatura do lado do servidor
No console do IoT Platform, crie uma assinatura do lado do servidor para MNS e selecione os tipos de mensagem desejados.
Faça login no console do IoT Platform.
Na página Overview, localize a instância que deseja gerencie e clique em no ID ou no nome da instância.
No painel de navegação à esquerda, escolha . Em seguida, clique em Create Product para crie um produto de detector de gás.
-
Escolha para crie um dispositivo no produto de detector de gás.
O certificado do dispositivo é necessário durante a configuração do SDK do lado do dispositivo.
-
No painel de navegação à esquerda, escolha . Depois, clique em Create Subscription para crie uma assinatura do lado do servidor para MNS. Para mais informações, consulte Usar assinaturas do lado do servidor para MNS.
NotaAo configurar o encaminhamento de mensagens para o MNS pela primeira vez, clique em Authorize na mensagem solicitada. Você será redirecionado ao console do RAM para conceder acesso do IoT Platform ao MNS.
Neste exemplo, selecione Device Status Change Notification como tipo de mensagem. Isso garante que todas as notificações de alteração de status do dispositivo para o produto sejam enviadas à fila MNS.
Após a criação da assinatura, o IoT Platform cria automaticamente uma fila no MNS para receber mensagens. O nome da fila segue o formato
aliyun-iot-${yourProductKey}. Utilize esse nome de fila ao configurar o SDK do MNS para escutar mensagens.Na lista de assinaturas, clique em no ícone ao lado de MNS para visualize o nome da fila MNS.
Configure o SDK do MNS no servidor
Este exemplo utiliza a demonstração do SDK do MNS para Java.
-
Acesse as Notas de versão do SDK do MNS para Java, baixe o pacote de amostra e descompacte-o.
Este exemplo usa o pacote de amostra aliyun-sdk-mns-samples-1.1.9.1.zip.
No IntelliJ IDEA, importe a pasta aliyun-sdk-mns-samples-1.1.9.1 como um projeto.
-
Em seu diretório local, em C:\Users\${YourComputerUserName}, crie um arquivo de propriedades chamado .aliyun-mns.properties. Nesse arquivo, adicione suas credenciais de autenticação do MNS no seguinte formato:
NotaO diretório home no Linux é /home/YOURNAME/. No Windows, o diretório home é C:\Users\YOURNAME.
mns.accountendpoint=http://${your_accountId}.mns.${your_regionId}.aliyuncs.com mns.accesskeyid=${your_accesskeyid} mns.accesskeysecret=${your_accesskeysecret}Parâmetro
Descrição
accountendpoint
Endpoint do seu serviço MNS. Encontre essa informação no console do Message Service (MNS). Selecione a região onde sua fila está localizada e clique em Details para a fila.
accesskeyid
O AccessKey ID e o AccessKey secret da sua conta Alibaba Cloud.
Faça login no console do IoT Platform, passe o ponteiro sobre a foto do perfil e clique em AccessKey Management para obter o AccessKey ID e o AccessKey secret.
accesskeysecret
-
No arquivo ComsumerDemo.java, localizado no diretório src\main\java\com.aliyun.mns.sample.Queue, especifique o nome da fila da Simple Message Queue (antigo MNS) criada automaticamente pelo IoT Platform.
public static void main(String[] args) { CloudAccount account = new CloudAccount( ServiceSettings.getMNSAccessKeyId(), ServiceSettings.getMNSAccessKeySecret(), ServiceSettings.getMNSAccountEndpoint()); MNSClient client = account.getMNSClient(); // Initialize the client. // Consume messages. try{ CloudQueue queue = client.getQueueRef("aliyun-iot-a1eN7La****");// Replace this with the queue name automatically created by IoT Platform. for (int i = 0; i < 10; i++) { Message popMsg = queue.popMessage(); // Pop a message from the queue. if (popMsg != null){ System.out.println("message handle: " + popMsg.getReceiptHandle()); System.out.println("message body: " + popMsg.getMessageBodyAsString()); // Get the raw message body. System.out.println("message id: " + popMsg.getMessageId()); System.out.println("message dequeue count:" + popMsg.getDequeueCount()); // Add your message processing logic here. // Delete the message from the queue. queue.deleteMessage(popMsg.getReceiptHandle()); System.out.println("delete message successfully.\n"); } } } catch (Exception e) { e.printStackTrace(); } } Execute o arquivo ComsumerDemo.java.
Configure o SDK do lado do dispositivo
Acesse o Link SDK e selecione o SDK para Java.
-
Baixe a demonstração do Link SDK para Java e descompacte o pacote.
NotaAo baixar esta demonstração, você concorda com o Contrato de Licença de Software.
No IntelliJ IDEA, importe o projeto JavaLinkKitDemo.
-
No arquivo device_id, insira as informações do certificado do seu dispositivo.
{ "productKey": "xxx", "deviceName": "Esensor", "productSecret": "", "deviceSecret": "1xxx?2" } -
No arquivo MqttSample.java, localizado no diretório src\main\java\com.aliyun.alink.devicesdk.demo, defina o tópico de publicação como o tópico do seu dispositivo.
public class MqttSample extends BaseSample { final static String TAG = "MqttSample"; public MqttSample(String pk, String dn) { super(pk, dn); } /** * An example of the publishing API. */ public void publish() { MqttPublishRequest request = new MqttPublishRequest(); // Specify the topic based on your use case. request.topic = "/sys/" + productKey + "/" + deviceName + "/thing/deviceinfo/update"; } } -
No arquivo HelloWorld.java, localizado no diretório src\main\java\com.aliyun.alink.devicesdk.demo, insira as informações de conexão do dispositivo.
Para obter as informações de conexão do dispositivo, consulte Visualizar e configurar endpoints de instância. O formato de
channelHosté{productKey}.iot-as-mqtt.{region}.aliyuncs.com:1883. Código de exemplo:public void init(final DeviceInfoData deviceInfoData) { this.pk = deviceInfoData.productKey; this.dn = deviceInfoData.deviceName; LinkKitInitParams params = new LinkKitInitParams(); /** * Set MQTT initialization parameters. */ IoTMqttClientConfig config = new IoTMqttClientConfig(); config.productKey = deviceInfoData.productKey; config.deviceName = deviceInfoData.deviceName; config.deviceSecret = deviceInfoData.deviceSecret; config.channelHost = pk + ".iot-as-mqtt." + deviceInfoData.region + ".aliyuncs.com:1883"; /** * Specifies whether to receive offline messages. * This corresponds to the cleanSession field in MQTT. */ // ... } Execute o arquivo HelloWorld.java para conectar o dispositivo.
Verifique os resultados
Após a execução do SDK do lado do dispositivo, a notificação de dispositivo online é enviada para a fila da Simple Message Queue (antigo MNS) por meio da assinatura do lado do servidor. O SDK da Simple Message Queue (antigo MNS) consome a mensagem da fila e a exclua.
O exemplo a seguir mostra a saída quando o SDK da Simple Message Queue (antigo MNS) recebe e exclua uma mensagem com sucesso.
message handle: 519xxx...AgMA==
message body:
{"payload":"eyJsYXN0xxx...IiwiY2xpZW5xxx...","topic":"/as/mqtt/status/xxx/device1","messageid":15xxx,"timestamp":1661158432}
message id: 51xxx...C49
message dequeue count:1
delete message successfully.