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()
```