Manifiesto de aplicación
El manifiesto de aplicación describe los recursos, también conocidos como funcionalidades de la aplicación, que requiere una aplicación. Cada aplicación tiene un manifiesto de aplicación.
Las aplicaciones deberán elegir usar las funcionalidades al enumerar cada recurso necesario en la sección Capabilities del manifiesto de aplicación; ninguna funcionalidad está habilitada de forma predeterminada. Si una aplicación solicita una funcionalidad que no aparece, se produce un error en la solicitud. Si el archivo del manifiesto de aplicación contiene errores, se produce un error al intentar la transferencia local de la aplicación. El manifiesto de cada aplicación debe almacenarse como app_manifest.json en el directorio raíz de la carpeta de la aplicación en el equipo.
Las plantillas de Azure Sphere crean automáticamente un manifiesto de aplicación predeterminado cuando se crea una aplicación. Debe editar el manifiesto predeterminado para enumerar las capacidades que requiere la aplicación. Cada ejemplo de Azure Sphere incluye un manifiesto de aplicación. Si basa la aplicación en un ejemplo, probablemente también necesitará editar el manifiesto.
Los distintos dispositivos de Azure Sphere pueden exponer las características del chip de maneras diferentes. Como resultado, el valor que se usa en el manifiesto para identificar una característica determinada, como el pin de un GPIO, puede variar en función del hardware para el que se está desarrollando. Administrar las dependencias del hardware de destino aporta más información sobre los destinos de hardware para una aplicación de alto nivel. En el manifiesto de aplicación de una aplicación de alto nivel, use las constantes definidas en el archivo JSON en la carpeta HardwareDefinitions del directorio de instalación del SDK de Microsoft Azure Sphere. La ubicación exacta del directorio de instalación variará en Windows y Linux. En una aplicación con respuesta en tiempo real (RTApp), use los valores sin formato que se enumeran en Contenido del manifiesto de aplicación.
Cuando una aplicación se transfiere localmente o se implementa en el dispositivo, el entorno de ejecución de Azure Sphere lee el manifiesto de aplicación para determinar qué funcionalidades de la aplicación tiene permiso para usar. Los intentos por acceder a los recursos que no aparecen en el manifiesto generarán errores de API, como EPERM (permiso denegado). Solo una aplicación del dispositivo puede utilizar un recurso. Si instala una aplicación que solicita un recurso que ya está en uso, se producirá un error en el intento.
Contenido del manifiesto de aplicación
El manifiesto de aplicación incluye los siguientes elementos:
Nombre | Descripción |
---|---|
SchemaVersion | Versión del esquema del manifiesto de aplicación en uso. Actualmente debe ser 1. Necesario. |
Nombre | Nombre de la aplicación. Durante la creación del proyecto, este valor se establece en el nombre del proyecto. El nombre puede ser cualquier longitud, pero solo los primeros 31 caracteres se almacenan en el paquete de imágenes; por lo tanto, el nombre aparece truncado en las consultas sobre el paquete de imágenes. Necesario. |
ComponentId | Id. del componente. Visual Studio crea este identificador cuando compila la aplicación. Si no usa Visual Studio, consulte Generación de un identificador de componente para obtener información sobre cómo crear el identificador. Necesario. |
EntryPoint | Nombre del archivo ejecutable junto con la ruta de acceso relativa en la imagen del sistema de archivos de la aplicación, que se crea cuando se compila la aplicación. Actualmente, Visual Studio usa /bin/app para este valor. Necesario. |
CmdArgs | Argumentos que se pasarán a la aplicación en el arranque. Encierre cada argumento entre comillas dobles y separe los argumentos con una coma. Opcional. |
TargetBetaApis | Especifica que la aplicación requiere las API Beta e identifica el conjunto de API Beta que se usa. Este campo se agrega automáticamente durante el proceso de compilación si la aplicación se compila con las API Beta. Opcional. Consulte Uso de las características beta para más información. |
ApplicationType | Tipo de aplicación. Opcional. Establezca en Debugger solo si está compilando un reemplazo para gdbserver. |
Capabilities | Lista de pares clave/valor que especifican los requisitos de recursos de aplicación. Necesario. |
MallocVersion | Entero que especifica la versión de malloc, donde 1=standard y 2=mallocng, un malloc mejorado disponible en las versiones MUSL superiores a 1.2.1. Se recomienda la versión 2 para todo el desarrollo de aplicaciones nuevas. |
La sección Capabilities admite lo siguiente:
Nota:
Las aplicaciones de alto nivel pueden utilizar valores de funcionalidad de archivos de definición del hardware o pueden usar valores sin formato. Sin embargo, no puede mezclar ambos tipos de valor en la misma funcionalidad. RTApps solo puede usar valores sin procesar para las funcionalidades.
Nombre | Descripción |
---|---|
Adc | Controlador de conversión analógica a digital (ADC) que usa la aplicación. Esta funcionalidad reserva el controlador de ADC completo (que comprende un bloque de 8 pines), no solo el pin 0 del bloque. En una aplicación de alto nivel, especifique el nombre del periférico que se declara en el archivo de encabezado de definición de hardware. En una RTApp, especifique el valor AppManifestValue que se declara en el archivo JSON de definición de hardware. Ejemplo de definición de hardware: "Adc": [ "$MT3620_RDB_ADC_CONTROLLER0" ] Ejemplo de valor sin formato: "Adc": [ "ADC-CONTROLLER-0" ] Referencia de API: Applibs adc.h Conceptual: Uso de ADC en Azure Sphere |
AllowedApplicationConnections | Lista de identificadores de componente de aplicación a los que se permite la conexión de la aplicación. Ejemplo: "AllowedApplicationConnections": [ "005180BC-402F-4CB3-A662-72937DBCDE47" ] Referencia de API: Applibs application.h Conceptual: Comunicarse con una aplicación de alto nivel |
AllowedConnections | Lista de nombres de host DNS o direcciones IP (IPv4) a los que la aplicación tiene permiso para conectarse. Si la aplicación usa una instancia de Azure IoT Hub, la lista debe incluir la dirección IP o el nombre de host DNS para el centro, normalmente nombre-centro.azure-devices.net. No se aceptan números de puerto ni caracteres comodín en nombres y direcciones IP. Ejemplo: "AllowedConnections" : [ "my-hub.example.net", "global.azure-devices-provisioning.net" ] |
AllowedTcpServerPorts | Lista de puertos que permiten el tráfico TCP entrante. Puede incluir hasta 10 puertos y se debe enumerar individualmente cada puerto. Los puertos admitidos son del 1024 al 65535. Puede especificar los mismos puertos para TCP y UDP. Sin embargo, si especifica el mismo puerto para más de una aplicación en el dispositivo, la segunda aplicación que se ejecute producirá un error al cargar. Ejemplo: "AllowedTcpServerPorts": [ 1024, 65535 ] |
AllowedUdpServerPorts | Lista de puertos que permiten el tráfico UDP entrante. Puede incluir hasta 10 puertos y se debe enumerar individualmente cada puerto. Los puertos admitidos son del 1024 al 65535. Puede especificar los mismos puertos para TCP y UDP. Sin embargo, si especifica el mismo puerto para más de una aplicación en el dispositivo, la segunda aplicación que se ejecute producirá un error al cargar. Ejemplo: "AllowedUdpServerPorts": [ 1024, 50000 ] |
CertStore | Valor booleano que indica si una aplicación de alto nivel tiene permiso para administrar certificados con certStore API: true para habilitar la API; de lo contrario, false. Ejemplo: "CertStore" : true |
DeviceAuthentication | Cadena que especifica el UUID del inquilino de Azure Sphere (heredado) que se va a usar para la autenticación de dispositivos. Ejemplo: "DeviceAuthentication": "77304f1f-9530-4157-8598-30bc1f3d66f0" |
DhcpService | Valor booleano que indica si la aplicación tiene permiso para configurar el servicio DHCP: true si la aplicación tiene la funcionalidad; de lo contrario, false. Ejemplo: "DhcpService" : true Referencia de API: Applibs networking.h Conceptual: Uso de servicios de red |
EnterpriseWifiConfig | Valor booleano que indica si una aplicación de alto nivel tiene permiso para crear una red EAP-TLS y asociar certificados a ella: true si la aplicación tiene la funcionalidad; de lo contrario, false. Ejemplo: "EnterpriseWifiConfig" : true |
ExternalInterrupt | Lista de interrupciones externas que usa una RTApp. Esta funcionalidad no está disponible para las aplicaciones de alto nivel. Ejemplo: "ExternalInterrupt": [ "EINT4", "EINT12" ] |
Gpio | Lista de los GPIO que usa la aplicación. En una aplicación de alto nivel, especifique el nombre del GPIO que se declara en el archivo de encabezado de definición de hardware, por ejemplo, $MT3620_RDB_LED1_RED. En una RTApp, especifique los enteros que corresponden a los números de GPIO en el archivo JSON de definición de hardware. Por ejemplo, 8 especifica el GPIO 8. Ejemplo de definición de hardware: "Gpio": [ "$MT3620_RDB_HEADER1_PIN6_GPIO", "$MT3620_RDB_LED1_RED", "$MT3620_RDB_BUTTON_A" ] Ejemplo de valor sin formato: "Gpio": [ 8, 12 ] Referencia de API: Applibs gpio.h Conceptual: Uso de GPIOs en Azure Sphere |
HardwareAddressConfig | Valor booleano que indica si la aplicación tiene permiso para configurar la dirección de hardware de la interfaz de red: true si la aplicación tiene la funcionalidad; de lo contrario, false. Ejemplo "HardwareAddressConfig" : true : Referencia de API: Applibs networking.h Conceptual: Uso de servicios de red |
HeapMemStats | Valor booleano que indica si el seguimiento de asignación de memoria del montón está habilitado: true si la aplicación tiene la funcionalidad; de lo contrario, false. Ejemplo: "HeapMemStats": true Conceptual:Uso de memoria en aplicaciones de alto nivel |
I2cMaster | Lista de interfaces maestras I2C utilizadas por la aplicación. En una aplicación de alto nivel, especifique el nombre del periférico que se declara en el archivo de encabezado de definición de hardware. En una RTApp, especifique el valor AppManifestValue que se declara en el archivo JSON de definición de hardware. Ejemplo de definición de hardware: "I2cMaster": [ "$MT3620_RDB_HEADER2_ISU0_I2C", "$MT3620_RDB_HEADER4_ISU1_I2C" ] Ejemplo de valor sin formato: "I2cMaster": [ "ISU0", "ISU1" ] Referencia de API: Applibs i2c.h Conceptual: Uso de I2C con Azure Sphere |
I2sSubordinate | La interfaz subordinada de Inter-IC Sound (I2S) utilizada por una RTApp. Esta funcionalidad no está disponible para las aplicaciones de alto nivel. Ejemplo de valor sin formato: "I2sSubordinate": [ "I2S0", "I2S1" ] |
MutableStorage | Configuración del almacenamiento mutable que permite que la aplicación utilice el almacenamiento persistente. Ejemplo: "MutableStorage" : { "SizeKB": 64, } Referencia de API: Applibs storage.h Conceptual: Uso del almacenamiento en Azure Sphere |
NetworkConfig | Valor booleano que indica si la aplicación tiene permiso para configurar una interfaz de red: true si la aplicación tiene la funcionalidad; de lo contrario, false. Ejemplo: "NetworkConfig" : true Referencia de API: Applibs networking.h Conceptual: Uso de servicios de red |
PowerControls | Matriz de cadenas que representan funcionalidades pormenorizadas para controlar el estado de energía del dispositivo. ForcePowerDown y ForceReboot son los únicos valores admitidos. Advertencia: Dado que ForcePowerDown y ForceReboot permiten que una aplicación finalice inmediatamente todas las aplicaciones, debe asegurarse de que el dispositivo sigue siendo capaz de recibir actualizaciones del sistema operativo y de la aplicación. Para más información e instrucciones, consulte Apagado forzado y actualizaciones. Ejemplo: "PowerControls": ["ForcePowerDown", "ForceReboot"] Referencia de API: Applibs powermanagement.h Conceptual: Administración del estado de apagado para dispositivos de Azure Sphere |
Pwm | Modulador de ancho de pulso (PWM) que usa la aplicación. En una aplicación de alto nivel, especifique el nombre del periférico que se declara en el archivo de encabezado de definición de hardware. En una RTApp, especifique el valor AppManifestValue que se declara en el archivo JSON de definición de hardware. Ejemplo de definición de hardware: "Pwm": [ "$MT3620_RDB_LED_PWM_CONTROLLER2" ] Ejemplo de valor sin formato: "Pwm": [ "PWM-CONTROLLER-0" ] Referencia de API: Applibs pwm.h Conceptual: Uso de PWM en aplicaciones de alto nivel |
ReadNetworkProxyConfig | Valor booleano que indica si la aplicación tiene permiso para recuperar la configuración del proxy: true si la aplicación tiene la funcionalidad; de lo contrario, false. Ejemplo: "ReadNetworkProxyConfig": true Referencia de API: Applibs networking.h Conceptual: Conexión a servicios web |
SntpService | Valor booleano que indica si la aplicación tiene permiso para configurar el servicio SNTP: true si la aplicación tiene la funcionalidad; de lo contrario, false. Ejemplo: "SntpService" : true Referencia de API: Applibs networking.h Conceptual: servidor SNTP |
SoftwareUpdateDeferral | Valor booleano que indica si la aplicación tiene permiso para aplazar las actualizaciones de software durante un período limitado: true si la aplicación tiene la funcionalidad; de lo contrario, false. Ejemplo: "SoftwareUpdateDeferral" : true Referencia de API: Applibs eventloop.h Conceptual: aplazar actualizaciones de dispositivos |
SpiMaster | Lista de interfaces maestras SPI utilizadas por la aplicación. En una aplicación de alto nivel, especifique el nombre del periférico que se declara en el archivo de encabezado de definición de hardware. En una RTApp, especifique el valor AppManifestValue que se declara en el archivo JSON de definición de hardware. Ejemplo de definición de hardware: "SpiMaster": [ "$MT3620_RDB_HEADER2_ISU0_SPI", "$MT3620_RDB_HEADER4_ISU1_SPI" ] Ejemplo de valor sin formato: "SpiMaster": [ "ISU0", "ISU1" ] Referencia de API: Applibs spi.h Conceptual: Uso de SPI con Azure Sphere |
SystemEventNotifications | Valor booleano que indica si la aplicación tiene permiso para recibir notificaciones de eventos del sistema: true si la aplicación tiene la funcionalidad; de lo contrario, false. Ejemplo: "SystemEventNotifications" : true Referencia de API: Applibs sysevent.h Conceptual: aplazar actualizaciones de dispositivos |
SystemTime | Valor booleano que indica si la aplicación tiene permiso para configurar la hora del sistema: true si la aplicación tiene la funcionalidad; de lo contrario, false. Ejemplo: "SystemTime" : true Referencia de API: Applibs rtc.h Conceptual: Administración de la hora del sistema y el RTC en Azure Sphere |
TimeSyncConfig | Valor booleano que indica si la aplicación tiene permiso para configurar el servicio de sincronización temporal: true si la aplicación tiene la funcionalidad; de lo contrario, false. Ejemplo: "TimeSyncConfig" : true |
Uart | Lista de periféricos UART que la aplicación usa. Esta funcionalidad no habilita el UART dedicado en una placa de desarrollo MT3620. Para obtener información sobre el UART dedicado, consulte Compilación de una aplicación con respuesta en tiempo real. En una aplicación de alto nivel, especifique el nombre del periférico que se declara en el archivo de encabezado de definición de hardware. En una RTApp, especifique el valor AppManifestValue que se declara en el archivo JSON de definición de hardware. Ejemplo de definición de hardware: "Uart": [ "$MT3620_RDB_HEADER2_ISU0_UART", "$MT3620_RDB_HEADER4_ISU1_UART" ] Ejemplo de valor sin formato: "Uart": [ "ISU0", "ISU1" ] Referencia de API: Applibs uart.h Conceptual: Uso de UART en Azure Sphere |
WifiConfig | Valor booleano que indica si la aplicación tiene permiso para usar la API WifiConfig para cambiar la configuración de Wi-Fi: true si la aplicación tiene la funcionalidad; de lo contrario, false. Ejemplo: "WifiConfig" : true Referencia de API: Applibs wificonfig.h Conceptual: Configuración de redes |
La sección MutableStorage admite lo siguiente:
Nombre | Descripción |
---|---|
SizeKB | Entero que especifica el tamaño del almacenamiento mutable en kibibytes. El valor máximo es 64. Un valor de 0 equivale a no tener capacidad de almacenamiento mutable. |
Ejemplo
A continuación se muestra un archivo app_manifest.json de ejemplo para una aplicación de alto nivel que tiene como destino el hardware de la RDB MT3620:
{
"SchemaVersion": 1,
"Name": "MyTestApp",
"ComponentId": "072c9364-61d4-4303-86e0-b0f883c7ada2",
"EntryPoint": "/bin/app",
"CmdArgs": ["-m", "262144", "-t", "1"],
"Capabilities": {
"AllowedConnections" : [
"my-hub.example.net",
"contoso.azure-devices.net",
"global.azure-devices-provisioning.net" ],
"AllowedTcpServerPorts": [ 1024, 65535 ],
"AllowedUdpServerPorts": [ 1024, 50000 ],
"DeviceAuthentication": "77304f1f-9530-4157-8598-30bc1f3d66f0",
"Gpio": [ "$MT3620_RDB_HEADER1_PIN6_GPIO", "$MT3620_RDB_LED1_RED", "$MT3620_RDB_BUTTON_A" ],
"HardwareAddressConfig": true,
"I2cMaster": [ "ISU2" ],
"MutableStorage" : {
"SizeKB": 64,
},
"SpiMaster": [ "ISU1" ],
"SystemTime" : true,
"Uart": [ "ISU0" ],
"WifiConfig" : true
},
"ApplicationType": "Default",
"MallocVersion": 2
}
El archivo de ejemplo app_manifest.json para MyTestApp hace lo siguiente:
- Pasa cuatro argumentos de la línea de comandos a la aplicación.
- Solo permite conexiones a los hosts DNS my-hub.example.net, contoso.azure-devices.net y global.azure-dispositivos-provisioning.net.
- Permite el tráfico TCP entrante en los puertos 1024 y 65535.
- Permite el tráfico UDP entrante en los puertos 1024 y 50000.
- Especifica un UUID de inquilino de Azure Sphere (heredado) que se usará para la autenticación de dispositivos y permite las conexiones al servicio Device Provisioning.
- Especifica el uso de tres GPIO.
- Permite a la aplicación configurar la dirección de hardware de la interfaz de red.
- Especifica el uso de un UART periférico.
- Habilita el almacenamiento mutable con 64 kibibytes de espacio de almacenamiento.
- Permite que la aplicación utilice la API WifiConfig para cambiar la configuración de la red Wi-Fi.
- Especifica el uso de una interfaz maestra SPI.
- Especifica el uso de una interfaz maestra I2C.
- Permite a la aplicación configurar la hora del sistema mediante RTC API.
- Habilita mallocng para el desarrollo de aplicaciones.