搭建rabbitmq服务
环境centos7.5
步骤:
docker pull rabbitmq
启动rabbitmq
docker run -d --hostname my-rabbit --name rabbit -p 15672:15672 -p 5672:5672 -p 1883:1883 -p 15675:15675 rabbitmq
说明:
hostname是必须的,name 是非必须的,是映射的名称。
15672 是rabbitmq management管理界面默认访问端口
5672 是amqp默认端口
1883 是mqtt tcp协议默认端口
15675 是web_mqtt websocket协议默认端口
查看运行状态
docker logs rabbit
启用插件
docker exec <容器ID> rabbitmq-plugins enable rabbitmq_management
docker exec <容器ID> rabbitmq-plugins enable rabbitmq_mqtt
docker exec <容器ID> rabbitmq-plugins enable rabbitmq_web_mqtt
开启端口号远程访问
firewall-cmd --zone=public --add-port=15672/tcp --permanent
firewall-cmd --zone=public --add-port=5672/tcp --permanent
firewall-cmd --zone=public --add-port=1883/tcp --permanent
firewall-cmd --zone=public --add-port=15675/tcp --permanent
firewall-cmd --reload
如提示
firewalld not running
则需要进行开启防火墙的操作。
3.3.2实现数据的发送和接收
数据发送
import paho.mqtt.client as mqtt
import paho.mqtt.publish as publish
import time
from scipy.io import loadmat
import struct
import math
import json
HOST = "106.12.26.219"
PORT = 1883
# rc 是操作结果的状态码,0 代表成功
# 断开连接时的 callback
def on_disconnect(self, client, userdata, rc):
print(self.get_time(), " end a loop with code " + str(rc))
# 链接成功
def on_connect(client, userdata, flags, rc):
print("Connected with result code "+str(rc))
client.subscribe("test")
# 接收到消息
def on_message(client, userdata, msg):
print(msg.topic+" "+msg.payload.decode("utf-8"))
if __name__ == '__main__':
matfn = u'E:\网盘\国家重点专项\健康状态实时在线评估与故障预报系统平台\工业故障诊断交接\StructuralHealth\data.mat'
data = loadmat(matfn)
dat = data['data']
for i in range(4,5):
for j in range(170):
if(j<=89):
f=0
else:
f=1
for m in range(16):
da = dat[m*500:(500+500*m), i, j].tolist()
da.insert(0, math.ceil((m+1) / 2))
da.insert(0,j+1)
da.insert(0,f)
da.insert(0,2)
da.insert(0,i+1)
packed_data=json.dumps(da)
client_id = time.strftime('%Y%m%d%H%M%S',time.localtime(time.time()))
client = mqtt.Client(client_id, userdata=None, protocol=4) # ClientId不能重复,所以使用当前时间,# 4就是MQTT3.1.1
client.username_pw_set("guest", "guest") # 必须设置,否则会返回「Connected with result code 4」
client.on_connect = on_connect
client.on_disconnect = on_disconnect
client.on_message = on_message
client.connect(HOST, PORT, keepalive=60)
pub_result=client.publish("test_topic", payload=packed_data, qos=0, retain=False) # 发布消息
if pub_result.is_published:
print(" success pub message with id: ", pub_result.mid)
else:
print("failed to pub message")
time.sleep(10)
数据接收,存储到mysql
import sys
import os
import paho.mqtt.client as mqtt
import time
import pymysql
import json
import numpy
import datetime
import math
HOST = "106.12.26.219"
PORT = 1883
db = pymysql.connect(host="106.12.26.219", user="root",password="123456", db="test", port=3306)
cur = db.cursor()
def client_loop():
client_id = time.strftime('%Y%m%d%H%M%S',time.localtime(time.time()))
client = mqtt.Client(client_id, userdata=None, protocol=4) # ClientId不能重复,所以使用当前时间 4就是MQTT3.1.1
client.username_pw_set("guest", "guest") # 必须设置,否则会返回「Connected with result code 4」
client.on_connect = on_connect
client.on_message = on_message
client.on_subscribe = on_subscribe
client.connect(HOST, PORT, keepalive=60)
print('mqtt connect success')
client.loop_forever(timeout=1.0)
# 开始时订阅 callback
def on_subscribe(self, client, userdata, mid, granted_qos):
print("Begin subscribe topic with ", mid)
# 链接成功的函数
def on_connect(client, userdata, flags, rc):
print("Connected with result code "+str(rc))
client.subscribe("test_topic") # 设置topic 0/#
# 接收到消息的函数
def on_message(client, userdata, msg):
print(msg.topic+" "+msg.payload.decode("utf-8"))
content = json.loads(msg.payload.decode("utf-8"))
data=[]
data.append(content[0])
data.append(content[1])
data.append(content[2])
data.append(content[3])
data.append(content[4])
for i in range(500):
now2 = datetime.datetime.now()
now = now2.strftime("%Y-%m-%d %H:%M:%S")
data.append(now)
data.insert(5,content[5+i])
cur.execute("INSERT INTO vibration_sensor_historical_data (idOperationData,Robotid,DataTypeid,Fault,Sessionid,Runid,Num1,Time) VALUES(null,%f,%f,%f,%f,%f,%f,str_to_date(\'%s\','%%Y-%%m-%%d %%H:%%i:%%s'))" % tuple(
data))
del data[5]
del data[5]
db.commit()
if __name__ == '__main__':
client_loop()
数据接收,存储到InfluxDB