Air780E连接点灯科技-LuatOS

news2025/3/2 4:16:55

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

先上成果演示

一、点灯云准备

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

1、添加设备

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

 右下角选择网络接入

 然后复制得到的key

2、配置设备

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

 二、设备端开发

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

1、鉴权

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

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

 

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

local function getDeviceInfo(authKey)
    local code, headers, data = http2.request("GET", serverAdress .. authKey .. "&protocol=mqtt").wait()
    if data and json.decode(data) then
        local authdata = json.decode(data)
        if authdata.message == 1000 then
            log.info(
                "获取设备信息成功",
                authdata.detail.host:sub(8, -1),
                authdata.detail.deviceName,
                authdata.detail.iotId,
                authdata.detail.iotToken,
                authdata.detail.uuid
            )
            return true, authdata.detail.host:sub(8, -1), authdata.detail.deviceName, authdata.detail.iotId, authdata.detail.iotToken, authdata.detail.uuid
        end
    end
    return false
end

2、连接

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

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

PROJECT = "gpiodemo"
VERSION = "1.0.0"
local sys = require "sys"
require("sysplus")
--{"deviceType": "OwnApp", "fromDevice": "856ED5F216FO23SKEEDQJ8LL", "toDevice": "0451f7667f1c11ec94755254", "data": {"state": "online"}}
local wifi_ssid = "NAS"
local wifi_password = "Air123456"
--如果是wifi设备,这里改成你的wifi账号和密码
local authKey = "" --点灯云申请的设备authKey
local serverAdress = "http://iot.diandeng.tech/api/v1/user/device/diy/auth?authKey=" --http鉴权地址
local mqttc = nil
local led_state = 0
local num = 0
local function getDeviceInfo(authKey)
    local code, headers, data = http2.request("GET", serverAdress .. authKey .. "&protocol=mqtt").wait()
    if data and json.decode(data) then
        local authdata = json.decode(data)
        if authdata.message == 1000 then
            log.info(
                "获取设备信息成功",
                authdata.detail.host:sub(8, -1),
                authdata.detail.deviceName,
                authdata.detail.iotId,
                authdata.detail.iotToken,
                authdata.detail.uuid
            )
            return true, authdata.detail.host:sub(8, -1), authdata.detail.deviceName, authdata.detail.iotId, authdata.detail.iotToken, authdata.detail.uuid
        end
    end
    return false
end
sys.taskInit(
    function()
        log.info("BSP", rtos.bsp())
        if rtos.bsp() == "ESP32C3" then
            LED = gpio.setup(12, 0, gpio.PULLUP)
            wlan.init()
            wlan.setMode(wlan.STATION)
            wlan.connect(ssid, password, 1)
            local result, data = sys.waitUntil("IP_READY")
            log.info("wlan", "IP_READY", result, data)
        elseif rtos.bsp() == "AIR105" then
            w5500.init(spi.HSPI_0, 24000000, pin.PC14, pin.PC01, pin.PC00)
            w5500.config() --默认是DHCP模式
            w5500.bind(socket.ETH0)
            LED = gpio.setup(62, 0, gpio.PULLUP)
            sys.wait(1000)
        elseif rtos.bsp() == "EC618" then
            mobile.simid(2)
            LED = gpio.setup(27, 0, gpio.PULLUP)
        end
        result, host, deviceName, iotId, iotToken, uuid = getDeviceInfo(authKey)
        if not result then
            log.info("获取设备信息失败")
            return
        end
        log.info("result", host, deviceName, iotId, iotToken)

        mqttc = mqtt.create(nil, host, 1883)
        -- mqttc:debug(true)
        mqttc:auth(deviceName, iotId, iotToken)
        mqttc:keepalive(30) -- 默认值240s
        mqttc:autoreconn(true, 3000) -- 自动重连机制
        local mqtt_topic = "/device/" .. deviceName .. "/r"
        mqtt_topic_pub = "/device/" .. deviceName .. "/s"
        local send_date = {}
        mqttc:on(
            function(mqtt_client, event, data, payload)
                if event == "conack" then
                    sys.publish("mqtt_conack")
                    log.info("mqtt", "mqtt已连接")
                    mqtt_client:subscribe(mqtt_topic)
                    send_date.dedeviceType = "OwnApp"
                    send_date.fromDevice = deviceName
                    send_date.toDevice = uuid
                    send_date.data = {}
                    send_date.data.state = "online"
                    mqttc:publish(mqtt_topic_pub, json.encode(send_date), 0)
                elseif event == "recv" then
                    log.info("mqtt", "收到消息", data, payload)
                    local data = json.decode(payload)
                    if data.data["btn-abc"] == "tap" then
                        led_state = (~led_state) & 1
                        LED(led_state)
                        send_date.data = {}
                        send_date.data["btn-abc"] = "tap"
                        mqttc:publish(mqtt_topic_pub, json.encode(send_date), 0)
                    elseif data.data.get == "state" then
                        send_date.data = {}
                        send_date.data.state = "online"
                        log.info("mqtt", "回复状态为在线", json.encode(send_date))
                        mqttc:publish(mqtt_topic_pub, json.encode(send_date), 0)
                    elseif data.data["btn-123"] == "tap" then
                        log.info("mqtt", "数字")
                        num = num + 1
                        send_date.data = {}
                        send_date.data["num-abc"] = {}
                        send_date.data["num-abc"].tex = "num"
                        send_date.data["num-abc"].val = num
                        mqttc:publish(mqtt_topic_pub, json.encode(send_date), 0)
                    end
                elseif event == "sent" then
                    log.info("mqtt", "sent", "pkgid", data)
                end
            end
        )
        mqttc:connect()
        sys.wait(10000)
        sys.waitUntil("mqtt_conack")
        while true do
            -- mqttc自动处理重连
            local ret, topic, data, qos = sys.waitUntil("mqtt_pub", 30000)
            if ret then
                if topic == "close" then
                    break
                end
                mqttc:publish(mqtt_topic_pub, data, qos)
            end
        end
        mqttc:close()
        mqttc = nil
    end
)

-- 用户代码已结束---------------------------------------------
-- 结尾总是这一句
sys.run()
-- sys.run()之后后面不要加任何语句!!!!!

三、测试

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/9216.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Offsets 获取该行的起始索引 start=offsets (x)

获取数据列的第 x 行,通过 Offsets 获取该行的起始索引 startoffsets (x) 和下一行的起始索引 endoffsets (x1),然后使用这两个索引通过 Bytes 获取具体数据对应的字节流 bytes.slice (start,end),最后按照字段类型做相应的转换即可。 注&am…

QGC二次开发基础

文章目录 前言一、添加文件到QGC工程二、添加界面三、QML和C++交互四、信号与槽五、测试前言 QGC 4.2.4 一、添加文件到QGC工程 在qgroundcontrol/src目录下创建SimpleTest文件夹 在文件夹中创建SimpleTest.cpp、SimpleTest.h和SimpleTest.qml三个文件 在qgroundcontrol.p…

锁竞争导致的慢sql分析

线上在同步用户时,经常出现简单sql的慢日志。根据方法找到代码,发现方法内使用redisson进行锁操作,waiTime和leaseTime都为3秒,数据库操作比较简单,只是一个简单的用户更新操作。代码简化后如下 Override Transactional(rollback…

客流分析统计摄像头可定制算法程序自动判断识别提醒

客流分析统计摄像头是一个专门为商业零售业企业开发的智能客流量统计分析系统。客流统计分析系统能实时、动态、准确、连续地记录着经营场地的客流的数据信息,既有当前客流又有历史客流,既有不同时段的,又有不同区域客流数据。 客流分析统计摄…

【论文】Poly-yolo: 改进anchor分配问题

文章目录Poly-yolo: higher speed,more precise detection and instance segmentation for yolov31 修改了骨干网络增加CE模块2 重写标签3、修改了输出层3.1 修改细节3.2 修改目的:改进anchor分配问题4 检测多边形 Instance segmentation with Poly-YOLO4.1 The pri…

【Pytorch with fastai】第 9 章 :表格建模深入探讨

🔎大家好,我是Sonhhxg_柒,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎 📝个人主页-Sonhhxg_柒的博客_CSDN博客 📃 🎁欢迎各位→点赞…

95后工程师上班哼小曲?那些愉快上班的打工人,到底怎么做到的?

特别羡慕我们公司一个画PCB板子的刘工,95后,来公司也3年多了,他不是我们部门赚得最多的,也不是人际关系处得最好的,却是活得最开心的。 具体表现在哪呢? ——他居然能每天哼着小曲上班。 怎么会有人上班…

《Linux下的进程创建》

【一】fork函数初识 在Linux中fork函数是非常重要的,他从已存在的进程中创建一个新进程,进程为子进程,而原进程为父进程。 返回值:fork函数的返回值是非常有意思的,他是有两个返回值的,对于父进程来说&…

QRegExp(正则表达式)

QRegExp 头文件&#xff1a;#include<QRegExp> 构造函数&#xff1a; 常用函数&#xff1a; indexIn()判断是否符合规则matchedLength()返回最后一个匹配字符串的长度&#xff0c;没有的话返回-1setPattern()将模式字符串设置为模式。区分大小写、通配符和最小匹配选项不…

openpnp软件的使用 - 引入坐标文件

文章目录openpnp软件的使用 - 引入坐标文件前言笔记生成符合openpnp要求的坐标文件板子在openpnp设备上摆放的规则确定openpnp设备的x,y方向确定自己板子的原点坐标和xy方向在openpnp设备平台上摆放板子在openpnp中引入坐标文件新建任务新建板子引入板子的坐标文件设置mark点Pa…

Starday影响者视频能给你提升80%的流量?

跨境电商行业随着互联网时代的推进&#xff0c;Starday跨境电商平台受到越来越多的人关注&#xff0c;许多商家受碍于疫情影响&#xff0c;为了个人商家和企业发展&#xff0c;将目光投于海外。如雨后春笋般出现的跨境电商平台&#xff0c;也为商家带来了许多困扰&#xff0c;该…

JS高级(一):类、原生tab栏切换、原型和原型链

JavaScript高级&#xff08;一&#xff09;一、类&#xff08;之前ES6学过&#xff09;1.类的用法2.类的继承2.1 extends关键字2.2 super关键字&#xff08;1&#xff09;子类属性和父类一致&#xff0c;constructor可以省略&#xff08;2&#xff09;子类要添加属性&#xff0…

axios 实现 POST/PUT接口入参是 query的形式而非JSON的形式——querystring的使用

先看下什么是query的形式入参&#xff1a; 1.常规的GET请求 一般是GET请求才会是query string parameters的形式入参 参数是query string parameters的展示&#xff0c;最终效果是拼接到url地址中&#xff0c;如下图所示&#xff1a; 2.常规的POST/PUT请求 一般是POST/PUT请…

云小课|使用SQL加密函数实现数据列的加解密

摘要&#xff1a;数据加密作为有效防止未授权访问和防护数据泄露的技术&#xff0c;在各种信息系统中广泛使用。作为信息系统的核心&#xff0c;GaussDB(DWS)数仓也提供数据加密功能&#xff0c;包括透明加密和使用SQL函数加密。本文分享自华为云社区《看GaussDB(DWS)如何使用S…

电感单位亨利H单位换算

1H 1e-18EH 1e-15PH 1e-12TH 1e-9GH 1e-6MH 0.001kH 1H 1,000mH 1,000,000uH 1,000,000,000nH 1,000,000,000,000pH 1,000,000,000,000,000fH 在线H亨利单位换算 (toolxq.com)http://www.toolxq.com/front/tools/trans/unit/H 亨利是电感的国际单位制导出单位&#xff0c;符…

2022年《微信小程序从基础到uni-app项目实战》

教程推荐&#xff1a;黑马程序员前端微信小程序开发教程&#xff0c;微信小程序从基础到发布全流程_企业级商城实战(含uni-app项目多端部署)_ 一、起步 1 uni-app 简介 uni-app 是一个使用 Vue.js 开发所有前端应用的框架。开发者编写一套代码&#xff0c;可发布到 iOS、And…

Word不计算封面、目录页数将正文页码修改为第几页共几页的格式

本文介绍在Word文档中&#xff0c;不考虑封面、目录、前言等的页数&#xff0c;为正文添加“第X页&#xff0c;共X页”样式页码的方法。 在Word中&#xff0c;我们可以双击页眉或页脚部分&#xff0c;选择“页码”选项并添加页码。 其中&#xff0c;可以添加如下图所示形式的页…

Nginx配置虚拟主机

虚拟主机指的是,在一台服务器中,我们使用Nginx,来配置多个网站。 如何区分不同的网站: 端口不同域名不同 1、通过端口区分不同的虚拟主机 1.1、Nginx配置文件 &#xff08;1&#xff09;Nginx配置文件的位置 cd /usr/local/nginx/conf nginx.conf 就是Nginx的配置文件 &a…

Docker学习

Docker学习 Docker概述 Docker安装 Docker命令 Docker镜像 Docker的数据卷 DockerFile Docker网络原理 IDEA整合Docker 集群-Docker Compose Docker Swarm CI\CD jenkins Docker概述 安装教程&#xff1a;(https://docs.docker.com/engine/install/centos/) 文档…

CSS初阶语法

CSS初阶语法 文章目录CSS初阶语法1.CSS介绍2.CSS引入方式3.CSS基础选择器3.1 标签选择器(标签名字)3.2 类选择器(class)3.3 id选择器(id)3.4 通配符选择器(*)4.文字基本样式4.1 字体样式(font-size、font-weight、font-style、font-family、font)4.2 文本样式(text-indent、tex…