Node.js
20 min
nuestros clientes a menudo necesitan comunicarse entre aplicaciones en un reproductor brightsign, o entre un reproductor brightsign y el mundo exterior esto se puede hacer utilizando varios protocolos http, serial y udp son los más populares puede escribir aplicaciones en brightscript o javascript para crear esta funcionalidad si elige escribir su aplicación en javascript, necesitará node js® para implementar funciones como alojar un servidor web en javascript brightsign pone a disposición un endpoint de node js para que nuestros socios puedan utilizar módulos y funciones de node js implementación de node js de brightsign los reproductores brightsign admiten el entorno de ejecución de node js, que se ejecuta sobre el mismo motor javascript v8 utilizado por chromium las instancias de node js® y chromium comparten un único contexto de ejecución de javascript, por lo que las aplicaciones javascript pueden acceder tanto a módulos de node js como a objetos dom al mismo tiempo el firmware de brightsign envía eventos de node js al bucle de eventos de chromium, lo que garantiza que las aplicaciones javascript reciban eventos de node js y dom sin inconvenientes la implementación de node js de brightsign se basa en los proyectos nw\ js https //github com/nwjs/nw\ js y electron https //github com/electron/electron y comparte muchas características con ellos mientras que electron utiliza un archivo javascript como punto de entrada (es decir, el archivo javascript crea una webview, que también tiene acceso al entorno de ejecución de node js), nw\ js y brightsign utilizan un archivo html como punto de entrada en un reproductor brightsign, brightscript crea una instancia de rohtmlwidget habilitada para node js; la url inicial, que se pasa cuando se inicializa rohtmlwidget , actúa como el punto de entrada para las aplicaciones node js al igual que nw\ js y electron, brightsign no utiliza sandboxing en su lugar, inicia el proceso de renderizado con un usuario y grupo de almacenamiento de node js, que tiene permisos de escritura para el almacenamiento local y permisos de lectura para todo el sistema de archivos también puede acceder a interfaces de red y utilizar puertos privilegiados la implementación integrada de node js en os 8 2 x y os 8 3 x se basa en node v10 para obtener más documentación e información de uso, consulte la documentación de la api de node js 10 0 0 https //nodejs org/dist/v10 0 0/docs/api/ node js no está habilitado para iframes ni web workers habilitación de node js la funcionalidad de objetos node js está disponible en brightsign author cuando los usuarios especifican elementos node js en configuración de la presentación docid\ a6ali6u szxhuansk6t3 los objetos node js no están disponibles en brightauthor classic node js se habilita para instancias individuales de rohtmlwidget al incluir la entrada nodejs enabled\ true en el objeto rohtmlwidget docid\ g tjkqqhlcft4fw5 z6t0 ejemplo r=createobject("rorectangle", 0,0,1920,1080) is = { 	port 3000 } config = { 	nodejs enabled true 	inspector server is 	brightsign js objects enabled true 	url "file ///sd /nodehello html" } h=createobject("rohtmlwidget", r, config) h show() no recomendamos cargar sitios web arbitrarios con node js habilitado algunas bibliotecas javascript asumen que node js se está ejecutando en una instancia con capacidades del lado del servidor, e intentarán cargar dependencias, lo que provocará que la reproducción falle si está utilizando un plugin de brightsign author para habilitar node js, deberá establecer otros parámetros deseados en el plugin, en lugar de hacerlo con un estado html5 por ejemplo, si desea habilitar el cursor del mouse, deberá establecer mouse enabled\ true durante la inicialización de rohtmlwidget , en lugar de marcar la casilla en el estado html5 seguridad entre dominios chromium tiene medidas de seguridad predeterminadas para evitar ataques de cross site scripting si la url de la instancia de rohtmlwidget es un dominio remoto, las aplicaciones javascript de ese dominio no pueden realizar solicitudes http a otros dominios; por otro lado, si la url apunta al almacenamiento local, las solicitudes a otros dominios remotos son aceptables si desea hacer referencia a otros dominios en aplicaciones remotas, establezca el parámetro seguridad web en falso al inicializar rohtmlwidget , como se muestra a continuación ejemplo r=createobject("rorectangle", 0,0,1920,1080) is = { 	port 3000 } config = { 	nodejs enabled true 	inspector server is 	brightsign js objects enabled true 	url "http //www mysitehere com" 	security params {websecurity false} } h=createobject("rohtmlwidget", r, config) h show() almacenamiento web si desea usar aplicaciones de almacenamiento javascript, deberá especificar una storage path y cuota de almacenamiento al inicializar el rohtmlwidget ejemplo r=createobject("rorectangle", 0,0,1920,1080) is = { 	port 3000 } config = { 	nodejs enabled true 	inspector server is 	brightsign js objects enabled true 	url "file ///sd /nodehello html" 	storage path "sd " 	storage quota 1073741824 } h=createobject("rohtmlwidget", r, config) h show() jquery jquery® requiere una solución alternativa para funcionar correctamente con node js (consulte esta página https //stackoverflow\ com/questions/4299363/how to use jquery selectors in node js para ver un ejemplo) esta solución alternativa requiere modificar el contenido, por lo que si no tiene control sobre la página web que habilita node en su widget html, esto puede causar un problema intratable solo debe habilitar node js si planea usarlo (por ejemplo, con nuestras api de javascript docid\ ex9tddoff9lzqcyywr 4j ) consulte también mejores prácticas de html docid 5sxjtu3n5tgs4zbrnmysu node serialport el reproductor brightsign proporciona enlaces de puerto serie de javascript para el paquete node serialport estos enlaces pueden utilizarse con la api @brightsign/serialport const serialport = require('@serialport/stream'); const brightsignbinding = require('@brightsign/serialport'); serialport binding = brightsignbinding; consulte también nuestra implementación de referencia https //github com/brightsign/bs node serialport en github recarga de aplicaciones web con node js habilitado cualquier aplicación de cliente que utilice objetos @brightsign y algunos de los objetos "bs" arrojará una excepción javascript cuando se vuelva a cargar en brightsignos 8 0 a 8 4 (aunque puede haber funcionado en os 7 x y versiones anteriores) debido a limitaciones con módulos nativos en node 10 este problema se solucionará en os 8 5 y versiones posteriores, que incluyen node 14 x también puede deshabilitar node js (y los objetos @brightsign ) si no lo necesita no se admite la recarga de node js mediante web inspector o javascript empaquetado y entrega de aplicaciones node js si está utilizando electron/chromium 110 o una versión posterior, brightsign ya no admite objetos brightscript/javascript en iframes por motivos de seguridad las solicitudes de iframes deben enviarse a parent https //nam04 safelinks protection outlook com/?url=https%3a%2f%2fdeveloper mozilla org%2fen us%2fdocs%2fweb%2fapi%2fwindow%2fparent\&data=05%7c02%7csmulqueen%40brightsign biz%7cc0b4df4b1a374212f14308dc95fa4ac2%7c8fbcdf641ab847cebdc743e23b04fb3c%7c0%7c0%7c638550149459230214%7cunknown%7ctwfpbgzsb3d8eyjwijoimc4wljawmdailcjqijoiv2lumziilcjbtii6ik1hawwilcjxvci6mn0%3d%7c0%7c%7c%7c\&sdata=%2bbc0offac7laewddoehvxi7wjyxdfmvlphpv6ynkl1g%3d\&reserved=0 y luego la página principal debe llamar a objetos brightsign/javascript para implementar su aplicación node js en un reproductor brightsign, ejecute "npm install" en su equipo esto creará el directorio node modules copie este directorio a la tarjeta sd junto con el resto de la aplicación cuando se inicializa, la implementación de node js de brightsign busca el directorio node modules relativo al archivo html cargado al igual que una aplicación estándar de node js, luego carga todos los módulos contenidos en el directorio node modules tenga en cuenta que debe actualizar sus módulos node a versiones compatibles con la versión correspondiente de node js docid\ yfoh0amtfishhw3be3ykq para su os cuando esté validando su código por ejemplo, si está utilizando chromium 120 (bos 9 1), debe usar versiones de módulos compatibles con node js v18 18 2 el uso de versiones anteriores de los módulos podría provocar un comportamiento inesperado como ejemplo, una versión anterior del módulo descompresor en bos 9 1 provocaba que los archivos brightscript descomprimidos intercambiaran/desordenaran bloques de código la mayoría de los módulos node js contienen únicamente código javascript sin embargo, algunos módulos contienen código binario cuando se instala un módulo que contiene partes binarias mediante "npm install", las partes binarias se compilan para la plataforma local (normalmente intel x64), y este código no se ejecutará en un reproductor brightsign actualmente, la implementación de node js de brightsign está limitada únicamente a código javascript webpack el directorio node modules asociado a una aplicación node js puede contener cientos o miles de archivos innecesarios el empaquetador webpack https //webpack js org/ ® le permite reducir el directorio node modules a un tamaño manejable para usar webpack®, deberá colocar su función de punto de entrada de node js en un archivo separado (p ej , "index js"), en lugar de usar html en línea este archivo contendrá las referencias a otros archivos javascript y módulos de node js ejemplo de index js var myutils = require(' /utilities'); // my utilities js var moment = require('moment'); // a node module function main() { myutils foo(); moment now(); // } el archivo javascript que contiene el punto de entrada de node js puede luego referenciarse en el archivo html ejemplo de html \<script src=' /index js'>\</script> para usar webpack®, adjunte main() al objeto window para que pueda encontrarse desde el archivo html var myutils = require(' /utilities'); // my utilities js var moment = require('moment'); // a node module function main() { myutils foo(); moment now(); // } window\ main = main; cambie el archivo html para que apunte al javascript empaquetado y a window\ main() \<script src=' /bundle js'>\</script> \<body onload="window\ main()"> para compilar su bundle, ejecute los siguientes pasos de npm en su computadora npm i d webpack webpack cli npx webpack mode production ahora puede publicar los archivos index html y bundle js; no es necesario publicar el directorio node modules consulte el ejemplo de configuración de webpack® a continuación para obtener más información rutas de almacenamiento del dispositivo para cargar módulos de node js y leer/escribir archivos, primero debe definir el directorio raíz del almacenamiento del dispositivo los siguientes son directorios raíz comunes microsd "storage/sd/" ssd "storage/ssd/" usb "storage/usb1/" recomendamos usar la llamada process chdir() al comienzo del script para cambiar la ruta del proceso ejemplo var process = require("process"); process chdir("/storage/sd"); alternativamente, si tiene módulos ubicados en múltiples unidades de almacenamiento, puede agregar múltiples rutas de búsqueda a un módulo ejemplo module paths push("/storage/sd/") module paths push("/storage/ssd/") module paths push("/storage/usb1/") depuración de aplicaciones cuando los módulos de node js están habilitados, se vuelven visibles desde el inspector remoto de chromium docid\ tkkedyuswbejhd0ljmhcs , lo que le permite depurar aplicaciones console log funciona como una aplicación web normal la salida se redirige tanto a stderr como al inspector remoto descarga de archivos grandes si su aplicación utiliza el objeto xmlhttprequest para descargar un archivo grande (100 200mb, dependiendo del modelo del reproductor), el reproductor se quedará sin memoria y la operación de descarga fallará el objeto xmlhttprequest primero descarga el archivo completo en la memoria, luego crea un objeto blob de igual tamaño, por lo que los requisitos de memoria para una descarga son efectivamente el doble del tamaño del archivo para descargar archivos de varios gigabytes, consulte nuestro ejemplo de descarga de archivos grandes https //github com/brightsign/dev cookbook/tree/main/examples/browser/large file download la aplicación se define en index html que utiliza streams de node js mediante rohtmlwidget docid\ g tjkqqhlcft4fw5 z6t0 para descargar el archivo e incluye un archivo autorun brs que le indica al reproductor que ejecute la aplicación más información está disponible en el archivo readme md asociado con el ejemplo ejemplos de node js github contiene un node js starter project https //github com/brightsign/node js starter project este proyecto se creó originalmente para brightauthor classic, pero también puede utilizarse con brightsign author otro ejemplo es el siguiente script, que inicializa un servidor http en el reproductor brightsign en el puerto 8000 cuando un cliente (por ejemplo, un navegador de escritorio) se conecta al servidor, este enviará el número de modelo y la versión de arranque del reproductor al cliente el script también muestra en la pantalla conectada al reproductor la dirección ip del cliente conectado ejemplo \<html> \<script> function displaymessage() { // load the http module to create an http server var http = require('http'); // configure our http server to respond with hello world to all requests var server = http createserver(function (request, response) { var device info = new bsdeviceinfo(); response writehead(200, {"content type" "text/plain"}); response end("device information \n" + device info model + "\n" + device info bootversion + "\n"); var ip = request connection remoteaddress; document getelementbyid("ip") innerhtml+="server responded to "+ ip + "\<br>"; console log("server responded to request from " + ip); }); // listen on port 8000, ip defaults to 127 0 0 1 server listen(8000); // display it on brightsign browser var os = require('os'); var interfaces = os networkinterfaces(); var addresses = \[]; for (var k in interfaces) { for (var k2 in interfaces\[k]) { var address = interfaces\[k]\[k2]; if (address family === 'ipv4' && !address internal) { addresses push(address address); } } } var message = "server running at " + addresses\[0] + " 8000\<br>"; document getelementbyid("ip") innerhtml+= message; // print message on console console log(message); } \</script> \<body style="background color\ red" onload="displaymessage()"> \<div id = "ip" style="font size 60px; text align\ center;"> \</div> \</body> \</html> los módulos integrados, como "os" y "http", se pueden inicializar mediante el método require() si la entrada nodejs enabled\ true no se incluye al inicializar el objeto rohtmlwidget (como se muestra arriba), el método require() no estará disponible