Przeglądaj źródła

add:添加jt808的demo

mw 2 lat temu
rodzic
commit
4dfa4ea5f3

+ 217 - 0
demo/jt808/JT808Prot.lua

@@ -0,0 +1,217 @@
+local JT808Prot = {}
+local paraCtrl = require "paraCtrl"
+
+--终端消息ID
+JT808Prot.T_COMMON_RSP = 0x0001
+JT808Prot.T_LOC_RPT = 0x0200
+JT808Prot.T_HEART_RPT = 0x0002
+
+JT808Prot.PARA_HEART_FREQ = 0x0001
+JT808Prot.PARA_TCP_RSP_TIMEOUT = 0x0002
+JT808Prot.PARA_TCP_RESEND_CNT = 0x0003
+JT808Prot.PARA_LOC_RPT_STRATEGY = 0x0020
+JT808Prot.PARA_LOC_RPT_MODE = 0x0021
+JT808Prot.PARA_SLEEP_LOC_RPT_FREQ = 0x0027
+JT808Prot.PARA_ALARM_LOC_RPT_FREQ = 0x0028
+JT808Prot.PARA_WAKE_LOC_RPT_FREQ = 0x0029
+JT808Prot.PARA_WAKE_LOC_RPT_DISTANCE = 0x002C
+JT808Prot.PARA_SLEEP_LOC_RPT_DISTANCE = 0x002E
+JT808Prot.PARA_ALARM_LOC_RPT_DISTANCE = 0x002F
+JT808Prot.PARA_FENCE_RADIS = 0x0031
+JT808Prot.PARA_ALARM_FILTER = 0x0050
+JT808Prot.PARA_KEY_FLAG = 0x0054
+JT808Prot.PARA_SPEED_LIMIT = 0x0055
+JT808Prot.PARA_SPEED_EXCEED_TIME = 0x0056
+
+JT808Prot.CONTROL_RESET = 4
+
+--平台消息ID
+JT808Prot.S_COMMON_RSP = 0x8001
+JT808Prot.S_REGISTER_RSP = 0x8100
+JT808Prot.S_SET_PARA = 0x8103
+JT808Prot.S_CONTROL = 0x8105
+
+local tSendSeq = 0
+
+local function encodeBcdNum(d,n)
+    if d:len()<n then
+        return (string.rep("0",n-d:len())..d):fromHex()
+    else
+        return (d:sub(1,n)):fromHex()
+    end
+end
+
+local function calCrc(d)
+    local sum = 0
+    for i=1,d:len() do
+        sum = sum^d:byte(i)
+    end
+    return sum
+end
+
+--终端消息封包
+--返回值1:打包后的字符串
+--返回值2:流水号
+function JT808Prot.encode(msgId,...)
+
+    local function cmnRsp(svrSeq,svrId,result)
+        return pack.pack(">HHb",svrSeq,svrId,result)
+    end
+
+    local function locRpt(alarm,status,lat,lng,alt,spd,course,tm,extInfo)
+        -- return pack.pack(">ddddHHHAA",alarm,status,lat,lng,alt,spd,course,tm,extInfo)
+        return pack.pack(">ddddHHHAA",alarm,status,lat,lng,math.modf(alt),math.modf(spd),math.modf(course),tm,extInfo)
+    end
+
+    local procer =
+    {
+        [JT808Prot.T_COMMON_RSP] = cmnRsp,
+        [JT808Prot.T_LOC_RPT] = locRpt,
+        [JT808Prot.T_HEART_RPT] = function() return "" end,
+    }
+    local msgBody = procer[msgId](...)    --消息体
+
+
+
+    local msgHead = pack.pack(">HHAH",  --消息头
+                    msgId, --消息ID
+                    msgBody:len(), --消息体属性,暂未实现分包和数据加密
+                    encodeBcdNum(paraCtrl.getTerminalNum(),12), --终端手机号
+                    tSendSeq --消息流水号
+                    )
+    local curSeq = tSendSeq
+    tSendSeq = (tSendSeq==0xFFFF) and 0 or (tSendSeq+1)
+    --校验码
+    local crc = calCrc(msgHead..msgBody)
+
+    --转义
+    local s = msgHead..msgBody..string.char(crc)
+    s = s:gsub("\125","\125\1") -- 7D -> 7D 01
+    s = s:gsub("\126","\125\2") -- 7E -> 7D 02
+    return string.char(0x7E)..s..string.char(0x7E),curSeq
+end
+
+--返回值1:未处理的数据
+--返回值2:解析后的packet,解析失败为nil,解释成功为table类型,table中有一个boolean类型的result变量进一步表示结果
+function JT808Prot.decode(s)
+    local _,tail,msg = s:find("\126(.-)\126")
+    local decPacket,msgAttr = {}
+    if not msg then
+        log.warn("prot.decode","wait packet complete")
+        return s,nil
+    end
+
+    --反转义
+    msg = msg:gsub("\125\2","\126") -- 7D 02 -> 7E
+    msg = msg:gsub("\125\1","\125") -- 7D 01 -> 7D
+
+    if msg:len()<13 then
+        log.error("prot.decode","packet len is too short")
+        return s:sub(tail+1,-1),nil
+    end
+
+    --验证校验码
+    if calCrc(msg:sub(1,-2))~=msg:byte(-1) then
+        log.error("prot.decode","packet len is too short")
+        return s:sub(tail+1,-1),nil
+    end
+
+
+    --消息头和消息体
+    msg = msg:sub(1,-2)
+
+    --消息ID
+    _,decPacket.msgId = pack.unpack(msg,">H")
+
+    --消息流水号
+    decPacket.msgSeq = pack.unpack(msg,">H")
+
+    --消息体属性
+    _,msgAttr = pack.unpack(msg:sub(3,4),">H")
+    --分包标志
+    local msgMultiPacket = bit.isset(msgAttr,13)
+    --数据加密标志
+    local msgEncrypt = bit.band(bit.rshift(msgAttr,10),0x07)
+    --消息体长度
+    local msgLen = bit.band(msgAttr,0x03FF)
+
+    local msgBodyHead = msgMultiPacket and 17 or 13
+    local msgBody = msg:sub(msgBodyHead,-1)
+    decPacket.result = msgBody:len()==msgLen
+    if not decPacket.result then
+        log.error("prot.decode","body len no match")
+        return s:sub(tail+1,-1),decPacket
+    end
+
+    local function cmnRsp(body)
+        if body:len()~=5 then
+            log.error("prot.decode.cmnRsp","len~=5 error",body:len())
+            return false
+        end
+
+        _,decPacket.tmnlSeq,decPacket.tmnlId,decPacket.rspResult = pack.unpack(body,">HHb")
+    end
+
+    local function setPara(body)
+        if body:len()<5 then
+            log.error("prot.decode.setPara","len<5 error",body:len())
+            return false
+        end
+
+        local cnt,i = body.byte(1)
+        local tmp,id = body:sub(2,-1)
+        while tmp:len() > 0 do
+            _,id = pack.unpack(tmp,">i")
+            if not list[id] then
+                log.error("prot.decode.setPara","unsupport para",id)
+                return false
+            end
+            local paraLen = tmp:byte(5)
+            if tmp:len() < paraLen+5 then
+                log.error("prot.decode.setPara","para data incomplete",id)
+                return false
+            end
+            if not paraCtrl.setPara(id,paraLen,tmp:sub(6,5+paraLen)) then
+                log.error("prot.decode.setPara","para proc error",id)
+                return false
+            end
+            tmp = tmp:sub(6+tmpLen,-1)
+        end
+
+        return true
+    end
+
+    local function control(body)
+        if body:len()<1 then
+            log.error("prot.decode.control","len<1 error",body:len())
+            return false
+        end
+
+        decPacket.controlCmd = body:byte(1)
+        return true
+    end
+
+
+    local procer =
+    {
+        [JT808Prot.S_COMMON_RSP] = cmnRsp,
+        [JT808Prot.S_SET_PARA] = setPara,
+        [JT808Prot.S_CONTROL] = control,
+    }
+
+    if not procer[decPacket.msgId] then
+        log.error("prot.decode","invalid id",decPacket.msgId)
+        decPacket.result = false
+        return s:sub(tail+1,-1),decPacket
+    end
+
+
+    if procer[decPacket.msgId](msgBody)==false then
+        log.error("prot.decode","procer fail")
+        decPacket.result = false
+    end
+
+    return s:sub(tail+1,-1),decPacket
+end
+
+return JT808Prot

+ 89 - 0
demo/jt808/gpsMng.lua

@@ -0,0 +1,89 @@
+local gpsMng = {}
+
+local gps_uart_id = 2
+
+libgnss.clear() -- 清空数据,兼初始化
+
+uart.setup(gps_uart_id, 115200)
+
+function exec_agnss()
+    if http then
+        -- AGNSS 已调通
+        while 1 do
+            local code, headers, body = http.request("GET", "http://download.openluat.com/9501-xingli/HXXT_GPS_BDS_AGNSS_DATA.dat").wait()
+            -- local code, headers, body = http.request("GET", "http://nutzam.com/6228.bin").wait()
+            log.info("gnss", "AGNSS", code, body and #body or 0)
+            if code == 200 and body and #body > 1024 then
+                -- uart.write(gps_uart_id, "$reset,0,h01\r\n")
+                -- sys.wait(200)
+                -- uart.write(gps_uart_id, body)
+                for offset=1,#body,512 do
+                    log.info("gnss", "AGNSS", "write >>>", #body:sub(offset, offset + 511))
+                    uart.write(gps_uart_id, body:sub(offset, offset + 511))
+                    sys.wait(100) -- 等100ms反而更成功
+                end
+                io.writeFile("/6228.bin", body)
+                break
+            end
+            sys.wait(60*1000)
+        end
+    end
+    sys.wait(20)
+    -- 读取之前的位置信息
+    local gnssloc = io.readFile("/gnssloc")
+    if gnssloc then
+        str = "$AIDPOS," .. gnssloc
+        log.info("POS", str)
+        uart.write(gps_uart_id, str .. "\r\n")
+        str = nil
+        gnssloc = nil
+    else
+        -- TODO 发起基站定位
+        uart.write(gps_uart_id, "$AIDPOS,3432.70,N,10885.25,E,1.0\r\n")
+    end
+end
+sys.taskInit(function()
+    -- Air780EG工程样品的GPS的默认波特率是9600, 量产版是115200,以下是临时代码
+    log.info("GPS", "start")
+    pm.power(pm.GPS, true)
+    -- 绑定uart,底层自动处理GNSS数据
+    -- 第二个参数是转发到虚拟UART, 方便上位机分析
+    libgnss.bind(gps_uart_id, uart.VUART_0)
+    -- libgnss.on("raw", function(data)
+    --     -- 默认不上报, 需要的话自行打开
+    --     data = data:split("\r\n")
+    --     if data == nil then
+    --         return
+    --     end
+    -- end)
+    sys.wait(200) -- GPNSS芯片启动需要时间
+    -- 调试日志,可选
+    -- libgnss.debug(true)
+    -- 显示串口配置
+    -- uart.write(gps_uart_id, "$CFGPRT,1\r\n")
+    -- sys.wait(20)
+    -- 增加显示的语句
+    -- uart.write(gps_uart_id, "$CFGMSG,0,1,1\r\n") -- GLL
+    -- sys.wait(20)
+    -- uart.write(gps_uart_id, "$CFGMSG,0,5,1\r\n") -- VTG
+    -- sys.wait(20)
+    -- uart.write(gps_uart_id, "$CFGMSG,0,6,1\r\n") -- ZDA
+    -- sys.wait(20)
+    exec_agnss()
+end)
+
+sys.taskInit(function ()
+    while true do
+        log.info("nmea", "isFix", libgnss.isFix())
+        sys.wait(10000)
+    end
+
+end)
+
+--获取时间
+function gpsMng.getTime()
+    local tTime = libgnss.getZda()
+    return (string.format("%02d%02d%02d%02d%02d%02d",tTime.year-2000,tTime.month,tTime.day,tTime.hour+8,tTime.min,tTime.sec)):fromHex()
+end
+
+return gpsMng

+ 75 - 0
demo/jt808/main.lua

@@ -0,0 +1,75 @@
+-- LuaTools需要PROJECT和VERSION这两个信息
+PROJECT = "my_test"
+VERSION = "1.2"
+PRODUCT_KEY = "s1uUnY6KA06ifIjcutm5oNbG3MZf5aUv" --换成自己的
+-- sys库是标配
+_G.sys = require("sys")
+_G.sysplus = require("sysplus")
+
+
+----------------------------------------
+-- 报错信息自动上报到平台,默认是iot.openluat.com
+-- 支持自定义, 详细配置请查阅API手册
+-- 开启后会上报开机原因, 这需要消耗流量,请留意
+if errDump then
+    errDump.config(true, 600)
+end
+----------------------------------------
+
+
+-- 如果运营商自带的DNS不好用,可以用下面的公用DNS
+-- socket.setDNS(nil,1,"223.5.5.5")
+-- socket.setDNS(nil,2,"114.114.114.114")
+
+-- socket.sntp()
+--socket.sntp("ntp.aliyun.com") --自定义sntp服务器地址
+--socket.sntp({"ntp.aliyun.com","ntp1.aliyun.com","ntp2.aliyun.com"}) --sntp自定义服务器地址
+-- sys.subscribe("NTP_UPDATE", function()
+--     log.info("sntp", "time", os.date())
+-- end)
+-- sys.subscribe("NTP_ERROR", function()
+--     log.info("socket", "sntp error")
+--     socket.sntp()
+-- end)
+
+-----------------------------------------------------------------------------------------------------------------
+sys.taskInit(function()
+    -- 检查一下当前固件是否支持fskv
+    if not fskv then
+        while true do
+            log.info("fskv", "this demo need fskv")
+            sys.wait(1000)
+        end
+    end
+
+    -- 初始化kv数据库
+    fskv.init()
+    fskv.set("authCode", " ")  --注册成功后的鉴权码
+    fskv.set("heartFreq",60)  --心跳上报间隔,单位秒
+    fskv.set("tcpSndTimeout",10)  --TCP等待应答超时时间,单位秒
+    fskv.set("tcpResendMaxCnt", 3)  --TCP重传次数
+    fskv.set("locRptStrategy", 0)   --位置汇报策略,0:定时汇报;1:定距汇报;2:定时和定距汇报
+    fskv.set("locRptMode",0)      --位置汇报方案,0:根据 ACC 状态; 1:根据登录状态和 ACC 状态,先判断登录状态,若登录再根据 ACC 状态
+    fskv.set("sleepLocRptFreq", 60)   --休眠时位置汇报时间间隔,单位为秒
+    fskv.set("alarmLocRptFreq",5)  --紧急报警时位置汇报时间间隔,单位为秒
+    fskv.set("wakeLocRptFreq", 20)   --缺省位置汇报时间间隔,单位为秒
+    fskv.set("sleepLocRptDistance", 500)    --休眠时汇报距离间隔,单位为米
+    fskv.set("alarmLocRptDistance", 5)     --紧急报警时位置汇报时间间隔,单位为米
+    fskv.set("wakeLocRptDistance", 50)    --缺省位置汇报时间间隔,单位为米
+    fskv.set("fenceRadis", 100)     --电子围栏半径,单位为米
+    fskv.set("alarmFilter",0)    --报警屏蔽字,与位置汇报消息中的报警标志相对应,相应位为 1,则相应报警被屏蔽
+    fskv.set("keyFlag", 0)   --关键标志,与位置信息汇报消息中的报警标志相对应,相应位为 1 则对相应报警为关键报警
+    fskv.set("speedLimit", 100)  --最高速度,单位为公里每小时(km/h)
+    fskv.set("speedExceedTime", 60)   --超速持续时间,单位为秒(s)
+end)
+
+-------------------------------------------------------------------------------------------------------------
+
+local gpsMng = require "gpsMng"
+require "JT808Prot"
+require "socket_demo"
+-- dtuDemo("112.125.89.8",35960)
+-- 用户代码已结束---------------------------------------------
+-- 结尾总是这一句
+sys.run()
+-- sys.run()之后后面不要加任何语句!!!!!

+ 86 - 0
demo/jt808/paraCtrl.lua

@@ -0,0 +1,86 @@
+local paraCtrl = {}
+
+--终端自身的手机号码
+function paraCtrl.getTerminalNum()
+    return "13937000000"
+end
+
+
+--省域ID
+function paraCtrl.getProvinceId()
+    return 0
+end
+
+--区县ID
+function paraCtrl.getCityId()
+    return 0
+end
+
+--制造商ID
+function paraCtrl.getManufactureId()
+    return "00001"
+end
+
+--终端型号
+function paraCtrl.getTerminalModule()
+    return "GT808"..string.rep(string.char(0),20-("GT808"):len())
+end
+
+--终端ID
+function paraCtrl.getTerminalId()
+    --return ("12341234001".."000"):fromHex()
+    return ("00000000000000"):fromHex()
+end
+
+--车辆颜色
+function paraCtrl.getCarColor()
+    return 0
+end
+
+--车辆标识
+function paraCtrl.getCarNumber()
+    return "41048063212"
+end
+
+
+
+
+function paraCtrl.setPara(id,len,data)
+    local value
+    if len==1 then
+        value = data:byte(1)
+    elseif len==2 then
+        _,value = pack.unpack(data,">H")
+    elseif len==4 then
+        _,value = pack.unpack(data,">i")
+    end
+
+    local numberPara =
+    {
+        [JT808Prot.PARA_HEART_FREQ] = "heartFreq",
+        [JT808Prot.PARA_TCP_RSP_TIMEOUT] = "tcpSndTimeout",
+        [JT808Prot.PARA_TCP_RESEND_CNT] = "tcpResendMaxCnt",
+        [JT808Prot.PARA_LOC_RPT_STRATEGY] = "locRptStrategy",
+        [JT808Prot.PARA_LOC_RPT_MODE] = "locRptMode",
+        [JT808Prot.PARA_SLEEP_LOC_RPT_FREQ] = "sleepLocRptFreq",
+        [JT808Prot.PARA_ALARM_LOC_RPT_FREQ] = "alarmLocRptFreq",
+        [JT808Prot.PARA_WAKE_LOC_RPT_FREQ] = "wakeLocRptFreq",
+        [JT808Prot.PARA_WAKE_LOC_RPT_DISTANCE] = "sleepLocRptDistance",
+        [JT808Prot.PARA_SLEEP_LOC_RPT_DISTANCE] = "alarmLocRptDistance",
+        [JT808Prot.PARA_ALARM_LOC_RPT_DISTANCE] = "wakeLocRptDistance",
+        [JT808Prot.PARA_FENCE_RADIS] = "fenceRadis",
+        [JT808Prot.PARA_ALARM_FILTER] = "alarmFilter",
+        [JT808Prot.PARA_KEY_FLAG] = "keyFlag",
+        [JT808Prot.PARA_SPEED_LIMIT] = "speedLimit",
+        [JT808Prot.PARA_SPEED_EXCEED_TIME] = "speedExceedTime",
+    }
+
+    if numberPara[id] then
+        fskv.set(numberPara[id],value)
+        return true
+    end
+
+    return false
+end
+
+return paraCtrl

+ 211 - 0
demo/jt808/socket_demo.lua

@@ -0,0 +1,211 @@
+local libnet = require "libnet"
+local JT808Prot = require "JT808Prot"
+local gpsMng = require "gpsMng"
+
+
+local d1Online = false
+local d1Name = "D1_TASK"
+local tx_buff = zbuff.create(1024)
+local rx_buff = zbuff.create(1024)
+local ip, port="112.125.89.8", 40042
+
+local function netCB(msg)
+	log.info("未处理消息", msg[1], msg[2], msg[3], msg[4])
+end
+
+--数据发送的消息队列
+local msgQuene = {}
+function insertMsg(data,user)
+    table.insert(msgQuene,{data=data,user=user})
+    return true
+end
+ --终端通用应答
+function T_commonRsp(seq,id,result,cbFnc)
+    local data = JT808Prot.encode(JT808Prot.T_COMMON_RSP,seq,id,result and 0 or 1)
+    if not insertMsg(data,{cb=function(r) log.info("socketOutMsg.commonRsp","send result",r) cbFnc(r) end}) then
+        if cbFnc then cbFnc(false) end
+    end
+end
+
+--位置上报task
+local coLocRpt
+function createLocRptTask()
+	return sys.taskInit(function()
+		log.info("libgnss.isFix()", libgnss.isFix())
+		while true do
+			if libgnss.isFix() then
+				local tLocation = libgnss.getRmc(2)
+				local lat = tLocation.lat*1000000
+				local lng = tLocation.lng*1000000
+				local spd = tLocation.speed
+				local speed = (spd*1852 - (spd*1852 %1000))/1000
+				local Course = tLocation.course
+				local gga = libgnss.getGga(2)
+				local altitude=gga.altitude
+				-- log.info("发送位置信息.locRpt", lat, lng)
+				local data, seq = JT808Prot.encode(JT808Prot.T_LOC_RPT,
+					0,
+					0,
+					tonumber(lat),
+					tonumber(lng),
+					altitude, --海拔
+					speed,            --速度
+					Course,  --方向
+					gpsMng.getTime(),
+					"")
+				log.info(" 打包后的字符串和流水号LocRpt", data, seq)
+				if insertMsg(data, { cb = function(r)
+						log.info("socketOutMsg.locRpt位置上报", "send result", r)
+						sys.publish("SEND_LOC_RPT_CNF", r)
+					end }) then
+					sys.waitUntil("SEND_LOC_RPT_CNF")
+				end
+			else
+				log.info("定位失败,位置上报失败")
+			end
+			sys.wait(fskv.get("wakeLocRptFreq") * 1000)
+		end
+	end)
+end
+
+--心跳上报task
+local coHeartRpt
+function createHeartRptTask()
+	return sys.taskInit(function()
+		while true do
+			local data, seq = JT808Prot.encode(JT808Prot.T_HEART_RPT)
+			log.info(" 打包后的字符串和流水号Heart", data, seq)
+			if insertMsg(data, { cb = function(r)
+					log.info("发送心跳信息.heartRpt", "send result", r)
+					sys.publish("SEND_HEART_RPT_CNF", r)
+				end }) then
+				sys.waitUntil("SEND_HEART_RPT_CNF")
+			end
+			sys.wait(fskv.get("heartFreq") * 1000)
+		end
+	end)
+end
+
+--平台通用应答
+local function s_commonRsp(packet)
+    log.info("s_commonRsp",packet.tmnlSeq,packet.tmnlId,packet.rspResult)
+    coroutine.resume(socketTask.coMonitor,'feed monitor')
+end
+--设置终端参数
+local function s_setPara(packet)
+    log.info("s_setPara",packet.result,packet.msgSeq,packet.msgId)
+    T_commonRsp(packet.msgSeq,packet.msgId,packet.result)
+end
+--终端控制
+local function s_control(packet)
+    log.info("s_control",packet.controlCmd,packet.result,packet.msgSeq,packet.msgId)
+    T_commonRsp(packet.msgSeq,packet.msgId,packet.result,function(r)
+        if packet.controlCmd==JT808Prot.CONTROL_RESET then
+            sys.timerStart(sys.restart,2000,"server control reset")
+        end
+    end)
+end
+local cmds =
+{
+    [JT808Prot.S_COMMON_RSP] = s_commonRsp,  --平台通用应答
+    [JT808Prot.S_SET_PARA] = s_setPara,   --设置终端参数
+    [JT808Prot.S_CONTROL] = s_control,     --终端控制
+}
+
+local tCache = {}
+--tcp接收数据处理函数
+function inproc(data)
+	table.insert(tCache, data)
+	local cacheData = table.concat(tCache) --连接字符串
+	tCache = {}
+	while cacheData:len() > 0 do
+		local unProcData, packet = JT808Prot.decode(cacheData)
+		cacheData = unProcData or ""
+		if packet then
+			if packet.msgId and cmds[packet.msgId] and packet.result then
+				cmds[packet.msgId](packet)
+			else
+				log.warn("inproc", "invalid packet")
+			end
+		else
+			if cacheData:len() > 0 then
+				table.insert(tCache, 1, cacheData)
+				sys.timerStart(function() tCache = {} end, 10000)
+			end
+			break
+		end
+	end
+end
+
+
+
+local function socketTask(ip, port)
+	local netc
+	local result, param, is_err
+
+	netc = socket.create(nil, d1Name)
+	-- socket.debug(netc, true)
+	socket.config(netc, nil, nil, nil)
+	-- socket.config(netc, nil, true)
+	while true do
+		-- log.info(rtos.meminfo("sys"))
+		result = libnet.waitLink(d1Name, 0, netc)
+		result = libnet.connect(d1Name, 15000, netc, ip, port)
+		-- result = libnet.connect(d1Name, 5000, netc, "112.125.89.8",34607)
+		d1Online = result
+		if result then
+			log.info("服务器连上了")
+			createLocRptTask()
+			createHeartRptTask()
+		end
+		while result do
+			succ, param, _, _ = socket.rx(netc, rx_buff)
+			if not succ then
+				log.info("服务器断开了", succ, param, ip, port)
+				break
+			end
+			if rx_buff:used() > 0 then
+				log.info("收到服务器数据,长度", rx_buff:used())
+				inproc(rx_buff:toStr(0, rx_buff:used()))  --读出接收数据并处理
+				rx_buff:del()
+			end
+			while #msgQuene>0 do
+				local outMsg = table.remove(msgQuene,1)
+				tx_buff:write(outMsg.data)
+				if tx_buff:used() > 0 then
+					result, param = libnet.tx(d1Name, 15000, netc, tx_buff)
+					log.info("发送结果", result)
+				end
+				if not result then
+					log.info("发送失败了", result )
+					break
+				end
+				if outMsg.user and outMsg.user.cb then outMsg.user.cb(result,outMsg.data,outMsg.user.para) end
+				if not result then return end
+				tx_buff:del()
+			end
+			if tx_buff:len() > 1024 then
+				tx_buff:resize(1024)
+			end
+			if rx_buff:len() > 1024 then
+				rx_buff:resize(1024)
+			end
+			-- 阻塞等待新的消息到来,比如服务器下发,串口接收到数据
+			result, param = libnet.wait(d1Name, 1000, netc)
+			if not result then
+				log.info("服务器断开了", result, param)
+				break
+			end
+		end
+		d1Online = false
+		libnet.close(d1Name, 5000, netc)
+		tx_buff:clear(0)
+		rx_buff:clear(0)
+		sys.wait(1000)
+	end
+end
+
+
+sysplus.taskInitEx(socketTask, d1Name, netCB, ip, port)
+
+