一,服务器
虽然这个没什么要求,实验的话虚拟机就可以;什么淘汰笔记本,台式机也可以。由于我是狂热份子,就买了台巴掌大的小电脑做为我的实验服务器。只是个电脑,内存没有ECC功能。不过够我做实验的了。
巴掌大,可以装一块2.5英寸机械硬盘和一块NVME固态硬盘。8G内存,CPU是I5-6500t,当时价格1800元。里面装的是Ubuntu 21.04服务器系统,我的Gcc编译和服务器实验都是上面进行。
怎么装Ubuntu我就不详细说了,网上教程很多,最好装服务器版本的系统,这种系统没有界面纯命令行,稳定性非常高。
二,物联网接入平台
我选择的是开源的EMQX,百万级连接。比着商业版缺少数据固化功能,需要自己开发一套订阅系统用于存储数据。
网址是:https://www.emqx.com/zh/downloads?product=broker,记得选择开源版的Ubuntu版本,企业版只可免费试用几个月。
安装也很简单,官方给了说明,只需3行代码。
从http://你的服务器IP:18083/进入管理界面,18083是WEB管理页面端口。运行后的界面是这样的。
占用的接口是下面这些,我们常使用的是1883端口,既是mqtt:tcp接口。如果使用coap协议就是5683端口。
三,传感器模拟(物联网设备1)
传感器模拟我使用的是树莓派,把树莓派的CPU温度用python上传到物联网平台。也可以订阅自己感兴趣的主题,用于控制个灯,风扇啥的。代码如下:
# subscriber.py
import paho.mqtt.client as mqtt
import time
# 0: 连接成功
# 1: 连接失败-不正确的协议版本
# 2: 连接失败-无效的客户端标识符
# 3: 连接失败-服务器不可用
# 4: 连接失败-错误的用户名或密码
# 5: 连接失败-未授权
# 6-255: 未定义
# 如果是其它问题,可以检查网络情况,或者确认是否安装了 `paho-mqtt`。
def on_connect(client, userdata, flags, rc):
if rc == 0:
print("\n连接成功!\n")
elif rc==1:
print(f"\n接失败-不正确的协议版本\n")
elif rc==2:
print(f"\n连接失败-无效的客户端标识符\n")
elif rc==3:
print(f"\n连接失败-服务器不可用\n")
elif rc==4:
print(f"\n连接失败-错误的用户名或密码\n")
elif rc==5:
print(f"\n连接失败-未授权\n")
else:
print(f"\n连接失败-未定义\n")
# 订阅,需要放在 on_connect 里
# 如果与 broker 失去连接后重连,仍然会继续订阅 raspberry/topic 主题
client.subscribe("raspberry/topic")
# 回调函数,当收到消息时,触发该函数
def on_message(client, userdata, msg):
print(f"{msg.topic} {msg.payload}")
def get_cpu_temp():
tempFile = open( "/sys/class/thermal/thermal_zone0/temp" )
cpu_temp = tempFile.read()
tempFile.close()
return float(cpu_temp)/1000
client = mqtt.Client("数梅派终端")
client.username_pw_set("你的用户名","你的密码")
client.on_connect = on_connect
client.on_message = on_message
# 设置遗嘱消息,当树莓派断电,或者网络出现异常中断时,发送遗嘱消息给其他客户端
client.will_set('raspberry/status', b'{"status": "offline!"}')
# 创建连接,三个参数分别为 broker 地址,broker 端口号,保活时间
client.connect("10.195.136.221", 1883, 60)
# 设置网络循环堵塞,在调用 disconnect() 或程序崩溃前,不会主动结束程序
client.loop_start()
while True:
# 四个参数分别为:主题,发送内容,QoS, 是否保留消息
client.publish('raspberry/topic', payload=str(get_cpu_temp()), qos=0, retain=False)
print(f"send cpu temp to raspberry/topic")
time.sleep(5)
这段代码每5秒钟向服务器发送一条温度信息。同时订阅了一条raspberry/topic的主题。
四,订阅设备模拟(物联网设备2)
如果没有树莓派,也可以用软件模拟,软件叫MQTTX,免费的,和服务器平台是一家,不用写任何代码,也是新手比较推荐的玩法。
和树莓派一样,可以发送消息和订阅消息,从图中可以看到订阅了树莓派所有过来的主题,当前温度不到44度。
从上次升级到现在,服务器已经运行3天接收到5万多条信息。