cjson=require("cjson") MQTT=require("mqtt_library") base64=require("base64") bit=require("bit") lpack=require("lua_pack") syslog=require("syslog") ls = require "socket" require("utils") bnot = bit.bnot band, bor, bxor = bit.band, bit.bor, bit.bxor lshift, rshift, rol = bit.lshift, bit.rshift, bit.rol --MQTT.Utility.set_debug(true) syslog.openlog("GoodWe upgrade", syslog.LOG_PERROR + syslog.LOG_ODELAY, "LOG_USER") broker_addr = "localhost" broker_port = 1883 once_block_max = 64 upgrade_num = 1 --升级编号 process_total = 1 process_curr = 1 serial_num = 1001 time_last = 0 function on_mqtt_msg(topic, payload) local payload_obj = cjson.decode(payload) if(string.find(payload_obj['src_identifier'],'__transparent') ~= nil)then coroutine.yield(topic, payload_obj) end end function mqtt_listen() while(true) do mqtt_client:handler() coroutine.yield() end end function send_data_to_sn(mqtt_client, gw_sn, dev_sn, mi, data, obj_send) topic = obj_send['topic'] obj_send['mi'] = mi obj_send['len'] = #data obj_send['data_b64'] = base64.encode(data) obj_send['sn'] = dev_sn json_str = cjson.encode(obj_send) mqtt_client:publish(topic, json_str) -- print("send_data_to_dev",topic,json_str) -- time_last = os.time() end function send_upgrade_process(mqtt_client, gw_sn, dev_sn, mi, Upgrade_Status, Upgrade_Progress) local topic = string.format("ipc/%s/upgrade/device/%s/data_filtered/event/__Upgrade_Progress", gw_sn, dev_sn) local payload={} payload['identifier'] = '__Upgrade_Progress' payload['sn'] = dev_sn payload['mi'] = mi payload['time'] = os.time() local progress = {} progress['Upgrade_Status'] = Upgrade_Status progress['Upgrade_Progress'] = Upgrade_Progress-Upgrade_Progress%0.01 payload['tags'] = progress json_str = cjson.encode(payload) -- print(topic,json_str) mqtt_client:publish(topic, json_str) end function wait_response(dev_sn,mi,check) local ret, topic, payload_obj local last = os.time() while(true)do repeat ret, topic, payload_obj = coroutine.resume(mqtt) if os.difftime(os.time(),last) > 5 then return false,2 end if not timeout and (payload_obj == nil or topic == nil)then -- os.execute("sleep 1") break end if not timeout and (payload_obj == nil or payload_obj.mi == nil or payload_obj.data_b64 == nil)then syslog.syslog("LOG_WARNING", string.format("miss resoponse,slave node not ack", topic)) -- os.execute("sleep 1") break end -- print(ret, topic, payload_obj,payload_obj.data_b64,payload_obj.mi) if ret == true and payload_obj and payload_obj.sn == dev_sn and payload_obj.mi == mi then local rcv_bin = base64.decode(payload_obj.data_b64) if rcv_bin ~= check then syslog.syslog("LOG_WARNING", string.format("send:%s",check)) syslog.syslog("LOG_WARNING", string.format("recv:%s",rcv_bin)) break else return true,rcv_bin end end until true end return false,-99 end function upgrade_node(json_str, gw_sn, firmware, send_out_json) local obj=cjson.decode(json_str) local dev_sn = obj['sn'] local obj_send = cjson.decode(send_out_json) local ret, topic, payload_obj mqtt_client = MQTT.client.create(broker_addr, broker_port, on_mqtt_msg) mqtt_client:connect("upgrade_test") local topic={} topic[1] = string.format("ipc/%s/+/device/+/data/raw_data", gw_sn) mqtt_client:subscribe(topic) mqtt = coroutine.create(mqtt_listen) local last_process = process_curr local index = 0 local tc,rc = 0,0 while true do local send_str = '' for i=1,64 do send_str = send_str .. index end send_data_to_sn(mqtt_client, gw_sn, dev_sn, 902, send_str, obj_send) syslog.syslog("LOG_INFO", string.format("Send To Uart:%s",send_str)) tc = tc + 1 local ret,recv_str = wait_response(dev_sn,902,send_str) if ret then rc = rc + 1 else os.execute("sleep 1") end syslog.syslog("LOG_INFO", string.format("send/recv: %d/%d",tc,rc)) if index >= 9 then index = 0 else index = index + 1 end end return 0 end json_str='{\ "identifier": "__Upgrade",\ "Action": "start",\ "Timeout": "0",\ "Dev_Type": "ARM",\ "sn": "JCIwsTin",\ "mi": 36684239,\ "URL": "http://10.3.1.229:8002/TEST1_26_V1084.bin",\ "MD5": "ac3ee42ae30ef8ce8bfa513ac22f1de1",\ "timestamp": 1586336532\ }' gw_sn='21012C000011' firmware= './ARM_410-02034-09_S00_new.bin' -- firmware= './DSP_410-04029-03(v124).bin' send_out_json= '{\ "data_b64": "",\ "len": 0,\ "period": 0,\ "port": "RS485_1",\ "mi": 0,\ "src_identifier": "__transparent",\ "sn": "JCIwsTin",\ "dtu_sn": "",\ "protocol": 1,\ "communication_timeout": 0,\ "term_addr": "00F7000000000000",\ "tcp_ip_addr": "",\ "tcp_port": 0,\ "topic": "ipc/21012C000011/RS485_1/device/JCIwsTin/data/Set_Rglt_Raw"\ } ' upgrade_node(json_str,gw_sn,firmware,send_out_json)