| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180 |
- --[[
- @module onenetcoap
- @summary 中移动OneNet平台COAP接入
- @version 1.0
- @date 2023.11.17
- @author wendal
- @demo onenet/coap
- @tag LUAT_USE_NETWORK
- @usage
- -- 使用方法请查阅demo
- ]]
- local onenet = {}
- local TAG = "onenet.coap"
- --[[
- 初始化onenet coap库
- @onenet.setup(conf)
- @table 配置项信息,必须有
- @return boolean 成功返回true,否则返回nil
- @usage
- -- 配置信息是一个table,具体键值如下:
- -- product_id 产品id,字符串,必须有
- -- device_name 设备名称,字符串,必须有
- -- device_key 设备密钥,字符串,必须有
- -- host coap服务器地址,字符串,默认"183.230.102.122"
- -- port coap服务器端口,整数,默认5683
- -- auto_reply 自动回复thing获取,布尔值,默认关闭false
- -- thing 物模型,类型是table,默认 {params={}}
- -- debug 调试开关,默认关闭false
- -- adapter 适配器编号,默认是最后一个注册的适配器
- -- callback 收到合法coap数据时的用户回调
- ]]
- function onenet.setup(conf)
- if not conf then
- return
- end
- if not conf.product_id then
- log.error(TAG, "配置信息缺product_id")
- return
- end
- if not conf.device_name then
- log.error(TAG, "配置信息缺device_name")
- return
- end
- if not conf.device_key then
- log.error(TAG, "配置信息缺device_key")
- return
- end
- onenet.product_id = conf.product_id
- onenet.device_name = conf.device_name
- -- log.info(">>", onenet.product_id, onenet.device_name, conf.device_key)
- _, _, onenet.login_token = iotauth.onenet(onenet.product_id, onenet.device_name, conf.device_key, "sha1")
- -- log.info("onenet.login_token", onenet.login_token)
- onenet.host = conf.host or "183.230.102.122"
- onenet.port = conf.port or 5683
- onenet.auto_reply = conf.auto_reply
- onenet.topic = conf.topic or "onenet_udp_inc"
- onenet.thing = conf.thing or {
- params = {}
- }
- onenet.debug = conf.debug
- onenet.thing_id = 1
- onenet.state = 0
- onenet.adapter = conf.adapter
- onenet.timeout = conf.timeout or 3000
- onenet.rx_buff = zbuff.create(1500)
- onenet.callback = conf.callback
- return true
- end
- function onenet.netc_cb(sc, event)
- -- log.info("udp", sc, string.format("%08X", event))
- local rxbuff = onenet.rx_buff
- if event == socket.EVENT then
- local ok, len, remote_ip, remote_port = socket.rx(sc, rxbuff)
- if ok then
- local data = rxbuff:query()
- rxbuff:del()
- log.info(TAG, "读到数据", data:toHex())
- ercoap.print(data)
- local resp = ercoap.parse(data)
- if resp and resp.code == 201 then
- log.info(TAG, "login success", resp.code, resp.payload:toHex())
- -- 这里非常重要, 获取其他请求所需要的token值
- onenet.post_token = resp.payload
- onenet.state = 2
- sys.publish(onenet.topic)
- end
- if resp then
- if onenet.callback then
- onenet.callback(resp)
- else
- sys.publish(onenet.topic, resp)
- end
- end
- else
- log.info(TAG, "服务器断开了连接")
- onenet.state = 0
- sys.publish(onenet.topic)
- end
- elseif event == socket.TX_OK then
- log.info(TAG, "上行完成")
- elseif event == socket.ON_LINE then
- log.info(TAG, "UDP已准备就绪,可以上行")
- -- 上行登陆包
- -- log.info("登陆参数", onenet.product_id, onenet.device_name, onenet.login_token)
- local data = ercoap.onenet("login", onenet.product_id, onenet.device_name, onenet.login_token)
- -- log.info("上行登陆包", data:toHex())
- socket.tx(sc, data)
- else
- log.info(TAG, "其他事件", event)
- end
- end
- function onenet.main_task()
- onenet.state = 1
- while onenet.state ~= 0 do
- local ok = onenet.main_loop()
- if not ok then
- sys.wait(500)
- end
- end
- end
- function onenet.main_loop()
- if onenet.netc == nil then
- onenet.netc = socket.create(onenet.adapter, onenet.netc_cb)
- end
- if onenet.netc == nil then
- log.info(TAG, "创建socket失败!!! 3秒后重试")
- return
- end
- local netc = onenet.netc
- if onenet.state ~= 2 then
- socket.config(netc, nil, true)
- if onenet.debug then
- socket.debug(netc, true)
- end
- socket.connect(netc, onenet.host, onenet.port)
- local result, resp = sys.waitUntil(onenet.topic, onenet.timeout)
- if not result then
- log.info(TAG, "等待底层连接成功超时了")
- return
- end
- end
- sys.waitUntil(onenet.topic, 3000)
- return
- end
- function onenet.start()
- if onenet.state ~= 0 then
- log.info("onenet", "coap", "已经在启动状态,不需要再启动")
- return
- end
- sys.taskInit(onenet.main_task)
- return true
- end
- function onenet.uplink(tp, payload)
- if not tp then
- return
- end
- if payload and payload["id"] == nil then
- payload["id"] = "1"
- end
- if type(payload) == "table" then
- payload = json.encode(payload, "7f")
- end
- -- log.info("uplink", onenet.product_id, onenet.device_name, onenet.post_token:toHex(), payload)
- local tmp = ercoap.onenet(tp, onenet.product_id, onenet.device_name, onenet.post_token, payload)
- -- log.info("uplink", tp, tmp:toHex())
- socket.tx(onenet.netc, tmp)
- return true
- end
- return onenet
|