Basic SB1 Application Development with WebServer and MySQL
I thought I would share my experiences with the community from when I created my first application and the hints and tips which I picked up from the internet and from colleagues. Hopefully the information below may help others who want to take the step to creating their first "Hello World" SB1 application. In this guide I will show how I have completed it using a Windows 7 machine, however it is just as simple to do using Linux and I have included links for that too.
The simple idea I wanted to do was to scan a barcode on the SB1 and then search a database on a server, find the product, return the data and show the data on the SB1. A basic price check application, which is a common use of the SB1.
Now being a native developer, this was one of the first time I had done a web based application. So the first thing I needed to do was get an environment set up. This was where I had the most issues and annoyances! The main problems were interference with other services which already ran on my machine (IIS, Soti, FileZilla) which all used port 80 or other ports which the webserver used.
Installation Tips:
- Don't use your native development machine!!! Leave that to do your native development!
- Either use a secondary machine (Not always plausible) , or set up a VM on your windows machine
- Download VM Ware player here https://my.vmware.com/web/vmware/free#desktop_end_user_computing/vmware_player/5_0
- Then either use a free linux VM - There seem to be a fair few listed here including Ubutu - http://www.thoughtpolice.co.uk/vmware/
- Or create your own Windows VM
- Download VM Ware player here https://my.vmware.com/web/vmware/free#desktop_end_user_computing/vmware_player/5_0
- Once you have your development environment you will then need to install the necessary components to get started
- A Webserver - Recommendation here is to use WAMP or LAMP depending on your OS - WAMP stands for (Windows, Apache, MySQL, PHP) or LAMP (Linux......) found here - http://www.wampserver.com/ or read the Wiki guide to install a LAMP - http://en.wikipedia.org/wiki/LAMP_(software_bundle)#External_links
- This then has the basics you need, now you will need something to edit your MySQL database. You can use the cmd line but my preference would be to use a GUI. There is a workbench editor available here http://dev.mysql.com/downloads/tools/workbench/just install the workbench part as the rest has been installed by WAMP
- A text editor - I would recommend Notepad++ as this highlights the HTML http://notepad-plus-plus.org/download/v6.4.2.html
- Google Chrome, best developer tools for checking for errors
- Now your all set up its time to do some development :-)
Develop a Simple Application
As I mentioned earlier I wanted to create a demo price check application. I started by using the developer toolkit applications as a base http://support.symbol.com/support/search.do?cmd=displayKC&docType=kc&externalId=13880&sliceId=&dialogID=481754905&stateId=1%200%20481746650
The application I used was the Price Check App found here TSDxc60AenDT000700\Sample UserDrives\Full Sample User Drive\UserDrive\apps\PriceCheck
This does exactly the scenario which I wanted to do but does it locally on the device. I need to move it to be hosted by a webserver and the data be stored on the database rather than in the application.
Checking the WAMP Server installation
When you run the WAMP server if all is working as expected you should see a green "W" in the taskbar, this indicates all is working fine. If for some reason the icon is orange it may be that one of the services is not running. Always worth a reboot of the PC if thats happening. Else click on the "W" and this will bring up a pop-up. Here you can choose the Application, Service and see if they are running, if you are seeing problems, it maybe that something is already running on port 80 (which is what WAMP uses). You can check this by using CMD as using the command netstat -aon, this will list the services running and on what ports. However with a clean installation as suggested you should not see any issues :-)
Setup MySQL Database
Here is where we want to put the data in order to search for it.
- Load up the MySQL Workbench, this is what you should see
2. Now select the database in the left column. This will bring up an editor
3. Here choose New Schema and add the scheme name of product
4. Create a table with the name stock and then add the columns :- code, info1, info2, item, description, image - Set Code as the primary key, and set them all as VARCHAR(45), bar image which will need to be bigger to include the image data. Try VARCHAR(1000)
5. Save and apply that and this will create the database
6. Here if you right click on the table stock, and then choose "Edit Table Data" it will allow you to input the data.
7. Here is used the data from the Product Info HTML page
{ info1: '$5.75', info2: '', image: 'data:image/png;base64,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', code: '294491310254', item: 'Cheese', description: 'Jasper Hill Cabot Cloth Bound Cheddar' }
Enter that data into the table and it should be as shown here (NB I only entered two records)
Webpage Development
With the data inserted into the table now we can get on with coding the HTML page in order to sync the data. Using the Price Check application I am going to modify it to firstly remove the Database from within it and then hook it up to the database via a PHP script. The first thing I needed to do was in the DecodeEvent fucntion which handles the decoding of the barcode, now rather than doing the searching through the internal database, I send that data to my PHP page. In that PHP page, I can then search the database.
Here are the changes I made
function decodeEvent(str) { str= str.data; if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari xmlhttp=new XMLHttpRequest(); } else {// code for IE6, IE5 xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); } xmlhttp.onreadystatechange=function() { if (xmlhttp.readyState==4 && xmlhttp.status==200) { UpdateScreen(); } } xmlhttp.open("POST","getuser.php",true); xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); xmlhttp.send("q=" + str); }
You will notice a few things in this code:
- Firstly I create a HTTP request in order to send the data
- I then have a callback which waits on the object to be returned and then it will update the screen with that data - this is this snippet - 200 means that the xmlhttp return is "OK" and the ready state of "4" means "Completed"
if (xmlhttp.readyState==4 && xmlhttp.status==200) { UpdateScreen(); }
More states can be looked for such as error responses etc - they can be seen here - http://msdn.microsoft.com/en-us/library/windows/desktop/ms767625(v=vs.85).aspx,and the ready states - http://msdn.microsoft.com/en-us/library/windows/desktop/ms753702(v=vs.85).aspx
Then I "POST" the request to my PHP page. This is where the data from this page will be interpreted and returned to the page. I used POST rather than GET as it is described as more secure. Theres quite a few documents describing the differences.
The Update screen function then updates the screen with the data returned. As you can see it is returned as XML and you can get the data from the XML file as shown below.
function UpdateScreen() { document.getElementById('info1').innerHTML = xmlhttp.responseXML.getElementsByTagName("info1")[0].firstChild.data; document.getElementById('info2').innerHTML = xmlhttp.responseXML.getElementsByTagName("info2")[0].firstChild.data; document.getElementById('image').src = xmlhttp.responseXML.getElementsByTagName("image")[0].firstChild.data; document.getElementById('code').innerHTML = xmlhttp.responseXML.getElementsByTagName("code")[0].firstChild.data; document.getElementById('item').innerHTML = xmlhttp.responseXML.getElementsByTagName("item")[0].firstChild.data; document.getElementById('description').innerHTML = xmlhttp.responseXML.getElementsByTagName("description")[0].firstChild.data; document.getElementById('priceLookup').className = ''; document.getElementById('information').className = 'hidden'; setTimeout(function(){document.getElementById('details').style.maxWidth = 320 - document.getElementById('image_div').clientWidth;},300); asl.back(function() { document.getElementById('priceLookup').className = 'hidden'; document.getElementById('information').className = ''; asl.back(exit); });
PHP Page
This page is used to receive the data which was sent from the HTML page. Here the data which has been sent as 'q' is recieved (Line 2), then we connect to the MySQL database which we previously created with Database name "Product" and username "root" and the password is blank.
Then using a simple SQL Select from the Table stock where the code equals the data we have received. Here we set variables for all of the data which has been received and then outputted as XML at the bottom of this page
You can test this by just using the PHP command window. If you navigate to the directory where php is located and then run php.exe and then the file you want to run, this will execute it and test that page (just incase your HTML page is broken). Simply change the SQL query to be a number you know exists!
Getting the page set up on the webserver
Now you have the pages, we need to make sure they work on the webserver and on the SB1. First lets check them on the PC which you are using. Drop them into your webserver folder, normally C:\wamp\www
As we are wanting to use these on the SB1 we will need to also include in this folder the "asl.css" and the "asl.js" so also drop them in. Due to this we need to edit the HTML file to update the path from
to
so that the asl.js is found on the server. With these 4 files on the server we can now view the site.
If you load Chrome up and then navigate to http://localhost:8080/index.html,this should then show you the SB1 page. It should look similar to below
If you have issues, check the Chrome Developer options (F12) and this will bring up a console, from here you can see the HTML/Javascript Errors, if no errors are shown, it may be your php, test as documented above
Obviously you cant scan a barcode to test but you could insert a button and send that data to the DecodeEvent function to test the return values to the database
Add this to the information body at the bottom of the page
Submit Details
Setting Up Your SB1
So your application works with your webrowser and you can access data from the database, now we need to get this on your SB1, and this is the simplest thing so far :-)
On your SB1 connect your device to the same wireless network as your webserver is connected to
Take your SB1, and if you have one, connect your developer backhouse. If you do not have this you will need to use MSP staging server or equivalent to do the next parts.
When the SB1 is connected you will see the UserDrive as an external drive. Navigate their and then create a folder called "Config". Navigate into there.
In here we need to place a file called apps.json. This will link your SB1 to your webserver
On your webserver get your IP Address- CMD->IpConfig
Using this we need to create an apps.json
{ "name": "Price Check Web Demo", "url": "http://192.168.4.184:80/index5.html", "icon":"http://192.168.4.159:8080/price_check_icon.png", "login": false, "canOverwriteBadge": true }
Here the IP Address on my server is 192.168.4.184 and i have been using port 80. Also I have put an icon on my webserver which is for the application icon on the device's screen.
With that saved onto the device, reboot the unit, using the Scan and Home key and then the application icon should show on the device.
Click the icon and your scan demo should be there, scan a barcode from the demo scan sheet and it should show the data.
NB: The image may not show as they are too large to send over the webserver, create a smaller image and convert it to base64 via a online tool
Mark Jolley
8 Replies
I would like to share what i have been doing however my "hands are tied" to some extent.
Suffice to say that it was the following:
Website 1 has a page which enables the scanner. it makes calls to the webapi.
WebApi hosted on IIS7 returns json data for the page to handle. If this approach is used then enabling CORS is important for the webpi to allow it to serve the requests from website 1.
If you have any questions then I will try and help out.
Hi David,
Great news you found it useful :-) Sometimes you write these things and are never quite sure if they will be read!
Glad you managed to get it working and apologies for not getting back quick enough to answer your issues.
Is this something you could share with us and do a quick write up for others?
Cheers
Mark
Hello David,
It would be great if you could share your demo application. I am planning to use ASP.Net and MSSQL server.
Cheers
OJ
David I am having a few issues with the SB1 app... Any change you are still willing to share or sample application for me to get an idea of what I am doing wrong?
Thank You Very much!
Marcel
Hi Marcel,
Sure I will try and help out where I can. It might be a good idea to start a new discussion with a summary of your app/how you created it and what the problem/error is?
Cheers
David
Looks good, I will have to try it out. I am trying to get a demo app working in the.NET environment .
Run a web app on my webserver with webapi. The webapis are used by ajax calls to update the screen.
Have you tried using jquery when developing web apps for the SB1?
My first attempt at this has resulted in the app working in desktop browser but the ajax call to get product info failing. Once the fail callback function is ok'd the screen keeps refreshing!!
FYI - the web app uses following
asl.js
asl.css
knockout.js - I have watched the developer video which suggested a SPA approach
jquery.js
modernizr.js
myown.js with ajax calls and update DOM elements.
Obviously I will have start again and probably running before walking! so starting with creating the XMLHttprequest object could be good starting point.
Cheers
If anyone is interested I have a got my demo working. In a similar vein to the example above I have got my demo working. On the client dev side I wanted to get back to basics so just used the following:
asl.js
asl.css
mytest.js - using xmlHttpRequest
A page does the following:
Scan barcode - calls webapi in ASP.NET. Retrieves basic product details and displays on screen.
There is a number field which displays SB1 keyboard to allow user to enter number.
Update button - calls webapi to update database.