Friday, 16 December 2016

0x0c In Binary Option

TFTP Bootloader Estoy trabajando en un proyecto de observatorio astronómico operado remotamente, y en el ámbito de este proyecto necesitaba muchas tarjetas TCP / IP controladas. Como estoy familiarizado con los entornos de redes, la disponibilidad de un gestor de arranque TFTP funcional y fiable estaba faltando a las placas de Arduino desde mi punto de vista. Así que decidí reescribir el código del cargador de arranque TFTP sin editar publicado por el equipo de Arduino, y desde hace unas semanas tengo un gestor de arranque que funciona correctamente y me ayuda en mi trabajo en las juntas de Arduino en entorno de desarrollo y producción. Pienso que esta característica es muy agradable (rápida, confiable y orientada a la red), creo que es interesante publicarlo, y tal vez agregar una característica en el IDE para programar el Arduino directamente a través de TFTP. Descargar En realidad, puedes descargarlo desde este sitio web: Compilación y versiones Cómo funciona Este gestor de arranque inicia un servidor TFTP en el puerto UDP 69 predeterminado y escucha durante unos 5 segundos al arrancar. Durante este tiempo el usuario puede cargar un nuevo firmware usando cualquier software de cliente TFTP. Gestiona las transferencias interrumpidas de archivos incluso si falla el suministro eléctrico. En este momento, el tamaño de los cargadores de arranque es de unas 1500 palabras (3000 bytes). Los fusibles tienen que ser configurados para declarar un booloader de 2Kwords. Por lo tanto, el código de usuario no debe exceder 28672 bytes. Hardware soportado En este momento, el cargador de arranque sólo se ha probado en Ethernet Arduino, pero el código fuente puede adaptarse fácilmente a otras tarjetas. El código que se va a modificar es: El inicio del archivo net. h para la configuración de la interfaz W5100 SPI: El principio de main. h para la configuración del pin LED: Sólo hay un controlador Ethernet soportado, el W5100. Los bytes de uso de la EEPROM de 0 a 20 están reservados para el cargador de arranque TFTP, por favor lea Ajustes almacenados en el flash siguiente Cargador de arranque intermitente: Conecte un programador TinyUSB y realice la instalación. Configuración de la red: La dirección predeterminada del gestor de arranque es 192.168.1.1. Configure la tarjeta de red de su equipo a una dirección estática de 192.168.1.x con una subred de 255.255.255.0. De forma predeterminada, el cargador de arranque supone que una pasarela de Internet está en la dirección 192.168.1.254. Conversión de firmware en el formato correcto: El cargador de arranque acepta imágenes binarias sin procesar, empezando en la dirección 0x0000. Éstos se pueden generar usando avr-objcopy, parte de WinAVR / AVR-GCC, usando la opción binaria - O. Ejemplo: avr-objcopy - j. text - j. data - O binario firmware. elf firmware. bin Cuando utilice el IDE de Arduino necesitará hacer una compilación detallada de su boceto y, a continuación, comprobar en el directorio temporal el uso para el. elf Archivo recién generado. Carga manual del firmware Compruebe que la placa de destino esté alimentada y conectada a la red del ordenador. Compruebe la configuración de red del equipo: IP estática de 192.168.1.x, subred de 255.255.255.0. Pulse el botón de reinicio para iniciar el gestor de arranque. El LED parpadeará rápidamente. En una ventana de consola (Windows): tftp - i 192.168.1.1 poner firmware. bin La placa se reprogramará y reiniciará. Códigos de flash: parpadeo rápido: el cargador de arranque Ethernet está esperando por una conexión. Temporización Tiempo de espera al arranque se establece en 5 segundos aproximadamente Tiempo de espera nunca se producirá si no hay firmware en el espacio de flash del usuario Tiempo de espera (también 5 segundos) se producirá si se ha iniciado una descarga y no hay respuesta enviada por el cliente y servidor TFTP Reiniciar y esperar un nuevo intento El tiempo de espera nunca se producirá después de un reinicio del hardware si ha habido una transferencia interrumpida antes (suponemos que la imagen en flash está incompleta) Direccionamiento IP: Este gestor de arranque TFTP no implementa un cliente DHCP en este momento. Como se ha pensado para ser tan pequeño, confiable y autónomo como sea posible solamente el enderezar estático es apoyado. El arranque DHCP con la recuperación de la dirección del servidor TFTP en una opción DHCP específica podría ser una opción para tener una estación sin disco como el comportamiento, pero una vez más se ha pensado que este gestor de arranque es sólido y el parpadeo automático del firmware al arrancar es una opción peligrosa. Ajustes almacenados en flash: Con el fin de proporcionar la posibilidad de configurar los ajustes Ethernet utilizados por el Bootloader TFTP y la aplicación de usuario, se pueden almacenar los siguientes ajustes en el flash MCU. Estos están destinados a ser compartidos entre el Bootloader TFTP y la aplicación cliente. Esto evitará cualquier inconsistencia y problemas de resolución de ARP durante el proceso de inicialización que tendrían éxito si se usan direcciones MAC diferentes, por ejemplo. 0: SIG1 (0x55), 1: SIG2 (0XAA) --gt Firma, si está presente. Bootloader utilizará los siguientes ajustes para configurar el chip Ethernet 2: IMAGE STATUS. 0xFF: BAD o nunca subido, 0xBB: IMAGE OK 3: GWIP0. 4: GWIP1. 5: GWIP2. 6: GWIP3 --gt Dirección IP de la puerta de enlace (Predeterminado 192.168.1.254) 7: MASK0. 8: MASK1. 9: MASK2. 10: MASK3 --gt Mask (predeterminado 255.255.255.0) 11: MAC0. 12: MAC1. 13: MAC2. 14: MAC3. 15: MAC4. 16: MAC5 --gt MAC Address (Predeterminado 12: 34: 45: 78: 9A: BC) 17: IP0. 18: IP1. 19: IP2. 20: IP3 --gt Dirección IP (Predeterminado 192.168.1.1) La coherencia de estos ajustes debe ser garantizada por la aplicación cliente. Errores manejados durante la transferencia TFTP: Los siguientes códigos de error y cadenas de error pueden ser reportados al software del cliente TFTP: Opcode, Código 1, TFTP Opcode enviado por el cliente no es compatible Flash Full, Código 3, Tamaño de Flash superado Imagen no válida, Firmware enviado por el cliente no comienza con 0x0C 0x94 0xWX 0xYZ (JMP 0xWXYZ) Error, Código 0, Error desconocido Depuración La depuración se puede habilitar en el momento de la compilación en debug. h, descomente la línea siguiente, guardar y compilar: debe ser reemplazado por. La depuración se enviará al puerto serie de la placa Arduino a una velocidad de 115200 bps. Historial de versiones 0.1 (xx / xx / xxxx): Primera versión interna. Soporta las subidas en tftp. (Arduino unachieved published release) 0.2 (07/12/2011): Revisado por Denis PEROTTO, comentarios agregados, códigos de error adicionales agregados y código limpiado Lista de Todo Volver a la configuración predeterminada de Ethernet al poner un alfiler ALTO durante el inicio Habilitar depuración de TFTP estableciendo un Valor en flash en la aplicación cliente Añadir funcionalidad syslog además de la depuración en serie Añadir la posibilidad de configurar el tiempo de espera del gestor de arranque TFTP mediante el establecimiento de un valor en flash en la aplicación cliente Contacto Para cualquier pregunta, puede ponerse en contacto conmigo en denis dot perotto at gmail dot Com Sharebin2hex Una buena opción para crear cadenas con datos binarios para guardar (por ejemplo, guardar una sentencia de sql en un archivo) en archivos de texto o código php es hacer lo siguiente: ltphp field bin2hex (campo) field chunksplit (field. ) Campo x. Substr (campo 0, - 2) gt esto convertirá su campo (binario o no) en hexadecimal y luego convertir el hex en una cadena que se puede colocar en un archivo php: FFFFFFFF - gt xFFxFFxFFxFF En respuesta a Patrik: Manera de imprimir un número en binario es usar baseconvert (). Lt echo baseconvert (bin, 10, 2) gt Si lo necesitas para imprimir todos los 32 bits (como lo hace tu función) puedes simplemente apagarlo: echo strpad (baseconvert (bin, 10, 2), 32, STRPADLEFT) gt La conversión es desde la base 10 porque cuando bin pasa a baseconvert (), se convierte en una cadena y la representación predeterminada es decimal. Espero que esto ayude. Algunos dieron una función para convertir un código hexadecimal de nuevo en un texto simple (legible por el usuario ASCII: P) Algunos más dio una función que hace uso de bin2hex para convertir URLs en algo como 123456 Aquí es una función para ir desde el formulario 123456 de nuevo en ASCII Observe que esta función se puede cambiar fácilmente para transformar cualquier código hexadecimal en ASCII lt función hex2text (str) str explode (, str) arrayshift (str) nmlstr foreach (str como hexstr) nmlstr. Chr (baseconvert (hexstr, 16, 10)) return nmlstr gt espero que esto ayude :) Regards - Tsuna Esperemos que esto ayude a alguien. Simplemente muestra una representación html de datos hexadecimales, como un visor hexadecimal. (Columnas columnCount) (columnas columnCount column) column column column column column column column column column column column column column column column column column column column column column column column column column column column column column column column ) LineCount columnCount 0 foreach (líneas como línea) return lttrgtlttd alignrightgt. BytePosition. : Lt / tdgt para (n 0 n lt columnas n) return lttdgt. Strtoupper (bin2hex (línea n)). Lt / tdgt return lttdgt ampnbspampnbspampnbspampnbspampnbspampnbspampnbspampnbsp lt / tdgt para (n 0 n lt columnas n) return lttdgt. (Htmlentities (línea n).htmlentities (línea n).mpnbsp). Lt / tdgt return lt / trgt bytePuesta bytePosition columnas return lt / tablegt return implode (return) gt Esta función lo deshace (convierte nuevamente en ASCII). Ltphp función hex2asc (myin) para (i 0 i lt strlen (myin) / 2 i) myout. Chr (basconvert (substr (myin. I 2. 2), 16. 10)) return myout gt Estaba viendo lo anterior y con una pequeña modificación, surgió lo siguiente que creo que es más flexible: Función ltphp bin2hex (Datos) corregidos eregreplace (0-9a-fA-F. Datos) paquete de devolución (H. strlen (corregido), corregido) gt Esto asegurará que todo lo que pase, incluso si está acolchado en las extremos o entre pares , Debe devolver los datos deseados. Administrar sus servidores IBM i Domino utilizando APIs QnninListDominoDatat es una estructura de datos predefinida en el archivo de encabezado H / QNNINLDS en la biblioteca QNOTES que se puede utilizar al llamar a la API QnninListDominoServers. Listado 2. Estructura QnninListDominoData El código de ejemplo siguiente muestra un ejemplo para enumerar todos los nombres de los servidores Domino en el sistema actual. En primer lugar, hemos definido una estructura mysturctt que contiene un QnninListDominoDatat y una matriz de cadena para contener los nombres de los servidores Domino. La variable svrlist se define del tipo mystructt y es el primer parámetro de QnninListDominoServers API. Después de llamar a esta API, los nombres de servidor podrían ser devueltos a la svrlist. Tenga en cuenta que la longitud del nombre del servidor devuelto es 255 y no se termina NULL. Si su menos de 255 será rellenado con espacios en blanco. Las sentencias for de este ejemplo se utilizan para enumerar todos los nombres de servidor Domino devueltos sin los espacios en blanco. Listado 3. Código de ejemplo para QnninListDominoServers Recuperar atributos de servidor Domino (QnninRtvDominoServerAttr) Cuando tenemos el nombre de los servidores Domino, podemos usar la API QnninRtvDominoServerAttr para recuperar más atributos de este servidor, como el estado del servidor, la ruta del directorio de datos, la ruta del directorio ejecutable, la versión de Domino y así. Buffer de datos para los atributos del servidor Domino OutputChar () Este búfer almacena los atributos de los servidores Domino. El formato del búfer de salida se define mediante el 5º parámetro (nombre del formato). Longitud del búfer de datos InputBinary (4) La longitud del búfer de datos. Por favor, asegúrese de que es lo suficientemente grande. Nombre del servidor InputChar (255) El nombre del servidor Domino que podría ser devuelto por QnninListDominoServers API para recuperar la información. Este campo está en blanco rellenado y no es nulo terminado. Longitud del nombre del servidor InputBinary (4) La longitud del nombre del servidor. Siempre debe ser 255. Si la longitud del nombre del servidor real es inferior a 255, se rellenará con espacios en blanco. Nombre del formato InputChar (8) El nombre del formato para recuperar los diferentes atributos del servidor Domino. DATR0100, DATR0200. Consulte la Tabla 3 para el formato DATR0100. Código de error I / OChar () Devuelve información de error para la persona que llama. Tabla 3. Buffer de atributos DATR0100 Para obtener información detallada sobre los formatos DATR0100 y DATR0200, consulte la Guía de desarrollo de aplicaciones de Lotus Domino para i5 / OS en la sección Recursos. QnninRtvDominoDatat es una estructura de datos predefinida en el archivo de encabezado H / QNNINLDS en la biblioteca QNOTES que se puede utilizar al llamar a la API QnninRtvDominoserverAttr. QnninRtvDominoDatat contiene los datos con formato DATR0100. Listado 4. Estructura QnninRtvDominoData El código de ejemplo a continuación proporciona un ejemplo para recuperar alguna información del servidor Domino. En este ejemplo, llamamos QnninRtvDominoServerAttr API con nombre de formato DATR0100 y extrajo el nombre del subsistema de servidores, la biblioteca de tiempo de ejecución, la versión del servidor y el estado del servidor. Listado 5. Código de ejemplo para QnninRtvDominoServerAttr Lista Información de versión de Domino (QnninListDominoRlsI) Esta API puede mostrar todas las versiones de Domino instaladas en el sistema actual. Cuando desarrollas una aplicación que admita diferentes versiones de Domino, esta API es muy útil y flexible para recuperar información de la versión de Domino del sistema. Esta información se puede acceder manualmente desde el menú Trabajar con programas bajo licencia (Go LICPGM), pero esta API recupera sólo la información del programa con licencia de Domino, que elimina el trabajo de búsqueda a través de la lista completa de programas con licencia instalados. Búfer de datos para las versiones de Domino OutputChar () Este búfer contiene la lista devuelta de información de versiones de Domino instalada con el formato definido que se muestra en la Tabla 4. Longitud del búfer de datos InputBinary (4) La longitud del búfer de datos. La longitud debe ser al menos lo suficientemente grande como para mantener el campo Bytes devuelto y Bytes disponibles. Si no se proporciona suficiente espacio para los datos, se obtendrán errores o se devolverán datos incompletos. Nombre del formato InputChar (8) El nombre del formato para la información de liberación de Domino. Puede utilizar DRLS0100, consulte la Tabla 5. Código de error I / OChar () Devuelve información de error para la persona que llama. Tabla 4. Estructura de los búferes de datos A continuación se presentan las estructuras de datos predefinidas en el archivo de encabezado H / QNNINLDS en la biblioteca QNOTES que se pueden utilizar al llamar a la API QnninListDominoRlsI. QnninListDominoRls define las listas de información de la versión y DominoRls100 define la información de la versión con el formato DRLS0100. Listado 6. Estructuras utilizadas en QnninListDominoRlsI El código de ejemplo siguiente proporciona un ejemplo para enumerar todas las versiones de Domino instaladas en el sistema. La información de liberación incluye biblioteca de tiempo de ejecución, ruta de acceso de ejecución, versión, ID de producto y opción de producto. Listado 7. Código de ejemplo para QnninListDominoRlsI Obtener y establecer el valor de Notes. ini (QnninGetIniValue y QnninSetIniValue) Estas dos API se utilizan para obtener o establecer un valor en el archivo notes. ini de los servidores Domino. Proporciona una forma sencilla de cambiar programaticamente la configuración en el archivo notes. ini. Por ejemplo, si un cliente desea habilitar la depuración de semáforo en todos sus servidores Domino, puede usar esta API para comprobar cada servidor para ver si la configuración ya está activada. Si no, pueden habilitar programaticamente la depuración de semáforo. Al hacer esto, el cliente evita tener que comprobar manualmente o establecerlo en cada servidor utilizando comandos CL. Nombre del servidor InputChar (255) El nombre del servidor Domino al que desea establecer el valor notes. ini. Longitud del nombre del servidor Entrada: Binario (4) La longitud del nombre del servidor. Nombre de la variable Notes. ini InputChar () El nombre de la variable que desea establecer un valor. Longitud del nombre de la variable Notes. ini Entrada: Binario (4) La longitud del nombre de la variable Notes. ini. El valor de la variable notes. ini Input: Char () El nuevo valor de esta variable. Flag InputBinary (4) REPLACELIST, APPENDTOLIST y REMOVEFROMLIST. Código de error I / O Char () Devuelto información de error. Este código de ejemplo a continuación da un ejemplo para obtener el valor y, a continuación, establecer otro valor a la variable notes. ini. En este ejemplo, comprobamos la configuración de los servidores Domino notes. ini CONSOLELOGENABLED y la establecimos en 1. Usando estas dos API, puede operar con cualquier otra configuración de notes. ini. Listado 8. Código de ejemplo para QnninGetIniValue y QnninSetIniValue QnninGetIniValuez es igual que QnninGetIniValue API, excepto que los parámetros de cadena de entrada se introducen como cadenas terminadas en null. Lo mismo que QnninSetIniValuez y QnninSetIniValue. Obtener y establecer el elemento de documento de servidor Tenemos 4 APIs relacionadas para obtener o establecer un valor de elemento de documento de servidor. QnninGetServerDocItem QnninGetServerDocItemz QnninSetServerDocItem QnninSetServerDocItemz El elemento de documento del servidor significa un elemento de un documento de servidor de servidores Domino en la base de datos de directorios de Domino (names. nsf). La API QnninGetServerDocItemz es idéntica a la API QnninGetServerDocItem, excepto que los parámetros de cadena de entrada se introducen como cadenas terminadas en nulo. Es lo mismo que QnninSetServerDocItemz y QnninSetServerDocItem. Aquí le damos un ejemplo de cómo usar QnninGetServerDocItemz. Nombre del servidor Entrada: Char (255) El nombre del servidor Domino del que desea obtener información. Nombre del elemento del documento del servidor Entrada: Char () El nombre del elemento para la entrada en el documento del servidor. Buffer de retorno Salida: Char () El búfer utilizado para almacenar el valor de los elementos. Longitud del buffer de retorno Entrada: Binario (4) La longitud del buffer de retorno. Devuelve bytes disponibles Output: Binary () El número de bytes que devolvió en el buffer de retorno. Tipo de datos del buffer de retorno Entrada: Binario (4) Hay tres tipos de datos diferentes para el valor del elemento. TEXTDATATYPE se utiliza para los datos de texto. FLOATDATATYPE se utiliza para los datos de flotador y INTEGERDATATYPE es para los datos enteros. Código de error E / S: Char () Devuelto información de error. En este ejemplo, el programa recupera el título del servidor del documento del servidor en names. nsf y establece el título en el servidor Domino para la prueba API. Listado 9. Código de ejemplo para QnninGetServerDocItem y QnninSetServerDocItem Sugerencias al utilizar estas API Cuando compila su programa C, puede encontrar los siguientes mensajes de error: include file QNNINLDS. H no encontrado. Debe asegurarse de que QNOTES esté en su lista de bibliotecas. Y luego intentarlo de nuevo. Un archivo de encabezado H / QNNINLDS en la biblioteca QNOTES contiene la lista de macros, la lista Estructuras y la lista Prototipo de funciones para las API. Cuando cambia la configuración de notes. ini o la configuración de documentos del servidor, es posible que algunos de ellos no tomen efectividad antes de reiniciar el servidor Domino. Cuando trata con el elemento de documento de servidor, debe utilizar el nombre de elemento correcto. Conclusión Este artículo presenta algunos conocimientos básicos de las API únicas de Domino para IBM i junto con algunos ejemplos de código. Estas API proporcionan una manera fácil de desarrollar programas para administrar y operar servidores Domino en IBM i, especialmente para clientes que tienen muchos servidores Domino. Esperamos que este artículo sirva como un primer paso para que Domino en los desarrolladores de IBM i explore y explote estas API en sus aplicaciones. Recursos


No comments:

Post a Comment