Documentos de Académico
Documentos de Profesional
Documentos de Cultura
2
Machine Translated by Google
1. Introducción Printsdk es el
kit de desarrollo de software para la máquina de impresión de huellas dactilares integradas. Puede desarrollar un programa de
comunicación con la máquina integrada. Por ejemplo, puede obtener información de usuario registrada del dispositivo o configurar la información
de usuario en el dispositivo, la información puede contener el nombre de usuario , contraseña de usuario, privilegio de usuario o plantilla de huella digital
de usuario, y puede administrar el dispositivo en la computadora. Finalmente, puede obtener registros de entrada / salida del dispositivo.
Instalación:
copie todos los archivos dll a la carpeta del sistema o la carpeta actual que ejecuta el programa. Luego ejecute regsvr32.exe para registrar los
controles: Regsvr32 zkemkeeper.dll.
Nota:
3
Machine Translated by Google
2. Método
[Función]
Descargue la plantilla de huellas dactilares del usuario inscrito desde el dispositivo
[Protocolo]
BOOL GetEnrollData( long
dwMachineNumber long dwEnrollNumber ,
long dwEMachineNumber
dwBackupNumber
long , long ,
FAR* dwMachinePrivilege
dwEnrollData
, long FAR*
long FAR* ,
dwPassWord);
[Parámetros]
dwNúmeroMáquina
El número de máquina del dispositivo operativo
dwEMachineNumber igual
a dwMachineNumber
dwEnrollNumber
La identificación de usuario
dwBackupNumber
El Número de Respaldo del Usuario, Número de Respaldo significa
Valor 0 Descripción
1234 Plantilla de huellas dactilares 0
Plantilla de huellas dactilares 1
Plantilla de huellas dactilares 2
Plantilla de huellas dactilares 3
Plantilla de huellas dactilares 4
5 Plantilla de huellas dactilares 5
6 Plantilla de huellas dactilares 6
7 Plantilla de huellas dactilares 7
8 Plantilla de huellas dactilares 8
9 Plantilla de huellas dactilares 9
10 Clave
dwMachinePrivilegio
El privilegio del usuario en el dispositivo, de la siguiente manera:
Valor Descripción 0
Usuario general
1 Administrador (inscripción de usuario, configuración de opciones del dispositivo) [Nivel 1]
2 Administrador (inscripción de usuario,) [Nivel 2] 3
Administrador (configurar opciones del dispositivo) [Nivel 3]
dwEnrollData El
puntero del búfer para guardar la plantilla de huella digital, el tamaño del búfer debe ser mayor o igual a 1836 BYTES.
4
Machine Translated by Google
dwPassWord
La contraseña.
[Devolver]
VERDADERO si tiene éxito, FALSO en caso contrario.
[Nota]
Si dwBackupNumber está entre 0 y 9, la plantilla de huella digital especificada se guarda en un búfer,
al que apunta el parámetro dwEnrollData. Y el parámetro dwPassWord se ignora. Por otro lado, si
dwBackupNumberValue es 10, la contraseña se guardará en dwPassWord y se ignorará el parámetro dwEnrollData.
[Función]
Cargue una plantilla de huella digital de usuario específica en un dispositivo, sobrescriba los datos del usuario existente.
[Protocolo]
[parámetros]
dwNúmeroMáquina
El número de máquina del dispositivo operativo
dwEnrollNumber
La identificación de usuario
dwEMachineNumber
igual a dwMachineNumber
dwBackupNumber
ver Método GetEnrollData
dwMachinePrivilegio
El privilegio del usuario para este dispositivo
dwEnrollData
La plantilla de huella digital. Si dwBackupNumber es 10, se ignorará
dwPassWord
La contraseña del usuario. Si dwBackupNumber es inferior a 10, se ignorará.
[Devolver]
VERDADERO si tiene éxito, FALSO en caso contrario.
2.3 ObtenerTmpUsuario
5
Machine Translated by Google
Descargue la plantilla de huellas dactilares del usuario inscrito desde el dispositivo. Es más rápido que la función GetEnrollData
Cargue una plantilla de huella digital de usuario específica en un dispositivo, sobrescriba los datos del usuario existente. Cargue la huella digital
en el dispositivo directamente, por lo que el dispositivo puede tener las mismas huellas digitales, es diferente de SetEnrollData. La velocidad es
más rápida que SetEnrollData.
[Función]
Eliminar la plantilla de huellas dactilares del usuario inscrito.
[Protocolo]
BOOL EliminarRegistrarDatos(
largo dwNúmeroMáquina ,
largo dwEnrollNumber ,
largo dwEMachineNumber ,
largo dwBackupNumber);
[parámetros]
Ver GetEnrollData
[Devolver]
VERDADERO si tiene éxito, FALSO en caso contrario.
[Notas]
Si no hay un usuario específico en el dispositivo, devuelve VERDADERO.
Si dwBackupNumberValue es 11, se eliminará toda la plantilla de huellas dactilares del usuario, que especificó mediante
dwEnrollNumber.
Si dwBackupNumberValue es 12, se eliminarán todas las plantillas de huellas dactilares y contraseñas del usuario,
que especificó mediante dwEnrollNumber.
2.6 DelUserTmp
Solo elimine una plantilla de huella digital del usuario inscrito.
[Función]
Lea los LOG generales de transicación (datos de asistencia) en el búfer interno del dispositivo.
[Protocolo]
BOOL ReadGeneralLogData(
long dwNúmeroMáquina );
[Parámetros]
dwMachineNumber
El número de máquina del dispositivo operativo
[Devolver]
VERDADERO si tiene éxito, FALSO en caso contrario.
6
Machine Translated by Google
[Notas]
Después de llamar a ReadGeneralLogData para leer datos en el búfer, puede llamar a GetGeneralLogData para obtener todos los registros de registro.
[Función]
Obtenga un registro de registro del búfer interno, que llenó ReadGeneralLogData.
[Protocolo]
BOOL ObtenerDatosRegistroGeneral(
long dwMachineNumber long ,
FAR* dwTMachineNumber long FAR* ,
dwEnrollNumber long FAR* ,
dwEMachineNumber long FAR* ,
dwVerifyMode , long FAR* dwInOutMode
,
long FAR* dwYear, long FAR* dwMonth,
long FAR* dwDay, long FAR* dwHour,
long FAR* dwMinute);
[parámetros]
dwNúmeroMáquina
El número de máquina del dispositivo operativo
dwTMachineNumber El
número de máquina del dispositivo, donde se verificó el usuario.
dwEnrollNumber
El ID de usuario.
dwEMachineNumber
igual a dwMachineNumber
dwVerifyMode
El método de una verificación exitosa. Es como sigue:
Valor Descripción
12 huella dactilar
Clave
dwInOutMode
El estado de asistencia. Es como sigue:
Valor Descripción 0
Servicio en
1 Fuera de servicio
dwaño,
dwmes,
dwday,
7
Machine Translated by Google
dwhora,
dwMinute
Las diferentes partes de la fecha y la hora.
[Devolver]
VERDADERO si tiene éxito, FALSO en caso contrario.
[Notas]
Llame a ReadGeneralLogData para leer datos en el búfer interno antes de este método. Puede llamarlo repetidamente hasta que
devuelva FALSO para obtener todos los registros.
Véase también Método ReadGeneralLogData
Mismo ReadGeneralLogData
2.10 ObtenerTodoslosGRegistroDatos
Igual GetGeneralLogData
[Función]
Obtener el estado del dispositivo.
[Protocolo]
BOOLGetDeviceStatus( long
dwMachineNumber long dwStatus long ,
FAR* dwValue ); ,
[Parámetros]
dwMachineNumber
El número de máquina del dispositivo operativo
dwStatus
Indica qué estado. Es como sigue:
Valor 1 Descripción
2345 Recuento de administradores
6 Recuento de usuarios Recuento
de plantilla de huella digital Recuento
de contraseña.
Recuento de nuevos LOG de transicación de administración.
Recuento de nuevos LOG generales
dwValue
El valor devuelto.
[Devolver]
VERDADERO si tiene éxito, FALSO en caso contrario.
8
Machine Translated by Google
[Función]
Obtener las opciones de un dispositivo.
[Protocolo]
BOOL GetDeviceInfo( largo
largo dwNúmeroMáquina ,
largo dwInfo ,
FAR* dwValue );
[parámetros]
dwNúmeroMáquina
El número de máquina del dispositivo operativo
dwInfo
Indica qué opción. Es el siguiente: 1. Número
máximo de administradores. El valor es de 0-10.
2. Número de máquina del dispositivo. El valor es de 1 a 255.
3. Idioma
Valor Descripción
012 inglés
Chino
coreano
4. Tiempo de apagado automático del dispositivo (minutos). Este valor es de 0 a 255.
5. Control de salida de bloqueo
abierto Valor Descripción Salida Señal
Señal de bloqueo
deabierto
bloqueo1 abierto 0 Sin salida
Descripción
Ninguna
Incluso
Extraño
Descripción
Un bit
dos bits
No es compatible ahora, pero puede implementarlo, use el elemento de información del dispositivo 34 denominado
Formato de fecha 13.Red 14.RS232 15.RS485 16.Voz 17.Velocidad de identificación
9
Machine Translated by Google
18.inactivo
19.Tiempo de apagado
20.Tiempo de encendido
21.Tiempo de suspensión
22.Timbre automático
23.Umbral de coincidencia
dwValue
El valor devuelto.
[Devolver]
VERDADERO si tiene éxito, FALSO en caso contrario.
[Función]
Establecer las opciones de un dispositivo.
[Protocolo]
BOOLSetDeviceInfo( largo
largo dwNúmeroMáquina ,
largo dwInfo dwValue);
,
[Parámetros]
dwMachineNumber ID del
dispositivo dwInfo Índice de
información del dispositivo
1.Número de administradores
de fechas
No es compatible ahora, pero puede implementarlo utilizando el elemento de información del dispositivo 34 denominado Formato de fecha,
consulte dwValue 34.
13.Red
10
Machine Translated by Google
14. R S232
15. R S485
16. V o z 17.
Descripción
Inglés,
Chino simplifi cado
Chino tradicional
Mantenga el tiempo para el estado temporal, por ejemplo, OT-IN, OT-OUT... Pero CheckIn/CheckOut es un estado normal.
32.Tiempo fuera del número de entrada
Mantenga el tiempo para esperar ingrese el número
7
8
9 10 35.Solo
1:1 Solo 1:1 modo de verificación.0:Falso,1:verdadero.
[Devolver]
[Función]
[Protocolo]
BOOL EnableDevice (largo
dwMachineNumber bFlag); ,
BOOL
[Parámetros]
dwMachineNumber
El número de máquina del dispositivo operativo
b Bandera
VERDADERO significa permitir la entrada de claves y huellas dactilares del usuario, FALSO significa no permitir
[Devolver]
[Notas]
Llame a EnableDevice con bFlag=FALSE para deshabilitar la operación del usuario frontal antes de llamar a otras funciones para intercambiar
datos entre el host y el dispositivo, como ReadGenealLogData, GetEnrollData, etc. Y llame a EnableDevice con bFlag=TRUE después de que
finalicen sus transacciones.
[Función]
12
Machine Translated by Google
[Protocolo]
[Parámetros]
bFlag
VERDADERO significa habilitar al usuario, FALSO significa deshabilitarlo.
Otros parámetros ver Método GetEnrollData.
[Devolver]
VERDADERO si tiene éxito, FALSO en caso contrario.
[Función]
Configure la fecha y la hora del dispositivo.
[Protocolo]
BOOLSetDeviceTime( largo
dwNúmeroMáquina);
[parámetros]
dwNúmeroMáquina
El número de máquina del dispositivo operativo
[Devolver]
VERDADERO si tiene éxito, FALSO en caso contrario.
[Notas]
Este método establece la fecha y hora del dispositivo igual que el host.
2.17 ObtenerTiempoDeDispositivo
[Función]
Obtenga la fecha y la hora del dispositivo.
[Protocolo]
BOOLGetDeviceTime( long
long dwNúmeroMáquina ,
FAR* dwYear, long FAR*
dwMonth, long FAR* dwDay,
long FAR* dwHour,
13
Machine Translated by Google
[parámetros]
dwNúmeroMáquina
El número de máquina del dispositivo operativo
dwaño,
dwmes,
dwDía,
dwHora,
dwMinute
Las diferentes partes de la fecha del dispositivo.
dwDayOfWeek
El día de la semana de la fecha del dispositivo
[Devolver]
VERDADERO si tiene éxito, FALSO en caso contrario.
[Función]
Apague el dispositivo.
[Protocolo]
BOOLPowerOffDevice(largo
dwNúmeroMáquina);
[parámetros]
dwNúmeroMáquina
El número de máquina del dispositivo operativo
[Devolver]
VERDADERO si tiene éxito, FALSO en caso contrario.
[Función]
Modificar un privilegio de usuario en un dispositivo.
[Protocolo]
14
Machine Translated by Google
[parámetros]
Ver Método GetEnrollData.
[Devolver]
VERDADERO si tiene éxito, FALSO en caso contrario.
[Función]
Lea todos los ID de usuario del dispositivo en el búfer interno.
[Protocolo]
[Parámetros]
dwMachineNumber
El número de máquina del dispositivo operativo
[Devolver]
VERDADERO si tiene éxito, FALSO en caso contrario.
[Notas]
Llame al método GetAllUserID para obtener todos los registros de ID de usuario.
2.22 GetAllUserID
[Función]
Lea un registro de ID de usuario del búfer que llenó ReadAllUserID.
[Protocolo]
[parámetros]
dwEnable
Indica si el usuario está habilitado. El valor 1 significa un usuario normal (habilitado), y el valor 2 significa un usuario deshabilitado.
[Devolver]
VERDADERO si tiene éxito, FALSO en caso contrario.
[Notas]
Llame a GetAllUserID repetidamente hasta que devuelva FALSO para obtenerlos todos.
15
Machine Translated by Google
[Función]
Obtenga la información del producto o el número de serie
[Protocolo]
BOOLGetSerialNumber ( long
dwMachineNumber,
BSTR FAR* lpszSerialNumber);
[parámetros]
dwNúmeroMáquina
El número de máquina del dispositivo operativo
lpszSerialNumber
La cadena devuelta
[Devolver]
VERDADERO si tiene éxito, FALSO en caso contrario.
[Función]
Elimine todos los nombres de plantillas de huellas dactilares de usuarios/administradores inscritos y los registros de entrada/salida.
[Protocolo]
BOOL ClearKeeperData(
largo dwMachineNumber);
[parámetros]
dwNúmeroMáquina
El número de máquina del dispositivo operativo
[Devolver]
VERDADERO si tiene éxito, FALSO en caso contrario.
[Función]
Borre todos los privilegios de administrador en el dispositivo.
[Protocolo]
ClearAdministrators(dwMachineNumber tan largo) como booleano
[parámetros]
dwNúmeroMáquina
El número de máquina del dispositivo operativo
[Devolver]
VERDADERO si tiene éxito, FALSO en caso contrario.
dieciséis
Machine Translated by Google
[Función]
Obtenga la versión de firmware del dispositivo.
[Protocolo]
[parámetros]
dwMachineNumber El
número de máquina del dispositivo operativo
strVersion Versión de firmware.
[Devolver]
2.29 GetFPTempLength
Obtener la longitud de la plantilla de huellas dactilares.
2.30 Connect_Com
[Función]
[Protocolo]
[parámetros]
Portarse
Número de puerto de comunicaciones
Número de máquina
El número de máquina del dispositivo operativo
Tasa de baudios
Tasa de baudios de comunicación
[Devolver]
2.31 Conectar_Red
[Función]
[Protocolo]
[parámetros]
Añadir IP
17
Machine Translated by Google
dirección IP
Puerto
Número de puerto, predeterminado 4370
[Devolver]
2.32 Desconectar
Desconectar con el dispositivo.
[Función]
Establezca la información del usuario en dispositivo. La información del usuario contiene el nombre y la contraseña del usuario.
[Protocolo]
SetUserInfo(dwMachineNumber tan largo, dwEnrollNumber tan largo, nombre como cadena, contraseña como cadena,
Privilegio Mientras, Habilitado Como Booleano) Como Booleano
[Parámetros]
dwMachineNumber
Clave
Contraseña de usuario
Privilegio
Privilegio de usuario
Habilitado
si Habilitado usuario
[Devolver]
[Función]
Obtenga la información del usuario del dispositivo. la información del usuario contiene el nombre y la contraseña del usuario.
[Protocolo]
SetUserInfo(dwMachineNumber tan largo, dwEnrollNumber tan largo, nombre como cadena, contraseña como cadena,
Privilegio Mientras, Habilitado Como Booleano) Como Booleano
[Parámetros]
dwMachineNumber
Clave
Contraseña de usuario
Privilegio
Privilegio de usuario
Activado
18
Machine Translated by Google
si usuario habilitado
[Devolver]
2.37 FPTempConvertir
Convierta la plantilla de huella digital del dispositivo a la plantilla de huella digital Biokey, luego puede verificar la huella digital en la computadora
con Biokey. Biokey SDK es el kit de desarrollo de huella digital en línea BioLife para PC.
[Función]
[Protocolo]
[parámetros]
Commkey
La contraseña de comunicación. Por ejemplo: si la contraseña es "123456", entonces CommKey=123456
[Devolver]
[Notas]
[Función]
Obtener SMS
[Protocolo]
[parámetros]
índicedw
Índice de SMS
dwEnrollNumber el ID
de usuario del SMS
SMS
Valor del SMS
[Devolver]
19
Machine Translated by Google
[Notas]
[Función]
Establecer SMS
[Protocolo]
Establecer SMS (dwIndex como largo, dwEnrollNumber como largo, SMS como cadena) como booleano
[parámetros]
índicedw
Índice de SMS
dwEnrollNumber
especifica el ID de usuario del SMS
SMS
Valor del SMS
[Devolver]
VERDADERO si tiene éxito, FALSO en caso contrario.
[Notas]
[Función]
[Protocolo]
CaptureImage(FullImage como booleano, ancho como largo, alto como largo, imagen como byte, archivo de imagen
como cadena) como booleano
[parámetros]
Imagen completa
Si es verdadero, la función devolverá la imagen completa, de lo contrario, devolverá una imagen válida, la imagen válida es la imagen
para verificar.
Ancho
especifica el ancho de la imagen
Altura
especifica la altura de la imagen.
Imagen
Matriz de bytes de la imagen
Archivo de imagen
Archivo de imagen
[Devolver]
VERDADERO si tiene éxito, FALSO en caso contrario.
[Notas]
[Función]
Actualice el firmware
[Protocolo]
[parámetros]
archivo de firmware
archivo de firmware
[Devolver]
VERDADERO si tiene éxito, FALSO en caso contrario.
[Notas]
[Función]
Copia de seguridad de los datos de usuario del dispositivo, contiene ID de usuario, contraseña, huella digital, registro, etc.
[Protocolo]
[parámetros]
Archivo de datos
[Devolver]
VERDADERO si tiene éxito, FALSO en caso contrario.
[Notas]
[Función]
Restaure los datos de esa copia de seguridad anterior.
[Protocolo]
[parámetros]
Archivo de datos
[Devolver]
VERDADERO si tiene éxito, FALSO en caso contrario.
[Notas]
[Función]
Escribir LCD de Devie
[Protocolo]
WriteLCD (fila tan larga, columna tan larga, texto como cadena) como booleano
[parámetros]
Fila
Columna
Texto
[Devolver]
VERDADERO si tiene éxito, FALSO en caso contrario.
[Notas]
2.47ClearLCD
[Función]
Borrar LCD de Devie
[Protocolo]
[parámetros]
[Devolver]
VERDADERO si tiene éxito, FALSO en caso contrario.
[Notas]
2.48 pitido
[Función]
pitido de zumbador
[Protocolo]
[parámetros]
RetrasoMS
Retraso milisegundo
[Devolver]
VERDADERO si tiene éxito, FALSO en caso contrario.
[Notas]
[Función]
22
Machine Translated by Google
reproducir voz
[Protocolo]
[parámetros]
Índice
Índice de voz.
[Devolver]
VERDADERO si tiene éxito, FALSO en caso contrario.
[Notas]
2.50 ACDesbloquear
[Función]
[Protocolo]
[parámetros]
dwNúmeroMáquina
Identificación del dispositivo.
[Devolver]
VERDADERO si tiene éxito, FALSO en caso contrario.
[Notas]
[Función]
ObtenerGrupoUsuario
[Protocolo]
GetUserGroup(dwMachineNumber tan largo, dwEnrollNumber tan largo, UserGrp tan largo) como booleano
[parámetros]
dwNúmeroMáquina
Identificación del dispositivo
dwEnrollNumber
ID de usuario
Grupo de usuario
[Devolver]
VERDADERO si tiene éxito, FALSO en caso contrario.
[Notas]
23
Machine Translated by Google
[Función]
[Protocolo]
SetUserGroup(dwMachineNumber tan largo, dwEnrollNumber tan largo, UserGrp tan largo) como booleano
[parámetros]
dwNúmeroMáquina
Identificación del dispositivo.
dwEnrollNumber
ID de usuario
Grupo de usuario
Grupo de usuario
[Devolver]
[Notas]
[Función]
Obtener información de la zona horaria.
[Protocolo]
GetTZInfo(dwMachineNumber tan largo, TZIndex tan largo, TZ como cadena) como booleano
[parámetros]
dwNúmeroMáquina
Identificación del dispositivo.
Índice TZ
Índice de zona horaria
TZ
Cadena de zona horaria.
[Devolver]
[Notas]
[Función]
Establecer información de zona horaria
[Protocolo]
SetTZInfo(dwMachineNumber como largo, TZIndex como largo, TZ como cadena) como booleano
24
Machine Translated by Google
[parámetros]
dwNúmeroMáquina
Identificación del dispositivo.
Índice TZ
Índice de zona horaria
TZ
[Devolver]
[Notas]
2.55 ObtenerDesbloquearGrupos
[Función]
[Protocolo]
[parámetros]
dwNúmeroMáquina
Identificación del dispositivo.
Grupos
Grupos
[Devolver]
[Notas]
[Función]
[Protocolo]
[parámetros]
dwNúmeroMáquina
Identificación del dispositivo.
Grupos
Cadena de grupos
[Devolver]
[Notas]
25
Machine Translated by Google
2.57 ObtenerGrupoTZStr
[Función]
Obtener zonas horarias de grupo.
[Protocolo]
GetGroupTZStr(dwMachineNumber tan largo, GroupIndex tan largo, TZs como cadena) como booleano
[parámetros]
dwNúmeroMáquina
Identificación del dispositivo.
índice de grupo
TZ
Zonas horarias
[Devolver]
VERDADERO si tiene éxito, FALSO en caso contrario.
[Notas]
2.58 EstablecerGrupoTZStr
[Función]
Establecer la zona horaria del grupo.
[Protocolo]
SetGroupTZStr(dwMachineNumber tan largo, GroupIndex tan largo, TZs como cadena) como booleano
[parámetros]
dwNúmeroMáquina
Identificación del dispositivo.
índice de grupo
TZ
[Devolver]
VERDADERO si tiene éxito, FALSO en caso contrario.
[Notas]
2.59 GetUserTZStr
[Función]
Obtener la zona horaria del usuario.
[Protocolo]
GetUserTZStr(dwMachineNumber tan largo, dwEnrollNumber tan largo, TZs como cadena) como booleano
[parámetros]
dwNúmeroMáquina
Identificación del dispositivo.
dwEnrollNumber
26
Machine Translated by Google
ID de usuario
TZ
Zonas horarias
[Devolver]
VERDADERO si tiene éxito, FALSO en caso contrario.
[Notas]
2.60 EstablecerUsuarioTZStr
[Función]
Establecer zonas horarias de usuario
[Protocolo]
SetUserTZStr(dwMachineNumber tan largo, dwEnrollNumber tan largo, TZs como cadena) como booleano
[parámetros]
dwNúmeroMáquina
Identificación del dispositivo.
dwEnrollNumber
ID de usuario
TZ
Zonas horarias
[Devolver]
VERDADERO si tiene éxito, FALSO en caso contrario.
[Notas]
2.61 ObtenerÚltimoError
[Función]
Obtenga el último número de error.
[Protocolo]
BOOL GetLastError(long
FAR* dwErrorCode);
[parámetros]
dwErrorCode
El número de error devuelto
Valor Descripción 1
EXITOSO 4
ERR_INVALID_PARAM 0
ERR_NO_DATA -1
ERROR_NOT_INIT -2
ERROR_IO-3
ERROR_TAMAÑO
-4 ERROR_SIN_ESPACIO
-100 ERROR_UNSUPPORT
27
Machine Translated by Google
[Devolver]
VERDADERO si tiene éxito, FALSO en caso contrario.
[Notas]
dwErrorCode = 6 causado por llamar al método GetGeneralLogData y GetAllGLogData.
Si devuelven FALSO, llame a GetLastError para determinar si hay un error o se han leído los datos.
28