有人物联口红DTU DR154配置与RS 485传感器数据处理

一、硬件设备

(1)有人物联口红DTU DR154(RS 485版本)
在这里插入图片描述
这个DTU非常给力,不用插卡自带esim卡,送8年流量,配置的话通过小程序【联博士】蓝牙配置(手机扫描DTU背后的二维码即可,蓝牙密码也在背面),省去了连接电脑硬件配置的繁琐步骤。

(2)温度传感器:速灵科RSDS5 (RS485接口)
在这里插入图片描述
注意速灵科RSDS5 设备地址默认为1,如果有多个传感器,需要设置不同地址,后面会介绍如何设置。
(3)12V电源适配器:为DTU和温度传感器供电

(4)腾讯云服务器
本博客是以自有的云服务器数据处理为例进行介绍的,使用有人云的例子请参考官网教程

二、设备参数配置

速灵科RSDS5参数配置

如果只有一个传感器,使用默认的地址即可,然后写hex指令读取温度(重点参考官网教程:http://www.jingsudz.com/Product/14625081.html):
在这里插入图片描述
【问题来了】,如果有多个传感器设备,那么需要配置寄存器,功能码为【06】,官方例子如下:
在这里插入图片描述
例子中没有说CRC校验位如何计算,产品说明提供了一段计算代码:
在这里插入图片描述
但更简单的方法是打开传感器对应的调试软件(可以不接传感器,需要打开串口),选择需要设置的参数,在下方会显示对应的hex指令,比如我现在有一个传感器默认地址是1,要设置地址为2,那么对应的指令为:
01060001000259CB01代表当前设备地址,06为写寄存器功能码,0001为设备地址寄存器(2个字节),0002为写入的设备地址(2个字节,范围1-255,这里设置为2),59CB为CRC校验位,2个字节。
以上设置完成后,再发送指令读取一下设备地址释放更改成功:
02 03 00 01 00 01 D5 F9
在这里插入图片描述

如果传感器还没接上DTU,那么可以使用速灵科对应的软件按照上述方法进行设置,如果已经安装在DTU上不想拆下来,也可以通过DTU自带的串口功能发送hex指令进行设置,首先通过小程序【联博士】连接DTU,选择【串口调试】,设置如下:
在这里插入图片描述

DTU DR154网络配置(心跳包,注册包)

DTU DR154支持4路独立socket连接,首先通过小程序【联博士】连接DTU,选择【参数设置】,设置如下:

  • 工作模式:网络透传模式
  • SOCK A开关:【地址】:‘xx.xx.xx.xx服务器地址’, 【端口号】:20086,【连接类型】:TCP协议,【连接方式】:长连接,如果有需要可以设置其他3路
  • 注册包和心跳包的设置如下图所示:
    在这里插入图片描述

三、服务器TCP服务

1.启用发送串口心跳包

如果启用了心跳包功能,会定时向服务器发送数据,此时在服务器上运行tcp服务用于监测和保存数据,代码如下:

# coding=gbk
'''
有人DTU DR154数据接收理服务,监听端口:20086,时间间隔300s

   速灵科 RS485读取温度指令:
   01  设备地址
   03  读指令功能码
   00  寄存器起始,地址高
   00  寄存器起始,地址低
   00  读取数量,高位
   01  读取数量,低位
   84  CRC校验,高位
   0A  CRC校验,低位
   
   返回数据:
   01  返回设备地址
   03  功能码
   02  返回数据数量,2个字节
   01  字节1,高位
   11  字节2,低位
   79  校验位,高位
   D8  校验位,低位
   
   有人DTU DR154设备返回数据:ICCID码+速灵科温度传感器返回数据(hex格式),例如:
   '89861122229046607070\x01\x03\x02\x00\xf9x\x06'

'''
import socketserver
import time
import os
import logging
logging.basicConfig(level=logging.DEBUG,#控制台打印的日志级别
                   filename='error.log',
                   filemode='a',##模式,有w和a,w就是写模式,每次都会重新写日志,覆盖之前的日志
                   #a是追加模式,默认如果不写的话,就是追加模式
                   format=
                   '%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s'
                   #日志格式
                   )

class MyTCPHandler(socketserver.BaseRequestHandler):
   """
   1.读取数据
   2.分割数据
   3.温度转换
   4.数据显示
   5.数据保存
   """
   def save_data(self, data:str, file_root='data.txt'):
       with open(file_root,'a+') as f:
           f.write(data+'\n')
           
   def handle(self):
       # self.request is the TCP socket connected to the client
       # self.data = self.request.recv(1024)
       print("{} wrote:".format(self.client_address[0]))
       self.request.sendall(b'\x01\x03\x00\x00\x00\x01\x84\x0A')
       localtime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
       # print("{} wrote:".format(self.client_address[0]))
       try:
         self.data = self.request.recv(1024)
         IMEI, temp = self.data.split(b'\x01')[0].decode(), int(self.data.split(b'\x01\x03')[1][1:3].hex(),16)/10.0
         # time, IMEI, temperature
         tcpmsg = f'{localtime}, {IMEI}, {temp}'
         # self.save_data(tcpmsg)
         print(tcpmsg)
         
       except:
         print('Failed to parse data: ', self.data)
         logging.debug(f'Failed to parse data!, raw data is: {self.data}')


if __name__ == "__main__":
   # 腾讯云服务器内网地址 
   HOST, PORT = "xxx.xxx.xxx.xxx", 20086
   socketserver.TCPServer.allow_reuse_address = True
   # Create the server, binding to localhost on port 9999
   with socketserver.ThreadingTCPServer((HOST, PORT), MyTCPHandler) as server:
       # Activate the server; this will keep running until you
       # interrupt the program with Ctrl-C
       # 设置线程数量
       server.daemon_threads = True
       server.max_threads = 4
       server.serve_forever()

2.未启用发送串口心跳包

如果未启用心跳包功能,那么需要通过tcp服务器定时发送hex温度获取指令,python代码如下:

# coding:gbk

from socket import *
from time import ctime
import time
print("=====================时间戳TCP服务器=====================");

HOST, PORT = "xxx.xxx.xxx.xxx", 20086
BUFSIZ = 1024  #接收数据缓冲大小
ADDR = (HOST, PORT)

tcpSerSock = socket(AF_INET, SOCK_STREAM) #创建TCP服务器套接字
tcpSerSock.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
tcpSerSock.bind(ADDR)  #套接字与地址绑定

tcpSerSock.listen(5) #监听连接,同时连接请求的最大数目
data = None

while True:
   print('等待客户端的连接...')
   tcpCliSock, addr = tcpSerSock.accept()   #接收客户端连接请求
   print('取得连接:', addr)

   while True:
       tcpCliSock.sendall(b'\x01\x03\x00\x00\x00\x01\x84\x0A') # 发送16进制指令
       localtime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
       try:
           data = tcpCliSock.recv(BUFSIZ)  #连续接收指定字节的数据,接收到的是字节数组
           IMEI, temp = data.split(b'\x01')[0].decode(), int(data.split(b'\x01\x03')[1][1:3].hex(),16)/10.0
           tcpmsg = f'{localtime}, {IMEI}, {temp}'
           print(tcpmsg)
       except:
           print('Failed to parse data: ', data)
       time.sleep(1) # 间隔1秒

   tcpCliSock.close()  #关闭与客户端的连接
tcpSerSock.close()  #关闭服务器socket

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/4359.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

界面开发框架Qt新手入门教程 - 项目视图示例介绍

Qt 是目前最先进、最完整的跨平台C开发工具。它不仅完全实现了一次编写,所有平台无差别运行,更提供了几乎所有开发过程中需要用到的工具。如今,Qt已被运用于超过70个行业、数千家企业,支持数百万设备及应用。Qt提供了许多功能&…

java基础问答

57、synchronized 各种加锁场景的作用范围 1.作用于非静态方法,锁住的是对象实例(this),每一个对象实例有一个锁。 public synchronized void method() {} 2.作用于静态方法,锁住的是类的Class对象,因为Cl…

chatgpt+安全机器人控制器+底盘一体化方案设计构想

“你有没有想过,你只需告诉你的家庭助理机器人:‘请加热我的午餐’,它就会自己找到微波炉。这是不是很神奇?” 近日,微软在其官网发表了一篇名为《机器人 ChatGPT:设计原则和模型能力(ChatGPT …

MongoDB 6.0 入门(一)

为什么研究MongDB 6.0 今天和老大聊天 聊到了一个场景的设计,我刚开始推荐了 clickhouse ,然后老大指出 前两天 测试的结果,因为clickhouse 因为 是列式存储,导致我们要查询一行数据,需要200ms(库中有2000…

MyBatis源码分析(二、续)SqlSource创建流程,SQL如何解析?如何将#{id}变成?的

文章目录实例一、SqlSource处理入口二、SqlSource处理逻辑1、XMLScriptBuilder 构造方法2、解析动态sql3、DynamicSqlSource4、RawSqlSource解析sql&#xff08;1&#xff09;parse方法解析sql写在后面实例 此处我们分析的sql&#xff1a; <select id"selectBlog&quo…

redis 十. 线程基础

目录一. redis 基础复习与了解redis6二. redis 线程问题总结一. redis 基础复习与了解redis6 redis官网, redis中文网站, redis命令参考网站此处以redis6.0.8或以上版本为例(查看自己redis版本命令"redis- server -v")按照redis6以上版本测试使用时,redis.conf下需要…

Baklib:企业知识管理帮助文档制作平台

在当今的商业环境中&#xff0c;企业面临着越来越多的挑战。其中之一是如何管理并传递企业内部的知识。企业知识管理的重要性不言而喻&#xff0c;它可以帮助企业更好地组织和利用内部的知识资源&#xff0c;提高生产力和竞争力。而Baklib作为一款企业知识管理&帮助文档制作…

新四级强化辅导

词汇题&#xff08;55道&#xff09; 1. You should carefully think over_____ the manager said at the meeting. A. that B. which C. what D. whose 1.选C,考察宾语从句连接词&#xff0c;主句谓语动词think over后面缺宾语&#xff0c;后面的宾语从句谓语动…

聚焦“专精特新” 共话高质量发展

3月23日&#xff0c;第七届杭州全球企业家论坛暨第三届中国专精特新企业&#xff08;新三板&#xff09;高峰论坛在杭州国博中心成功举办。超过500位专精特新企业代表、专家学者、政府部门代表、科研院所代表共聚一堂&#xff0c;现场座无虚席&#xff0c;气氛热烈。本届峰会以…

SQL Server 2016安装教程

✅作者简介&#xff1a;CSDN内容合伙人、阿里云专家博主、51CTO专家博主、新星计划第三季python赛道Top1&#x1f3c6; &#x1f4c3;个人主页&#xff1a;hacker707的csdn博客 &#x1f525;欢迎订阅系列专栏&#xff1a;SQL Server 2016从入门到精通&#x1f947; &#x1f4…

借东风拉马力,龙头券商东方财富发展持续向好

3月17日&#xff0c;互联网券商东方财富公布2022年年报。具体来看&#xff0c;东方财富2022年实现总营收124.9亿元&#xff0c;同比下滑4.6%&#xff1b;归母净利润85.1亿元&#xff0c;同比下滑0.5%&#xff0c;略低于预期。其中&#xff0c;2022年第四季度总营收同比下滑15.4…

【Python课堂】使用Akshare高效获得A股可转债的重要信息

文章目录前言一、准备二、获取基本信息1.引入库2.读入数据3.获取行情数据4.可转债比价表总结前言 Akshare是一个非常好用的开源A股数据获取模块&#xff0c;它是基于 Python 的财经数据接口库&#xff0c;目的是实现对A股、美股、期货等金融产品的基本面数据、实时和历史行情数…

【干货】交换机管理

实验目的 熟悉掌握交换机的管理&#xff0c;包括&#xff1a;密码恢复&#xff0c;IOS升级和备份&#xff0c;IOS恢复 掌握实际工程中控制线的操作 交换机管理&#xff08;一&#xff09; 交换机密码恢复&#xff08;以下实验都需要在真机上操作&#xff09; 控制线和电脑的连…

oracle语句查询时间范围

oracle语句查询时间范围 参考网址 &#xff1a; https://blog.csdn.net/weixin_36436373/article/details/116541220?ops_request_misc%257B%2522request%255Fid%2522%253A%2522167930069316800188562500%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%25…

Web自动化测试入门

1.Web自动化测试的价值&#xff08;为什么要做web自动化测试&#xff09; 我们可以使用脚本语言代替人来进行测试 2.Web自动化测试相关技术&#xff1a; Selenium:支持多语言&#xff0c;行业内最火最主流Pytest/JUnit5:最好用最全面的单元测试框架Allure:测试报告3.Web自动化…

多线程应用:定时器

一. 定时器 定时器(定时任务) 定时器是一种控制任务延时调用&#xff0c;或者周期调用的技术。作用&#xff1a;闹钟、定时邮件发送。 定时器的实现方式 方式一&#xff1a;Timer方式二&#xff1a;ScheduledExecutorService 二. Timer定时器 TimerTask继承了Runnable&#…

APT、对称加密、非对称加密、SSL工作过程技术的介绍

1. APT的简单介绍APT全称&#xff1a;Advanced Persistent Threat 高级可持续威胁攻击。指的是某组织对特定对象展开持续有效的攻击活动。这种攻击活动具有极强的隐蔽性和针对性&#xff0c;通常会运用受感染的各种介质&#xff0c;供应链和社会工程学等手段&#xff0c;实施先…

【Vue全家桶】细说slot

【Vue全家桶】细说slot 文章目录【Vue全家桶】细说slot前言一、认识插槽Slot1.1 插槽的基本使用二、插槽的使用2.1 默认内容2.2 剧名插槽2.3 作用域插槽前言 我们已经了解到组件能够接收任意类型的 JavaScript 值作为 props&#xff0c;但组件要如何接收模板内容呢&#xff1f;…

【翻译】使用Go生成一个随机字符串(密码)

来源&#xff1a; Generate a random string (password) YourBasic Go https://yourbasic.org/golang/generate-random-string/ Random string 随机字符串 This code generates a random string of numbers and characters from the Swedish alphabet (which includes the non…

Linux内核查询

使用uname命令查找Linux内核 uname是用于获取系统信息的Linux命令。您也可以使用它来确定您使用的是32位还是64位系统。 打开一个终端并使用以下命令&#xff1a; [linuxmilinux:~/www.xxx.com]$ uname -r 输出将类似于以下内容&#xff1a; 5.3.0-28-generic 这意味着您正在…