赞
踩
很多朋友在学习或则工作的时候都是专研某个领域;很多时候,写后端服务的攻城狮们(加班狗)只关心后端数据,前端妹妹们只管做界面,这造成硬件工程师经常抱怨服务器来的数据量太大,他们处理不完(嘿嘿 后端开发们以为mcu是 x86--至强);后端开发又吐槽硬件来的数据格式不标准(你们为何不是json);当然术业有专攻,每一个开发人员所做的工作都是值得肯定的。面对物联联网这种需要多种技术配合使用的架构时很多人会懵(尤其是搞硬件开发的对后端逻辑十分陌生)。下边是一个物联网系统的简单实现。
luat:
luat是一款带有常用外设(io,uart,iic,spi)的(2g/4g)通信模组其使用lua脚本开发,内部自己带有mqtt协议(不知道的自行百度或谷歌,此协议优点多多,最舒服的是不会粘包),为了方便我们就别自己用at指令移植mqtt了,假如你使用的设备没有这些协议比如说stm32,arm-linux开发板,你需要移植了;mqtt源码:https://github.com/eclipse/paho.mqtt.c 下边是luat连接emqx代理服务器的代码:(不会lua请移步http://www.runoob.com/lua/lua-tutorial.html)
这是我用官方的一个样例:
https://github.com/123zxl/luat-go
部份代码如下;
- --- 模块功能:MQTT客户端处理框架
- -- @author openLuat
- -- @module mqtt.mqttTask
- -- @license MIT
- -- @copyright openLuat
- -- @release 2018.03.28
-
- module(...,package.seeall)
-
- require"misc"
- require"mqtt"
- require"mqttOutMsg"
- require"mqttInMsg"
-
- local ready = false
-
- --- MQTT连接是否处于激活状态
- -- @return 激活状态返回true,非激活状态返回false
- -- @usage mqttTask.isReady()
- function isReady()
- return ready
- end
- local function print(...)
- _G.print("test",...)
- end
- --启动MQTT客户端任务
- sys.taskInit(
- function()
- local retryConnectCnt = 0
- while true do
- if not socket.isReady() then
- retryConnectCnt = 0
- --等待网络环境准备就绪,超时时间是5分钟
- sys.waitUntil("IP_READY_IND",300000)
- end
-
- if socket.isReady() then
- local imei = misc.getImei()
-
- --创建一个MQTT客户端
- local mqttClient = mqtt.client(imei,600,"user","password")
- --阻塞执行MQTT CONNECT动作,直至成功
- --如果使用ssl连接,打开mqttClient:connect("lbsmqtt.airm2m.com",1884,"tcp_ssl",{caCert="ca.crt"}),根据自己的需求配置
- --mqttClient:connect("lbsmqtt.airm2m.com",1884,"tcp_ssl",{caCert="ca.crt"})
-
- -----------------------------------------------------------------
- --请自己添ip ,端口,接入方式
- if mqttClient:connect("lbsmqtt.airm2m.com",1884,"tcp") then
- -----------------------------------------------------------------------
-
- retryConnectCnt = 0
- ready = true
- --订阅主题
- if mqttClient:subscribe({["go-mqtt/sample"]=0, ["go-mqtt/sample"]=1}) then
-
- --循环处理接收和发送的数据
- while true do
- if not mqttInMsg.proc(mqttClient) then log.error("mqttTask.mqttInMsg.proc error") break end
- if not mqttOutMsg.proc(mqttClient) then break end
- end
-
- end
- ready = false
- else
- retryConnectCnt = retryConnectCnt+1
- end
- --断开MQTT连接
- mqttClient:disconnect()
- if retryConnectCnt>=5 then link.shut() retryConnectCnt=0 end
- sys.wait(5000)
- else
- --进入飞行模式,20秒之后,退出飞行模式
- net.switchFly(true)
- sys.wait(20000)
- net.switchFly(false)
- end
- end
- end
- )
emqx:
emqx是我用过的开源mqtt带服务器中最好的它的安装也很简单具体流程看:http://docs.emqtt.cn/zh_CN/latest/install.html 我本人是比较推崇docker安装的,这样方便项目搬迁,部署。以下是我在win10 上使用:
解压:。。。。。。。。。。。
进入bin文件夹 emqx console 启动 ( 如图)。
代理服务器就这么容易安装好了。
golang(java/Py/c#php 皆可):
golang是门非常容易上手的语言,性能也超级棒(哈哈 我不会其它后端开发语言),我才用它来写后端。golang环境安装就不在这里多说了。我们要使用golang 来订阅和发布mqtt的主题,所以需要mqtt客服端包 :
go get github.com/eclipse/paho.mqtt.golang
由于部分盆友还不会科学上网(fan qiang)会报错 解决方法:https://blog.csdn.net/sudaobo/article/details/72827930
下边是转载于:https://studygolang.com/articles/14452
- package main
-
- import (
- "fmt"
- "time"
- "github.com/eclipse/paho.mqtt.golang"
- )
- //订阅回调函数;收到消息后会执行它
- var f mqtt.MessageHandler = func(client mqtt.Client, msg mqtt.Message) {
- fmt.Printf("TOPIC: %s\n", msg.Topic())
- fmt.Printf("MSG: %s\n", msg.Payload())
- }
-
- func main() {
- //此处我是以ws方式接入的,请添你自己代理服务器的公网ip ,这里只是举例
- opts := mqtt.NewClientOptions().AddBroker("ws://127.0.0.1:8083/mqtt")
- opts.SetClientID("gotrivial")
- opts.SetKeepAlive(2 * time.Second)
- opts.SetDefaultPublishHandler(f)
- opts.SetPingTimeout(1 * time.Second)
- opts.SetCleanSession(false)
- c := mqtt.NewClient(opts)
- if token := c.Connect(); token.Wait() && token.Error() != nil {
- panic(token.Error())
- }
- //订阅
- if token := c.Subscribe("go-mqtt/sample", 2, nil); token.Wait() && token.Error() != nil {
- fmt.Println(token.Error())
-
- }
- time.Sleep(1 * time.Second)
- //发布
- if token := c.Publish("go-mqtt/sample", 2, false,"博主的第一篇博客"); token.Wait() && token.Error() != nil {
- fmt.Println(token.Error())
-
- }
-
-
- //取消订阅
- if token := c.Unsubscribe("go-mqtt/sample"); token.Wait() && token.Error() != nil {
- fmt.Println(token.Error())
-
- }
- //关闭链接
- c.Disconnect(250)
-
- time.Sleep(20 * time.Second)
- }
运行上述代码 ,可以 看到自己订阅主题了
好了 数据采集传输部份已实现,关于上传数据的存储和处理,以及对用户提供交互界面等工作就该是web前后端们的工作了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。