• Air780E连接点灯科技-LuatOS


    前面发了腾讯云点灯以后,有朋友提到了点灯科技,人家都叫点灯科技了,那咱们学点灯必须连一下试试呀。本文将记录如何将设备连接点灯云平台,并通过手机进行远程控制

    先上成果演示

    一、点灯云准备

    下载点灯科技的app-blinker,注册账号,这部分就不用写了

    1、添加设备

    点击右上角添加设备,设备类型选独立设备

     右下角选择网络接入

     然后复制得到的key

    2、配置设备

    点击我们刚添加的设备,根据提示,我们直接点载入示例

     二、设备端开发

    思路一样,首先找文档,看看如何接入。可以看到有http和mqtt方式接入,那我们肯定是mqtt呀,因为我们要长连接才能保证设备实时被控制。

    1、鉴权

    所以查找文档点灯科技 (diandeng.tech)可以看到mqtt的鉴权需要先使用http请求获得连接参数

     找一下luatos的http的库http2 - http2客户端 - LuatOS 文档可看到很简单,就一行代码,而且接口使用和其他语言基本一致

     

     所以直接上代码,我们直接封装一个函数,传入authKey就可以获得连接参数

    1. local function getDeviceInfo(authKey)
    2. local code, headers, data = http2.request("GET", serverAdress .. authKey .. "&protocol=mqtt").wait()
    3. if data and json.decode(data) then
    4. local authdata = json.decode(data)
    5. if authdata.message == 1000 then
    6. log.info(
    7. "获取设备信息成功",
    8. authdata.detail.host:sub(8, -1),
    9. authdata.detail.deviceName,
    10. authdata.detail.iotId,
    11. authdata.detail.iotToken,
    12. authdata.detail.uuid
    13. )
    14. return true, authdata.detail.host:sub(8, -1), authdata.detail.deviceName, authdata.detail.iotId, authdata.detail.iotToken, authdata.detail.uuid
    15. end
    16. end
    17. return false
    18. end

    2、连接

    连接部分的代码就和昨天连腾讯云没啥两样了,都是连mqtt,然后订阅数据,收到数据以后根据文档进行处理

    直接上完整代码吧,一样是Air780E,Air105,ESP32C3通用代码

    1. PROJECT = "gpiodemo"
    2. VERSION = "1.0.0"
    3. local sys = require "sys"
    4. require("sysplus")
    5. --{"deviceType": "OwnApp", "fromDevice": "856ED5F216FO23SKEEDQJ8LL", "toDevice": "0451f7667f1c11ec94755254", "data": {"state": "online"}}
    6. local wifi_ssid = "NAS"
    7. local wifi_password = "Air123456"
    8. --如果是wifi设备,这里改成你的wifi账号和密码
    9. local authKey = "" --点灯云申请的设备authKey
    10. local serverAdress = "http://iot.diandeng.tech/api/v1/user/device/diy/auth?authKey=" --http鉴权地址
    11. local mqttc = nil
    12. local led_state = 0
    13. local num = 0
    14. local function getDeviceInfo(authKey)
    15. local code, headers, data = http2.request("GET", serverAdress .. authKey .. "&protocol=mqtt").wait()
    16. if data and json.decode(data) then
    17. local authdata = json.decode(data)
    18. if authdata.message == 1000 then
    19. log.info(
    20. "获取设备信息成功",
    21. authdata.detail.host:sub(8, -1),
    22. authdata.detail.deviceName,
    23. authdata.detail.iotId,
    24. authdata.detail.iotToken,
    25. authdata.detail.uuid
    26. )
    27. return true, authdata.detail.host:sub(8, -1), authdata.detail.deviceName, authdata.detail.iotId, authdata.detail.iotToken, authdata.detail.uuid
    28. end
    29. end
    30. return false
    31. end
    32. sys.taskInit(
    33. function()
    34. log.info("BSP", rtos.bsp())
    35. if rtos.bsp() == "ESP32C3" then
    36. LED = gpio.setup(12, 0, gpio.PULLUP)
    37. wlan.init()
    38. wlan.setMode(wlan.STATION)
    39. wlan.connect(ssid, password, 1)
    40. local result, data = sys.waitUntil("IP_READY")
    41. log.info("wlan", "IP_READY", result, data)
    42. elseif rtos.bsp() == "AIR105" then
    43. w5500.init(spi.HSPI_0, 24000000, pin.PC14, pin.PC01, pin.PC00)
    44. w5500.config() --默认是DHCP模式
    45. w5500.bind(socket.ETH0)
    46. LED = gpio.setup(62, 0, gpio.PULLUP)
    47. sys.wait(1000)
    48. elseif rtos.bsp() == "EC618" then
    49. mobile.simid(2)
    50. LED = gpio.setup(27, 0, gpio.PULLUP)
    51. end
    52. result, host, deviceName, iotId, iotToken, uuid = getDeviceInfo(authKey)
    53. if not result then
    54. log.info("获取设备信息失败")
    55. return
    56. end
    57. log.info("result", host, deviceName, iotId, iotToken)
    58. mqttc = mqtt.create(nil, host, 1883)
    59. -- mqttc:debug(true)
    60. mqttc:auth(deviceName, iotId, iotToken)
    61. mqttc:keepalive(30) -- 默认值240s
    62. mqttc:autoreconn(true, 3000) -- 自动重连机制
    63. local mqtt_topic = "/device/" .. deviceName .. "/r"
    64. mqtt_topic_pub = "/device/" .. deviceName .. "/s"
    65. local send_date = {}
    66. mqttc:on(
    67. function(mqtt_client, event, data, payload)
    68. if event == "conack" then
    69. sys.publish("mqtt_conack")
    70. log.info("mqtt", "mqtt已连接")
    71. mqtt_client:subscribe(mqtt_topic)
    72. send_date.dedeviceType = "OwnApp"
    73. send_date.fromDevice = deviceName
    74. send_date.toDevice = uuid
    75. send_date.data = {}
    76. send_date.data.state = "online"
    77. mqttc:publish(mqtt_topic_pub, json.encode(send_date), 0)
    78. elseif event == "recv" then
    79. log.info("mqtt", "收到消息", data, payload)
    80. local data = json.decode(payload)
    81. if data.data["btn-abc"] == "tap" then
    82. led_state = (~led_state) & 1
    83. LED(led_state)
    84. send_date.data = {}
    85. send_date.data["btn-abc"] = "tap"
    86. mqttc:publish(mqtt_topic_pub, json.encode(send_date), 0)
    87. elseif data.data.get == "state" then
    88. send_date.data = {}
    89. send_date.data.state = "online"
    90. log.info("mqtt", "回复状态为在线", json.encode(send_date))
    91. mqttc:publish(mqtt_topic_pub, json.encode(send_date), 0)
    92. elseif data.data["btn-123"] == "tap" then
    93. log.info("mqtt", "数字")
    94. num = num + 1
    95. send_date.data = {}
    96. send_date.data["num-abc"] = {}
    97. send_date.data["num-abc"].tex = "num"
    98. send_date.data["num-abc"].val = num
    99. mqttc:publish(mqtt_topic_pub, json.encode(send_date), 0)
    100. end
    101. elseif event == "sent" then
    102. log.info("mqtt", "sent", "pkgid", data)
    103. end
    104. end
    105. )
    106. mqttc:connect()
    107. sys.wait(10000)
    108. sys.waitUntil("mqtt_conack")
    109. while true do
    110. -- mqttc自动处理重连
    111. local ret, topic, data, qos = sys.waitUntil("mqtt_pub", 30000)
    112. if ret then
    113. if topic == "close" then
    114. break
    115. end
    116. mqttc:publish(mqtt_topic_pub, data, qos)
    117. end
    118. end
    119. mqttc:close()
    120. mqttc = nil
    121. end
    122. )
    123. -- 用户代码已结束---------------------------------------------
    124. -- 结尾总是这一句
    125. sys.run()
    126. -- sys.run()之后后面不要加任何语句!!!!!

    三、测试

    把完整代码烧录进设备,不会烧录的可以看 AIR780E二次开发点灯(LuatOS)

    底层固件要用最新的,可以自行编译CSDK里的luatos项目,也可以用我这里编译好的LuatOS-SoC_V1001_EC618.soc

    烧录好以后,打开点灯app,然后就可以开始测试了。点击开灯按钮可以翻转开发板上带的灯的状态;点击计数按钮,设备端会累加次数并上报,在app可以看到次数不断增加。

  • 相关阅读:
    「随笔」IT行业哪个方向比较好就业
    Vue Router 嵌套路由
    通讯网关软件015——利用CommGate X2MQTT实现MQTT访问Modbus RTU
    WPF样式
    语言模型和编解码模型
    21天Python进阶学习挑战赛
    第8章 如何启动和推广 Micro SaaS 应用程序
    蓝桥杯-递增三元组(三种解法,二分, 双指针, 前缀和)
    数据分析------知识点(六)
    将特征转换为正态分布的一种方法示例
  • 原文地址:https://blog.csdn.net/rootuseres/article/details/127883265