Use a ponte de dispositivo IoT Central para conectar outras nuvens IoT à IoT Central
A ponte de dispositivo do IoT Central é uma solução de software livre que conecta outras nuvens IoT, como Sigfox, Particle Device Cloud e The Things Network, ao seu aplicativo IoT Central. A ponte de dispositivo funciona encaminhando dados de dispositivos conectados a outras nuvens IoT por meio de seu aplicativo IoT Central. A ponte de dispositivo apenas encaminha dados para o IoT Central, não envia comandos ou atualizações de propriedade do IoT Central de volta para os dispositivos.
A ponte de dispositivos permite combinar o poder do IoT Central com dispositivos como:
- Dispositivos de rastreamento de ativos conectados à rede de área ampla de baixo consumo de energia da Sigfox.
- Dispositivos de monitoramento da qualidade do ar na Particle Device Cloud.
- Dispositivos de monitoramento de umidade do solo na The Things Network.
Você pode usar os recursos do aplicativo IoT Central, como regras e análises nos dados, criar fluxos de trabalho nos aplicativos Power Automate e Azure Logic ou exportar os dados.
A solução de ponte de dispositivo provisiona vários recursos do Azure em sua assinatura do Azure que funcionam juntos para transformar e encaminhar mensagens do dispositivo para a Central de IoT.
Pré-requisitos
Para concluir as etapas neste guia de instruções, você precisará de:
Uma assinatura ativa do Azure. Se você não tiver uma assinatura do Azure, crie uma conta gratuita antes de começar.
Um aplicativo do IoT Central criado usando o modelo de Aplicativo personalizado. Para saber mais, confira Criar um aplicativo do IoT Central e Sobre o aplicativo.
Visão geral
A ponte de dispositivo do IoT Central é uma solução de software livre no GitHub. Ela usa um modelo personalizado do Azure Resource Manager para implantar vários recursos em sua assinatura do Azure, incluindo um aplicativo de funções do Azure Functions.
O aplicativo de funções é a peça central da ponte do dispositivo. Ele recebe solicitações HTTP POST de outras plataformas IoT por meio de um webhook simples. O repositório do Azure IoT Central Device Bridge inclui exemplos que mostram como conectar as nuvens Sigfox, Particle e The Things Network. Você pode estender esta solução para se conectar à sua nuvem IoT personalizada se sua plataforma puder enviar solicitações HTTP POST para seu aplicativo de funções.
O aplicativo de função transforma os dados em um formato aceito pela IoT Central e os encaminha usando o serviço de provisionamento de dispositivo e APIs de cliente do dispositivo:
Se seu aplicativo IoT Central reconhecer o ID do dispositivo na mensagem encaminhada, a telemetria do dispositivo aparecerá na IoT Central. Se o aplicativo IoT Central não reconhecer a ID do dispositivo, o aplicativo de função tentará registrar um novo dispositivo com a ID do dispositivo. O novo dispositivo aparece como um dispositivo não atribuído na página Dispositivos em seu aplicativo IoT Central. Na página Dispositivos, você pode atribuir o novo dispositivo a um modelo de dispositivo e, em seguida, visualizar a telemetria.
Implantar a ponte de dispositivo
Para implantar a ponte do dispositivo em sua assinatura:
No aplicativo do IoT Central, navegue até a página Permissões > Grupos de conexão de dispositivo.
Anote a ID do Escopo. Você usa esse valor ao implantar a ponte do dispositivo.
Na mesma página, abra o grupo de inscrição SAS-IOT-Devices. Na página de grupo SAS-IOT-Devices, copie a chave primária. Você usa esse valor ao implantar a ponte do dispositivo.
Use o botão Implantar no Azure a seguir para abrir o modelo personalizado do Gerenciador de Recursos que implanta o aplicativo de função em sua assinatura. Use o Escopo da ID e a Chave primária da etapa anterior:
Depois que a implantação for concluída, você precisará instalar os pacotes npm que a função requer:
No portal do Azure, abra o aplicativo de funções que foi implantado em sua assinatura. Em seguida, acesse Console> das Ferramentas de Desenvolvimento. No console, execute os seguintes comandos para instalar os pacotes:
cd IoTCIntegration npm install
Esses comandos podem levar vários minutos para serem executados. Você pode ignorar com segurança qualquer mensagem de aviso.
Após a conclusão da instalação do pacote, selecione Reiniciar na página Visão geral do aplicativo de funções:
A função agora está pronta para uso. Os sistemas externos podem usar solicitações HTTP POST para enviar dados de dispositivo por meio da ponte do dispositivo para seu aplicativo IoT Central. Para obter a URL da função, navegue até Functions > IoTCIntegration > Codificar + Testar > Obter URL da função:
Os corpos das mensagens enviadas para a ponte do dispositivo devem ter o seguinte formato:
"device": {
"deviceId": "my-cloud-device"
},
"measurements": {
"temp": 20.31,
"pressure": 50,
"humidity": 8.5,
"ledColor": "blue"
}
Cada chave no objeto measurements
deve corresponder ao nome de um tipo de telemetria no modelo do dispositivo no aplicativo IoT Central. Esta solução não suporta a especificação do ID da interface no corpo da mensagem. Portanto, se duas interfaces diferentes tiverem um tipo de telemetria com o mesmo nome, a medição aparecerá em ambos os fluxos de telemetria em seu aplicativo IoT Central.
Você pode incluir um campo timestamp
no corpo para especificar a data e hora UTC da mensagem. Este campo deve estar no formato ISO 8601. Por exemplo, 2020-06-08T20:16:54.602Z
. Se você não incluir um carimbo de data/hora, a data e a hora atuais serão usadas.
Você pode incluir um campo modelId
no corpo. Use esse campo para atribuir o dispositivo a um modelo de dispositivo durante o provisionamento.
O deviceId
deve ser alfanumérico, minúsculo e pode conter hifens.
Se você não incluir o campo modelId
ou se o IoT Central não reconhecer o ID do modelo, uma mensagem com um deviceId
não reconhecido cria um novo dispositivo não atribuído no IoT Central. Uma operadora pode migrar manualmente o dispositivo para o modelo de dispositivo correto. Para saber mais, confira Gerenciar dispositivos no aplicativo Azure IoT Central > Como migrar dispositivos para um modelo.
Observação
Até que o dispositivo seja atribuído a um modelo, todas as chamadas HTTP para a função retornam um status de erro 403.
Para mudar o registro em log para o aplicativo de funções com o Application Insights, navegue até Monitoramento > Logs no aplicativo de funções no portal do Azure. Selecione Ativar o Application Insights.
Recursos provisionados
O modelo do Resource Manager provisiona os seguintes recursos em sua assinatura do Azure:
- Aplicativo de funções
- Plano do Serviço de Aplicativo
- Conta de armazenamento
- Key vault
O Key Vault armazena a chave de grupo SAS para seu aplicativo IoT Central.
O aplicativo de funções é executado em um plano de consumo. Embora essa opção não ofereça recursos de computação dedicados, ela permite que a ponte de dispositivo trate centenas de mensagens de dispositivo por minuto, adequado para frotas menores de dispositivos ou dispositivos que enviam mensagens com menos frequência. Se o seu aplicativo depende da transmissão de um grande número de mensagens do dispositivo, substitua o plano de consumo por um plano de serviço de aplicativo dedicado. Este plano oferece recursos de computação dedicados, que proporcionam tempos de resposta do servidor mais rápidos. Usando um Plano de Serviço de Aplicativo padrão, o desempenho máximo observado da função do Azure nesse repositório foi de cerca de 1.500 mensagens de dispositivo por minuto. Para saber mais, confira Opções de hospedagem do Azure Functions.
Para usar um Plano de Serviço de Aplicativo dedicado em vez de um plano de consumo, edite o modelo personalizado antes de implantar. Selecione Editar modelo.
Substitua os seguintes segmentos:
{
"type": "Microsoft.Web/serverfarms",
"apiVersion": "2015-04-01",
"name": "[variables('planName')]",
"location": "[resourceGroup().location]",
"properties": {
"name": "[variables('planName')]",
"computeMode": "Dynamic",
"sku": "Dynamic"
}
},
por
{
"type": "Microsoft.Web/serverfarms",
"sku": {
"name": "S1",
"tier": "Standard",
"size": "S1",
"family": "S",
"capacity": 1
},
"kind": "app",
"name": "[variables('planName')]",
"apiVersion": "2016-09-01",
"location": "[resourceGroup().location]",
"tags": {
"iotCentral": "device-bridge",
"iotCentralDeviceBridge": "app-service-plan"
},
"properties": {
"name": "[variables('planName')]"
}
},
Em seguida, edite o modelo a ser incluído "alwaysOn": true
na configuração dofunctionapp
recurso em "properties": {"SiteConfig": {...}}
A configuração alwaysOn garante que o aplicativo de funções esteja sempre em execução.
Exemplos
Os exemplos a seguir descrevem como configurar a ponte do dispositivo para várias nuvens IoT:
Exemplo 1: conectando dispositivos de partículas por meio da ponte do dispositivo
Para conectar um dispositivo de partículas por meio da ponte do dispositivo para IoT Central, vá para Console de partículas e crie uma nova integração de webhook. Defina o formato da solicitação como JSON. Em Configurações avançadas, use o seguinte formato de corpo personalizado:
{
"device": {
"deviceId": "{{{PARTICLE_DEVICE_ID}}}"
},
"measurements": {
"{{{PARTICLE_EVENT_NAME}}}": "{{{PARTICLE_EVENT_VALUE}}}"
}
}
Cole a URL de função de seu aplicativo de funções e você verá os dispositivos de partículas aparecerem como dispositivos não atribuídos na IoT Central. Para saber mais, consulte Veja como integrar seus projetos baseados em partículas com a postagem do blog Azure IoT Central.
Exemplo 2: conectando dispositivos Sigfox através da ponte de dispositivo
Algumas plataformas podem não permitir que você especifique o formato das mensagens de dispositivo enviadas por meio de um webhook. Para tais sistemas, você deve converter a carga útil da mensagem para o formato do corpo esperado antes que a ponte de dispositivo a processe. Você pode fazer a conversão na mesma função que executa a ponte de dispositivo.
Esta seção mostra como converter a carga útil de uma integração de webhook Sigfox para o formato do corpo esperado pela ponte do dispositivo. A nuvem Sigfox transmite dados do dispositivo em um formato de cadeia de caracteres hexadecimal. Por conveniência, a ponte de dispositivo inclui uma função de conversão para este formato, que aceita um subconjunto dos tipos de campo possíveis em uma carga útil de dispositivo Sigfox: int
e uint
de 8, 16, 32 ou 64 bits; float
de 32 bits ou 64 bits; little-endian e big-endian. Para processar mensagens de uma integração de webhook do Sigfox, faça as seguintes alterações no arquivo IoTCIntegration/index.js no aplicativo de funções.
Para converter a carga da mensagem, adicione o seguinte código antes da chamada para handleMessage
na linha 21, substituindo payloadDefinition
pela sua definição de carga Sigfox:
const payloadDefinition = 'gforce::uint:8 lat::uint:8 lon::uint:16'; // Replace this with your payload definition
req.body = {
device: {
deviceId: req.body.device
},
measurements: require('./converters/sigfox')(payloadDefinition, req.body.data)
};
Os dispositivos Sigfox esperam um 204
código de resposta. Adicione o seguinte código após a chamada para handleMessage
na linha 21:
context.res = {
status: 204
};
Exemplo 3: Conectando dispositivos da The Things Network por meio da ponte de dispositivos
Para conectar os dispositivos The Things Network à IoT Central:
- Adicione uma nova integração de HTTP ao aplicativo na The Things Network: Aplicativos > Integrações > adicionar integração > Integração de HTTP.
- Verifique se o aplicativo inclui uma função de decodificador que converte automaticamente o conteúdo das mensagens de dispositivo em JSON antes do envio para a função: Aplicativo > Funções de Conteúdo > decodificador.
O exemplo a seguir mostra uma função de decodificador JavaScript que você pode usar para decodificar tipos numéricos comuns de dados binários:
function Decoder(bytes, port) {
function bytesToFloat(bytes, decimalPlaces) {
var bits = (bytes[3] << 24) | (bytes[2] << 16) | (bytes[1] << 8) | bytes[0];
var sign = (bits >>> 31 === 0) ? 1.0 : -1.0;
var e = bits >>> 23 & 0xff;
var m = (e === 0) ? (bits & 0x7fffff) << 1 : (bits & 0x7fffff) | 0x800000;
var f = Math.round((sign * m * Math.pow(2, e - 150)) * Math.pow(10, decimalPlaces)) / Math.pow(10, decimalPlaces);
return f;
}
function bytesToInt32(bytes, signed) {
var bits = bytes[0] | (bytes[1] << 8) | (bytes[2] << 16) | (bytes[3] << 24);
var sign = 1;
if (signed && bits >>> 31 === 1) {
sign = -1;
bits = bits & 0x7FFFFFFF;
}
return bits * sign;
}
function bytesToShort(bytes, signed) {
var bits = bytes[0] | (bytes[1] << 8);
var sign = 1;
if (signed && bits >>> 15 === 1) {
sign = -1;
bits = bits & 0x7FFF;
}
return bits * sign;
}
return {
temperature: bytesToFloat(bytes.slice(0, 4), 2),
presscounter: bytesToInt32(bytes.slice(4, 8), true),
blueLux: bytesToShort(bytes.slice(8, 10), false)
};
}
Depois de definir a integração, adicione o código a seguir antes da chamada para handleMessage
na linha 21 do arquivo IoTCIntegration/index.js do seu aplicativo de funções. Este código traduz o corpo de sua integração HTTP para o formato esperado.
req.body = {
device: {
deviceId: req.body.end_device_ids.device_id.toLowerCase()
},
measurements: req.body.uplink_message.decoded_payload
};
Observação
O snippet anterior usa a ID do dispositivo amigável. A mensagem da The Things Network também inclui uma ID técnica que você pode acessar usando req.body.dev_eui.toLowerCase()
. Para saber mais, confira The Things Network – Formatos de dados.
Limitações
A ponte do dispositivo apenas encaminha mensagens para IoT Central e não envia mensagens de volta aos dispositivos. Essa limitação é o motivo pelo qual as propriedades e os comandos não funcionam para dispositivos que se conectam ao IoT Central por meio dessa ponte de dispositivo. Como as operações de dispositivo duplo não são suportadas, não é possível atualizar as propriedades do dispositivo por meio da ponte de dispositivo. Para usar esses recursos, um dispositivo deve se conectar diretamente ao IoT Central usando um dos SDKs do dispositivo IoT do Azure.
Próximas etapas
Agora que você aprendeu como implantar a ponte de dispositivo IoT Central, esta é a próxima etapa sugerida: