【问题标题】:Serial port communication and web application串口通信和网络应用
【发布时间】:2013-09-10 22:58:17
【问题描述】:

我需要集成我的 REST (Jersey) 和串行端口通信。我现在在处理服务器操作时遇到问题。基本上我使用的是 RXTXcomm.jar 库并直接在其中打开端口(串行端口的参数是硬编码的):

public class ApplicationConfig extends Application {
      public ApplicationConfig () {
            // init serial port here
      }
}

我的问题:

  1. init 类在第一次调用我的 API 时被实例化。我可以在服务器启动后以某种方式强制初始化吗?
  2. 其次是端口关闭。当我停止服务器时,我需要关闭我的端口。如何检测服务器停止事件?
  3. 您是否发现这种方法存在一些问题? (这是可选问题)。

谢谢。


我不想通过 HTTP 请求传递数据。只需使用一些参数,然后在 REST 资源内部填充串行数据。请求将非常罕见,并且仅来自一个“客户”。

【问题讨论】:

    标签: java web-services web-applications serial-port


    【解决方案1】:

    如果您实现ServletContextListener,您可以在服务器启动时初始化您的 init 类。

    1. ServletContextListener 有一个 contextInitialized(javax.servlet.ServletContextEvent) 方法,该方法在服务器启动时被调用,您可以重写该方法来初始化您的 init 类。
    2. ServletContextListener 有一个 contextDestroyed(javax.servlet.ServletContextEvent) 在服务器停止时被调用,你可以覆盖它来关闭你的端口。
    3. 你的项目似乎是一个爱好项目,所以我建议你先让它工作,然后再考虑优化/清理。

    【讨论】:

    • 这更像是演示/试用项目。我运行你的建议。一个 START/STOP 循环工作得很好。但是当重新部署我的应用程序时,我看到了异常:java.lang.UnsatisfiedLinkError: Native Library rxtxSerial.dll already loaded in another classloader thrown while loading gnu.io.RXTXCommDriver.
    • 您可能想要停止/启动您的服务器,而不仅仅是重新部署。如果您不想这样做,发布您的代码可能会帮助我们进行调试。
    • 你也可以在捕获UnsatisfiedLinkError时用try/catch包裹System.load()调用。
    • 非常感谢!您的解决方案非常适合正常工作:一个周期启动/停止服务器。我只是发布错误以供参考(我观察到是因为我在 IDE 中启用了“保存时部署”)。
    【解决方案2】:

    我想可能会有一个潜在的问题,如果在第一个请求仍在写入串行端口时发出第二个请求。

    您可以创建一个独立的应用程序,该应用程序将通过 tcp/ip(或命名管道或其他 ipc 方式)接收数据,将其缓存在队列中并将其转发到串行端口。

    【讨论】:

    • 感谢您的意见。我的请求将非常罕见,并且仅来自一个“客户”。我不想使用非常复杂的解决方案,因为没有时间。但我想我明白你的意思。这可能是一个不错的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-21
    • 2012-12-20
    • 1970-01-01
    • 2018-11-30
    • 1970-01-01
    • 2022-12-16
    • 1970-01-01
    相关资源
    最近更新 更多