大家好 这是我的第一篇文章 因为有很多小伙伴想参考于是我发到了这里
首先了解一下整体项目架构, 我在一家外包公司上班, 这个项目是一个外包项目, 公司只给了我3个星期的时间,所以我当初制作这个项目的时候我也很紧张, 从头到尾只有我自己一个人。
本人技术背景:
我只是一个负责WebApi开发的普通程序员,平时也就写写简单的业务接口。这个项目的实现难度对我而言还是很难的,不过还是成功做了出来 相信有不少人会用得上其中的一些技术希望大家开发顺利从中获得帮助。
项目的主要功能为:
通过物联网设备对农业土壤信息和种植信息进行采集并且保存到云端提供调用
他的功能架构是:
1. 构建一套数据平台
2. 对接智能网关设备
3. 获取传感器数据
4. 对数据进行清洗和展示
5. 开发对公接口提供第三方调用
项目整体架构
启动
-
当天开完会回来 得知需求后 我脑子还一片空白,没过几天以后 我在客户提供的基地去调研,看看怎么布电和设施,要采集的信息是那些。
看了两个地点以后 发现很多问题 比方说强电无法进入菜地等各种问题 最终选择了右边的种植基地。
-
现场勘察过以后 开始采购设备,但是我觉得传感器这种东西应该是很成熟的 于是我在淘宝上搜索项目所需要的传感器设备, 后来真的让我找到了合适的传感器 就是有点贵 要500块钱一个,
跟着传感器的说明书 购买了rs485串口转USB的线 看了非常多RS485的文档 自己尝试写了串口指令 还是拿不到数据,后来问卖家 卖家写的指令却可以用 当时我还不知道为什么,不过能够成功拿到数据就好。
但是拿到了传感器的数据,还得想办法怎么接收传感器的数据和下发传感器指令?
-
在传感器的购买页面下 我看到了一种推荐的商品 叫做DTU 智能网关, 便立刻买了一个回来研究 可惜研究了很久 都不知道如何使用python和该设备进行通讯,不断地查阅说明书和设备的官方文档后 发现该设备的工作原理是
通过tcp连接设备 → 转发tcp指令给串口 → 接收串口返回的数据 → 回传服务器
于是我跟着设备的教程 使用了TCP测试工具等 手动编写了串口指令 成功通过网关设备获取到了传感器的数据信息, 那是不是用python连接设备 发送串口数据就可以拿到数据了呢?可我又从来没写过socket编程 就非常蛋疼了。
-
后来我在js上找到了一篇不错的文章 并开始尝试上手编写接口
https://www.jianshu.com/p/c0b13dd11c6e# -*- coding:utf-8 -*- import socket import threading from Config import TCP_SERVER_PORT from Main import client_handler from concurrent.futures import ThreadPoolExecutor def Activate(): """输出服务器状态到控制台""" while True: time.sleep(5) # print("[活动中的线程]",threading.activeCount()) print("[DB]", App.db) if __name__ == '__main__': # 创建服务器, 端口不支持复用 server_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # 绑定端口, 打印运行信息 server_address = ('', TCP_SERVER_PORT) server_sock.bind(server_address) print('TCP Server starting up on port {}'.format(server_address[1])) # 设置socket为被动连接, 默认为主动连接 server_sock.listen(5) # 线程池, 任务池 pool = ThreadPoolExecutor(max_workers=8) task_pool = [] # # 监听服务器活动 # Activate = threading.Thread(target=Activate) # Activate.start() try: while True: # 主进程只用来负责监听新的客户连接 print('Main Thread [{}], 正在等待客户端连接...'.format( threading.current_thread().name)) # client_sock是专为这个客户端服务的socket,client_addr是包含客户端IP和端口的元组 client_sock, client_addr = server_sock.accept() print('Main Thread [{}], client {} 已连接'.format( threading.current_thread().name, client_addr)) # 1.把新接收到的连接交由下一步处理 # client_handler(client_sock, client_addr) # 2.多线程 # client = threading.Thread(target=client_handler, args=(c