产品中心
    您当前位置:主页 > 产品中心 >
    涉川实业物联网系统
    涉川实业物联网系统
    1. 文档介绍 1.1. 文档目的 该文档的主要目的是为了指导用户如何有效地接入并使用物联感知平台。文档将提供详细的步骤,包括硬件设备的配置、网络连接的建立、软件接口的接入以及

    1.     文档介绍
    1.1.   文档目的
    该文档的主要目的是为了指导用户如何有效地接入并使用物联感知平台。文档将提供详细的步骤,包括硬件设备的配置、网络连接的建立、软件接口的接入以及故障排除等。通过这个文档,用户能够快速理解并掌握如何与系统进行交互,以实现对高速公路的智能管理和优化运营。
    1.2.文档对象 该文档主要面向高速公路运营商、网络和硬件工程师、系统管理员等技术人员。同时,对于相关的软件开发者和高速公路管理人员,本文档也将提供重要的参考信息。
    1.3.文档内容 文档的主要内容包括:
    系统概述:简单介绍物联感知平台的设计和功能。
    设备接入:详细说明如何配置和接入硬件设备。
    网络连接:解释如何建立和测试网络连接。
    软件接口:描述如何通过软件接口与系统交互。
    故障排除:提供一些常见问题的解决方案和建议。
    系统维护:提供系统日常维护和更新的建议。
    希望通过本文档,用户可以有效地接入和使用物联感知平台,提升高速公路的管理效率和服务质量。
     
    1.2.   文档范围
    1.2.1 系统概述
    本文档会介绍物联感知平台的总体结构、主要功能、系统需求以及相关的硬件和软件组件。但这部分内容将不会深入到具体的实现技术或编程细节。
    1.2.2 设备接入
    我们会详细解释如何将各类设备(如传感器、摄像头等)接入到物联感知平台中,包括设备的配置和连接过程。但是,具体的设备安装和物理布线等步骤可能会根据设备的型号和规格略有不同,这些内容不在本文档的讨论范围内。
    1.2.3 网络连接
    本文档会介绍如何建立和测试网络连接,包括局域网(LAN)、广域网(WAN)和无线网络(Wi-Fi)。我们不会讨论如何建立和管理网络基础设施,如路由器、交换机和防火墙等。
    1.2.4 软件接口
    我们会详细描述如何通过软件接口与物联感知平台进行交互。然而,本文档并不包括如何开发或定制这些接口的具体编程指南。
    1.2.5 故障排除
    本文档会提供解决物联感知平台中常见问题的建议和解决步骤,但并不会涵盖所有可能的故障或错误。对于一些具体的、复杂的问题,可能需要联系系统供应商或专业的技术支持。
    1.2.6 系统维护
    我们将介绍如何进行系统的日常维护和更新,但不会提供关于硬件维修或替换的详细指南。
    总的来说,本文档旨在提供一个关于如何接入和使用物联感知平台的综合指南,而不会涉及到具体的设备安装、网络基础设施建设、接口编程、硬件维修等深层次的技术细节。
    1.3.   读者对象
    1.3.1 高速公路运营商
    本文档对高速公路运营商提供了关于如何使用和管理物联感知平台的指导。它可以帮助他们理解系统的功能和结构,以便有效地监控和优化公路的运营。
    1.3.2 网络和硬件工程师
    网络和硬件工程师是本文档的主要读者群体。本文档将为他们提供如何配置、连接设备,以及如何建立和测试网络连接的详细步骤。
    1.3.3 系统管理员
    系统管理员可以通过本文档了解如何进行系统的日常维护和更新,以及如何解决系统中可能出现的常见问题。
    1.3.4 软件开发者
    虽然本文档并不包括具体的编程指南,但软件开发者仍然可以从中了解如何通过软件接口与物联感知平台进行交互。
    1.3.5 高速公路管理人员
    对于参与高速公路管理和运营决策的人员,本文档也可以提供有用的参考信息,帮助他们了解物联感知平台的功能和用途。
    请注意,由于本文档涉及到一些技术性的内容,读者需要具有一定的网络和硬件知识才能充分理解。对于没有相关背景的读者,我们建议他们在阅读本文档时与具有相关技术知识的专业人员一起进行。
    2.     设备接入
    2.1.   MQTT设备接入
    通用的MQTT设备接入
    1.      设备认证
    (1)    加密认证(推荐)
    (2)    简单认证
    2.      设备交互
    (1)    发布物模型、设备信息、时钟同步相关Mqtt主题
    (2)    订阅物模型、设备升级、时钟同步相关Mqtt主题
    3.      设备AP配网(可选,仅限Wifi类设备)
    (1)    设备检测接口
    (2)    设备配置接口
    2.1.1. 描述
    l  参考的硬件SDK源码https://gitee.com/kerwincui/gaocheng-smart/tree/master/sdk/
    l  目前只支持Mqtt协议设备接入,其他协议例如TCP和Modbus协议在开发中
    l  如果设备的Mqtt消息格式是固定的,可以通过EMQX的规则引擎进行转发,适配到平台
    2.1.2. 设备认证

    l  设备认证
    n        加密认证(推荐)
    n        简单认证
    u        认证类型:S=简单认证,E=加密认证
    u        产品启用设备授权码后,授权码不能为空
    u        用户ID就是登陆用户的ID,使用不同用户ID,设备归属于不同用户。可以统一使用admin账号1,后面通过配网或者扫码关联设备分配给不同用户。
    u        设备编号有两种方式获取:1.使用系统新建设备时,生成的设备编号;2.系统未新建设备,硬件端生成一个唯一编号作为设备编号,认证后系统会自动注册一个设备实体(设备比较多时,推荐这种方式)
    l  设备交互
    n        发布物模型、设备信息、时钟同步相关Mqtt主题
    n        订阅物模型、设备升级、时钟同步相关Mqtt主题
    l  设备AP配网(可选,仅限Wifi类设备)
    n        设备检测接口
    n        设备配置接口
     
    2.1.3. 加密认证
    l  产品详情中获取产品编号、Mqtt账号、Mqtt密码和产品秘钥,密码通过产品秘钥进行AES加密,传递到后端;后端通过产品秘钥解密进行认证;连接Mqtt消息服务器需要提供唯一的客户端ID、用户名和密码,具体格式如下:
    # 客户端Id等于 认证类型 + 设备编号 + 产品编号 + 用户ID
    clientId = E & deviceNumber & productId & userId
    # 用户名
    userName = smart
    # 密码
    password = mqtt密码 & 过期时间
    password = mqtt密码 & 过期时间 & 设备授权码 (产品启用设备授权时格式)
     
    l  客户端ID等于 认证类型 + 设备编号 + 产品编号 + 用户ID,用 & 符号连接,中间无空格;
    l  用户名直接输入Mqtt账号
    l  密码等于 Mqtt密码 + 密码过期时间 + 设备授权码(可选),然后进行AES加密。为了安全,密码过期时间应该在24小时以内,采用时间戳格式,精确到毫秒。
    l  账号配置信息示例:
    clientId = "E&D68329VL588&2&1"
    userName = "smart"
    password = "/W2A/4MK+9cEGBhyBDgr2K5c62DAjAK4m0b5pvwxX6FFMzI3h1pUmaDY3BH1P2mI"
     
     
    2.1.4. 简单认证
    l  产品详情中获取Mqtt账号和Mqtt密码,建议测试环境使用。Mqtt客户端ID格式类似加密认证,其中E改为S。
    # 客户端Id等于 认证类型 + 设备编号 + 产品编号 + 用户ID
    clientId = S & deviceNumber & productId & userId
    # 用户名
    userName = smart
    # 密码
    password = mqtt密码
    password = mqtt密码 & 设备授权码 (产品启用设备授权时格式)
     
    l  账号配置信息示例:
    # 客户端Id等于 认证类型 + 设备编号 + 产品编号 + 用户ID
    clientId = "S&D68329VL588&2&1"
    userName = "smart"
    password = "PHYFED93WSFF1DAS"
    password = "PHYFED93WSFF1DAS&ADBFCC8934864B26B55658C66F562A"(产品启用设备授权时格式)
     
    2.1.5. 设备获取当前时间
    l  获取当前时间,可以调用系统的NTP时间接口,接口请求时发送设备当前运行毫秒数,返回设备发送时间、服务端接收时间、服务端发送时间。然后获取设备当前运行毫秒数,作为设备接收间。最后用公式计算出设备当前的时间,时间必须以毫秒为单位。
    # deviceSendTime值为设备当前运行的毫秒数
    http://localhost:8080/iot/tool/ntp?deviceSendTime=35768
    # 计算时间
    设备当前时间 = (服务端接收时间 + 服务端发送时间 + 设备接收时间 - 设备发送时间) / 2
     
    2.1.6. 加密说明
    采用AES的CBC加密模式,偏移量固定为smart-open16位,输出为Base64,加密使用的密码为产品密钥。测试可以使用:
    加密模式:  CBC
    填    充:  pkcs5padding
    数 据 块:  128
    偏 移 量:  smart-open
    输    出:  base64
    密    码:  对应系统的产品秘钥
    加密内容:  mqtt密码 & expireTime & 授权码(可选)
     
    2.1.7. 设备交互
    {productId}代表产品ID,{deviceNum}代表设备编号。通过web端获取产品ID和设备编号,如果使用自动添加设备,设备编号可以使用唯一编码或者使用设备MAC地址,设备认证成功后会在后端自动添加一个对应的设备实体。
    2.1.8. 订阅主题
    主题
    描述
    /{productId}/{deviceNum}/info/get
    订阅设备信息(订阅到该主题就发布设备信息)
    /{productId}/{deviceNum}/ota/get
    订阅设备升级
    /{productId}/{deviceNum}/property/get
    订阅属性(服务端发布,设备订阅)
    /{productId}/{deviceNum}/property-online/get
    订阅属性(在线模式,用户端发布,设备订阅)
    /{productId}/{deviceNum}/function/get
    订阅功能(服务端发布,设备订阅)
    /{productId}/{deviceNum}/function-online/get
    订阅功能(在线模式,用户端发布,设备订阅)
    /{productId}/{deviceNum}/monitor/get
    订阅实时监测信号(根据监测次数和间隔,然后发布监测数据)
    /{productId}/{deviceNum}/ntp/get
    订阅时钟同步(可选,用于同步设备的当前时间)
     
     
     
     
    2.1.9. 发布主题
    主题
    描述
    /{productId}/{deviceNum}/info/post
    发布设备信息
    /{productId}/{deviceNum}/property/post
    发布属性 (实时显示,包括监测数据,可定时上报监测数据)
    /{productId}/{deviceNum}/function/post
    发布功能 (实时显示)
    /{productId}/{deviceNum}/event/post
    发布事件
    /{productId}/{deviceNum}/monitor/post
    发布实时监测数据(仅用于实时监测图表显示,不会存储)
    /{productId}/{deviceNum}/ntp/post
    发布时钟同步(可选)
     
    2.1.10. 数据格式
    设备和系统交互使用JSON格式
    l  订阅设备信息,对应主题:/info/get
    # 描述:订阅到设备信息后,发布设备信息,解决设备状态同步问题
    # 设备消息内容为空
     
    l  发布设备信息,对应主题:/info/post
    # 描述:1.设备上电后发布设备信息; 2.设备接收到设备信息指令后发布设备信息
    # rssi             设备信号(信号极好[-550],信号好[-70-55],信号一般[-85-70],信号差[-100-85]
    # status           设备状态,固定为3,表示在线
    # firmwareVersion  固件版本
    # userId           可选,用户的ID,可设置为admin用户ID1,仅Wifi类设备需要上传用户ID,配网时再分配设备给用户。
    # longitude        可选,经度,使用设备定位时需要上传
    # latitude         可选,纬度,使用设备定位时需要上传
    # summary          可选,摘要,设备的配置信息等,json格式,对象可自定义
    {
         "rssi": -43,
         "firmwareVersion": 1.2,
         "status": 3,
         "userId": "1",
         "longitude": 0,
         "latitude": 0,
         "summary": {
           "name": "gaocheng-smart",
           "chip": "esp8266",
           "author": "kerwincui",
           "version": 1.2,
           "createTime": "2022-06-06"
         }
    }
     

     
    l  订阅实时监测,对应主题:/monitor/get
    # 描述:订阅到实时监测消息,根据数量和间隔发布实时监测数据
    # count      数量
    # interval   间隔,毫秒为单位
    {
        "count": 60,
    "interval": 1000
    }
     
     
    l  发布实时监测,对应主题:/monitor/post
    # 描述:根据订阅到的实时监测消息,发布指定数量和间隔的监测数据
    # id       标识符,实时监测是物模型中的属性,产品详情中查看标识符,对应id值
    # value    设备采集的值,只能是整数或者小数,以字符串类型传递
    # remark   可为空或者使用设备当前时间
    [{
        "id": "temperature",
        "value": "27.43",
        "remark": ""}, {
        "id": "humidity",
        "value": "32.18",
    "remark": ""
    }]
     
     

     
    l  订阅属性/功能,对应主题:/property/get、/function/get、property-online/get、/function-online/get
    # 描述:属性、功能、事件都属于物模型,Json定义是一样的。属性和功能的在线模式和普通模式,用于区分不同种类消息,但是设备的处理都是一样的。例如都订阅到消息打开开关,设备的处理都是把开关打开。  
    # id      标识符,产品详情中查看物模型,对应物模型的标识符
    # value   值,对应物模型中定义,以字符串类型传递
    # remark  平台中告警、场景联动和定时下发的指令有备注信息
    [{
        "id": "gear",
        "value": "1",
        "remark": "设备定时"},{
        "id": "switch",
        "value": "0",
    "remark": "场景联动触发"
    }]
     
     
     
     
    l  发布属性/功能/事件,对应主题:/property/post、/function/post、/event/post
    # 描述:属性、功能、事件都属于物模型,Json定义是一样的。`value` 的值如果是布尔类型,值为"0"或者"1",代表打开/关闭;枚举类型对应枚举项的键值(例如 "1",代表中速档位);数组类型是以英文逗号分隔的字符串。
    # id      标识符,产品详情中查看物模型,对应物模型的标识符
    # value   值,对应物模型中定义,以字符串类型传递
    # remark  可以直接使用订阅到的备注信息,设备日志信息中查看到该备注
    [{
        "id": "gear",
        "value": "1",
    "remark": "档位设置成功"},
    {
        "id": "switch",
        "value": "0",
    "remark": "开关已关闭"
    }]
     

    相关物模型说明
    l  所有物模型的Id(标识符)都是唯一的,尽量不要使用特殊字符,以字母和数字为主。
    l  对象类型物模型下面子模型Id(标识符)格式:parentId_childId,对象数组类型同样,子模型Id增加父级的Id以下划线分隔,例如:
    # 父级物模型Id:power# 子级物模型Id:power_light
     
    l  数组类型(包括对象数组类型)的物模型Id(标识符)只有一个,物模型值为数组(以英文逗号分隔的字符串存储),例如98,100,50字符串。所以上报数组类型的属性/功能/事件,相对特殊,Id(标识符)必须以array_索引开头,索引是两位数,例如:
    # 普通数组格式 `array_00_RGB`# 对象数组格式 `array_00_power_switch`# 索引00代表数组中第一个元素,02 / 03 ... 98 / 99 以此类推,数组长度不能超过100
    [{
       "id": "array_01_power_switch",   // array_01作为前缀,表示数组中的第二个元素
       "value": "1",
       "remark": ""
    }]
     
     
    l  发布时钟同步,对应主题:/ntp/post
    # 描述:可选,发布时钟同步消息,服务端订阅到后下发时钟同步消息
    # deviceSendTime 设备发送时间
    {"deviceSendTime": "1592361428000"}
     
     
    l  订阅时钟同步,对应主题:/ntp/get
    # 描述:可选,订阅到时钟同步消息,计算当前时间 = (服务端接收时间 + 服务端发送时间 + 设备接收时间 - 设备发送时间) / 2
    # deviceSendTime  设备发送时间
    # serverRecvTime  服务端接收时间
    # serverSendTime  服务端发送时间
    {
        "deviceSendTime": "1592361428000",
        "serverSendTime": "1592366463548",
        "serverRecvTime": "1592366463548"}
     

     
    l  订阅OTA升级,对应主题:/ota/get
     
    # 描述:订阅到设备升级消息后,根据固件下载地址,Http请求下载固件并升级
    # version       版本号,可用于匹配固件版本
    # downloadUrl   固件下载地址
    {
        "version": 1.1,
    "downloadUrl": "https://iot.gaocheng.live/prod-api/profile/iot/6/2022-0616-140539.bin"
    }
     
    2.1.11. 接入样例
    1、系统创建产品
    (1)     通信协议根据实际情况选择,一般默认JSON解析协议
    (2)     传输协议选择MQTT
    (3)     认证方式选择简单加密方式
    (4)     针对当前产品绑定对于物模型

    2、系统创建设备
    (1)     创建设备选择指定的产品
    (2)     生成或者填入设备编码
    (3)     创建完毕会出现mqtt连接信息,得到连接信息使用设备或者工具模拟

    3、使用MQTTX或其他工具模拟设备上线下线,上报数据
    (1)     打开MQTTX工具设置好连接信息进行保存
    (2)     点击连接按钮 模拟设备上线
    (3)     /151/D15NTQGMU9KA/property/post 发送指定地址发送json格式数据如下图


     
     
     
     
     
    2.2.   设备发现
    2.2.1. 对接第三方设备进行设备发现
    针对第三方协议进行定制,维护好配置
    2.2.2. 设备管理界面点击设备发现按钮
     
    2.2.3. 选择第三方协议选项,进行加载设备
     
    2.2.4. 勾选指定的设备同步到平台中

     
     
    2.3.   监控设备接入
    2.3.1. 监控平台整体架构
     
    2.3.2. 目前平台支持的功能
    l  设备接入注册
    l  设备心跳
    l  设备信息查询
    l  设备通道查询
    l  设备直播
    l  云台控制
    l  设备管理统一到平台
    l  设备本地录像在线播放
    l  设备通道国标ID生成
    2.3.3. 待开发功能
    l  设备告警
    l  云端录像存储,接入七牛云,萤石云,阿里云等
    l  移动端播放器,主要适配h5端
    l  语音对讲
    l  P2P协议,AI能力对接
    l  其他监控管理协议适配
    2.3.4. 设备接入流程
    l  新增产品

    l  选择产品分类和设备类型

    l  新建SIP配置,流媒体服务器配置
    l  点击获取默认配置,然后新建SIP配置

    l  修改流媒体服务器IP为部署服务器公网IP,默认为http播放协议,用https需修改zlmedia/conf/default.pem证书

    l  新建设备,生成设备ID和通道ID
    l  摄像头:设备类型为"IPC",通道类型为"IPC"
    l  录像机:设备类型为"录像机",通道类型为"录像机"
    l  NVR+IPC:设备类型为"NVR",通道类型为"IPC"
    l  DVR+IPC:设备类型为"DVR",通道类型为"IPC"

    l  将相关信息填入设备
    l  将产品中SIP配置和生成的id填入设备
    l  服务器ID = SIP服务器ID(海康) = SIP服务器编号(大华)
    l  服务器域 = SIP服务器域(海康) = SIP域(大华)
    l  部署服务器公网IP = SIP服务器地址(海康) = SIP服务器IP(大华)
    l  服务器端口 = SIP服务器端口(海康) = SIP服务器端口(大华)
    l  认证密码 = 密码(海康) = 注册密码(大华)
    l  设备ID = SIP用户名(海康) = SIP用户认证ID(海康) = 设备编号
    l  通道ID = 视频通道编号ID(海康) = 通道编号(大华)
    l  海康接入示例: 配置路径:配置-> 网络-> 高级配置-> 平台接入

    l  大华接入示例: 配置路径:配置-> 网络配置-> 平台接入

    l  摄像头流媒体格式建议为:视频:h264 音频:aac

    l  监控设备管理
    l  设备详情

    l  设备通道

    l  设备直播

    l  设备录像点播

     
    2.3.5. 什么是GB28181协议
    GB/T28181《安全防范视频监控联网系统信息传输、交换、控制技术要求》是由公安部科技信息化局提出,由全国安全防范报警系统标准化技术委员会(SAC/TC100)归口,公安部一所等多家单位共同起草的一部国家标准。该标准规定了城市监控报警联网系统中信息传输、交换、控制的互联结构、通信协议结构,传输、交换、控制的基本要求和安全性要求,以及控制、传输流程和协议接口等技术要求。该标准适用于安全防范监控报警联网系统的方案设计、系统检测、验收以及与之相关的设备研发、生产,其他信息系统可参考采用。
    2.3.6. sip协议,sdp协议
    SIP(Session initialization Protocol,会话初始协议)是由IETF(Internet Engineering Task Force,因特网工程任务组)制定的多媒体通信协议。它是一个基于文本的应用层控制协议,用于创建、修改和释放一个或多个参与者的会话。SIP 是一种源于互联网的IP 语音会话控制协议,具有灵活、易于实现、便于扩展等特点。SIP(Session Initiation Protocol)是一种类似于http协议的纯文本应用层协议。SIP可以用来控制会话的建立、取消、关闭等操作。
    SDP全称是Session Description Protocol,翻译过来就是描述会话的协议。主要用于两个会话实体之间的媒体协商。 SDP描述由许多文本行组成,文本行的格式为<类型>=<值>,表示为key=value; SIP负责建立和释放会话,一般来说,会话中包含相关的媒体,比如视频和音频。媒体数据是由SDP描述的。SDP一般不单独使用,它与SIP配合使用时会放到SIP协议的body中。会话建立时,需要媒体协商,双方才能确定对方的媒体能力以及交换媒体的数据(这就是sdp的工作)。
    2.3.7. rtp协议
    实时传输协议(Real-time Transport Protocol或简写RTP)是一个网络传输协议,它是由IETF的多媒体传输工作小组1996年在RFC 1889中公布的。RTP协议详细说明了在互联网上传递音频和视频的标准数据包格式。它一开始被设计为一个多播协议,但后来被用在很多单播应用中。RTP协议常用于流媒体系统(配合RTSP协议),视频会议和一键通(Push to Talk)系统(配合H.323或SIP),使它成为IP电话产业的技术基础。RTP协议和RTP控制协议RTCP一起使用,而且它是创建在UDP协议上的。
    2.4.   Modbus设备接入
    2.4.1. 新增Modbus设备
    提示:
    本平台实现modbus协议的方式有两种方案,按照需要选择
    2.4.2. 设备通讯协议
    添加产品之前先确认是否有对应的设备通讯协议,由于硬件设备的通讯协议五花八门,目前系统支持json报文,modbusRtu协议报文,如需添加适配自己硬件设备的通讯解析,可以查看基于注解方式添加通讯协议文档
    2.4.3. 采集点模板配置
    采集点模块即是物模型模板,由于之前的物模型模板不支持子设备,所以新增了采集点模块进行配置设备组的物模型

    Modbus实现有两种方式
    a. 云端轮询:云端结合采集点模板定时下发读指令给设备,由于是云端定时执行,无法做到实时性,当设备量少时,上千级的设备量以下,使用没有压力。当设备量超过万级时,云端压力较大,实时性很差,不推荐
    b. 边缘网关:轮询交给边缘网关处理,外加MCU作为轮询载体,成本低,而且移植性强,大大提高云端处理数据的能力,而且能做到实时性,推荐使用。需要配合Dtu或者模组固件进行采集
    采集点详情配置如下: 点击新增->添加变量模板,
    2.4.4. 添加模板如下:

    1. 添加从机:
    从机地址 : 硬件设备的地址编码,例如485接口,有1-3个子设备,设备地址可以为 01 02 03
    功能码:目前支持 03,04

    寄存器起始地址(10进制): 一般为0x00,例如设备有0~100个寄存器,起始地址就为 0 寄存器结束地址(10进制): 例如设备有0~100个寄存器,起始地址就为 100 批量采集频率:目前这个参数没有作用,采集频率在: 系统监控-定时任务-modbus云端轮询的定时任务调节 组包寄存器最大数量 : 该参数决定批量读取寄存器的个数,默认为32,若寄存器小于32,会根据起始地址和结束地址进行计算长度

    2. 为从机添加变量
    单个变量添加流程: 选中从机,点击添加变量,如下, 模型名称:该物模型显示的名称 模型标识:如果是modbus,模型标识根据寄存器地址一样,自动填充 寄存器: 目前功能码支持 03 04,暂不支持01。后面输入框为寄存器地址值(10进制)

    批量导入变量:点击导入变量,下载模板填写:如下

    3. 新建产品
    在前面步骤新建了设备通讯协议和采集点模板后,新增一个产品,如下

    选择通讯协议:系统目前只支持三种

    选择采集点模块,我这里选择先配置好的采集模块,modbus从机组,
     
    传输协议:目前支持 系统完全支持MQTT,TCP,其他协议服务如UDP,已经搭建,但是没有做协议解析逻辑。

    设备类型: 这里选择了modbus-rtu协议后,自动选择网关设备
    4. 产品物模型:
    新增后,可以看到配置的产品物模型:

    5. 新建设备
    选择对应的产品,设备编号需要填写模组的IMEI号或者Dtu设备的MAC编号

    6. 运行状态和服务下发
    新增完成后,可以看到设备的运行状态页签,设备最新的一次数据缓存
    2.4.5. Modbus协议
    2.4.5.1.     Modbus-RTU协议
    个报文就是一帧数据,一个数据帧就一个报文: 指的是一串完整的指令数据,本质就是一串数据。

    从机地址: 每个从机都有唯一地址,占用一个字节,范围0-255,其中有效范围是1-247,其中255是广播地址(广播就是对所有从机发送应答)
    功能码: 占用一个字节,功能码的意义就是,知道这个指令是干啥的,比如你可以查询从机的数据,也可以修改从机的数据,所以不同功能码对应不同功能.
    数据: 根据功能码不同,有不同功能,比方说功能码是查询从机的数据,这里就是查询数据的地址和查询字节数等。
    校验: 在数据传输过程中可能数据会发生错误,CRC检验检测接收的数据是否正确
    2.4.5.2.     Modbus功能码
    Modbus规定了多个功能,那么为了方便的使用这些功能,我们给每个功能都设定一个功能码,也就是指代码。如下:
    标题
    标签
    字段名
    读取输出线圈
     
    读取输入线圈
     
    读取保持寄存器
     
    读取输入寄存器
     
    写入单线圈
     
    写入单寄存器
     
    写入多线圈
     
    写入多寄存器
     
    _
     
     
    2.4.5.3.     主机对从机读数据操作

    0x01:从机的地址 0x03:查询功能,读取从机寄存器的数据 0x00 0x01: 代表读取的起始寄存器地址.说明从0x0001开始读取. 0x00 0x01: 查询的寄存器数量为0x0001个 Modbus把数据存放在寄存器中,通过查询寄存器来得到不同变量的值,一个寄存器地址对应2字节数据; 寄存器地址对应着从机实际的存储地址 0xD5 0xCA: 循环冗余校验 CRC
    从机回复报文格式如下: | 从站地址 | 功能码 | 字节计数 | 字节1 |字节2 | 校验 | | 0x01 | 0x03| 0x02| 0x01 | 0x00| 0x17| 0xF8 0x4A |
    0x01:从机的地址 0x03:查询功能,读取从机寄存器的数据 0x02: 返回字节数为2个 一个寄存器2个字节 0x00 0x17:寄存器的值是0017 0xF8 0x4A: 循环冗余校验 CRC
    2.4.5.4.     主机对从机写数据操作

    x01:从机的地址 0x06:修改功能,修改从机寄存器的数据 0x00 0x01: 代表修改的起始寄存器地址.说明修改0x0000-0x0001的存储内容 0x00 0x17: 要修改的数据值为0017 0x98 0x04: 循环冗余校验 CRC
    从机回复报文一样
    0106000100179804
    0x01
    06
    00 01
    00 17
    98 04
    从机地址
    功能号
    数据地址
    数据
    CRC校验
    2.4.5.5.     .主机对从机读数据操作
    0103020017F84A
    0x01
    03
    00 01
    00 01
    D5 CA
    从机地址
    功能号
    数据地址
    读取数据个数
    CRC校验
    0x01 06 00 01 00 17 98 04 从机地址 功能号 数据地址 数据 CRC校验
    0x01 06 00 01 00 17 98 04 从机地址 功能号 数据地址 数据 CRC校验
    0x01 06 00 01 00 17 98 04 从机地址 功能号 数据地址 数据 CRC校验
    0x01 06 00 01 00 17 98 04 从机地址 功能号 数据地址 数据 CRC校验
    2.4.5.6.     报文实例
    1、读40005、40006两个寄存器,假设从机地址为1
    下行报文:01 03 00 04 00 02 85 ca
    从机地址
    功能码
    寄存器起始地址
    读取寄存器个数
    CRC校验
    01
    03
    00 04
    00 02
    85 ca
    上行报文:01 03 04 00 00 00 00 21 33
    从机地址
    功能码
    返回字节个数
    寄存器40005数据
    寄存器40006数据
    CRC校验
    01
    03
    04
    00 00
    00 00
    21 33
    2.4.5.7.     Modbus-Rtu常用功能码
    数据类型
    读功能码
    写功能码
    对象类型
    离散量输入
    02
     
    单个位
    线圈状态
    01
    05,15
    单个位
    输入寄存器
    04
     
    16位字
    保持寄存器
    03
    06,16
    16位字
    2.4.5.8.     寄存器起始地址(起始数据地址)
    数据类型
    参数地址,寄存器编号
    离散量输入
    00001~0FFFF
    线圈状态
    10001~1FFFF
    输入寄存器
    30001~3FFFF
    保持寄存器
    40001~4FFFF
     
     
    2.5.   TCP设备接入
    2.5.1. TCP设备连接
    l   注册包:
    由于TCP设备连接,需要识别设备,因此TCP客户端连接时,上报的第一个报文为客户端的注册包。
    例如:7e80D4AD203F3A1C7e
    其中 7e 是包头包尾
    80是注册包的标识位
    D4AD203F3A1C 是设备编号
    客户端上报注册包后,更新设备状态为在线
    l  心跳包:
    TCP需要主动发送消息来维持设备的心跳保持,上图中 keep-alive 是心跳超时的判定时间 70s,因此设备的心跳需要维持在70s以下。
    心跳包例如: 7e817e 7e 是包头包尾,81是标识位 (心跳包只是维持TCP长连接,一般无其他实际意义)
    l  特殊的注册,心跳 数据包:
    在有些设备客户端,会把设备的注册包,心跳包,数据包,定时上报,一方面是包含了设备编号,也可以维持了心跳,数据包还包含了设备上报的信息,这种情况系统也是可以支持的。
    2.5.2. TCP模拟客户端测试
    模拟客户端放在如下文件

    模拟客户端上线
    发送注册包:配置好后,点击链接,发送注册包,如下 7e80D4AD203F3A1C7e
    这个时候,看下本地启动服务可以看到
    a. TCP客户端上线
    b. 更新TCP客户的状态
    c. 记录设备事件记录
    查看前端页面展示: webSocket 推送设备上线消息,实时更新前端显示
    2.5.3. 模拟TCP客户端断电或 断开
    断电需要等待设备心跳超时(70S), 断开连接是,是实时上报设备状态
    断开连接是,打印信息如下,更新设备上下线状态,新增设备事件记录,前端ws推送实时更新

    同样模拟客户端断电,需要等待客户端超过心跳超时时间 (70s),更新动作跟设备断开一致。
    2.5.4. TCP客户端前端连接展示
    新建产品,选择TCP传输协议,通讯协议可以选择 JSON,Modbus-rtu协议
    新建产品后,选中产品新建设备即可。
    2.5.5. TCP数据包,粘包,分包处理
    TCP粘包拆包发生场景
    因为TCP是面向流,没有边界,而操作系统在发送TCP数据时,会通过缓冲区来进行优化,例如缓冲区为1024个字节大小。
    如果一次请求发送的数据量比较小,没达到缓冲区大小,TCP则会将多个请求合并为同一个请求进行发送,这就形成了粘包问题。
    如果一次请求发送的数据量比较大,超过了缓冲区大小,TCP就会将其拆分为多次发送,这就是拆包。
    对于粘包和拆包问题,常见的解决方案有四种:
    发送端将每个包都封装成固定的长度,比如100字节大小。如果不足100字节可通过补0或空等进行填充到指定长度;
    发送端在每个包的末尾使用固定的分隔符,例如\r\n。如果发生拆包需等待多个包发送过来之后再找到其中的\r\n进行合并;例如,FTP协议;
    将消息分为头部和消息体,头部中保存整个消息的长度,只有读取到足够长度的消息之后才算是读到了一个完整的消息;
    通过自定义协议进行粘包和拆包的处理
    Netty对粘包和拆包问题的处理
    Netty对解决粘包和拆包的方案做了抽象,提供了一些解码器(Decoder)来解决粘包和拆包的问题。如:
    LineBasedFrameDecoder:以行为单位进行数据包的解码;
    DelimiterBasedFrameDecoder:以特殊的符号作为分隔来进行数据包的解码;
    FixedLengthFrameDecoder:以固定长度进行数据包的解码;
    LenghtFieldBasedFrameDecode:适用于消息头包含消息长度的协议(最常用);
     
    3.     使用说明
    3.1.   名词解释
    物模型:物模型是产品或设备的数据模型。包括属性、功能和事件。属性指设备的状态、配置和监测数据,例如温湿度;监测数据只能读取,配置和状态可以读取和写入。功能用于执行某项特定任务,例如打开风扇,可读取和写入。事件是设备主动上报给系统,例如温度过高,设备异常等。
    设备影子:用于缓存设备的属性和功能。设备离线时可以控制设备,设备上线后系统把离线控制的属性和功能下发给设备,设备作出响应。
    场景联动:一种自动化业务逻辑的可视化编程方式。例如设置晚上回家这个场景,门锁一打开,就把电视、饮水机和空调打开。
     

    Copyright © 2020 www.awver.com 涉川实业 版权所有

    备案号:闽ICP备2020016989号-1