Cómo hacer un lector de código con Node.js para Linux

Si deseas deseas desarrollar una aplicación web que lea códigos de barras utilizando Node.js, puedes buscar un módulo de código de barras con npm o construir uno por tus propios medios. En este tutorial, te voy a ilustrar sobre cómo crear addon para leer códigos de barras en Ubuntu con DBR (Dynamsoft Barcode Reader para Linux).

Si deseas utilizar la última versión de node, no instales node y npm con la utilidad apt-get, ya que sólo obtendrás la versión antigua y provocarás el error - 'FunctionCallbackInfo' does not name a type:

Instalar Node

Descarga el último paquete de node: node-V5.3.0-linux-x64.tar.gz.

Extrae el paquete tal que así:

tar -xzf node-v5.3.0-linux-x64.tar.gz

Abre .bashrc

nano ~/.bashrc

Exporta el path node y guarda .bashrc

export PATH=$(YOUR_HOME)/Downloads/node-v5.3.0-linux-x64/bin:$PATH

Instala node-gyp

npm install -g node-gyp

Instala DBR

Descarga v4.0.0-pre-alpha.tar.gz

Extrae el paquete dbr

tar -xzf v4.0.0-pre-alpha.tar.gz

Encontrar la librería compartida cuando se construye el proyecto con make, crea un enlace simbólico del código de barras.

sudo ln -s $(DynamsoftBarcodeReader)/Redist/libDynamsoftBarcodeReaderx64.so /usr/lib/libDynamsoftBarcodeReaderx64.so

Como hacer el addon del lector de código de barras con Node

Crea binding.gyp y especifica las rutas de las cabeceras del DBR y las librerías compartidas:

{
  "targets": [
    {
      "target_name": "dbr",
      "sources": [ "dbr.cc" ],
      "include_dirs" : [
        "$(DynamsoftBarcodeReader)/Include"
      ],
      "libraries": [
        "-lDynamsoftBarcodeReaderx64", "-L$(DynamsoftBarcodeReader)/Redist"
      ]
    }
  ]
}

Crea dbr.cc usando el código de emplo provisto por Dynamsoft Barcode Reader SDK:

#include 
#include "If_DBR.h"
#include "BarcodeFormat.h"
#include "BarcodeStructs.h"
#include "ErrorCode.h"

using namespace v8;

// Barcode format
const char * GetFormatStr(__int64 format)
{
	if (format == CODE_39)
		return "CODE_39";
	if (format == CODE_128)
		return "CODE_128";
	if (format == CODE_93)
		return "CODE_93";
	if (format == CODABAR)
		return "CODABAR";
	if (format == ITF)
		return "ITF";
	if (format == UPC_A)
		return "UPC_A";
	if (format == UPC_E)
		return "UPC_E";
	if (format == EAN_13)
		return "EAN_13";
	if (format == EAN_8)
		return "EAN_8";
	if (format == INDUSTRIAL_25)
		return "INDUSTRIAL_25";
	if (format == QR_CODE)
		return "QR_CODE";
	if (format == PDF417)
		return "PDF417";
	if (format == DATAMATRIX)
		return "DATAMATRIX";

	return "UNKNOWN";
}

void DecodeFile(const FunctionCallbackInfo& args) {

	Isolate* isolate = Isolate::GetCurrent();
	HandleScope scope(isolate);

	// convert v8 string to char *
	String::Utf8Value fileName(args[0]->ToString());
	String::Utf8Value license(args[1]->ToString());
	char *pFileName = *fileName;
	char *pszLicense = *license;
	// Dynamsoft Barcode Reader: init
	__int64 llFormat = (OneD | QR_CODE | PDF417 | DATAMATRIX);
	int iMaxCount = 0x7FFFFFFF;
	ReaderOptions ro = {0};
	pBarcodeResultArray pResults = NULL;

	// Initialize license
	if (pszLicense)
	{
		printf("license: %sn", pszLicense);
		DBR_InitLicense(pszLicense);
	}
	else
		DBR_InitLicense("AC4561856D63EF392F46D7454052372D");

	ro.llBarcodeFormat = llFormat;
	ro.iMaxBarcodesNumPerPage = iMaxCount;

	// Decode barcode image
	int ret = DBR_DecodeFile(pFileName, &ro, &pResults);
	printf("ret: %dn", ret);

	if (ret == DBR_OK){
		int count = pResults->iBarcodeCount;
		pBarcodeResult* ppBarcodes = pResults->ppBarcodes;
		pBarcodeResult tmp = NULL;

		// javascript callback function
		Local cb = Local::Cast(args[2]);
		const unsigned argc = 1;

		// array for storing barcode results
		Local barcodeResults = Array::New(isolate);

		for (int i = 0; i < count; i++)
		{
			tmp = ppBarcodes[i];

			Local result = Object::New(isolate);
			result->Set(String::NewFromUtf8(isolate, "format"), Number::New(isolate, tmp->llFormat));
			result->Set(String::NewFromUtf8(isolate, "value"), String::NewFromUtf8(isolate, tmp->pBarcodeData));

			barcodeResults->Set(Number::New(isolate, i), result);
		}

		// release memory
		DBR_FreeBarcodeResults(&pResults);

		Local argv[argc] = { barcodeResults };
		cb->Call(isolate->GetCurrentContext()->Global(), argc, argv);
	}
}

void Init(Handle exports) {
	NODE_SET_METHOD(exports, "decodeFile", DecodeFile);
}

NODE_MODULE(dbr, Init)

Automáticamente generará los archivos del proyecto:

node-gyp configure

Construye el proyecto para producir dbr.node

node-gyp build

Escribe un test dbr.js que cargue la licencia SDK e invoque los métodos nativos de lectura:

var dbr = require('./build/Release/dbr');
var readline = require('readline');
var fs = require('fs');

fs.readFile('./license.txt', 'utf8', function (err, data) {
  if (err) throw err;
  var rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
  });

  var license = data.trim();
  rl.question("Please input a barcode image path: ", function(answer) {

    dbr.decodeFile(
      answer, license,
      function(msg){
        var result = null;
        for (index in msg) {
          result = msg[index]
          console.log(result['format']);
          console.log(result['value']);
          console.log("##################");
        }
      }
    );

    rl.close();
  });
});

Ejecuta el script

Y este ha sido el artículo en el que trataba explicaros como hacer un lector de código con Node.js para Linux, esperamos que te haya gustado y sepas aplicarlo en tus futuros proyectos. Ya sabes que si nos quieres proponer un tema que quieres ver reflejado como un tutorial o como una práctica, solo tienes que hacer uso del área de comentarios de un poco más abajo. Por el contrario, si quieres enviarnos tus propios tutoriales, puedes hacerlo a través de la intranet de usuarios que está habilitada para ello, a través del menú Enviar Tutorial. Ya sabes, ayúdanos a crecer con tus conocimientos. ¡Un saludo y feliz código!

 

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP