这部分完成了在数据收集端(windows)的代码编写,由于没有经过完善的实验,因此部分参数与设置仍处于待定状态,具体过程如下:
上一节中提到我通过mosquitto来测试数据采集端的程序,但是在后期分析中我们还需要更多的数据,甚至包括一个时间段内的数据统计,而且只是通过cmd操控mosquitto我并没有办法去保存接收到的数据。所以还是要上代码,python语言的paho.mqtt包满足了我的需求,先简单介绍一下paho.mqtt:
paho.mqtt封装了一些与mqtt代理通信的方法与类,让我们很方便的可以使用mqtt协议实现我们想要的功能,个人体验比Arduino上的PubSubClient.h方便。当然了,平台都不一样。
对paho.mqtt的学习还是参考了大佬的博客在这里只简单说一下我的代码涉及到的部分,有兴趣的朋友传送门在上面。
这是我们在编程中主要使用的一个类,主要负责与mqtt代理进行通信,它提供了很多回调函数方便我们在不同的事件发生时插入我们想要的功能。
以下是几个例子:
on_connect(client, userdata, flags, rc):
在与mqtt代理连接的时候被调用,rc是返回的状态码,可以判断连接是否成功。
状态码对照表格如下:
值 | 连接情况 |
---|---|
0 | 连接成功 |
1 | 协议版本错误 |
2 | 无效的客户端标识 |
3 | 服务器无法使用 |
4 | 错误的用户名或密码 |
5 | 未经授权 |
其他的元素并不确定,可能会在后去更新中一一确定,mid在其他的回调函数参数中出现,解释在上文大佬的链接里,没大看懂不做搬运…
以下是我自己填充的回调函数:
def on_connect(client, userdata, flags, rc):
while(rc!=0):
print("[MQTT]connect failed rc is " + str(rc))
print("[MQTT]next reconnecting ...")
client.connect("localhost", 1883, 60)
print("[MQTT]success connected")
startTime = time.time()
result = client.subscribe([("topic01",0),("connected",2),("disconnected",2)])
def on_message(client, userdata, msg):
if(msg.topic == "connected"):
connectionNumber += 1
elif(msg.topic == "disconnected"):
connectionNumber -= 1 #计算最大连接数
elif(msg.topic == "topic01"):
print("[MQTT]MSG :" + str(msg.payload))
print("[MQTT]MSG SIZE:" + str(len(msg.payload)))
#print("[MQTT]MSG IP:" + str(msg))
messageOperation(msg.payload)
#数据处理业务函数
def on_disconnect(client,userdata,rc):
if(rc == MQTT_ERR_SUCCESS):
print("[MQTT]Disconnect Succcessful")
else:
print("[MQTT]Error Disconnect. Err Code: " + str(rc))
def on_subscribe(client, userdata,mid,granted_qos):
#此处granted_qos返回了一个由程序订阅的所有主题的服务等级构成的列表
print("[MQTT]Subscribe Mid: " + str(mid))
print("[MQTT]Subscribe Granted_qos: " + str(granted_qos))
print("[MQTT]Subscribe Successful")
除此之外还有一些函数提供了连接,信息发送等功能,这里我们用到subscribe函数来订阅主题,connect函数来创建连接(触发回调函数)
在数据采集过程中我们需要了解每个时间段内数据的上传时间,esp8266只能计算系统时间,因此我准备在接收到数据时将时间数据打包到传过来的message中,同时计算多个与时间相关的所需数值。代码如下:
def messageOperation(msg):
endTime = time.time()
allLenth += len(msg)#计算数据长度
if(timeMax < connectionNumber):
timeMax = connectionNumber
if(endTime - startTime > timeWindow):
startTime = endTime
fileOperation()
最后将一个时间段内被计算完毕的数据存储到data.csv中
def fileOperation():
hour = time.localtime().tm_hour
minute = time.localtime().tm_minute
today = datetime.date.today()
with open("data.csv","a") as file:
writer = csv.writer(file)
writer.writerows([today,hour,minute,ip,ipNumber,allLenth,timeMax])
下一步就是要部署传感器终端了,根据实验的结果调整参数以及部分代码