Posts From Category: brightscript

Using HTTPS on a Roku device

I was once developing a Roku application and switched from a staging environment to (what was supposed to be) an identical production environment and everything stopped working. It turned out that the only difference with the API was one was HTTP and one was HTTPS. I know, cool story, bear with me.

Generally for a HTTP request you have something like this sat in a task node (to make it asynchronous):

function httpGetRequest(url as String) as Object
	request = createObject("roUrlTransfer")
	request.setURL(url)
	response = request.getToString()
	return response
end function

This is simplified version of what you actually would have as Roku isn’t the best at handling anything other than POST/GET requests - you’d need to handle these yourself (I’ll cover this in another post).

To enable HTTPS you have to set the certificates file and then initialise it. The certificate file is either the .pem file on your web server or the common one listed below (if you don’t know try it with the file listed below, it is included on all Roku boxes). Add the following to the code we wrote above:

if left(url, 5) = "https" then
	request.setCertificatesFile("common:/certs/ca-bundle.crt")
	request.initClientCertificates()
end if

The complete request would look something like this:

function httpGetRequest(url as String) as Object
	request = createObject("roUrlTransfer")
	if left(url, 5) = "https" then
		request.setCertificatesFile("common:/certs/ca-bundle.crt")
		request.initClientCertificates()
	end if
	request.setURL(url)
	response = request.getToString()
	return response
end function

Read More

Mood

Setting up a SceneGraph application

Set up a SceneGraph application with correct directory structure and get it running on the box.

The way SceneGraph applications are set up with regards to directory structure are different than previous SDK1 applications.

Have a read of the information here

Basically you have your directory structure like this:

- components
- images
MakeFile
manifest
- source

To run your application you will need a Main function that creates a screen in a Main.brs file. Your Main.brs file should be in your source folder. Here is an example of a Main.brs file:

sub Main()
  showChannelSGScreen()
end sub

sub showChannelSGScreen()
  print "in showChannelSGScreen"
  screen = CreateObject("roSGScreen")
  m.port = CreateObject("roMessagePort")
  screen.setMessagePort(m.port)
  scene = screen.CreateScene("mainScene")
  screen.show()

  while(true)
    msg = wait(0, m.port)
    msgType = type(msg)

    if msgType = "roSGScreenEvent" then
      if msg.isScreenClosed() then
        return
      end if
    end if
  end while
end sub

As you can see above we created a scene called mainScene. This needs to be implemented at some point. In SceneGraph applications there are two different file types we use. *.brs and *.xml - we generally use the xml files for views and the *.brs files for everything else. You can embed BrightScript code into the xml files but I’ve often found it good practice to separate the two.

Next create a file called components/mainScene/MainScene.xml and write the following code in it.

<?xml version="1.0" encoding="utf-8" ?>

<component name="MainScene" extends="OverhangPanelSetScene" >
    <interface>
    </interface>

    <children>

    </children>
    <script type="text/brightscript" uri="pkg://components/mainScene/MainScene.brs" />
</component>

Notice that we have included a brs file within it (<script type="text/brightscript" uri="pkg://components/mainScene/MainScene.brs" />). This brs file would usually contain the business logic for the view - like a mediator/controller. In this example though it’s cool just to print something out - like this (create this in components/mainScene/MainScene.brs):

function init() as Void
  ? "howdy"
end function

Note how the init() method is always called on object creation - like a constructor.

Getting the app on the box

Now getting the application on to the box. To make things easier I have a MakeFile that I use (http://ry.d.pr/Fysh - mainly based on Roku’s). To run this makefile download it to the root directory of your application. Open a shell in your root and execute (where 192.168.1.XXX is the IP of your box):

export ROKU_DEV_TARGET=192.168.1.XXX

Once you have done this you can simply type:

make install

to install your app.

Have a play around and get your app on the box - add a few components to the view if you like. Also have a look at the manifest file and add some different splash screens there.

To view trace output/errors you can telnet into your box.

telnet 192.168.1.XXX 8085

On firmware previous to 7.5 you can use ports 8085 - 8089 for different outputs (main app, threads, component traces) but on firmware 7.5 all of this is amalgamated on port 8085 (which makes life a lot easier).

Read More