Tynamo™-TINI FAQ

This document contains answers to frequently asked questions about the Tynamo™-TINI server.

Topics:


General

  • What does 'conditionally compliant' mean?

    'Conditionally compliant' means that the server satisfies a certain minimum level of the requirements of the HTTP specification. Please consult Section 1.2 of RFC 2616, Hypertext Transfer Protocol -- HTTP/1.1.

Building

  • The build is reported as successful, but no binary was built, and it displays this message: "[tini] Could not find BuildDependency. Make sure you have it in your classpath". What does this mean?

    This usually means that Ant cannot find the TINI tools with which to convert your classes into a .tini executable. Check that the tini.path setting in your build.properties file is correct. If you've used backslashes ('\'), then ensure that you use two backslashes when you mean one. For example, if your TINI firmware is in C:\tini1.17, then specify

    tini.path=C:\\tini1.17

    The reason for this is that properties files interpret the backslash as an escape, changing the meaning of the following character. For example, "\t" represents a tab, and "\\" represents a single backslash.

    The preferred solution, however, is to use forward slashes for all file separators. For example, use

    tini.path=C:/tini1.17

    instead.

  • Why does Ant give me the error, 'The <condition> task doesn't support the nested "isset" element.'?

    You need to use Ant version 1.5.x or later.

  • How do I decrease the size of the .tini binary?

    Try removing unneeded OneWireContainer objects from the build by deleting the appropriate lines from dependency.groups in the build.properties file. Servlet reloading also takes up space with lots of reflection information, so this can also be excluded from the build. Please see Building Reloading into the Binary.

Deploying

  • Why doesn't FTP work, using the deploy task or otherwise?

    Try setting the FTP client to passive mode. For the deploy task, change passive="no" to passive="yes" in all the <ftp> tags in your build.xml file.

Servlets

  • How do I add my own 1-Wire servlet?

    Well, there are two ways:

    1. You can include it via the example OneWireServlet.
    2. Alternatively, you could write your own servlet that has nothing to do with the 1-Wire example, and map your own request path. Please see the writing your own servlets document.
  • How do I add support for more 1-Wire containers?

    Simply add the appropriate OneWireContainer object to the dependency.groups and reflect.classes properties in the build.properties file.

    For example, to add support for the Thermocron iButton, add "OneWireContainer21" to dependency.groups and "com.dalsemi.onewire.container.OneWireContainer21" to reflect.classes.

Execution

  • How do I make the server start faster?

    Try removing unnecessary lines from the servlet.props file.

  • My logs say that my logfiles were mailed, but I don't receive them. Why is this so?

    There is a very strong possibility your mailhost isn't set. You can accomplish this with the ipconfig -h <mailhost> Slush command. Another possibility is that your mail server does not accept mail with a "From" domain it does not recognize.

  • Why are there frequent IOExceptions in the log?

    If the remote connection closes its connection before the server is finished reading or sending information, then an IOException will be thrown when attempting to read from or write to the socket connection. This exception is not ignored by the server since there may be other reasons for this type of error within your own servlet.

    Now, while most errors within a servlet should be wrapped inside a ServletException, this may not be the case, and so an IOException may indicate a servlet problem not related to the connection.

  • My server always responds with a "400 Bad Request" or "Invalid host." message.

    The solution is to comment out the server.hostname property in the server configuration file.

    All HTTP/1.1 requests must have a "Host:" header in the request. If the value of this header does not match the server.hostname property, then this message will be returned. Unless you know for sure that HTTP clients will be requesting this specific host, this property should not be set.

  • Why does it give me the error, "Insufficient contiguous heap", when trying to start the server?

    The TINI doesn't handle heap fragmentation very well, so even though your free memory may seem more than sufficient, there may not be a continuous block of memory with sufficient space for the server. Try rebooting, and if that doesn't fix the problem, try clearing the heap and reloading the application.

    Note: You can reboot with the '-h' option to clear the heap.

  • Why can't I find or instantiate class X?

    If building the server for TINI firmware 1.1x, make sure to include the full class name in the reflect.classes build property. Also, be sure to include the correct dependency group in the dependency.groups property if needed (1-Wire classes, for example). Lastly, ensure that the syntax of each entry in the build file is correct. For example, if a list spans multiple lines, then there should be a ",\" at each line break.

    Note that this problem can also manifest itself as a 404 Not Found error when trying to access a servlet that "you just know is there".

  • Why are new sessions created when it should be using a previously created one?

    Make sure to get the session before calling getOutputStream(). The reason is that session IDs are usually stored in the headers, and a call to getOutputStream() does not allow any more headers to be sent. This is what is meant by a "committed response".

  • Why am I getting a NullPointerException when constructing a new URL object?

    First, make sure that the appropriate URL handler classes are included in the build (see dependency.groups and reflect.classes). If this does not solve the problem, then make sure you are using the latest firmware (version 1.17, as of this writing).

    There is a bug inside the algorithm that looks for appropriate handler classes for URLs. It exists in firmware versions 1.11, 1.02f, and earlier. It is fixed in firmware 1.12 and 1.02g.

  • Why is a MalformedURLException being thrown when creating a new URL object?

    A MalformedURLException is thrown when the string could not be parsed as a valid URL, or a valid protocol implementation could not be found. First check that the string is correct. Next, ensure that the proper protocol handler classes are included, either in your source, or in the dependency classes.

    For example, to support the "http" protocol, add "HTTP" to the dependency.groups build property and "com.dalsemi.protocol.http.Handler" to reflect.classes.

    In other words, if you're sure the URL is correct, then some classes are probably missing from the build.