| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 |
- -- 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()之后后面不要加任何语句!!!!!
|