摘要:本期文章采用了4G LTE Cat.1模块,编程语言用的是lua,实现对华为云物联网平台的设备通信与控制

本文分享自华为云社区《基于luatos的4G(LTE Cat.1)模组接入华为云物联网平台完成设备通信与控制(Air780e)》,作者:中华小能能。

一、简介

1、项目介绍

本期文章采用了4G LTE Cat.1模块,编程语言用的是lua,整体来说代码比较简洁,实现对华为云物联网平台的设备通信与控制,即采用一个变量作为模拟属性定时上报,并以一个LED灯作为受控设备进行云端命令的控制,本期内容为我们在户外的项目应用中提供一些参考方案,实现手机远程控制户外设备与数据通信的功能。

准备:

Air780e开发板

usb-typec数据线

4G SIM手机卡(可上网)

2、Air780E模组

Air780E 是LTE Cat.1bis通信模块,采用移芯EC618平台,支持4G全网通 支持双卡单待、支持SPI LCD、支持USB 2.0, 仅CDC功能、支持I2S数字语音接口、支持摄像头等配置,支持AT指令开发、CSDK开发和luatos的lua脚本语言的多种开发,开发板目前淘宝官网是39.9,性价比还是可以的

3、luatos

Lua可以说是目前嵌入式方案中,资源占用最小、运行效率最高、语法最简洁的一门脚本语言。对于编程小白来说,它适合作为你的编程入门语言,因为语法简单。对于会c语言的老手来说,它与c可以完美契合,再加上LuatOS本身就是开源,你可以轻松地使用c为其添加一套c库接口,享受它的高效。在本次教程中,我们便使用lua语言跑luatos实现对华为云物联网平台的设备通信与控制。

4、华为云物联网平台

物联网平台的相关配置在这里就不和大家一一重复了,创建服务、设备、属性、命令等过程大家可以参考以前发布的文章(文末有链接),主要需要提前准备的数据有华为云物联网平台的设备三元组、相关MQTT发布订阅主题等,参考如下:

local mqtt_host = "iot-mqtts.cn-north-4.myhuaweicloud.com"
local mqtt_port = 1883
local mqtt_isssl = false
local client_id = "61fb2d7fde9933029bfuniot_esp8266_test01_0_0_2023021710"
local user_name = "61fb2d7fde9933029bfuniot_esp8266_test01"
local password = "eaff6453a8b5b774b11funiot99aa367b52df8funiot5333funiotf76bea151"
local mqtt_hw = nil
local devdata_topic="$oc/devices/61fb2d7fde9933029funiot_esp8266_test01/sys/properties/report" --订阅属性上报主题
local cmdrec_topic="$oc/devices/61fb2d7fde9933029befuniot_esp8266_test01/sys/commands/#" --订阅命令下发主题
local service_id="Dev_data" --服务ID
local command_name="Control" --控制命令

二、完整开发流程

1.下载软件包与编译烧录工具

1)LuatOS软件包:Air780e使用LuatOS-SoC@EC618

下载链接:LuatOS-SoC@EC618 V1103

2)调试与烧录工具:Luatools

下载链接:https://doc.openluat.com/wiki/37?wiki_page_id=4489#LuaTools__9

2. 编写luatos脚本

-- 获取更多资料,可以关注公众号"IOT趣制作"
-- LuaTools需要PROJECT和VERSION这两个信息
PROJECT = "led"
VERSION = "1.0.0"
-- 引入必要的库文件(lua编写), 内部库不需要require
sys = require("sys")
log.info("main", "mqtt_huaweiiot")
print(_VERSION)
if wdt then
--添加硬狗防止程序卡死,在支持的设备上启用这个功能
wdt.init(9000)--初始化watchdog设置为9s
sys.timerLoopStart(wdt.feed, 3000)--3s喂一次狗
end
--用户代码开始---------------------------------------------------
--根据自己华为云物联网平台的配置修改以下参数,下列参数仅作参考
local mqtt_host = "iot-mqtts.cn-north-4.myhuaweicloud.com"
local mqtt_port = 1883
local mqtt_isssl = false
local client_id = "61fb2d7fde9933029bfuniot_esp8266_test01_0_0_2023021710"
local user_name = "61fb2d7fde9933029bfuniot_esp8266_test01"
local password = "eaff6453a8b5b774b11funiot99aa367b52df8funiot5333funiotf76bea151"
local mqtt_hw = nil
local devdata_topic="$oc/devices/61fb2d7fde9933029funiot_esp8266_test01/sys/properties/report" --订阅属性上报主题
local cmdrec_topic="$oc/devices/61fb2d7fde9933029befuniot_esp8266_test01/sys/commands/#" --订阅命令下发主题
local service_id="Dev_data" --服务ID
local command_name="Control" --控制命令
local LED_PIN=27 --LED引脚编号
gpio.setup(LED_PIN,0, gpio.PULLUP) --设置LED上拉输出
sys.taskInit(function()
while 1 do
--网络相关
mobile.simid(2)
LED = gpio.setup(27, 0, gpio.PULLUP)
device_id = mobile.imei()
sys.waitUntil("IP_READY", 30000)
--mqtt客户端创建
mqtt_hw = mqtt.create(nil,mqtt_host, mqtt_port, mqtt_isssl, ca_file)
mqtt_hw:auth(client_id,user_name,password)
mqtt_hw:keepalive(60) -- 默认值240s
mqtt_hw:autoreconn(true, 3000) -- 自动重连机制
--注册mqtt回调
mqtt_hw:on(function(mqtt_client, event, data, payload)
-- 用户自定义代码
log.info("mqtt", "event", event, mqtt_client, data, payload)
if event == "conack" then --连接响应成功
sys.publish("mqtt_conack")--订阅主题
mqtt_client:subscribe(pub_devdata_topic)
mqtt_client:subscribe(pub_cmdrec_topic)
elseif event == "recv" then
log.info("mqtt", "downlink", "topic", data, "payload", payload)
print("payload:",payload)
--解析json
--例如:{"paras":{"led":1},"service_id":"Dev_data","command_name":"Control"}
local mycmd=json.decode(payload)
if mycmd then -- 若解码失败, 会返回nil
print("service_id :",mycmd["service_id"])
print("command_name is",mycmd["command_name"])
print("paras->led is",mycmd["paras"]["led"])
if mycmd["service_id"]==service_id and mycmd["command_name"]==command_name then
if mycmd["paras"]["led"]==1 then
print("led turn on")
gpio.set(LED_PIN, gpio.HIGH)
elseif mycmd["paras"]["led"]==0 then
print("led turn off")
gpio.set(LED_PIN, gpio.LOW)
end
end
end
elseif event == "sent" then
log.info("mqtt", "sent", "pkgid", data)
-- elseif event == "disconnect" then
-- 非自动重连时,按需重启mqtt_hw
-- mqtt_client:connect()
end
end)
--连接mqtt
mqtt_hw:connect()
sys.waitUntil("mqtt_conack")
while true do
-- mqtt_hw自动处理重连
local ret, topic, data, qos = sys.waitUntil("mqtt_pub", 30000)
if ret then
if topic == "close" then break end
mqtt_hw:publish(topic, data, qos)
end
end
mqtt_hw:close()
mqtt_hw = nil
end
end)
--定时上报属性
sys.taskInit(function()
local topic = devdata_topic --上报的topic
local temp=0 --温度属性值
local data = "{\"services\":[{\"service_id\":\"Dev_data\",\"properties\":{\"temp\": "..tostring(temp).."}}]}"
local qos = 1
local temp=0
while true do
sys.wait(5000)
if mqtt_hw and mqtt_hw:ready() then
-- mqtt_hw:subscribe(topic)
local pkgid = mqtt_hw:publish(topic, data, qos)
temp=temp+1
data = "{\"services\":[{\"service_id\":\"Dev_data\",\"properties\":{\"temp\": "..tostring(temp).."}}]}"
-- 也可以通过sys.publish发布到指定task去
-- sys.publish("mqtt_pub", topic, data, qos)
end
end
end)
-- 用户代码已结束---------------------------------------------
-- 结尾总是这一句
sys.run()
-- sys.run()之后后面不要加任何语句!!!!!

3.编译烧录

打开Luatools,点击项目管理按钮,选择下载好的固件(后缀名为soc的文件)和编写好的main.lua文件,勾选USB BOOT下载,点击下载底层和脚本按钮下载即可,具体操作流程如下图所示:

4.运行结果

命令接收的同时开发板的LED灯光会对应的完成开关亮灭

5.Android APP

这里我们同样可以采用之前的Android APP完成与物联网平台的通信,实现手机远程控制户外设备与数据通信的功能

链接:【华为云IOT的Android应用开发-详细教程】:https://bbs.huaweicloud.com/forum/thread-186368-1-1.html

6.其他相关参考文章

【stm32+AT指令+ESP8266接入华为云物联网平台并完成属性上报与下发的命令处理】https://bbs.huaweicloud.com/forum/thread-195143-1-1.html

【esp8266接入华为云物联网平台完成属性上报、命令处理】https://bbs.huaweicloud.com/forum/thread-187353-1-1.html

点击关注,第一时间了解华为云新鲜技术~

手把手教你基于luatos的4G(LTE Cat.1)模组接入华为云物联网平台的更多相关文章

  1. Delphi - 手把手教你基于D7+Access常用管理系统架构的设计与实现 (更新中)

    前言 从事软件开发工作好多年了,学的越深入越觉得自己无知,所以还是要对知识保持敬畏之心,活到老,学到老! 健身和代码一样都不能少,身体是革命的本钱,特别是我们这种高危工种,所以小伙伴们运动起来!有没有 ...

  2. 手把手教你基于SqlSugar4编写一个可视化代码生成器(生成实体,以SqlServer为例,文末附源码)

    在开发过程中免不了创建实体类,字段少的表可以手动编写,但是字段多还用手动创建的话不免有些浪费时间,假如一张表有100多个字段,手写有些不现实. 这时我们会借助一些工具,如:动软代码生成器.各种ORM框 ...

  3. 手把手教你基于C#开发WinCC语音报警插件「附源代码」

    写在前面 众所周知,WinCC本身是可以利用C脚本或者VBS脚本来做语音报警,但是这种方式的本质是调用已存在的音频文件,想要实现实时播报报警信息是不行的,灵活性还不够,本文主要介绍基于C#/.NET开 ...

  4. python 手把手教你基于搜索引擎实现文章查重

    前言 文章抄袭在互联网中普遍存在,很多博主都收受其烦.近几年随着互联网的发展,抄袭等不道德行为在互联网上愈演愈烈,甚至复制.黏贴后发布标原创屡见不鲜,部分抄袭后的文章甚至标记了一些联系方式从而使读者获 ...

  5. 手把手教你基于Netty实现一个基础的RPC框架(通俗易懂)

    阅读这篇文章之前,建议先阅读和这篇文章关联的内容. [1]详细剖析分布式微服务架构下网络通信的底层实现原理(图解) [2][年薪60W的技巧]工作了5年,你真的理解Netty以及为什么要用吗?(深度干 ...

  6. 手把手教你基于koa2,mongoose实现增删改查

    初始化项目 npm init -y 先安装一波乱七八糟的依赖插件(需要具备一定的koa2知识,至于mongoDB自行百度安装教程),模板引擎我使用的是art-template(据说是性能最好的,而且是 ...

  7. 手把手教你基于CentOS8搭建微信订阅号后台服务(一)

    一.准备域名并完成解析 关于域名,我买的是阿里的一个1元/年的廉价域名,同时国内域名都需要备案,当时在这里耽搁了挺久的. 域名解析的话,在阿里云官方帮助文档里有.传送门:https://help.al ...

  8. ESA2GJK1DH1K基础篇: 阿里云物联网平台: 云平台显示单片机采集的温湿度数据,控制设备继电器(基于GPRS模块,AT指令TCP_MQTT通信)

    实现的功能 上一节是使用的Wi-Fi模块连接的阿里云平台,这节呢咱用GPRS连接. 阿里云的设备配置还是按照上一节的,有个温度,有个湿度. 测试 一,打开单片机程序 二,根据自己的修改,然后下载进去单 ...

  9. 动手实践丨手把手教你用STM32做一个智能鱼缸

    摘要:本文基于STM32单片机设计了一款基于物联网的智能鱼缸. 本文分享自华为云社区<基于STM32+华为云IOT设计的物联网鱼缸[玩转华为云]>,作者: DS小龙哥 . 1. 前言 为了 ...

  10. 基于STM32+华为云IOT设计智能称重系统

    摘要:选择部署多个重量传感器和必要的算法.通过WiFi 通信模块.GPS定位模块,采集车辆称重数据一地理位置信息,并通过网络发送至云平台,设计图形化UI界面展示称重.地图位置等重要信息,实现对称重系统 ...

随机推荐

  1. TypeScript Number

    TypeScript Number TypeScript 与 JavaScript 类似,支持 Number 对象. Number 对象是原始数值的包装对象. 语法 var num = new Num ...

  2. 在ubuntu18.04上安装nodejs14

    步骤 1:更新 在 Ubuntu 上运行 apt update 命令以更新软件包库内容数据库. sudo apt update 第 2 步:在 Ubuntu 18.04 上安装 Node.js 14 ...

  3. 【ADB命令】安装app

    在电脑上安装以下指令 adb install app的文件位置

  4. vue3 vite等笔记

    1.脚手架 vue-cli基于webpack封装,生态非常强大,可配置性也非常高,几乎能够满足前端工程化的所有要求.缺点就是配置复杂,甚至有公司有专门的webpack工程师专门做配置,另外就是webp ...

  5. Lua中__index元方法的介绍与使用

    一.相关介绍请参考:Lua中__index原方法介绍 二.使用示例 代码如下: 下面示例使用的元素迭代器 --1.列表元素迭代器,仅返回列表中每一个元素,改列表索引必须为连续的数字 function ...

  6. Linux网络第三章:DNS服务器原理及搭建

    目录 一.DNS服务器原理 1.什么是DNS 2.DNS服务器查询过程 二.主备DNS服务器搭建 1.搭建环境 2.检查安装DNS服务 3.修改主服务器配置文件 4.修改备服务器配置文件 5.启动服务 ...

  7. CCIE DC Multicast Part 1.

    Hi Guys! As we all wait anxiously for the training vendors to release Rack Rentals (Come on guys! At ...

  8. bzoj 2337

    有人说这题像游走... 关于游走的思想,他死了... 明明直接从期望dp的角度考虑更简单合理嘛 首先由于是异或运算不妨逐位考虑 对于每一位,设状态$f[i]$表示从第$i$个点到第$n$个点,这一位上 ...

  9. 笔记:vue.nextTick()方法的使用详解

    vue.nextTick定义: 在下次DOM更新循环结束之后执行延迟回调.在修改数据之后立即使用这个方法,获取更新后的DOM. 简单理解:数据更新了,在dom渲染后立即执行该函数 举例 注意:Vue实 ...

  10. Vue的学习(2)

    Vue.js的模板语法 1.数据绑定的最常见的方法是插值法,写法{{}} 2.输出html代码,命令为v-html 例如: <div id="app"> <p v ...