物联网系统上位机源码,含服务器和客户端 物联网服务端程序,可以接受市面上大多数透传数据的DTU登录,以及和DTU双向通讯 程序功能:能分组管理,不同的组别用户只可见自己组别的设备,设备和客户端登录掉线直观显示,DTU数据无损转发给客户端(同时存储在SQL中)。 程序运行于windows平台,需要互联网固定IP(租一台云服务器并不贵),可用于各种要使用DTU通信的数据采集场合,也非常适合大学生研究生基于物联网应用的课题设计 图2是客户端界面,内置地图。

最近在研究物联网相关项目,发现了一套超实用的物联网系统上位机源码,包含服务器和客户端,今天就来和大家分享分享。

物联网服务端程序的强大之处

这套服务端程序堪称“DTU 友好型”,它能够接受市面上大多数透传数据的 DTU 登录,并且实现和 DTU 的双向通讯。

先看看关键代码片段(以 Python 为例,实际可能因语言不同而有差异):

import socket

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_address = ('your_fixed_ip', your_port)
server_socket.bind(server_address)
server_socket.listen(1)

while True:
    connection, client_address = server_socket.accept()
    try:
        data = connection.recv(1024)
        # 这里接收到的 data 就是 DTU 传来的数据
        print(f"Received data from DTU: {data}")
        # 处理数据逻辑,例如存储到 SQL 数据库
        # 双向通讯发送数据示例
        response = "Message from server"
        connection.sendall(response.encode())
    finally:
        connection.close()

在这段代码里,首先创建了一个基于 TCP 协议的套接字 serversocket,绑定到指定的固定 IP 和端口(这里yourfixedipyourport要替换成实际的值)。然后开始监听连接,一旦有 DTU 连接进来,就接收它传来的数据,并可以向其发送响应数据,从而实现双向通讯。

分组管理功能

它还具备分组管理功能,不同组别的用户只能看到自己组别的设备。这在实际应用中极大地提升了数据的安全性和管理的便捷性。实现分组管理可能涉及到数据库表结构设计和权限验证代码。比如数据库中可能会有这样的表结构:

CREATE TABLE devices (
    id INT PRIMARY KEY AUTO_INCREMENT,
    device_name VARCHAR(255),
    group_id INT,
    FOREIGN KEY (group_id) REFERENCES groups(id)
);

CREATE TABLE groups (
    id INT PRIMARY KEY AUTO_INCREMENT,
    group_name VARCHAR(255)
);

CREATE TABLE users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    user_name VARCHAR(255),
    group_id INT,
    FOREIGN KEY (group_id) REFERENCES groups(id)
);

在查询设备时,就可以通过用户所属的组 ID 来过滤设备数据,保证用户只能看到自己组的设备。代码实现可能类似这样(以 Java 为例):

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class DeviceManager {
    public static void getDevicesForUser(int userId) {
        String url = "jdbc:mysql://localhost:3306/your_database";
        String username = "your_username";
        String password = "your_password";

        try (Connection connection = DriverManager.getConnection(url, username, password)) {
            // 先通过用户 ID 获取组 ID
            String getUserGroupQuery = "SELECT group_id FROM users WHERE id =?";
            PreparedStatement getUserGroupStmt = connection.prepareStatement(getUserGroupQuery);
            getUserGroupStmt.setInt(1, userId);
            ResultSet userGroupRs = getUserGroupStmt.executeQuery();
            if (userGroupRs.next()) {
                int groupId = userGroupRs.getInt("group_id");

                // 通过组 ID 获取设备列表
                String getDevicesQuery = "SELECT * FROM devices WHERE group_id =?";
                PreparedStatement getDevicesStmt = connection.prepareStatement(getDevicesQuery);
                getDevicesStmt.setInt(1, groupId);
                ResultSet devicesRs = getDevicesStmt.executeQuery();
                while (devicesRs.next()) {
                    int deviceId = devicesRs.getInt("id");
                    String deviceName = devicesRs.getString("device_name");
                    System.out.println("Device ID: " + deviceId + ", Device Name: " + deviceName);
                }
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

在这段 Java 代码中,首先根据用户 ID 从users表中获取其所属的组 ID,然后根据组 ID 从devices表中查询出该组的设备列表,从而实现不同组用户只能看到自己组设备的功能。

设备和客户端登录掉线直观显示

为了实现设备和客户端登录掉线直观显示,可能会用到心跳检测机制。在服务端代码里可以这样实现简单的心跳检测(以 Node.js 为例):

const net = require('net');
const clients = [];

const server = net.createServer((socket) => {
    clients.push(socket);
    socket.on('data', (data) => {
        // 接收到数据,更新心跳时间
        socket.heartbeat = new Date();
    });

    socket.on('end', () => {
        const index = clients.indexOf(socket);
        if (index!== -1) {
            clients.splice(index, 1);
        }
    });
});

setInterval(() => {
    const now = new Date();
    clients.forEach((client) => {
        if (!client.heartbeat || (now - client.heartbeat > 10000)) {
            // 如果 10 秒内没有收到心跳数据,视为掉线
            client.end();
            const index = clients.indexOf(client);
            if (index!== -1) {
                clients.splice(index, 1);
                console.log("Client disconnected due to no heartbeat.");
            }
        }
    });
}, 5000);

server.listen(your_port, 'your_ip', () => {
    console.log('Server listening on port'+ your_port);
});

在这段 Node.js 代码中,每当有客户端连接进来,就将其加入clients数组,并在接收到客户端数据时更新其心跳时间。通过定时检查,如果某个客户端 10 秒内没有收到心跳数据,就视为掉线并关闭连接,同时从clients数组中移除,这样就可以直观地知道哪些设备或客户端掉线了。

DTU 数据无损转发给客户端(同时存储在 SQL 中)

服务端接收到 DTU 数据后,一方面要无损转发给客户端,另一方面要存储在 SQL 数据库中。还是以 Python 为例,代码可能如下:

import socket
import mysql.connector

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_address = ('your_fixed_ip', your_port)
server_socket.bind(server_address)
server_socket.listen(1)

while True:
    connection, client_address = server_socket.accept()
    try:
        data = connection.recv(1024)
        print(f"Received data from DTU: {data}")

        # 转发数据给客户端(假设客户端连接已经建立并存储在 client_connections 列表中)
        for client_connection in client_connections:
            client_connection.sendall(data)

        # 存储数据到 SQL 数据库
        mydb = mysql.connector.connect(
            host="localhost",
            user="your_username",
            password="your_password",
            database="your_database"
        )
        mycursor = mydb.cursor()
        sql = "INSERT INTO dtu_data (data) VALUES (%s)"
        val = (data.decode('utf-8'),)
        mycursor.execute(sql, val)
        mydb.commit()
    finally:
        connection.close()

在这段代码里,接收到 DTU 数据后,先遍历clientconnections列表将数据转发给各个客户端,然后连接到 MySQL 数据库,将数据插入到dtudata表中,实现数据的存储。

程序运行环境与应用场景

这套程序运行于 Windows 平台,需要互联网固定 IP,租一台云服务器并不贵,对于很多项目来说成本还是比较低的。它可用于各种要使用 DTU 通信的数据采集场合,像工业设备数据采集、环境监测数据采集等等。同时,也非常适合大学生研究生基于物联网应用的课题设计,能快速搭建起一个功能较为完善的物联网上位机系统。

物联网系统上位机源码,含服务器和客户端 物联网服务端程序,可以接受市面上大多数透传数据的DTU登录,以及和DTU双向通讯 程序功能:能分组管理,不同的组别用户只可见自己组别的设备,设备和客户端登录掉线直观显示,DTU数据无损转发给客户端(同时存储在SQL中)。 程序运行于windows平台,需要互联网固定IP(租一台云服务器并不贵),可用于各种要使用DTU通信的数据采集场合,也非常适合大学生研究生基于物联网应用的课题设计 图2是客户端界面,内置地图。

客户端界面内置地图,这对于一些需要地理信息展示的物联网项目来说,简直太方便了。比如物流车辆跟踪、智能农业设备定位等场景,结合地图可以更直观地展示设备位置信息。

总之,这套物联网系统上位机源码为物联网项目的开发提供了一个很好的基础,无论是从功能的完整性还是应用场景的适用性来看,都有很大的参考价值,感兴趣的小伙伴不妨深入研究研究。

Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐