Protección del código fuente del proyecto de nodo
Durante el proceso de desarrollo, encontramos algunos problemas y algunas trampas. Resumámoslo a continuación y registrémoslo aquí. Aquí utilizamos la biblioteca de enlaces dinámicos de ROCKEY-ARM con parámetros de funciones de interfaz complejos para el desarrollo.
Nota: He compartido el código fuente del módulo de interfaz ROCKEY-ARM encapsulado en JavaScript. Si solo necesita usar ROCKEY-ARM en proyectos electron o Node.js, puede usarlo directamente.
Primero, necesitas instalar los módulos FFI-NAPI, REF-NAPI, REF-Array-NAPI y REF-Struct-NAPI en tu proyecto node.js.
La siguiente es una breve introducción a los usos de estos módulos:
Si compra el producto de bloqueo de cifrado ROCKEY-ARM de Tianfei Chengxin, puede obtener el SDK de ROCKEY-ARM y Windows y Biblioteca de enlaces dinámicos de Linux. Los nombres de los archivos son generalmente dongle_d y libRockeyARM.so.0.3.
FFI-Pina es compatible con los sistemas Windows y Linux, por lo que ambos son compatibles. dll y . Entonces se puede apoyar. Simplemente cargue diferentes archivos de biblioteca dinámica en diferentes sistemas operativos. El método para cargar una biblioteca dinámica es el siguiente:
El primer parámetro de la biblioteca() es la ruta. dll, y la ruta del sistema Linux es. entonces. El segundo parámetro rockeyInterface es la declaración de la función exportada de la biblioteca dinámica. Hay muchas funciones exportadas de ROCKEY-ARM, así que las definí por separado. Los detalles se mencionan a continuación.
Primero busca algunas funciones con parámetros simples para declarar desde ROCKEY-ARM.
Primero, echemos un vistazo a los tipos de datos utilizados por las interfaces anteriores: dongle_handle, dword, dongle_handle, int y byte.
Echemos un vistazo a los tipos de datos admitidos por FFI-Pina. ref-Pina admite los siguientes tipos:
Los parámetros aquí deben ser del mismo tipo de datos y pueden tener las siguientes coincidencias.
El contenido de la declaración es el siguiente:
Un json, la clave es el nombre de la función exportada por la biblioteca dinámica, como 'Dongle_Open', el valor es una lista, el primer elemento es el valor de retorno, los segundos elementos son parámetros. El parámetro sigue siendo una lista. Hay un tipo adecuado en esta ref-pina. Simplemente escriba el tipo específico, como el valor de retorno DWORD y la longitud entrante int. Aquí uso 'int'. Para otros parámetros, defino además el identificador ryHandle, el puntero del identificador ptrHandle y el puntero de bytes ptrByte. Las definiciones de ryHandle, ptrryHandle y ptrByte son las siguientes:
La esencia de DONGLE_HANDLE es de tipo void*. Al principio, el tipo void * intentó definir una matriz vacía y luego usó una matriz vacía para representar el vacío, y luego descubrió que la afirmación era incorrecta y la matriz no admitía el tipo vacío. Por lo tanto, se utiliza directamente un número sin signo para representar el puntero nulo. El sistema de 64 bits tiene 8 bytes y el sistema de 32 bits tiene 4 bytes. Solo usa el tipo uint. Dongle_handle.
Las funciones de ROCKEY-ARM también tienen muchas interfaces con parámetros, como:
Tome las dos interfaces de funciones anteriores como ejemplos. El primer parámetro en Dongle_Enum es un puntero a la estructura DONGLE_INFO, que devuelve una lista de información del dispositivo después de ejecutarse. Cuando utilice ROCKEY-ARM, debe obtener la lista de información del dispositivo a través de la función de enumeración y luego comparar la ID del producto o la ID del hardware para decidir qué dispositivo abrir.
Para analizar la ID del producto o la ID del hardware a partir de la información del dispositivo devuelta por la función de enumeración, el parámetro DONGLE_INFO* pDongleInfo debe declararse como una matriz de estructuras. La función Dongle_RsaGenPubPriKey () tiene dos parámetros de puntero de estructura, RSA_public_key y RSA_private_keiy, porque los usuarios comunes aquí no necesitan analizar N, D, E y otros componentes en la clave RSA y pueden usarlos directamente como una matriz de bytes, declarada directamente como Tipo ptrByte arriba. Entonces la declaración es la siguiente:
Llame a la función declarada por FFI-Pina, asigne principalmente el valor inicial al tipo de datos que definió y obtenga el valor de retorno del parámetro personalizado. Se explican a continuación.
El int* aquí se refiere a la cantidad de dispositivos devueltos por la función, o la longitud de los datos de entrada pasados o los datos de salida pasados, así que simplemente defina una matriz int con una longitud de 1, de la siguiente manera:
Para asignar un valor a los datos entrantes, solo necesita asignar un valor al elemento con índice 0.
Este parámetro es una lista de información enumerada al dispositivo a través de la función de enumeración. Debido a que se enumeran muchos dispositivos, debe pasar una cantidad suficiente de DONGLE_INFO como se muestra a continuación:
Este parámetro generalmente se usa como un búfer para datos entrantes y salientes, por lo que al crear una matriz, debe crear suficiente El espacio largo es el siguiente:
Durante el proceso de desarrollo, encontramos algunos obstáculos y perdimos mucho tiempo. Aquí hay un resumen.
La estructura de ROCKEY-ARM está alineada en bytes, ref-struct-Pina aún no ha encontrado una manera de establecer la alineación de bytes. La estructura anunciada en ese momento es la siguiente:
Durante las pruebas, encontramos que la alineación de la estructura definida es diferente de la definida por ROCKEY-ARM, por lo que dividimos los miembros m_Birthday y m_HID de ref. type.uint64 en dos uint32 a la izquierda y a la derecha, de modo que la alineación de la estructura pueda ser consistente con la alineación de ROCKEY-ARM. Cuando use m_Birthday y m_HID, debe hablar sobre el empalme de uint32 izquierdo y derecho, lo cual es un poco problemático. Sin embargo, es aceptable garantizar resultados correctos cuando no se encuentra ningún alineador StructType.