-- LuaTools需要PROJECT和VERSION这两个信息 PROJECT = "oneNET_demo" VERSION = "1.0.0" -- sys库是标配 _G.sys = require("sys") --[[特别注意, 使用mqtt库需要下列语句]] _G.sysplus = require("sysplus") lbsLoc2 = require("lbsLoc2") local iotcloud = require("iotcloud") mobile.simid(2, true) local produt_id = "4qM5N1Sa4T" local userid = "226691" local userkey = "pk1M3FKXBvvmjF8If/xDfSFFmr96NZCEg00sxlLBMjjh9vOD5hpIs42rmAYnMh5b3m9B1+0rmYdqzUyoQVrxow==" local device_name = mobile.imei() local send_data_time = 5 * 60 * 1000 -- 定时发送数据的时间,单位ms -- 统一联网函数 sys.taskInit(function() local device_id = mcu.unique_id():toHex() -- 默认都等到联网成功 sys.waitUntil("IP_READY") sys.publish("net_ready", device_id) end) sys.taskInit(function() -- 等待联网 local ret, device_id = sys.waitUntil("net_ready") -------- 以下接入方式根据自己需要修改,相关参数修改为自己的 --------- -- ONENET云 -- 动态注册 iotcloudc = iotcloud.new(iotcloud.ONENET, { device_name = device_name, produt_id = produt_id, userid = userid, userkey = userkey }) -- 一型一密 -- iotcloudc = iotcloud.new(iotcloud.ONENET,{produt_id = "xxx",product_secret = "xxx"}) -- 一机一密 -- iotcloudc = iotcloud.new(iotcloud.ONENET,{produt_id = "xxx",device_name = "xxx",device_secret = "xxx"}) if iotcloudc then iotcloudc:connect() end end) -- 发布和订阅的主题 local oneNET_sub = "$sys/" .. produt_id .. "/" .. device_name .. "/thing/property/post/reply" local oneNET_pub = "$sys/" .. produt_id .. "/" .. device_name .. "/thing/property/post" local function oneNET_send_data() log.info("oneNET 链接成功,准备开始发送数据") while 1 do -- 没有mobile库就没有基站定位 mobile.reqCellInfo(15) -- 由于基站定位需要等待扫描周围基站,推荐扫描时间为15S sys.waitUntil("CELL_INFO_UPDATE", 15000) local lat, lng, t = lbsLoc2.request(5000) log.info("lbsLoc2", lat, lng, (json.encode(t or {}))) -- 如果没扫描到基站则给lat和lng赋值为0 if lat and lng then log.info("扫描到了,有位置信息") else lat = "0" lng = "0" end -- 读取CPU温度, 单位为0.001摄氏度, 是内部温度, 非环境温度 adc.open(adc.CH_CPU) local cpu_temp = adc.get(adc.CH_CPU) adc.close(adc.CH_CPU) local gpio_pin = 6 -- GPIO编号 local gpio_state = gpio.get(gpio_pin) local send_data = { id = "123", verson = VERSION, params = { gpio_state = { value = gpio_state }, cpu_temp = { value = cpu_temp / 1000 }, lbs_lat = { value = tonumber(lat) }, lbs_lng = { value = tonumber(lng) -- value = lng } } } local send_data = json.encode(send_data) log.info("发送的数据为", send_data) -- 正式发布数据 iotcloudc:publish(oneNET_pub, send_data) -- 循环发送数据的定时时间 sys.wait(send_data_time) end end local con = 0 --oneNET断开后的处理函数, local function oneNET_DISCONNECT() log.info("云平台断开了,隔一分钟重连一次,如果10次都没有连上则重启设备") while con < 10 do sys.wait(60*1000) log.info("oneNET reconnection",con) iotcloudc:connect() end pm.reboot() end sys.subscribe("iotcloud", function(cloudc, event, data, payload) -- 注意,此处不是协程内,复杂操作发消息给协程内进行处理 if event == iotcloud.CONNECT then -- 云平台联上了 log.info("iotcloud", "CONNECT", "oneNET平台连接成功") iotcloudc:subscribe({ [oneNET_sub] = 1 }) -- 订阅服务器下发数据的主题 -- 链接成功,启动一个task专门用来定时发消息 sys.taskInit(oneNET_send_data) elseif event == iotcloud.RECEIVE then log.info("收到服务器下发的数据") log.info("iotcloud", "topic", data, "payload", payload) -- 用户处理代码 if payload then payload = json.decode(payload) if payload["code"] == 200 then log.info("服务器收到了刚刚上传的数据", payload["msg"]) else log.info("服务器接收数据有误", "错误码为", payload["code"], "错误信息为", payload["msg"]) end end elseif event == iotcloud.SEND then log.info("发送数据成功") elseif event == iotcloud.DISCONNECT then -- 云平台断开了 sys.taskInit(oneNET_DISCONNECT) end end) -- 用户代码已结束--------------------------------------------- -- 结尾总是这一句 sys.run() -- sys.run()之后后面不要加任何语句!!!!!