HTTP

# Socket编写HTTP >dhttp server 在本地模拟,端口8000 >i设置响应头 self.send_header('Content-type', 'application/json') ## HTTP模板 ```lua require("global") local http = require("socket.http") local cjson = require("cjson") local ltn12 = require("ltn12") -- 请求数据处理 local function send_data() local current_datetime = os.date("%Y-%m-%d %H:%M:%S") local data = { time = current_datetime, state = 0, sprayNumber = "WP001" } -- 将数据编码为 JSON 格式 local dat_json = cjson.encode(data) log("sendData:", dat_json) return dat_json end -- 请求响应数据处理 local function handle_post_response(response, err) if response then -- 处理接收到的数据块 log("POST 响应数据:", response) else -- 处理错误信息 log("POST Error:", err) end return true end -- 处理 GET 请求响应数据 local function handle_get_response(response) -- 在这里添加你的处理逻辑 log("GET 响应数据:", response) end create_timer(function() -- 设置接口地址 --local post_url = "http://61.240.139.42:18080/project/api/saveProjectSpray" local post_url = "http://192.168.10.186:8000/submit" local get_url = "http://192.168.10.186:8000/data" -- 发送 GET 请求 local get_response, get_status = http.request(get_url) -- 检查 GET 请求状态码 if get_status == 200 then log("GET 请求成功") -- 处理 GET 请求的响应数据 handle_get_response(get_response) else log("GET 请求失败,状态码:" .. get_status) end -- 发送 POST 请求 local post_data = send_data() local post_response, post_status = http.request { url = post_url, method = "POST", headers = { ["Content-Type"] = "application/json", ["Content-Length"] = #post_data }, source = ltn12.source.string(post_data), sink = handle_post_response -- 使用自定义的 sink 函数处理响应数据 } -- 检查 POST 请求状态码 if post_status == 200 then log("POST 请求成功") else log("POST 请求失败,状态码:" .. post_status) end end, 10) run() ``` ## 一、 周期执行 ```python require("global") local socket = require("socket") local cjson = require("cjson") --获取变量信息 local equipment_num = get_var("equipment_num"); local product_version = get_var("product_version"); local process_name = get_var("process_name"); local step_num = get_var("step_num"); local start_date = get_var("start_date"); local end_date = get_var("end_date"); local product_status = get_var("product_status"); local user_name = get_var("user_name"); local create_date = os.time() local url = "http://192.168.10.186:8000/" local content_type = "application/x-www-form-urlencoded" local data_type = "json" -- or "text" local timeout = 10 -- seconds --正常状态 if (product_status ==1) then --创建table local myTable = {} myTable["equipment_num"] = equipment_num; myTable["product_version"] = product_version; myTable["process_name"] = process_name; myTable["step_num"] = step_num; myTable["create_date"] = create_date; --myTable["end_date"] = end_date; myTable["product_status"] = product_status; myTable["user_name"] = user_name; --数据转json local jsonData = cjson.encode(myTable) print("jsonData:", jsonData) -- 条件成立触发推送 http_post(url, jsonData, content_type, data_type, timeout) set_var("product_status", "0"); elseif (product_status ==2) then --创建table local errTable = {} errTable["equipment_num"] = equipment_num; errTable["product_version"] = product_version; errTable["create_date"] = create_date; errTable["product_status"] = product_status; --数据转json local errData = cjson.encode(errTable) print("errData:", errData) -- 条件成立触发推送 http_post(url, errData, content_type, data_type, timeout) set_var("product_status", "0"); else socket.sleep(1) end socket.sleep(1) ``` ## 二、常驻脚本-While循环 ```python require("global") local socket = require("socket") local cjson = require("cjson") local url = "http://192.168.10.186:8000/" local content_type = "application/x-www-form-urlencoded" local data_type = "json" -- or "text" local timeout = 10 -- seconds while true do --获取变量信息 local equipment_num = get_var("equipment_num"); local product_version = get_var("product_version"); local process_name = get_var("process_name"); local step_num = get_var("step_num"); local start_date = get_var("start_date"); local end_date = get_var("end_date"); local product_status = get_var("product_status"); local user_name = get_var("user_name"); local create_date = os.time() --正常状态 if (product_status ==1) then --创建table local myTable = {} myTable["equipment_num"] = equipment_num; myTable["product_version"] = product_version; myTable["process_name"] = process_name; myTable["step_num"] = step_num; myTable["create_date"] = create_date; --myTable["end_date"] = end_date; myTable["product_status"] = product_status; myTable["user_name"] = user_name; --数据转json local jsonData = cjson.encode(myTable) print("jsonData:", jsonData) -- 条件成立触发推送 local code,res = http_post(url, jsonData, content_type, data_type, timeout) --print("code:",code) --res is table local res_status = res["success"] print("res_status:",res_status) if (res_status =="true") then set_var("product_status", "0"); end socket.sleep(3) elseif (product_status ==2) then --异常状态 --创建table local errTable = {} errTable["equipment_num"] = equipment_num; errTable["product_version"] = product_version; errTable["create_date"] = create_date; errTable["product_status"] = product_status; --数据转json local errData = cjson.encode(errTable) print("errData:", errData) -- 条件成立触发推送 local code,res = http_post(url, errData, content_type, data_type, timeout) --print("code:",code) --res is table local res_status = res["success"] print("res_status:",res_status) if (res_status =="true") then set_var("product_status", "0"); end --print("resjsonData:",resjsonData) socket.sleep(3) else end socket.sleep(1) end ``` # 矽镨http - 协议HTTP请求方式:POST - 编码 UTF8 - Content-Type:application/json - 请求地址(测试)http://192.168.10186:8000 ## 请求参数参数名说明 - appid:应用id,区分大小写,联系矽镨信息部获取,测试:KBgQCII6ytNurRSl - appsecret:应用私钥,区分大小写,联系矽镨信息部获取(调用时不传此参数),测试:5r265QHyRpErUZw7 - timestamp:当前时间戳,北京时区,精确到秒,长度10位token接口调用凭证,MD5值,转化为小写,长度32位,算法见凭证生成规则 - type:上报数据类型,”data”:业务数据,”warning”:告警数据 - data:上报数据集内容,JSON数组格式,内容格式由接入方提供token凭证生成规则将appid、appsecret、timestamp合并为一个字符串,计算该字符串的MD5散列值,得到接口调用凭证。token=MD5(appid+appsecret+timestamp) 请求实例: ```lua { "timestamp": 1710565880, "appid": "KBgQCII6ytNurRSl", "type": "data", "token": "fef5cd03e5d3eaa08b97bf1b0bf470ec", "data": [ { "time": "2024-01-01 13:00:00", "value": "123", "deviceID": "gdfgd", "msg": "sdfsdf" } ] } ``` ## 脚本 ```lua require("global") local cjson = require("cjson") local md5 = require("md5") local function md5_encrypt(input) return md5.sumhexa(input) end --local url = "http://218.14.83.222:19006/fmcs/upload" local url = "http://192.168.10.186:8000" local appid = "KBgQCII6ytNurRSl" local appsecret = "5r265QHyRpErUZw7" local type = "data" create_timer(function() local current_timestamp = os.time() local timestamp = math.floor(current_timestamp / 1) -- 获取10位时间戳 local token = md5_encrypt(appid..appsecret..timestamp) -- 创建一个空数组 local myArray = {} --创建table local myTable = {} myTable["deviceID"] = "gdfgd"; myTable["time"] = "2024-01-01 13:00:00"; myTable["value"] = "123"; myTable["msg"] = "sdfsdf"; -- 将表添加到数组中 table.insert(myArray, myTable) local dataTable = {} dataTable["appid"] =appid dataTable["timestamp"] =timestamp dataTable["token"] =token dataTable["type"] =type dataTable["data"] = myArray local jsonData = cjson.encode(dataTable) local a,b = http_post(url, jsonData, "application/json", "json", 30) -- 解析 JSON 字符串到 Lua 的 table local b = cjson.encode(b)--数据转json print("err_a",a) print("err_b",b) set_var("user_name", a); set_var("end_date", b); end, 10) run() ``` # HTTP处理返回请求 ## 脚本 ```lua require("global") local http = require("socket.http") local cjson = require("cjson") local ltn12 = require("ltn12") -- 请求数据处理 local function send_data() local current_datetime = os.date("%Y-%m-%d %H:%M:%S") local data = { time = current_datetime, state = 0, sprayNumber = "WP001" } -- 将数据编码为 JSON 格式 local dat_json = cjson.encode(data) log("sendData:", dat_json) return dat_json end -- 请求响应数据处理 local function handle_post_response(response, err) if response then -- 处理接收到的数据块 log("POST 响应数据:", response) else -- 处理错误信息 log("POST Error:", err) end return true end -- 处理 GET 请求响应数据 local function handle_get_response(response) -- 在这里添加你的处理逻辑 log("GET 响应数据:", response) end create_timer(function() -- 设置接口地址 --local post_url = "http://61.240.139.42:18080/project/api/saveProjectSpray" local post_url = "http://192.168.10.186:8000/submit" local get_url = "http://192.168.10.186:8000/data" -- 发送 GET 请求 local get_response, get_status = http.request(get_url) -- 检查 GET 请求状态码 if get_status == 200 then log("GET 请求成功") -- 处理 GET 请求的响应数据 handle_get_response(get_response) else log("GET 请求失败,状态码:" .. get_status) end -- 发送 POST 请求 local post_data = send_data() local post_response, post_status = http.request { url = post_url, method = "POST", headers = { ["Content-Type"] = "application/json", ["Content-Length"] = #post_data }, source = ltn12.source.string(post_data), sink = handle_post_response -- 使用自定义的 sink 函数处理响应数据 } -- 检查 POST 请求状态码 if post_status == 200 then log("POST 请求成功") else log("POST 请求失败,状态码:" .. post_status) end end, 10) run() ``` # HTTP服务端 ## 脚本 ```lua require("global") local socket = require("socket") local cjson = require("cjson") socket.sleep(10) local function check_port_availability(port) local sock = socket.tcp() local success, err = sock:bind("*", port) sock:close() return success, err end local function start_server(port) local success, err = check_port_availability(port) if not success then print("Failed to start server because the port is in use. Error: " .. err) return else print("Port " .. port .. " is available.") end local server,err = socket.bind("*", port) if not server then print("Failed to create server object. "..err) return else print("Server is listening on port " .. port .. " ...") while true do local client, err = server:accept() if not client then print("Failed to accept connection: " .. err) break end print("Server: client connected") local request_line, err = client:receive("*l") -- 读取请求行 if not request_line then print("Failed to read request line: ", err) client:close() break end print("Request_line:",request_line) local headers = {} -- 读取请求头 while true do local header_line, err = client:receive("*l") if not header_line or header_line == "" then break end local header_name, header_value = header_line:match("(.-): (.*)") headers[header_name:lower()] = header_value print("Request_Headers:",header_line) end -- 从请求头中获取 Content-Length local content_length = tonumber(headers['content-length']) if content_length then local post_data, err = client:receive(content_length) if not post_data then print("Failed to read POST data: ", err) else print("Received POST data: " .. post_data) -- 解析 JSON 数据 local json_data = nil json_data, err = cjson.decode(post_data) if json_data then for k, v in pairs(json_data) do print("Parsed JSON data_K: ",k) print( "Parsed JSON data_V: ",v) set_var("aa", "11") log("Parsed JSON data_K: ",k) log( "Parsed JSON data_V: ",v) log("------------------") end else print("Error parsing JSON: ", err) end end end local ok, response_err = pcall(function() -- 处理逻辑简化,实际应用中可能需要更复杂的请求解析 local response_data = { res = "success", code = "0" } -- 构建JSON响应 local response_json = cjson.encode(response_data) local response = "HTTP/1.1 200 OK\r\n" .. "Content-Type: application/json\r\n" .. "Content-Length: " .. string.len(response_json) .. "\r\n" .. "Connection: close\r\n\r\n" .. response_json -- 发送响应 client:send(response) log("11") client:close() log("22") end) log("44") print("1") if not ok then print("Error processing request: " .. response_err) -- 可以选择在这里记录错误并继续处理下一个连接 end log("55") print("2") end log("33") print("3") server:close() print("Server stopped.") end end -- 定义固定端口 local FIXED_PORT = 9090 -- 尝试启动服务器 start_server(FIXED_PORT) ``` # PING判断网络 ## 脚本 ```lua --在这里开始写您的代码, 当前代码将一秒钟执行一次 local socket = require("socket") -- Ping函数,返回ping结果 function is_device_connected(ip_address) local command = "ping -c 4 -W 3 " .. ip_address .. " > /dev/null 2>&1" local result = os.execute(command) if result == true or result == 0 then -- 兼容不同Lua版本的返回值处理 log(ip_address .. " is connected.") return true else log(ip_address .. " is not connected.") return false end end local ip_address = "192.168.10.1" is_device_connected(ip_address) ``` # HTTP标准客户端 ## 路径自定义即可 ## 上传格式 ```lua { "type": "data", "timestamp": "2024-05-06 13:55:08", "data": { "变量1": "0", "变量2": "11", "变量3": "22" } } ``` ## 返回格式 正常接收数据: `{ "errcode": "0", "errmsg": "OK" }` 接收数据异常: `{ "errcode": "1", "errmsg": "错误详情" }` ## 脚本 ```lua require("global") local cjson = require("cjson") local url = "http://47.107.51.192:40001/sap/App2SAP/Upload" local type = "data" create_timer(function() local current_timestamp = os.time() local timestamp = math.floor(current_timestamp / 1) -- 获取10位时间戳 -- 将时间戳转换为年月日时分秒的格式 local current_time = os.date("%Y-%m-%d %H:%M:%S", current_timestamp) local dataTable = {} dataTable["timestamp"] =current_time dataTable["type"] =type -- 获取变量 local vars = get_var_list(); local var_table= {} for i, var in pairs(vars) do local deviceID = var[1]; local msg = var[2]; local value = var[5]; local datatype = var[4]; var_table[msg] = value; end dataTable["data"] = var_table local jsonData = cjson.encode(dataTable) log("jsondata:",jsonData) local a,b = http_post(url, jsonData, "application/json", "json", 30) -- 解析 JSON 字符串到 Lua 的 table local b = cjson.encode(b)--数据转json log("err_a",a) log("err_b",b) end, 10) run() ```