本文已参与「新人创作礼」活动,一起开启掘金创作之路。
一、简介
本次项目的前期工作已经接近尾声,现已实现通过STC12C5A60S2单片机
驱动3144霍尔传感器
和NEO-6M GPS模块
来采集当前区域的经纬度信息以及磁场变化;LCD1602液晶显示屏
显示采集到的信息;深联智达 DL-20 2.4G zigbee无线串口收发模块
将采集到的信息从单片机发送给树莓派;树莓派4B
将接收到的数据再转发给阿里云服务器ECS
;阿里云服务器ECS
对接收到的数据进行处理,存入mysql数据库
;最后通过Navicat
远程连接数据库,使用SSM框架
搭建上位机系统对采集到的数据状态进行实时显示。
二、前情提要
1、STC12C5A60S2
STC12C5A60S2接线说明:
STC12C5A60S2 ADC采集:
STC12C5A60S2 Uart串口通信:
2、树莓派
树莓派与无线收发设备:
树莓派通过Socket与ECS进行通信:
3、阿里云服务器ECS
Navicat远程连接ECS数据库:
ECS搭建MQTT服务器:
三、硬件准备
四、软件准备
树莓派使用Socket发送数据至阿里云服务器ECS并存入数据库 此处代码有所改动,对应了单片机发送过来的数据形式。
1、raspberry pi
# -*- coding: utf-8 -*
from socket import *
import serial
import time
import json
HOST = '公网地址'
PORT = 2222
BUFSIZ = 1024
ADDR = (HOST,PORT)
temp = 0;
ser = serial.Serial('/dev/ttyAMA0', 9600)
if ser.isOpen == False:
ser.open() # 打开串口
try:
mySocket = socket(AF_INET,SOCK_STREAM)
mySocket.connect(ADDR)
print("连接到服务器")
except : ##连接不成功,运行最初的ip
print ('连接不成功')
try:
while True:
size = ser.inWaiting() # 获得缓冲区字符
if size != 0:
response = ser.read(18)# 读取内容并显示
temp = response.decode("UTF-8") # 将读取到的bytes转化为str
print(temp)
# 获得一个较为准确的数值 {index,ad}
if temp.startswith('{') and temp[16] == '}':
msg = temp
mySocket.send(msg.encode("utf-8"))
print("发送完成")
time.sleep(10)
ser.flushInput() # 清空接收缓存区
time.sleep(0.1) # 软件延时
except KeyboardInterrupt:
mySocket.close()
ser.close()
print("程序结束\n")
exit()
2、ECS
import socket
import pymysql
import time
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
HOST = '内网地址'
PORT = 2222
#绑定socket
s.bind((HOST, PORT))
s.listen(10)
# 打开数据库连接
db = pymysql.connect(
host='localhost',
port=3306,
user='root',
passwd='数据库密码',
db='centosdb',
charset='utf8'
)
print("数据库开启")
# 使用 cursor() 方法创建一个游标对象 cursor
cursor = db.cursor()
sqltime = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
index = ""
adc = ""
try:
while True:
# 接收客户端连接
print("等待连接....")
client, address = s.accept()
print("新连接")
print("IP is %s" % address[0])
print("port is %d\n" % address[1])
while True:
# 读取消息
msg = client.recv(1024)
# 把接收到的数据进行解码
print(msg.decode("utf-8"))
print("读取完成")
temp = msg.decode("utf-8")
if temp.startswith('{') and temp[16] == '}':
index = temp[7]
adc = temp[12:16]
# SQL 插入语句
# sql = "INSERT INTO MAGNETISM(MTIME , MFLAG) VALUES ('%s','%s')" % (sqltime, msg.decode("utf-8"))
sql = "INSERT INTO magnetism(MINDEX, MFLAG) VALUES ('%s','%s')" % (index,adc)
try:
# 执行sql语句
cursor.execute(sql)
# 提交到数据库执行
db.commit()
print("insert success!")
except:
# 如果发生错误则回滚
db.rollback()
print("insert fail!")
time.sleep(10)
except KeyboardInterrupt:
client.close()
s.close()
# 关闭数据库连接
db.close()
print("程序结束\n")
exit()