
做物联网开发有没有被这些问题折磨过传感器一换就得重写逻辑网络一不稳就疯狂丢包排查问题只能死磕日志设备到底有没有正常上传数据全程靠猜。这些让人头疼的开发痛点现在有了更简单的解法。AirCloud 内置的数据上报功能就能帮你一站式搞定设备数据上云难题。一、AirCloud数据上报能做什么1.1 数据上报功能概述数据上报是AirCloud的核心功能之一允许设备将各种状态数据、传感器数据等信息定期或触发式地传输到云端平台用于实现设备状态实时监控传感器数据采集与分析设备运行历史记录基于数据的业务决策1.2 支持的数据类型AirCloud支持上报多种 类 型的数据通过excloud扩展库的excloud.FIELD_MEANINGS常量定义主要包括以下几大类传感器数据如温度、湿度、酸碱度、颗粒物浓度、环境温度、电量计量等。定位与运动数据如GNSS经纬度、行驶速度、GNSS卫星信噪比、搜索到的卫星总数、航向角、方向角、定位方式标识等。设备状态数据如电池电压、4G信号强度、SIM卡ICCID、设备休眠模式、定时唤醒间隔等。设备参数数据如设备物理高度/宽度、转速、驻留小区、小区信息、元器件型号等。软件与系统数据如固件版本、系统错误信息、短信转发、来电转发等。通用数据如时间戳、无意义数据等。控制与响应数据如控制命令/回应、鉴权请求/回复等。二、开源实例快速上手源示例快速上手合宙针对各模组型号提供丰富的开源示例demo并持续更新配套教程开发者可以快速掌握AirCloud数据上报功能的使用方法为物联网应用开发打下坚实的基础。以Air780EHV系列为例可选用配套核心板或开发板快速实操验证。最新示例源码https:// gitee .com/openLuat/LuatOS/tree/master/module/Air780EHM_Air780EHV_Air780EGH/demo/aircloud实操教程详见https://docs.openluat.com/air780ehv/luatos/app/base/aircloud_up/核心代码如下图示完整demo详见源码仓库最新文件。开发者可根据实际项目需求灵活配置连接参数快速实现设备接入与数据上报。本demo演示的功能为 本demo演示了excloud扩展库的完整使用流程包括 1. 设备连接与认证 2. 数据上报与接收 3. 运维日志管理 4. 文件上传功能 5. 心跳保活机制 ]] -- 导入excloud库 local excloud require(excloud) -- 注册回调函数 -- 注册回调函数 function on_excloud_event(event, data) log.info(用户回调函数, event, json.encode(data)) if event connect_result then if data.success then log.info(连接成功) sys.publish(aircloud_connected) else log.info(连接失败: .. (data.error or 未知错误)) end elseif event auth_result then if data.success then log.info(认证成功) else log.info(认证失败: .. data.message) end elseif event message then log.info(收到消息, 流水号: .. data.header.sequence_num) -- 处理服务器下发的消息 for _, tlv in ipairs(data.tlvs) do log.info(TLV字段, 含义:, tlv.field, 类型:, tlv.type, 值:, tlv.value) if tlv.field excloud.FIELD_MEANINGS.CONTROL_COMMAND then log.info(收到控制命令: .. tostring(tlv.value)) -- 处理控制命令并发送响应 local response_ok, err_msg excloud.send({ { field_meaning excloud.FIELD_MEANINGS.CONTROL_RESPONSE, data_type excloud.DATA_TYPES.UNICODE, value 命令执行成功 } }, false) if not response_ok then log.info(发送控制响应失败: .. err_msg) end end end elseif event disconnect then log.warn(与服务器断开连接) elseif event reconnect_failed then log.info(重连失败已尝试 .. data.count .. 次) elseif event send_result then if data.success then log.info(发送成功流水号: .. data.sequence_num) else log.info(发送失败: .. data.error_msg) end elseif event mtn_log_upload_start then log.info(运维日志上传开始, 文件数量:, data.file_count) elseif event mtn_log_upload_progress then log.info(运维日志上传进度, 当前文件:, data.current_file, 总数:, data.total_files, 文件名:, data.file_name, 状态:, data.status) elseif event mtn_log_upload_complete then log.info(运维日志上传完成, 成功:, data.success_count, 失败:, data.failed_count, 总计:, data.total_files) end end -- 注册回调 excloud.on(on_excloud_event) -- 主任务函数 function excloud_task_func() -- 如果当前时间点设置的默认网卡还没有连接成功一直在这里循环等待 while not socket.adapter(socket.dft()) do log.warn(excloud_task_func, wait IP_READY, socket.dft()) -- 在此处阻塞等待默认网卡连接成功的消息IP_READY -- 或者等待1秒超时退出阻塞等待状态; -- 注意此处的1000毫秒超时不要修改的更长 -- 因为当使用exnetif.set_priority_order配置多个网卡连接外网的优先级时会隐式的修改默认使用的网卡 -- 当exnetif.set_priority_order的调用时序和此处的socket.adapter(socket.dft())判断时序有可能不匹配 -- 此处的1秒能够保证即使时序不匹配也能1秒钟退出阻塞状态再去判断socket.adapter(socket.dft()) sys.waitUntil(IP_READY, 1000) end -- -- 配置excloud参数 local ok, err_msg excloud.setup({ use_getip true, -- 使用getip服务 device_type 1, -- 4G设备 -- auth_key Qqn2TH50319ELOuO0rhPgF5fOxNVNhNW, transport udp, -- 使用TCP传输 auto_reconnect true, -- 自动重连 reconnect_interval 10, -- 重连间隔(秒) max_reconnect 5, -- 最大重连次数 mtn_log_enabled true, -- 启用运维日志 mtn_log_blocks 1, -- 日志文件块数 mtn_log_write_way excloud.MTN_LOG_ADD_WRITE -- 追加写入方式 }) --不使用getip服务注意把use_getip设置为false -- local ok, err_msg excloud.setup({ -- use_getip false, -- 不使用getip服务 -- device_type 1, -- 设备类型: 4G -- host 112.125.89.8, -- 服务器地址 -- port 32585, -- 服务器端口 -- auth_key Qqn2TH50319ELOuO0rhPgF5fOxNVNhNW, -- 鉴权密钥 -- transport tcp, -- 使用TCP传输 -- auto_reconnect true, -- 自动重连 -- reconnect_interval 10, -- 重连间隔(秒) -- max_reconnect 5, -- 最大重连次数 -- mtn_log_enabled true -- 启用运维日志 -- }) -- 配置excloud参数虚拟设备链接 -- local ok, err_msg excloud.setup({ -- use_getip true, --使用getip服务 -- device_type 9, -- auth_key Qqn2TH50319ELOuO0rhPgF5fOxNVNhNW, -- virtual_phone_number 15893470522, -- 11位手机号 -- virtual_serial_num 1, -- 序列号0-999 -- transport tcp, -- 由于mqtt链接需要使用imei,虚拟设备没有,所以只能使用TCP传输 -- mtn_log_enabled true -- }) if not ok then log.info(初始化失败: .. err_msg) return end log.info(excloud初始化成功) -- 开启excloud服务 local ok, err_msg excloud.open() if not ok then log.info(开启excloud服务失败: .. err_msg) return end log.info(excloud服务已开启) -- 启动自动心跳默认5分钟一次的心跳 excloud.start_heartbeat() log.info(自动心跳已启动) -- 启动3分钟一次的心跳可配置自定义内容 -- excloud.start_heartbeat(180, { -- { field_meaning excloud.FIELD_MEANINGS.TIMESTAMP, -- data_type excloud.DATA_TYPES.INTEGER, -- value os.time() } -- }) -- 停止自动心跳 --excloud.stop_heartbeat() -- 记录启动日志 --excloud.mtn_log(system, 设备启动完成, version, 1.0.0) -- 获取并打印二维码信息 local qrinfo excloud.get_qrinfo() if qrinfo and qrinfo.url then log.info(二维码URL:, qrinfo.url) else log.info(未获取到二维码信息) end -- 主循环定期上报数据 while true do -- 每30秒上报一次数据 sys.wait(30000) -- 检查连接状态 local status excloud.status() if not status.is_connected then log.warn(设备未连接跳过数据上报) else -- 上报基础状态数据 local ok, err_msg excloud.send({ { field_meaning excloud.FIELD_MEANINGS.SIGNAL_STRENGTH_4G, data_type excloud.DATA_TYPES.INTEGER, value 22 -- 信号强度 }, { field_meaning excloud.FIELD_MEANINGS.SIM_ICCID, data_type excloud.DATA_TYPES.ASCII, value 89860118801012345678 -- SIM卡ICCID }, { field_meaning excloud.FIELD_MEANINGS.TIMESTAMP, data_type excloud.DATA_TYPES.INTEGER, value os.time() } }, false) if ok then log.info(基础数据上报成功) else log.error(基础数据上报失败:, err_msg) end end end end -- 启动主任务 sys.taskInit(excloud_task_func) --上传图片示例 function upload_image_fun() -- 等待连接建立 sys.waitUntil(aircloud_connected, 10000) -- 上传图片 log.info(开始上传图片) if not excloud.status().is_connected then log.info(设备未连接跳过图片上传) return end if io.exists(/luadb/test.jpg) then local ok, err excloud.upload_image(/luadb/test.jpg, test.jpg) if ok then log.info(图片上传成功) else log.error(图片上传失败:, err) end else log.warn(测试图片文件不存在) end end sys.taskInit(upload_image_fun) -- 运维日志测试示例 function mtnlog_test_task() local test_count 0 while true do test_count test_count 1 excloud.mtn_log(info, mtn_test, test_count) -- 每1秒记录一次 sys.wait(1000) end end sys.taskInit(mtnlog_test_task)今天的分享就到这里谢谢您读到了这里