Project

extface

0.0
No commit activity in last 3 years
No release in over 3 years
Extface allows use of Cash Registers, Fiscal and POS printers without physical connection between the device, application server and the end user. Can also be used for remotely reading CDR logs from PBX systems and actually supports data exchange with all low-speed devices having serial, parallel or USB* interface
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
 Dependencies

Development

Runtime

 Project Readme

Extface

External Interfaces for Cloud-Based Applications (Rails 4)

Using Cash Registers, Fiscal and POS printers without physical connection between the device, application server and the end user. Can also be used for remotely reading CDR logs from PBX systems and actually supports data exchange with all low-speed devices having serial, parallel or USB* interface. Extface allows multiple jobs to be executed in queue, and provides job progress monitor through Server-Sent Events.

It's just the beginning

gem 'extface'

bundle install

bundle exec rake extface:install:migrations

bundle exec rake db:migrate

Communication with devices is realized through Redis server, so it is required. Read more down.

Home page: http://extface.com

Demo application: http://example-extface.rhcloud.com

Demo application source code: https://github.com/AlexVangelov/extface-example

To add external interfaces to Shop model, use mapper extface_for in config/routes.rb, example:

resources :shops do 
  extface_for :shop
end

Add has_extface_devices in your /app/models/shop.rb

Extface engine will be visible at link_to 'Extface', shop_extface_path(@shop)

Create a device with driver Generic Pos Print. Copy the Pull URL, visible on device's show page.

To simulate client side (one way communication) of the system you can use bash script (replace the URL with your one):

while true; do RESULT=$(curl -u extface:extface -c extface -b extface -s http://localhost:3000/shops/1/shop_extface/bb6ac841cf239ab89b967352c40e4b39); if [ -z "$RESULT" ]; then sleep 5; else echo -e "$RESULT"; sleep 1; fi done

Hit The Print Test Page and you will see result in you console.

Output can be forwarded to real device by adding > /dev/ttyS0 at the end example script.

Extface Client

(Update 2014-08-13) To allow testing the module without having a hardware client, I just realize win32 version, available for download in bin/extface_client_win32 extface.exe It's fully featured client for tests and development. The only limit is that it does not support SSL and is not recommended to use in production. Command line options:

extface.exe PullUrl [PORT][,BoudRate][,ByteSyzeParityStopBits][,Control]
Options: Parity: E|M|N|O|S; StopBits: 1|1.5|2; Control: N|H|X (None|Hardware|XON/XOF)
Default: COM1,9600,8N1,N

Usage

job = extface_device.session do |s|
  s.print "some data\r\n"
  10.times do |i|
    s.print "Line #{i}\r\n"
  end
end

The result of this block returns immediately, and the job is executed in background. Job execution can be monitored with EventStream (SSE) at shop_extface_job_path(shop, job)

Extface is happy with Unicorn workers, even recommended it!

The project is still in workflow development stage. It is focused on the following tasks:

Easy and clear integration. Reliability. Low consumption of server and client resources. Maintenance of a large number of protocols and devices.

Rails engines

Extface is intended to work properly with multiple instances in rails engines. Possible routing mappers:

resources :shops do
  extface_for :shop, interfaceable_type: 'Market::Shop', controller_include: 'Market::ShopController'
end

Where Market::ShopController is Module that includes application before actions, like authentication, set locale and what ever.

scope ':shop_uuid' do
  extface_for :shop, interfaceable_type: 'Market::Shop', interfaceable_param: :shop_uuid, controller_include: 'Market::ShopController'
end

This will mount extface at market/:shop_uuid/shop_extface and will try to find shop instance by Market::Shop.find_by(uuid: params[:shop_uuid])

Redis connection string

Create config/initializers/extface.rb:

Extface.setup do |config|
  #config.redis_connection_string = "redis://username:password@my.host:6389"
  #config.device_timeout = 10 #seconds to wait before cancel the job if there is no activity on the device
end

Views & Layout

Views as designed for twitter bootstrap CSS. Engine layout can be replaced by creating app/views/layouts/extface/application.html.erb in your engine/main_app.

Driver writing guide

http://alexvangelov.wordpress.com/2014/08/14/extface-driver-writing-guide-ruby https://alexvangelov.wordpress.com/2015/05/21/extface-driver-writing-guide-2