在網上找了一圈,也沒有找到luci-app-ser2net的OpenWrt頁面,於是自己動手寫了個luci-app-ser2net。至於串口透傳模塊ser2net_client和ser2net_server可以聯系本人。用戶只需簡單設置,即可實現串口到網絡的雙向數據透明傳輸,支持心跳功能,支持5路socket連接。
將luci-app-ser2net目錄放到OpenWrt源碼的package/utils下:
[xujun@localhost luci-app-ser2net]$ tree
.
├── files
│ └── root
│ ├── etc
│ │ ├── config
│ │ │ └── ser2net
│ │ └── init.d
│ │ └── ser2net_client
│ └── usr
│ └── lib │ └── lua │ └── luci │ ├── controller │ │ └── ser2net.lua │ └── model │ └── cbi │ └── ser2net.lua └── Makefile 12 directories, 5 files [xujun@localhost luci-app-ser2net]$
luci-app-ser2net/Makefile
include $(TOPDIR)/rules.mk PKG_NAME:=luci-app-ser2net PKG_VERSION=1.0 PKG_RELEASE:=1 PKG_MAINTAINER:=xujun<792799761@qq.com> PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME) include $(INCLUDE_DIR)/package.mk define Package/luci-app-ser2net SECTION:=luci CATEGORY:=LuCI SUBMENU:=3. Applications TITLE:=ser2net for LuCI PKGARCH:=all endef define Package/luci-app-ser2net/description This package contains LuCI configuration pages for ser2net. endef define Build/Prepare endef define Build/Configure endef define Build/Compile endef define Package/luci-app-ser2net/install $(INSTALL_DIR) $(1)/etc/config $(INSTALL_DIR) $(1)/etc/init.d $(INSTALL_DIR) $(1)/usr/lib/lua/luci/model/cbi $(INSTALL_DIR) $(1)/usr/lib/lua/luci/controller $(INSTALL_CONF) ./files/root/etc/config/ser2net $(1)/etc/config/ser2net $(INSTALL_BIN) ./files/root/etc/init.d/ser2net_client $(1)/etc/init.d/ser2net_client $(INSTALL_DATA) ./files/root/usr/lib/lua/luci/model/cbi/ser2net.lua $(1)/usr/lib/lua/luci/model/cbi/ser2net.lua $(INSTALL_DATA) ./files/root/usr/lib/lua/luci/controller/ser2net.lua $(1)/usr/lib/lua/luci/controller/ser2net.lua endef $(eval$(call BuildPackage,luci-app-ser2net))
luci-app-ser2net/files/root/etc/config/ser2net
config ser2net option enabled '0' option DeviceId '12345678' option SimNumber '13900001234' option interval '60' option heartbeat 'FE' option MaxDataLen '1000' option DataWaitTime '300' option ReDialTime '60' option serial '/dev/ttyS0' option 'baudrate' '57600' option 'databit' '8' option 'parity_check' 'n' option 'stopbit' '1' option srvmode '0' option srvport '9999' option clinum '5' option protocol1 'tcp' option ip1 '' option BasePort1 '' option protocol2 'tcp' option ip2 '' option BasePort2 '' option protocol3 'tcp' option protocol4 'tcp' option protocol5 'tcp'
luci-app-ser2net/files/root/etc/init.d/ser2net_client
#!/bin/sh /etc/rc.common START=100 ser2net() { local enabled config_get_bool enabled $1 enabled if [ $enabled ]; then # /etc/init.d/ser2net_server stop local srvmode config_get srvmode $1 srvmode echo $srvmode if [ "$srvmode"x = "0"x ]; then echo $srvmode killall /bin/ser2net_server pidof ser2net_client | awk '{print $2}' > /tmp/ser2net_client PID=$(cat /tmp/ser2net_client) rm /tmp/ser2net_client if [ ! $PID ]; then echo "ser2net client has started." /bin/ser2net_client & else echo "ser2net client: is already running" fi else echo $srvmode killall /bin/ser2net_client pidof ser2net_server | awk '{print $2}' > /tmp/ser2net_server PID=$(cat /tmp/ser2net_server) rm /tmp/ser2net_server if [ ! $PID ]; then echo "ser2net server has started." /bin/ser2net_server & else echo "ser2net server: is already running" fi fi fi } start() { config_load ser2net config_foreach ser2net ser2net } stop() { # pidof ser2net_client | sed -e "s/$$//g" > /tmp/ser2net_client_pid # PID=`cat /tmp/ser2net_client_pid` # rm -f /tmp/ser2net_client_pid # kill -9 $PID echo "ser2net client has stoped." echo "ser2net server has stoped." killall /bin/ser2net_client killall /bin/ser2net_server }
luci-app-ser2net/files/root/usr/lib/lua/luci/controller/ser2net.lua
module("luci.controller.ser2net", package.seeall) function index() entry({"admin", "services", "ser2net"}, cbi("ser2net"), _("ser2net"), 102) end
luci-app-ser2net/files/root/usr/lib/lua/luci/model/cbi/ser2net.lua
--[[
LuCI - Lua Configuration Interface
Copyright 2010 Jo-Philipp Wich <xm@subsignal.org> Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 ]]-- require("luci.sys") m = Map("ser2net", translate("Serial<->Networking"), translate("Serial data and network data exchanged.")) s = m:section(TypedSection, "ser2net", "") s.addremove = false s.anonymous = true s:tab("basic", translate("Basic Configuration")) enabled = s:taboption("basic", Flag, "enabled", translate("Enable")) DeviceId = s:taboption("basic", Value, "DeviceId", translate("Device ID")) DeviceId.rmempty = false DeviceId.default = "12345678" DeviceId:depends("enabled", "1") SimNumber = s:taboption("basic", Value, "SimNumber", translate("Sim Number")) SimNumber.rmempty = false SimNumber.default = "13900001234" SimNumber:depends("enabled", "1") interval = s:taboption("basic", Value, "interval", translate("Heartbeat Interval (s)")) interval.rmempty = false interval.default = "60" interval:depends("enabled", "1") heartbeat = s:taboption("basic", Value, "heartbeat", translate("Heartbeat Content")) heartbeat.rmempty = false heartbeat.default = "FE" heartbeat:depends("enabled", "1") MaxDataLen = s:taboption("basic", Value, "MaxDataLen", translate("MaxDataLen")) MaxDataLen.rmempty = false MaxDataLen.default = "1000" MaxDataLen:depends("enabled", "1") DataWaitTime = s:taboption("basic", Value, "DataWaitTime", translate("DataWaitTime")) DataWaitTime.rmempty = false DataWaitTime.default = "300" DataWaitTime:depends("enabled", "1") ReDialTime = s:taboption("basic", Value, "ReDialTime", translate("ReDialTime")) ReDialTime.rmempty = false ReDialTime.default = "15" ReDialTime:depends("enabled", "1") Parameter1 = s:taboption("basic", Value, "Parameter1", translate("Parameter1")) Parameter1:depends("enabled", "1") Parameter2 = s:taboption("basic", Value, "Parameter2", translate("Parameter2")) Parameter2:depends("enabled", "1") Parameter3 = s:taboption("basic", Value, "Parameter3", translate("Parameter3")) Parameter3:depends("enabled", "1") Parameter4 = s:taboption("basic", Value, "Parameter4", translate("Parameter4")) Parameter4:depends("enabled", "1") Parameter5 = s:taboption("basic", Value, "Parameter5", translate("Parameter5")) Parameter5:depends("enabled", "1") s:tab("serial", translate("Serial Configuration")) baudrate = s:taboption("serial", ListValue, "baudrate", translate("Baudrate (bps)")) baudrate:value("110", "110") baudrate:value("300", "300") baudrate:value("600", "600") baudrate:value("1200", "1200") baudrate:value("2400", "2400") baudrate:value("4800", "4800") baudrate:value("9600", "9600") baudrate:value("19200", "19200") baudrate:value("38400", "38400") baudrate:value("57600", "57600") baudrate:value("115200", "115200") baudrate:value("230400", "230400") baudrate.default = "57600" databit = s:taboption("serial", ListValue, "databit", translate("Databit")) databit:value("5", "5") databit:value("6", "6") databit:value("7", "7") databit:value("8", "8") databit.default = "8" parity_check = s:taboption("serial", ListValue, "parity_check", translate("Odd-Even Check")) parity_check:value("n", translate("None Check")) parity_check:value("o", translate("Odd Check")) parity_check:value("e", translate("Even Check")) parity_check.default = "n" stopbit = s:taboption("serial", ListValue, "stopbit", translate("Stopbit")) stopbit:value("1", "1") stopbit:value("2", "2") stopbit.default = "1" s:tab("network", translate("Networking Configuration")) o = s:taboption("network", ListValue, "srvmode", translate("Server Mode")) o:value("0", "Client") o:value("1", "Tcp") o:value("2", "Udp") o:value("3", "Tcp&Udp") o = s:taboption("network", Value, "srvport", translate("Server Port")) o:depends("srvmode", "1") o:depends("srvmode",