各类IoT产品和解决方案的飞速发展,为市场提供了新的机遇,从而根本上转变了竞争激烈的的商业环境。越来越多的企业已经通过物联技术实现产品升级甚至企业转型,从而在大趋势中牢牢占据领先位置。 虽然价值显而易见,但挑战严峻,尤其是在技术层面:
本质上,企业需要一个性能稳定、扩展灵活、易于使用、安全的系统平台,能够针对不同的业务形态,将设备和业务的解耦,进而实现各种复杂的场景和业务流程。正是在这一背景下,IoT中继平台应运而生。
IOT中继宝盒是一款专业、强大、易用的含视频接入、流媒体生成、设备建模、设备接入、设备控制、数据采集、数据转发、设备运行监测、边缘计算等功能部署在设备侧的解决设备与业务管理系统互联互通的物联网中继、边缘服务器设备。 是主要应用在社区、工厂、学校、园区、工地、矿山、田园、水利、道路、桥梁等项目现场,解决现场设备与业务管理系统互联互通的软硬件一体边缘计算设备。
IOT中继宝盒是软硬件一体设备。主要应用在社区、工厂、学校、医院、园区、工地、矿山、矿井、田园、农场、水利、道路、桥梁等项目现场,接入管理项目现场的硬件设备、传感器等。例如:
智慧工地

项目工地各种施工生产设备如升降机、塔吊、搅拌机等生产设备接入平台,对设备的工作循环数据进行监测,提前预知、预判设备运行故障、异常,对设备及时维修保养,确保设备的安全运行,减少避免设备安全事故。通过视频监控对施工现场作业进行监控,及时对违规作业进行纠正,确保安全生产、安全监督。对项目工地的扬尘、风向等进行监测,确保文明施工等。
智慧农业、智慧养殖

通过各种传感器设备对蔬菜大棚温度、湿度、光照、CO2浓度、土壤温度和湿度进行监测分析、调整控制,保证蔬菜的生长和产量。
通过各种传感器设备对养殖场温度、湿度、光照、氨气浓度、硫化氢、水质等进行检测,对有害生物进行防御,提高养殖质量和产量等。
智慧医院

通过视频监控对医院通道的畅通、各科室流量进行监控调度,对医院各种设备、仪器、传感设备数据接入医院业务管理系统应用,例如智能手环对医院的婴儿、母亲、位置匹配,防止报错,手环滑落报警;对精神病患者、残疾病患者、突发病患者进行人员定位,让病患及时得到救助等等。
智慧养老

通过视频监控的应用开展远程问诊,各种智能穿戴设备、健康监测设备入网等应用,例如利用智能手环、智能床垫等设备监测老人的呼吸、血压、睡眠、体温等数据上传给康养管理中心。
消防安全

通过视频监控对小区、园区、酒店、商超等公共场所的通道的畅通、流量进行监控,对相关场所烟雾、声光、电、水、燃气泄漏等进行检测报警,提升消防安全。
智慧储能

对储能电站各个电池舱、电池PACK温度进行监测,对各种开关、变压器、升压器、线路电流、电压等参数进行监控调节,提高储能电站的生产效率。采用视频监控对各个舱室进行监控,进行远程巡检、安全生产监督等。
智慧矿山、矿井

矿山、矿井的消防应用,对矿山矿井里面的瓦斯浓度监测设备、烟雾传感器设备、温度、湿度、气体浓度等各种监测设备入网,提前进行事故预警和预报,实时传输现场施工视频录像,安全生产监控等。
智慧工厂

工厂、车间生产线机械设备入网,通过数据采集上报到控制平台、下发设备运行指令实现自动化生产。通过传感器和智能设备的连接,可以实现对机器制造过程中的各个环节进行实时监测和控制。例如,可以通过安装传感器,实现对机器的温度、湿度、压力等参数的监测,对机器的运行状态进行实时监控,从而及时发现问题并进行处理。同时,还可以通过智能化的数据分析和预测,提前预测可能出现的故障,避免停机和生产中断的发生,减少维护成本和提高生产效率。
智能家居

通过家庭中各种设备接入平台,实现居家的安防、智能、环保节能、健康监测、提升生活质量和舒适度的应用等。例如家中的空调、洗衣机、电视、音响、冰箱等各种电器智能连接,智能应用、自动化应用,提升生活质量和品质等。
低延迟
平台部署在设备边缘,将数据处理和计算推向网络边缘,避免将数据发送远程服务器进行处理的时间延迟,减少数据传输延时和响应时间。
高宽带
边缘计算采用了分布式计算架构,能够在多个边缘节点之间共享计算和存储资源,提供更高的宽带和吞吐量,例如充分利用现场的宽带资源,确保视频的传输的清晰流畅。
易使用
灵活轻便,易于部署; 适用于多种类型的场景;
高可靠
平台部署在设备边缘,对于大规模、集群应用,即使设备出现故障影响的也只是局部单点功能,不会影响整个业务应用。
高安全
数据处理和存储在距离用户更近的边缘设备,减少数据网络传输中的暴露风险,同时业务接口调用采用鉴权机制、数据加密传输,确保数据的隐私和安全;
多协议支持
提供modbus、串口、http、coap、websocket、mqtt等多种协议支持和服务后台,方便设备接入。
IoT中继宝盒是一款设备边缘的物联网管理系统,为万物互联提供可靠安全稳定的终端接入、协议适配、消息路由、数据存储和分析、应用使能等核心功能。在平台中定义了统一的设备接入标准,以及统一的数据管理及交换标准,确保不同厂商不同种类的终端设备在平台上得以集中管理并且提供统一的数据交换功能,并通过平台连接各种业务相关的异构系统、应用,满足平台与各业务系统之间无缝共享和交换数据的需要。其功能架构 如下:

IoT中继宝盒其主要功能分别如下:
设备服务: 提供设备基础管理功能,包括设备的鉴权管理、数据协议解析、消息路由管理功能;
设备建模服务: 提供设备建模功能,通过建模建立设备与业务管理系统统一连接数据连通交换规范标准。
连接服务: 提供设备联网功能,支持设备通过各种无线或有线的通信方式接入网络,并支持各种主流的网络传输协议;
数据服务: 提供设备数据的基本管理功能,包括设备的上下行日志存储,以及一些数据指标的聚合分析,如平均值、最大、最小值等;
使能服务: 提供应用使能服务,主要是为上层或第三方应用提供按规则和条件进行数据订阅和数据转发的服务。包括应用注册、规则引擎、数据流转服务;
应用服务: 一是提供视频方面视频的接入管理、视频拉流、云台控制、视频播录、录像计划、录像下载应用服务;
二是提供现场物理设备的入网连接配置管理、设备数据采集、数据上报、下发设备指令控制、设备连接状态管理、设备运行监测、设备运行预警等应用服务;
三是提供丰富的应用端API调用接口、调用规范服务;
四是提供丰富的C端不同接入协议开发板例程、接入应用规范、指导服务。
内网穿透服务: 提供子域名注册解析 、域名与终端绑定,IOT中继宝盒终端与业务应用平台网络连接、数据网络穿透服务。
其他: 包括基础的安全服务、控制台和监控服务、IOT中继宝盒恢复出厂设置功能。安全服务提供基本物联网安全机制;可视化控制台提供IoT中继宝盒与客户交互的界面;可视化监控提供服务可用性及风险监控能力。
| 名称 | 说明 |
|---|---|
| 设备 | 设备是指物理存在的、可通过网络连接的单个物联网设备。拥有唯一的DeviceId。设备可以是各种类型的物品,例如传感器、执行器、控制器等。这些设备通过物联网连接到平台,以便与其他设备或应用程序进行通信、交换数据和接收命令。 |
| 数据指标 | 指预期中打算达到的指数、规格或标准。从预置指标和自定义指标维度管理数据指标,以用于数据可视化分析,从中挖掘价值,优化改进相关配置,从而提升业务效率。在本平台中主要是针对设备物属性(见后物模型物属性定义)的范围、上下限、规格的界定,例如对于温度,设置超出设定范围的温度为报警温度。 |
| 设备诊断 | 针对设备运行数据提供的一系列运维场景智能服务,帮助您分析判断设备故障、探测设备潜在风险并及时预知业务异常。 |
| 连通性检测 | 在本平台中是指针对接入设备从建模型、接入参数、口令配置、启用状态到设备连接前一系列流程的完成情况展示。 |
| Topic | Topic是UTF-8字符串,是发布(Pub)/订阅(Sub)消息的传输中介。可以向Topic发布或者订阅消息。 |
| 发布 | 操作Topic的权限类型,对应的英文名称为Pub。可以往此类Topic中发布消息。 |
| 订阅 | 操作Topic的权限类型,对应的英文名称为Sub。可以从此类Topic中订阅消息。 |
| 数据转发 | 通过创建、配置规则,以实现平台订阅、数据流转和场景联动。如,在本平台中,通过配置把采集到的设备数据推送到业务平台或消息服务器。 |
| IOT终端 | IOT终端即为IOT中继宝盒设备,每个盒子有唯一ID标识(终端编号)。 |
| 内网穿透 | 内网穿透是一种网络技术,它可以使得外部网络的用户能够通过公网访问到内部网络中的设备和服务。内网穿透的原理是将内部网络的服务映射到公网上,然后由一个中转服务器(也称为穿透服务器)提供一个公网地址供外部用户访问。这个过程中,穿透服务器会接收到来自外部的请求并将其转发给内部网络的最终目标服务器。 |
| 终端域名绑定 | 终端域名绑定是指在本平台申请使用的子域名同IOT终端设备的关系映射,在平台做内网穿透时,根据映射的子域名来连接IOT终端设备。 |
物模型用于向平台描述设备具备的能力和特性。开发者通过定义产品物模型,在物联网平台构建一款设备的抽象模型,使平台理解该设备支持的服务、属性、命令等信息,如、温度、湿度、颜色、开关等。
| 物模型 | 描述 |
|---|---|
| 物模型定义 | 物模型是物理空间中的实体(如传感器、车载装置、楼宇、工厂等)在平台的数字化表示,从属性、功能、事件三个维度,分别描述了该实体是什么、能做什么、可以对外提供哪些信息。 |
| 物属性 | 物属性:用于描述设备运行时具体信息和状态。例如温湿度传感器包含“温度”、“湿度”两个属性。 属性-读写类型:对于设备属性定义其支持操作类型。 上报:仅显示设备上数信息。 读:支持在平台内操作下发读取属性指令。 写:支持在平台内操作下发修改属性指令。 |
| 物功能 | 物功能:设备可被外部调用的能力或方法,可设置输入参数和输出参数。相比于属性,服务可通过一条指令实现更复杂的业务逻辑,如执行某项特定的任务。 功能-是否异步:对于功能调用的响应是否阻塞等待。 是-异步:异步发送不等待设备响应回复指令,平台默认回复一条消息。 否-同步:同步阻塞等待,需要设备响应指令。 |
| 物事件 | 物事件:设备的功能模型之一,设备运行时的事件。 事件一般包含需要被外部感知和处理的通知信息,可包含多个输出参数。例如,某项任务完成的信息,或者设备发生故障或告警时的温度等,事件可以被订阅和推送。 用于描述设备上报平台的多个参数,多用于复杂报文结构或设备本身在某个阈值触发的报文。 |



本章节介绍IOT中继宝盒的使用,在此之前您需要阅读完上一章节《平台介绍》相关内容。
开机准备
IOT中继宝盒开机前,你需要准备键盘、鼠标、显示器设备并插入相应的设备接口。设备通电,按下设备上的电源开关,设备启动,显示屏显示系统平台登录界面。

输入出厂设置的初始账号和密钥进入平台主操作界面。(初始账户见设备包装里面的使用说明)

打开系统设置栏目下“系统参数配置”图标

系统会自动获取设备IP地址,点击保存IP配置,旁边“连接测试按钮”可以测试配置的IP是否正确,服务后台是否连通。

终端用户账户配置栏目下填写您的终端账号和密钥,保存终端用户配置。

如果您没有设备终端的账号密钥,请打开注册终端界面获取终端用户账户和口令。

填写您的姓名,手机号,发送短信验证码,阅读注册协议后点击“下一步”操作按钮进入注册信息提交页面填写注册信息

注册信息填写完整后,提交等待我公司客服审核,审核通过后会把您的注册账号和口令以服务短信发送到您手机上,您在终端用户账户配置栏目下填入保存即可。
在下图业务参数配置区域填写系统平台相关参数配置,完成后保存参数配置。

主操作界面,点击系统设置栏目下“IOT终端绑定”图标,打开域名终端绑定界面

在终端域名检索区域输入您要申请的子域名检索查询,检索返回信息显示通过无用户使用,点击“申请此域名”按钮,等待武汉公司审核,审核通过后会把通过信息发送在您注册账号手机上。

输入您的终端设备号(通常在您购买的IOT中继宝盒产品标签上的设备序列号)、审核通过的子域名,点击“绑定此域名到IOT终端”完成域名终端设备绑定。
主操作界面,点击系统设置栏目下“账号安全设置”图标,在此界面设置您的账号密保问题答案,便于您在遗忘平台登录密钥时找回使用。

忘记密码,在登录界面点击“忘记密码”,打开密保问题验证界面,输入账号和您设置的密保问题答案点击“提交”验证按钮,验证通过则可重新设置您的系统登录密钥。



在平台右上角点击登录用户名称旁下拉菜单箭头,弹出菜单,选择“修改密码”菜单,打开修改密钥界面,修改您的登录密码。

主操作界面,点击系统设置栏目下“恢复出厂设置”图标,打开恢复出厂设置界面,输入安全密钥,点击“确认恢复出厂设置”按钮,则会把IOT中继宝盒恢复到出厂设置时的状态。
特别说明: 恢复出厂设置会清空系统所有数据,断开服务连接,系统恢复至初始化未接入状态,以前数据不可找回,请谨慎操作。

主操作界面,视频监控栏目下点击“视频设备”图标,打开设备管理界面

点击“新增NVR设备”按钮,打开添加视频设备窗口

填写设备名称、设备编号,通道明细区域填写通道信息,如果摄像头支持云台控制,则把选项勾选。通道明细区域可以选择“新增通道”按钮添加通道,也可以选择“删除”按钮删除通道明细。点击“确定”则添加视频设备成功。
我的NVR设备管理界面选择“删除”则可以删除添加的整改视频监控设备。

特别说明此处的NVR设备只是视频监控设备别称,在本IOT中继平台中视频可以是NVR也可以直接是IPC摄像头,如果添加的是摄像头设备,只需要添加一路通道,通常的NVR设备是指硬盘录像机,一个NVR下接入多个摄像头设备。
在我的NVR设备管理界面点击“我的接入配置”按钮,则打开对应的NVR设备接入配置详情界面,在此界面显示了NVR或摄像头接入本IOT中继平台的配置信息以及监控接入说明。


视频接入施工人员根据显示的配置信息,进入NVR或摄像头设备的接入平台,把显示的端口、信令服务器IP、SIP、通道ID、sip认证密码保存完成视频设备的接入。接入成功,在配置界面会显示注册信息成功。
在NVR或摄像头设备的接入平台把配置信息注册成功后,本IOT中继宝盒视频管理界面会间隔5秒检测NVR或摄像头设备是否接入成功上线。如下图:


本IOT中继宝盒视频管理界面,点击“通道”按钮则打开对应通道摄像头播放管理界面,在此界面可以实时播放视频流。



视频拉流地址 在通道播放窗口下方显示对应通道的视频拉流地址

在通道播放窗口点击“云台控制”打开云台控制面板

在此操作界面可以点击方向箭头按钮向摄像头发送云台控制指令调整摄像头拍摄角度和范围。右边部分输入框和按钮可以设置和调整摄像头的巡航、扫描速度、预置点位等。

在实时视频操作界面提供了“录制录像”、“停止录像”、“制定录像计划”的按钮,您可以点击“录制录像”按钮开始实时录像,点击“停止录像”停止录像,左边录像标识为录像状态,绿色是录像运行中,灰色是没有录像。

点击“制定录像计划”的按钮在打开制定录像计划窗口,在此窗口您可以设置指定的时间段录像。
特别说明: IOT中继宝盒视频录像是直接流媒体服务端录制,视频文件保存在本IOT中继平台上。

点击“录像查询”的按钮在打开录像列表窗口,在此窗口您可以查找指定的时间段录像播放,默认查询当天时间的录像文件,您也可以在时间控件选择指定时间查询录像文件。
在录像列表选择录像文件,点击下载则可以把录像文件下载到本地。

除了视频监控设备外,需要接入网络连接本平台的设备在本平台统称为IOT设备,针对设备使用接入协议不同有不同的接入流程,接入流程图见前面平台介绍《8、系统应用数据流转过程示意图》章节。
主操作界面,IOT设备栏目下点击“IOT设备”图标,打开设备管理界面


点击“新增IOT设备”按钮,打开添加接入设备界面,在添加设备界面填写你要接入设备的名称、编号、型号等信息,选择设备的接入方式(接入协议)。

保存后,设备列表管理界面显示新添加的设备信息,在设备展示界面有编辑、删除操作按钮可以对设备信息进行管理,另外提供了设备状态管理“启用”、“停止”按钮来控制设备是否启用,后续设备建模需要先把设备启用。

添加接入设备后,在主操作界面,IOT设备栏目下点击“设备建模”图标,打开设备物模型管理界面进行设备物模型建模操作,关于设备“物模型”概念见前面“平台介绍”–>“基本概念”–>《b、物模型说明》章节。

点击“属性定义”按钮打开设备物模型属性定义界面

在此界面点击“新增”按钮,打开物属性定义窗口

基本信息 在物属性定义窗口,您需要填写业务管理需要的设备属性等信息,例如起重机设备需要上报设备工作时的行进速度。您需要在基本信息区域填写属性名称、选择数据的读写类型(属性是读、写还是上报)、属性的数据类型、单位、设置属性的缩放因子(缩放因子是指属性数值的精度,在计量领域中,它是一个比率,用于对属性值的单位转换)、功能描述、备注等信息。

关于此界面的设备ID是在添加设备时,系统自动生成的唯一设备ID标识,属性标识也是在定义物属性时,系统自动分配唯一标识。
指标配置
在物属性定义窗口下面区域为属性指标配置区域,用于对设定的属性指标设置(指标的定义请查看前面平台介绍–基本概念章节–名称解释里面“数据指标”的定义)。

点击“新增指标”按钮,则新生成一输入行,可以在输入框里面填写对应指标范围界定数值。点击“删除”按钮则删除一指标数据输入行。

点击“确定”按钮,则物属性和指标定义成功。点击“编辑”、“删除”按钮也可以对指标设置管理。
点击“事件定义”按钮打开设备物模型事件定义界面

在此界面点击“新增”按钮,打开物模型事件定义窗口

在物模型事件定义界面分为“基本信息”和“输出参数”两个区域,“基本信息”填写事件名称、定义事件标识、设定事件的类别、事件的功能描述和备注信息。
输出参数
输出参数区域可以添加管理此物模型事件发生时相关信息的输出设置,例如设备在此事件发生时同时上报设备运行的属性数据,同时对属性参数的数据类型、单位、缩放因子进行设置。


点击“功能定义”按钮打开设备物模型功能定义界面

在物模型功能定义界面分为“基本信息”和“输入参数”两个区域,“基本信息”填写功能名称、定义功能标识、功能的功能描述和备注;设置是否异步操作、输出参数(通常是功能执行的结果)、输出参数的数据类型。
特别说明 物模型功能是指设备提供的功能,也是指设备提供的服务,也可以叫做物模型服务,如下图设置了设备关机的服务功能定义。

输入参数
输入参数区域可以添加管理此物模型功能同时需要的输入参数设置,例如设备在接收设备关机指令时同时需要执行其他动作或要多个参数输入等对参数类型、单位、缩放因子进行设置。


从前面“平台介绍”《7、设备接入流程》章节设备接入流程,针对接入设备所采取的接入协议不同,平台有不同的物联接入方式和接入路径。针对采用http、websocket、coap、mqtt协议接入的设备我们需要在IOT中继平台配置设备接入鉴权的账户外,另外还需要针对开发版开发C语言驱动程序。
针对采用MODBUS协议接入的设备相对特殊,只需要在本平台配置好设备连接方式、账号,设置好读写物属性的数据点位即可(特别说明:采用MODBUS协议接入的设备,IOT中继平台即为master节点,接入设备为slave节点)。
主操作界面,IOT设备栏目下点击“设备接入配置”图标,打开设备接入配置界面

选择设备,点击“接入账号配置”按钮,打开接入设备的接入账号配置窗口

填写设备接入账号、口令,保存则设置完成接入设备的鉴权信息。
对于采用mqtt协议接入的设备,由于IOT中继平台直接集成了mqtt消息服务器,在平台的配置信息里面指定了mqtt服务器的鉴权连接信息,在此处平台没必要重复提供配置。
采用MODBUS协议接入的设备,第一步选择MODBUS连接方式,配置相应的连接ip、端口、读写数据位、数据读写长度等信息;第二步配置对应物属性的数据点位信息。
点击“接入方式配置”打开MODBUS连接方式配置窗口

Modbus协议接入有三种连接方式,分别是“串口RTU连接”、“串口ASCII连接”、“TCP/IP连接”:




“串口RTU连接”、“串口ASCII连接”需要填写“端口标识”、“波特率”、“数据位”、“停止位”、“校验位”、“超时时间”等信息。
采用“TCP/IP连接”配置方式不同,需要填写“主站IP”、“主站端口”,应注意区别,通常这里的“主站IP”即为IOT中继宝盒的IP地址。

点击“数据点配置”打开MODBUS数据点配置窗口

点击“新增数据点”按钮,打开数据点配置窗口

填写数据点与物属性对应的属性名称、接入设备从站ID、功能码、数据起始位、数据读取长度、数据采集周期、数据类型、数据缩放因子等信息,保存配置则完成数据点的配置。
IOT设备接口是供设备端开发人员使用的不同协议接入本IOT中继平台的帮助文档和API接口信息。主操作界面,IOT设备栏目下点击“IOT设备接口”图标,打开IOT设备接口信息界面

在此界面分类显示了接入设备的“设备端接入端接口”和“连通性检测工具”两个按钮。
点击“设备端接入端接口”按钮,根据不同的设备接入协议,则展示不同的设备接入端接口文档,设备端开发人员根据对应的接入文档和范例完成终端设备的接入开发。







连通性检测工具是本IOT中继平台帮设备接入人员提供的一个检测工具,目的是帮助接入人员了解要接入的设备相关接入配置是否完成,接入配置是否正确。点击“连通性检测”按钮,打开窗口会逐条显示当前设备接入每一步骤的完成情况,点击重新检测则重新检测一遍当前设备的接入情况。

数据转发是IOT中继平台针对业务应用或第三方平台应用推出的一项更特殊灵活的服务。给业务端应用提供一种新的选择。通过数据转发配置可以把接入本IOT中继平台的设备采集到的数据实时的推送到应用端消息服务器或应用服务器。实现更加灵活的应用。
主操作界面,IOT设备栏目下点击“数据转发配置”图标,打开设备数据转发配置界面

点击“转发配置”按钮,打开相应设备数据转发配置界面

数据转发配置界面有两个区域,上面部分是配置转发方式和转发目标连接认证信息,下面部分是选择需要转发推送的特征数据范围。
数据转发方式有“http转发”、“推送到kafka服务器”、“推送到RabbitQM服务器”三种类型。“http转发” 是通过http协议把数据推送到应用平台的服务器,通常目标平台提供restful API接口和鉴权接口,本IOT中继平台主动调用配置的API接口把本地数据推送给应用服务器。(注:选择http转发,应用服务器需要提供restful风格的鉴权连接API和对应的数据接收API)
“http转发” 需要配置目标服务器的IP、端口、连接账号、口令;连接认证方式(设置了“用户名+密码基础认证”、“HTTP Bearer Token”两种连接认证方式选择),http转发需要配置登录请求的地址和请求方法。
“推送到kafka服务器”、“推送到RabbitQM服务器” 需要提供连接目标消息服务器的IP、端口、连接账号和口令。
关于下面部分转发数据的选取,勾选需要转发的属性或事件数据,根据转发方式不同,填写转发的路径或消息服务器的TOPIC

数据的转发频率则由上面部分里面的转发心跳设置来确定转发数据的频率。
在数据转发配置界面另外提供了“启用转发”、“停止转发”按钮用来管理数据转发服务。另外提供了设备运行状态的图标和是否有转发服务的标识显示。

设备运维板块是IOT中继平台为方便业务应用对接和对设备接入情况进行检测提供的可视化应用功能。
设备在线监测是监测接入本IOT中继平台的设备在线和连接情况。主操作界面点击“设备在线监测”图标打开

在设备监测界面分别以图表显示了视频监控和iot设备当前的设备连接数和在线率情况。
下面的两tab标签页则详细显示了视频通道的在线情况和IOT设备的在线情况。
数据转发监测是对本IOT中继平台配置的数据转发推送情况的监测。主操作界面点击“数据转发监测”图标打开

在数据转发监测界面分两部分,上面部分图标标识了当前IOT设备数据转发服务情况和近30天数据转发情况。
下面部分展示了近30天数据转发的详细记录。
设备预警是本IOT中继平台提供的另一项重要的功能应用。一是对接入设备离线的告警;二是对IOT中继宝盒本身存储空间情况的监测预警;三是对近30天内对接入的设备超出业务指标值的告警。同时列出了近30天超出指标范围设备列表。

IOT中继平台记录的设备接入流转的数据分析。


本章节用于指导设备端开发者实现设备接入IOT中继平台使用。开发者根据设备入网方式,设备接入协议,选择对应的例程完成嵌入式开发版驱动程序开发。
IOT中继平台设备端接入当前支持http、coap、websocket、modbus、mqtt、串口几种主流的设备通讯协议接入方式。根据不同设备接入协议方式,IOT中继平台提供了Http Restful API接口调用的接入方式、C 语言嵌入式开发接入方式。结合行业设备物联实际应用,针对开发板入网提供STM、ESP8266相关开发例程,供开发者开发接入使用。
对于采用modbus协议接入的设备,只需要在IOT中继平台做好连接方式、数据点配置即可,不涉及到程序开发。
关于不同接入协议数据传输安全,本IOT中继平台与接入设备交互采用接入设备ID+接入账号+接入密钥 加密认证方式,对传输的报文数据采用json字符串BASE64加密传输方式进行。
本章节适用对象为设备侧,供设备采用HTTP协议以Http Restful API方式接入本IOT中继平台使用。
此设备采用http协议接入本IOT中继系统平台,所有接口均使用POST方式访问。主要实现从接入设备上报物模型属性、事件数据。
POST方式调用:(SERVER_URL)/(INTERFACE)
| 参数名称 | 参数类型 | 参数说明 |
|---|---|---|
| Authorization | Header | 用于区分接入方应用身份的验证内容,通常为Bearer XXXXXXX格式 |
| Content-Type | Header | application/json |
| token | Header | 固定值:登陆后调用业务口时设置,内容从登陆鉴权的响应报文中获取 |
接口响应内容为JSON格式报文:
| 报文属性 | 说明 |
|---|---|
| code | 响应标识代码 |
| success | true/false,请求是否成功 |
| data | 请求返回的数据 |
| msg | 请求返回的消息 |
响应代码:
| 代码 | 说明 |
|---|---|
| 200 | 请求正确完成 |
| 0 | 后台处理成功 |
| -1 | 后台处理失败 |
| 401 | 没有授权 |
| 403 | 资源不可用 |
| 404 | 访问地址不存在 |
| 500 | 系统错误 |
服务器地址: http://192.168.0.105:18080
用户名: 134xxxxxxxx IOT设备接入设置的连接账号 (此设备采用http协议接入,在IOT设备接入配置中设置的设备连接账号)
密码: XXXXXX IOT设备接入设置的连接口令 (此设备采用http协议接入,在IOT设备接入配置中设置的设备连接口令)
Authorization: Bearer xxxxxxxxx (xxxxxxxxx 为登陆鉴权成功返回的token)
特别说明: 此处服务器IP地址为本IOT中继宝盒里面配置的盒子的IP地址,本文档后面出现的IP地址“192.168.0.105 ” 根据您盒子的配置统一替换,在本文档中只是演示使用。
Request URL: http://192.168.0.105:18080/oauth/token
Request Method: POST
数据提交格式 application/json
请求头 无
请求体格式 :
{ "username": "134xxxxxxxx", "password": "******" }
请求体参数说明:
| 参数名 | 类型 | 必须 | 描述 |
|---|---|---|---|
| username | string | 是 | IOT设备接入设置的连接账号 (此设备采用http协议接入,在IOT设备接入配置中设置的设备连接账号),此连接账号为: 134xxxxxxxx |
| password | string | 是 | IOT设备接入设置的连接口令 (此设备采用http协议接入,在IOT设备接入配置中设置的连接口令 ******* ) |
正确响应结果示例:
{
"code": "200",
"msg": "success",
"data": {
"token" : "eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiJiNjE3OGVlN2ZhNWM0OWU2ODlmMGEzNjIxNzkxYzk2OCIsInN1YiI6IntcInVzZXJJZFwiOlwiNDlcIixcInVzZXJOYW1lXCI6XCIxMzQzNzE1NjU2OVwiLFwibmlja05hbWVcIjpcIjQ0MDgwMDAwMDAxMTExMDAwMDE3XCJ9IiwiaXNzIjoic2oiLCJpYXQiOjE2OTcxNTk2NjgsImV4cCI6MTY5NzE2MTQ2OH0.4C3GJIF5ejmySHy9l_LmheoCs5jknq17h9tPsZB3dIM",
}
}
错误响应结果示例:
{
"code": "-1",
"msg": "fail:用户登录验证失败"
}
Request URL: http://192.168.0.105:18080/loginOut
Request Method: GET
请求头参数 Authorization
请求头参数说明:
| 参数名 | 类型 | 必须 | 描述 |
|---|---|---|---|
| Authorization | Header | 是 | 固定值:字符串“Bearer” +“token”组成, "token"为上述登录接口获取的属性值,如:请求头中 “Authorization” : “Bearer eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiJiNjE3OGVlN2ZhNWM0OWU2ODlmMGEzNjIxNzkxYzk2OCIsInN1YiI6IntcInVzZXJJZFwiOlwiNDlcIixcInVzZXJOYW1lXCI6XCIxMzQzNzE1NjU2OVwiLFwibmlja05hbWVcIjpcIjQ0MDgwMDAwMDAxMTExMDAwMDE3XCJ9IiwiaXNzIjoic2oiLCJpYXQiOjE2OTcxNTk2NjgsImV4cCI6MTY5NzE2MTQ2OH0.4C3GJIF5ejmySHy9l_LmheoCs5jknq17h9tPsZB3dIM” |
请求体格式 :无
正确响应结果示例:
{
"msg": "注销成功",
"code": "200",
"data": "{ }"
}
错误响应结果示例:
{
"code": "-1",
"msg": "注销失败"
}
本文档适用对象为设备侧,供设备接入本IOT中继平台使用。 此设备采用http协议接入本IOT中继系统平台,主要实现从接入设备上报物模型属性数据。 设备侧根据业务需要周期性调用此接口向平台上报设备属性数据,例如:间隔10分钟上报设备温度。
Request URL: http://192.168.0.105:18080/httpService/uploadPropertiesData
Request Method: POST
数据提交格式 application/json
请求头参数 Authorization
请求头参数说明:
| 参数名 | 类型 | 必须 | 描述 |
|---|---|---|---|
| Authorization | Header | 是 | 固定值:字符串“Bearer” +“token”组成, "token"为上述登录接口获取的属性值,如:请求头中 “Authorization” : “Bearer eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiJiNjE3OGVlN2ZhNWM0OWU2ODlmMGEzNjIxNzkxYzk2OCIsInN1YiI6IntcInVzZXJJZFwiOlwiNDlcIixcInVzZXJOYW1lXCI6XCIxMzQzNzE1NjU2OVwiLFwibmlja05hbWVcIjpcIjQ0MDgwMDAwMDAxMTExMDAwMDE3XCJ9IiwiaXNzIjoic2oiLCJpYXQiOjE2OTcxNTk2NjgsImV4cCI6MTY5NzE2MTQ2OH0.4C3GJIF5ejmySHy9l_LmheoCs5jknq17h9tPsZB3dIM” |
请求体格式 Content-Type
{
"deviceId": "44080000001111000017",
"propertiesList": [
{ "propertiesId": "P_1696583483495", "dataValue": "36" },
{ "propertiesId": "P_1696583483496", "dataValue": "45" },
。。。。。。
]
}
请求体参数说明:
| 参数名 | 类型 | 必须 | 描述 |
|---|---|---|---|
| deviceId | string | 是 | 接入设备ID标识,黄色为接入设备ID标识值 “44080000001111000017” |
| propertiesId | string | 是 | IOT接入设备物模型属性ID标识,黄色为物模型属性ID标识值 “P_1696583483495” “P_1696583483496” |
| dataValue | string | 是 | IOT接入设备物模型属性值标识,黄色为物模型属性值,如: “36” “45” |
正确响应结果示例:
{
"code": "0",
"msg": "success",
"data": "true",
}
错误响应结果示例:
{
"code": "-1",
"msg": "fail:数据上报失败"
}
本文档适用对象为设备侧,供设备接入本IOT中继平台使用。 此设备采用http协议接入本IOT中继系统平台,主要实现从接入设备上报物模型事件数据。 设备侧根据业务需要周期性调用此接口向平台上报设备事件数据,例如:设备温度超标关机。
Request URL: http://192.168.0.105:18080/httpService/uploadEventData
Request Method: POST
数据提交格式 application/json
请求头参数 Authorization
请求头参数说明:
| 参数名 | 类型 | 必须 | 描述 |
|---|---|---|---|
| Authorization | Header | 是 | 固定值:字符串“Bearer” +“token”组成, "token"为上述登录接口获取的属性值,如:请求头中 “Authorization” : “Bearer eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiJiNjE3OGVlN2ZhNWM0OWU2ODlmMGEzNjIxNzkxYzk2OCIsInN1YiI6IntcInVzZXJJZFwiOlwiNDlcIixcInVzZXJOYW1lXCI6XCIxMzQzNzE1NjU2OVwiLFwibmlja05hbWVcIjpcIjQ0MDgwMDAwMDAxMTExMDAwMDE3XCJ9IiwiaXNzIjoic2oiLCJpYXQiOjE2OTcxNTk2NjgsImV4cCI6MTY5NzE2MTQ2OH0.4C3GJIF5ejmySHy9l_LmheoCs5jknq17h9tPsZB3dIM” |
请求体格式 Content-Type
{
"deviceId": "44080000001111000017",
"eventId": "E_1696584389929",
"paramsList": [
{ "paramsId": "aaaaa", "dataValue": "36" },
{ "paramsId": "bbbbb", "dataValue": "45" },
。。。。。。
]
}
请求体参数说明:
| 参数名 | 类型 | 必须 | 描述 |
|---|---|---|---|
| deviceId | string | 是 | 接入设备ID标识,黄色为接入设备ID标识值 “44080000001111000017” |
| eventId | string | 是 | 接入设备物模型事件ID标识,黄色为物模型事件ID标识值 “E_1696584389929” |
| paramsId | string | 是 | IOT接入设备事件物模型输出参数ID标识,黄色为事件物模型输出参数ID标识值 “aaaaa” “bbbbb” |
| dataValue | string | 是 | IOT接入设备事件物模型输出参数值标识,黄色为事件物模型输出参数值,如: “36” “45” |
正确响应结果示例:
{
"code": "0",
"msg": "success",
"data": "true"
}
错误响应结果示例:
{
"code": "-1",
"msg": "fail:数据上报失败"
}
MQTT是基于TCP/IP协议栈构建的异步通信消息协议,是一种轻量级的发布、订阅信息传输协议。可以在不可靠的网络环境中进行扩展,适用于设备硬件存储空间或网络带宽有限的场景。使用MQTT协议,消息发送者与接收者不受时间和空间的限制。
IOT中继宝盒嵌入了MQTT消息服务器为接入设备接入物联网服务。
此设备采用Mqtt协议接入本IOT中继系统平台,实现从接入嵌入设备读、写、上报物模型数据。 设备读写报文数据采用字符串BASE64加密传输。
(本例程以stm32开发版+W5500以太网模块设备接入为例)
MQTT服务器地址: tcp://:192.168.0.105:1883( IOT中继宝盒IOT设备接口–配置说明中显示的MQTT服务器连接地址和端口)
用户名:txbxxxxx(IOT中继宝盒IOT设备接口–配置说明中显示的MQTT服务器用户名)
密码:dHhiMDIxMjE4 (IOT中继宝盒IOT设备接口–配置说明中显示的MQTT服务器客户端口令,BASE64解密使用)
客户端ID: 44080000001111000019(连接IOT中继宝盒的设备ID)
设备侧MQTT协议使用前提为设备启用、连接协议配置生效。设备侧Mqtt发布TOPIC为配置的物模型属性、物模型事件对应的上报设备属性数据和事件发生上报的数据。 数据流向为上行
对应的发布的主题TOPIC 、服务质量格式分别为:
| 类别 | 主题TOPIC | 描述 | 服务质量 |
|---|---|---|---|
| 属性数据 | /iotboxProperties/44080000001111000019/P_1696583483495 | 此topic对应设备物模型属性数据,由类别标识、设备ID、物模型属性ID组成。 主题中 “44080000001111000019” 为设备ID; "P_1696583483495"为设备物模型定义的属性ID标识 |
QS1 |
| 事件数据 | /iotboxEvent/44080000001111000019/E_1696584389929 | 此topic对应设备物模型事件数据,由类别标识、设备ID、物模型事件ID组成。 主题中 “44080000001111000019” 为设备ID; "E_1696584389929"为设备物模型定义的事件ID标识 |
QS1 |
设备侧Mqtt订阅TOPIC为配置的物模型功能,通常用于设备接收处理功能指令的操作。 数据流向为下行
对应的订阅的主题TOPIC 、服务质量格式分别为:
| 类别 | 主题TOPIC | 描述 | 服务质量 |
|---|---|---|---|
| 功能数据 | /iotboxFunction/44080000001111000019/F_1696584326733 | 此topic对应设备物模型功能数据,由类别标识、设备ID、物模型功能ID组成。 主题中 “44080000001111000019” 为设备ID; "F_1696584326733"为设备物模型定义的功能ID标识 |
QS1 |
设备侧向MQTT服务器发布消息体格式采用字符串BASE64加密传输。 参数属性说明:
| 类别 | 主题TOPIC | 加密前消息体内容 | 加密后消息体内容 | ||||||
| 属性数据 | /iotboxProperties/44080000001111000019/P_1696583483495 | 如:温度 "36" 度 | MzY= | ||||||
| 事件数据 | /iotboxEvent/44080000001111000019/E_1696584389929 | 事件数据为json数值格式,由物模型事件属性中的输出参数组成。加密前格式如: [ {"paramsId": "aaaaaa", "dataValue": "36"}, {"paramsId": "bbbbbb", "dataValue": "45"}, ...... ]
|
WyB7InBhcmFtc0lkIjogImFhYWFhYSIsICJkYXRhVmFsdWUiOiAiMzYiIH0seyJwYXJhbXNJZCI6ICJiYmJiYmIiLCAgImRhdGFWYWx1ZSI6ICI0NSJ9LF0= | ||||||
设备侧向MQTT服务器订阅消息体格式采用字符串BASE64加密传输。 参数属性说明:
主题TOPIC: /iotboxFunction/44080000001111000019/F_1696584326733
订阅返回消息体内容:
ewogICAgICJkZXZpY2VJZCI6ICI0NDA4MDAwMDAwMTExMTAwMDAxNiIsCiAgICAgImZ1bmN0aW9uSWQiOiAiRl8xNjk2NTg0MzI2NzMzIiwKICAgICAiZnVuY3Rpb25OYW1lIjogIui/nOeoi+WFs+acuiIsCiAgICAgWwogICAgIHsicGFyYW1zSWQiOiAiYWFhYWFhIiwgInBhcmFtc05hbWUiOiAi5bCP6L2m5b2S5L2NIiwgImRhdGFWYWx1ZSI6ICJ0cnVlIiB9LAogICAgIF0KIH0=
订阅返回消息体内容:
消息体数据为json数值格式,由物模型功能定义中的输入参数组成。解密后的格式如:
{
"deviceId": "44080000001111000016",
"functionId": "F_1696584326733",
"functionName": "远程关机",
"inputParamsList": [
{"paramsId": "aaaaaa", "paramsName": "小车归位", "dataValue": "true" },
......
]
}
| json字符串内容说明 | |
| deviceId | 定义的设备ID标识 如上例黄色 "44080000001111000016" 为需要处理下发的功能指令设备标识 |
| functionId | 设备物模型功能定义中的功能ID标识 如上例黄色 "F_1696584326733" 为设备物模型功能定义中的功能ID标识 |
| functionName | 设备物模型功能定义中的功能名称 如上例黄色 "远程关机" 为设备物模型功能定义中的功能名称 |
| paramsId | 输入参数ID标识,为设备物模型功能定义中的输入参数ID标识 如上例黄色 "aaaaaa" 为输入参数标识 |
| paramsName | 输入参数名称,为设备物模型功能定义中的输入参数名称 如上例黄色 "远程关机" 为设备物模型功能定义中的输入参数名称 |
| dataValue | 输入参数数据值,dataValue 为设备物模型功能定义中的输入参数数值标识 上例黄色 "true" 设备物模型功能定义中的输入参数数值,为输入参数布尔值true |
ts_mqtt.c文件中定义:
char *mqtt_clientID="44080000001111000019"; //Mqtt 客户端ID 填写iotrelay中继平台接入设备的ID
char *mqtt_account ="txb0727"; //Mqtt 服务器连接账号 填写iotrelay中继平台接入设备接口生成的账号
char *mqtt_password ="xxxxxx"; //Mqtt 服务器连接密码 填写iotrelay中继平台接入设备接口生成的口令
uint16 local_port = 5000; //设置开发板本地端口,根据需要设置
uint8 remote_ip[4] = {192.168.0.102}; //连接mqtt服务器IP
uint16 remote_port = 1883; //连接mqtt服务器端口
参数说明:
| 参数 | 说明 |
|---|---|
| mqtt_clientID | 连接本IOT中继平台Mqtt服务器的客户端ID, 填写iot中继平台接入设备的ID。 |
| mqtt_account | 连接本IOT中继平台Mqtt服务器的连接账号, 填写iot中继平台接入设备接口生成的账号 |
| mqtt_password | 连接本IOT中继平台Mqtt服务器的口令, 填写iot中继平台接入设备接口生成的口令,嵌入设备中填写base64解密后的口令 |
| remote_ip[4] | 连接本IOT中继平台Mqtt服务器的IP, 填写iot中继平台的IP |
| remote_port | 连接本IOT中继平台Mqtt服务器的端口, 填写iot中继平台Mqtt服务器的端口 |
发布上报物模型属性数据,在本样例中ts_mqtt.c文件publishIotrelayModelProperties方法实现,部分代码段:
/**** *此处为构建上报的报文,获取设备属性数据在此填入,例如在此调用gpio获取设备的温度,在此范例处先直接填入数字 *上报设备物模型属性数据,例如 温度 36 度, *****/ char *indata="36" ; //上报设备属性数据 温度 ,在此范例处先直接填入数字,实际应用调用gpio获取设备的物模型属性数据 char outdata[20]; //加密后数据 int outlen; memset(outdata,0,sizeof(outdata)); /* 对上报属性数据Base64加密处理 */ int jm= base64_encode(indata, strlen(indata), outdata, &outlen);
参数说明:
“36” 为要上报的属性实际数值,例如温度36 度(设备的属性值为您程序开发中获取,获取后替换); int jm= base64_encode(indata, strlen(indata), outdata, &outlen); 为对上报属性数据Base64加密处理
发布上报物模型事件数据,在本样例中ts_mqtt.c文件publishIotrelayModelEvent方法实现,部分代码段:
/****
* 此处为构建上报的报文,设备属性数据在此填入,例如在此调用gpio获取设备的光照、温度
*上报设备物模型事件数据,事件数据为json数值格式,由物模型事件属性中的输出参数组成,
* 例如:设备关机事件上报数据
* 数据为json格式字符串 "[{\"paramsId\":\"suning\", \"dataValue\": \"80\" },{\"paramsId\": \"temperature\", \"dataValue\": \"45\"}]"
*****/
char *indata="[{\"paramsId\":\"suning\", \"dataValue\": \"80\" },{\"paramsId\": \"temperature\", \"dataValue\": \"45\"}]"; //上报设备事件数据
printf("加密前报文: %s \r\n",indata);
char outdata[512]; //加密后数据
int outlen;
memset(outdata,0,sizeof(outdata));
/* 对上报数据Base64加密处理 */
int jm= base64_encode(indata, strlen(indata), outdata, &outlen);
char *indata=“[{"paramsId":"suning", "dataValue": "80" },{"paramsId": "temperature", "dataValue": "45"}]”; 为上报设备事件json数据 。 int jm= base64_encode(indata, strlen(indata), outdata, &outlen); 为对上报数据Base64加密处理
设备事件json数据参数说明:
| 参数 | 说明 |
|---|---|
| paramsId | 上报设备事件输出参数ID标识,为设备物模型配置的事件输出参数ID标识 如上例 “suning” 、 “temperature” 为光照和温度参数标识 |
| dataValue | 上报设备事件输出参数数据值,dataValue 为上报设备事件输出参数值标识 上例 “80” 、 “45” 上报设备事件输出参数数据值,为输出参数光照温和度数据值;设备的属性值为您程序开发中获取,获取后替换) |
订阅物模型功能,在本样例中ts_mqtt.c文件 **subscribIotrelayModelFunction **方法实现,部分代码段:
//Base64解密接收到的报文
char outdata[600]; //接收到的报文数据
int outlen;
memset(outdata,0,sizeof(outdata));
int jm= base64_decode((const char *)payload_in, strlen((const char *)payload_in), outdata, &outlen);
if(jm<0){
printf("解密数据错误:\r\n");
}else{
printf("解密后数据: %s \r\n",outdata);
//解析JSON格式字符串
cJSON *root = cJSON_Parse(outdata);
if(root != NULL)
{
char *json_str = cJSON_Print(root);
printf("解析解密后的JSON数据 %s", json_str);
//此处根据获取的物模型功能指令,填写设备需要操作的代码,例如设备关机
int jm= base64_decode((const char *)payload_in, strlen((const char *)payload_in),outdata, &outlen); 为base64解密订阅功能接收的json字符串数据 。 cJSON *root = cJSON_Parse(outdata); 为解析JSON格式字符串
//此处根据获取的物模型功能指令,填写设备需要操作的代码,例如设备关机
/******************************************************************************
* @file mqqt协议发布上报设备属性或设备事件数据,订阅设备功能 Project Template ../main.c
* @author txb0727
* @version V1.0.0
* @date 2023-12-10
* @brief Main program body
******************************************************************************
* @attention
* 本范例用于嵌入式开发版采用mqqt协议发布上报设备属性或设备事件数据,订阅设备功能,仅供参考
* 本范例硬件为stm32f103开发板,通讯模块为W5500以太网通讯模块
*
* <h2><center>© COPYRIGHT 2023 txb0727.</center></h2>
******************************************************************************/
/* Includes ------------------------------------------------------------------*/
#include <stm32f10x.h>
#include "FreeRTOS.H"
#include "task.h"
#include "mcu_init.h"
#include "config.h"
#include "device.h"
#include "spi2.h"
#include "socket.h"
#include "w5500.h"
#include "at24c16.h"
#include "util.h"
#include "dhcp.h"
#include "string.h"
#include <stdio.h>
#include "ts_mqtt.h"
static TaskHandle_t AppTaskCreate_Handle = NULL;/* 创建任务句柄 */
static TaskHandle_t subscribeFunctionTopicTask_Handle = NULL;/* KEY任务句柄 */
static TaskHandle_t publishPropertiesTopicTask_Handle = NULL;/* KEY任务句柄 */
static TaskHandle_t publishEventTopicTask_Handle = NULL;/* LED任务句柄 */
static TaskHandle_t dhcpTask_Handle = NULL;/* KEY任务句柄 */
static void subscribeFunctionTopicTask(void* pvParameters);/* subscribeFunctionTopicTask任务实现 */
static void publishPropertiesTopicTask(void* pvParameters);/* publishPropertiesTopicTask任务实现 */
static void publishEventTopicTask(void* pvParameters);/* publishEventTopicTask任务实现 */
static void dhcpTask(void* pvParameters);/* dhcpTask任务实现 */
static char publishPropertiesMeassage[200]; //发布物模型属性消息体
static char publishEventMeassage[200]; //发布物模型事件消息体
/******************
* 此topic对应iotrelay中继平台中定义的设备物模型属性/功能/事件,由类别标识、设备ID、物模型属性ID/功能ID/事件ID组成
*************/
//订阅物模型功能Topic
char *subscribeFunctionTopic="/iotboxFunction/44080000001111000019/F_1696584326733";
//发布物模型属性Topic
char *publishPropertiesTopic="/iotboxProperties/44080000001111000019/P_1696583483495";
//发布物模型事件Topic
char *publishEventTopic="/iotboxEvent/44080000001111000019/E_1696584389929";
static void subscribeFunctionTopicTask(void *pvParameters){
while (1) {
/*********
* 订阅iotrelay平台设备功能
* subscribeFunctionTopic 为订阅物模型功能主题
********/
subscribIotrelayModelFunction(subscribeFunctionTopic);
printf("subscribeFunctionTopicTask min free stack size is %d \r\n",(int32_t)uxTaskGetStackHighWaterMark(NULL));
vTaskDelay(5*1000); // 延时5000毫秒
}
}
static void publishPropertiesTopicTask(void *pvParameters) {
while (1) {
/*********
* 发布iotrelay平台设备属性
* publishPropertiesTopic 为发布物模型属性主题
********/
memset(publishPropertiesMeassage,0,sizeof(publishPropertiesMeassage));
publishIotrelayModelProperties(publishPropertiesTopic,publishPropertiesMeassage);
printf("publishPropertiesTopicTask min free stack size is %d \r\n",(int32_t)uxTaskGetStackHighWaterMark(NULL));
vTaskDelay(60*1000); // 延时1秒
}
}
static void publishEventTopicTask(void *pvParameters) {
while (1) {
/*********
* 发布iotrelay平台设备事件 根据业务需要调用此发布物模型事件,如设备关机、设备预警等
* publishEventTopic 为发布物模型事件主题
********/
memset(publishEventMeassage,0,sizeof(publishEventMeassage));
publishIotrelayModelEvent(publishEventTopic,publishEventMeassage);
printf("publishEventTopicTask min free stack size is %d \r\n",(int32_t)uxTaskGetStackHighWaterMark(NULL));
vTaskDelay(60*1000); // 延时1秒
}
}
static void dhcpTask(void *pvParameters) {
while (1) {
DHCP_run();
printf("dhcpTask min free stack size is %d \r\n",(int32_t)uxTaskGetStackHighWaterMark(NULL));
vTaskDelay(1000); // 延时100毫秒
}
}
static void AppTaskCreate(void){
BaseType_t xReturn = pdPASS;
taskENTER_CRITICAL();
xReturn = xTaskCreate(
(TaskFunction_t) subscribeFunctionTopicTask,
(const char*) "subscribeFunctionTopicTask",
(uint32_t) 1024,
(void*) NULL,
(UBaseType_t) 1,
(TaskHandle_t*) &subscribeFunctionTopicTask_Handle
);
if (pdPASS == xReturn)
printf("subscribeFunctionTopicTask created successfully\r\n");
else
printf("subscribeFunctionTopicTask created failed\r\n");
xReturn = xTaskCreate(
(TaskFunction_t) publishPropertiesTopicTask,
(const char*) "publishPropertiesTopicTask",
(uint32_t) 350,
(void*) NULL,
(UBaseType_t) 1,
(TaskHandle_t*) &publishPropertiesTopicTask_Handle
);
if (pdPASS == xReturn)
printf("publishPropertiesTopicTask created successfully\r\n");
else
printf("publishPropertiesTopicTask created failed\r\n");
xReturn = xTaskCreate(
(TaskFunction_t) publishEventTopicTask,
(const char*) "publishEventTopicTask",
(uint32_t) 350,
(void*) NULL,
(UBaseType_t) 1,
(TaskHandle_t*) &publishEventTopicTask_Handle
);
if (pdPASS == xReturn)
printf("publishEventTopicTask created successfully\r\n");
else
printf("publishEventTopicTask created failed\r\n");
xReturn = xTaskCreate(
(TaskFunction_t) dhcpTask,
(const char*) "dhcpTask",
(uint32_t) 100,
(void*) NULL,
(UBaseType_t) 1,
(TaskHandle_t*) &dhcpTask_Handle
);
if (pdPASS == xReturn)
printf("dhcpTask created successfully\r\n");
else
printf("dhcpTask created failed\r\n");
vTaskDelete(AppTaskCreate_Handle);
taskEXIT_CRITICAL();
}
int main()
{
BaseType_t xReturn = pdPASS;
RCC_Configuration(); /* 配置单片机系统时钟*/
NVIC_Configuration();/* 配置嵌套中断向量*/
Systick_Init(72);/* 初始化Systick工作时钟*/
GPIO_Configuration();/* 配置GPIO*/
Timer_Configuration();/*定时器初始化*/
USART1_Init(); /*初始化串口通信:115200@8-n-1*/
at24c16_init();/*初始化eeprom*/
printf("W5500 EVB initialization over.\r\n");
Reset_W5500();/*硬重启W5500*/
WIZ_SPI_Init();/*初始化SPI接口*/
printf("W5500 initialized!\r\n");
set_default();
init_dhcp_client();
// 创建任务
xReturn = xTaskCreate(
(TaskFunction_t) AppTaskCreate,
(const char*) "AppTaskCreate",
(uint32_t) 128,
(void*) NULL,
(UBaseType_t) 3,
(TaskHandle_t*) &AppTaskCreate_Handle
);
if (xReturn == pdPASS)
vTaskStartScheduler(); // 启动调度器
while(1);
}
/******************* (C) COPYRIGHT 2023 txb0727 ****** END OF FILE ****/
#include "ts_mqtt.h"
#include "MQTTPacket.h"
#include "transport.h"
#include "util.h"
#include "w5500.h"
#include "socket.h"
#include <string.h>
#include <stdlib.h>
#include "stm32f10x.h" // Device header
#include "base64.h"
#include "cJSON.h"
#include "utf8_gb2312_switch.h"
char *mqtt_clientID="44080000001111000019"; //Mqtt 客户端ID 填写iotrelay中继平台接入设备的ID
char *mqtt_account = "iotrelayAdmin"; //Mqtt 服务器连接账号 填写iotrelay中继平台接入设备接口生成的账号
char *mqtt_password = "txb021218"; //Mqtt 服务器连接密码 填写iotrelay中继平台接入设备接口生成的口令
uint16 local_port = 5000; //设置开发板本地端口
uint8 remote_ip[4] = {192, 168, 0, 103}; //连接mqtt服务器端口
uint16 remote_port = 1883; //连接mqtt服务器端口
//MQTT发布消息函数
/*********
* 发布iotrelay平台设备属性 消息体内容Base64加密传输
* @params pTopic 为发布物模型属性主题 ,此topic对应iotrelay中继平台中定义的设备物模型属性数据,由类别标识、设备ID、物模型属性ID组成,例如 "/iotboxProperties/44080000001111000019/P_1696583483495"
* @params publishPropertiesMeassage 为发布消息体内容
********/
void publishIotrelayModelProperties(char *pTopic,char *publishPropertiesMeassage)
{
MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
int rc = 1;
int mysock = SOCK_PROPERTIES;
unsigned char buf[200];
int buflen = sizeof(buf);
MQTTString topicString = MQTTString_initializer;
int len = 0;
switch (getSn_SR(SOCK_PROPERTIES))
{
case SOCK_CLOSED:
socket(SOCK_PROPERTIES, Sn_MR_TCP, local_port++, Sn_MR_ND);
printf("SOCK_CLOSED \r\n");
break;
case SOCK_INIT:
connect(SOCK_PROPERTIES, remote_ip, remote_port);
printf("SOCK_INIT \r\n");
break;
case SOCK_ESTABLISHED:
if (getSn_IR(SOCK_PROPERTIES)&Sn_IR_CON)
{
printf("TCP established \r\n");
setSn_IR(SOCK_PROPERTIES, Sn_IR_CON);
}
data.clientID.cstring = mqtt_clientID; //client ID
data.keepAliveInterval = 60; //keep alive time
data.cleansession = 1; // clean the last info after re-link (1: clean; 0: not clean)
data.username.cstring = mqtt_account; // the username if MQTT server need
data.password.cstring = mqtt_password; // the password if MQTT server need
len = MQTTSerialize_connect(buf, buflen, &data); // Serialize the MQTT Packet according the connect data
printf("Serialize the MQTT Packet according the connect data %d \r\n",len);
rc = transport_sendPacketBuffer(mysock, buf, len); // sned packet to Server by driver
printf("sned packet to Server by driver %d \r\n",rc);
/*wait for connack*/
if (MQTTPacket_read(buf, buflen, transport_getdata3)==CONNACK) // call the driver to get conn ack packet from Server
{
unsigned char sessionPresent, connack_rc;
if (MQTTDeserialize_connack(&sessionPresent, &connack_rc, buf, buflen) != 1 || connack_rc != 0) //deserialize packet to confirm the MQTT connect success
{
printf("Unable to connect, return code %d \n", connack_rc);
transport_close(mysock);
// return 0;
}
else
{
printf("Connect succeed!\r\n");
}
}
else
{
transport_close(mysock);
// return 0;
}
/****
*此处为构建上报的报文,获取设备属性数据在此填入,例如在此调用gpio获取设备的温度,在此范例处先直接填入数字
*上报设备物模型属性数据,例如 温度 36 度,
*****/
char *indata="36"; //上报设备属性数据 温度 ,在此范例处先直接填入数字,实际应用调用gpio获取设备的物模型属性数据
char outdata[20]; //加密后数据
int outlen;
memset(outdata,0,sizeof(outdata));
/* 对上报属性数据Base64加密处理 */
int jm= base64_encode(indata, strlen(indata), outdata, &outlen);
printf("加密后数据: %s \r\n",outdata);
strcpy(publishPropertiesMeassage,outdata);//填充Ba64加密后的消息体内容
int pubStringLen= strlen(publishPropertiesMeassage);
printf(" char *pubString. %s \r\n",publishPropertiesMeassage);
memset(buf,0,buflen);
topicString.cstring = pTopic; // publish topic name to Server
len = MQTTSerialize_publish(buf, buflen, 0, 0, 0, 0, topicString, (unsigned char*)publishPropertiesMeassage, pubStringLen);
rc = transport_sendPacketBuffer(mysock, buf, len);
printf("disconnecting. \r\n");
len = MQTTSerialize_disconnect(buf, buflen);
rc = transport_sendPacketBuffer(mysock, buf, len);
free(outdata);
free(buf);
break;
case SOCK_CLOSE_WAIT:
close(SOCK_PROPERTIES);
printf("SOCK_CLOSE_WAIT. \r\n");
break;
}
}
/*********
* 发布iotrelay平台设备事件 消息体内容Base64加密传输
* @params pTopic 为发布物模型事件主题 ,此topic对应iotrelay中继平台中定义的设备物模型事件数据,由类别标识、设备ID、物模型事件ID组成,例如 "/iotboxEvent/44080000001111000019/E_1696584389929"
* @params publishEventMeassage 为发布消息体内容
********/
void publishIotrelayModelEvent(char *pTopic,char *publishEventMeassage)
{
MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
int rc = 1;
int mysock = SOCK_EVENT;
unsigned char buf[200];
int buflen = sizeof(buf);
MQTTString topicString = MQTTString_initializer;
int len = 0;
switch (getSn_SR(SOCK_EVENT))
{
case SOCK_CLOSED:
socket(SOCK_EVENT, Sn_MR_TCP, local_port++, Sn_MR_ND);
printf("SOCK_CLOSED \r\n");
break;
case SOCK_INIT:
connect(SOCK_EVENT, remote_ip, remote_port);
printf("SOCK_INIT \r\n");
break;
case SOCK_ESTABLISHED:
if (getSn_IR(SOCK_EVENT)&Sn_IR_CON)
{
printf("TCP established \r\n");
setSn_IR(SOCK_EVENT, Sn_IR_CON);
}
data.clientID.cstring = mqtt_clientID; //client ID
data.keepAliveInterval = 60; //keep alive time
data.cleansession = 1; // clean the last info after re-link (1: clean; 0: not clean)
data.username.cstring = mqtt_account; // the username if MQTT server need
data.password.cstring = mqtt_password; // the password if MQTT server need
len = MQTTSerialize_connect(buf, buflen, &data); // Serialize the MQTT Packet according the connect data
printf("Serialize the MQTT Packet according the connect data %d \r\n",len);
rc = transport_sendPacketBuffer(mysock, buf, len); // sned packet to Server by driver
printf("sned packet to Server by driver %d \r\n",rc);
/*wait for connack*/
if (MQTTPacket_read(buf, buflen, transport_getdata4)==CONNACK) // call the driver to get conn ack packet from Server
{
unsigned char sessionPresent, connack_rc;
if (MQTTDeserialize_connack(&sessionPresent, &connack_rc, buf, buflen) != 1 || connack_rc != 0) //deserialize packet to confirm the MQTT connect success
{
printf("Unable to connect, return code %d \r\n", connack_rc);
transport_close(mysock);
// return 0;
}
else
{
printf("Connect succeed!\r\n");
}
}
else
{
transport_close(mysock);
// return 0;
}
/****
* 此处为构建上报的报文,设备属性数据在此填入,例如在此调用gpio获取设备的湿度、温度
*上报设备物模型事件数据,事件数据为json数值格式,由物模型事件属性中的输出参数组成,
* 例如:设备关机事件上报数据
* 数据为json格式字符串 "[{\"paramsId\":\"suning\", \"dataValue\": \"80\" },{\"paramsId\": \"temperature\", \"dataValue\": \"45\"}]"
*****/
char *indata="[{\"paramsId\":\"suning\", \"dataValue\": \"80\" },{\"paramsId\": \"temperature\", \"dataValue\": \"45\"}]"; //上报设备事件数据
printf("加密前报文: %s \r\n",indata);
char outdata[512]; //加密后数据
int outlen;
memset(outdata,0,sizeof(outdata));
/* 对上报数据Base64加密处理 */
int jm= base64_encode(indata, strlen(indata), outdata, &outlen);
printf("加密后数据: %s \r\n",outdata);
strcpy(publishEventMeassage,outdata);//填充Ba64加密后的消息体内容
int pubStringLen= strlen(publishEventMeassage);
printf(" char *pubString. %s \r\n",publishEventMeassage);
memset(buf,0,buflen);
topicString.cstring = pTopic; // publish topic name to Server
len = MQTTSerialize_publish(buf, buflen, 0, 0, 0, 0, topicString, (unsigned char*)publishEventMeassage, pubStringLen);
rc = transport_sendPacketBuffer(mysock, buf, len);
printf("disconnecting. \r\n");
len = MQTTSerialize_disconnect(buf, buflen);
rc = transport_sendPacketBuffer(mysock, buf, len);
free(outdata);
free(buf);
break;
case SOCK_CLOSE_WAIT:
close(SOCK_EVENT);
printf("SOCK_CLOSE_WAIT. \r\n");
break;
}
}
/*********
* MQTT订阅消息函数
* 订阅iotrelay平台设备物模型功能
* @params pTopic 为订阅物模型功能主题 ,此topic对应iotrelay中继平台中定义的设备物模型功能数据,由类别标识、设备ID、物模型功能ID组成,例如 "/iotboxFunction/44080000001111000019/F_1696584326733"
*
********/
void subscribIotrelayModelFunction(char *pTopic)
{
MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
int rc = 1;
int mysock = SOCK_SUBSCRIBED;
unsigned char buf[256];
int buflen = sizeof(buf);
int msgid = 1;
MQTTString topicString = MQTTString_initializer;
int req_qos = 0;
int len = 0;
switch (getSn_SR(SOCK_SUBSCRIBED))
{
case SOCK_CLOSED:
socket(SOCK_SUBSCRIBED, Sn_MR_TCP, local_port++, Sn_MR_ND);
printf("SOCK_CLOSED \r\n");
break;
case SOCK_INIT:
connect(SOCK_SUBSCRIBED, remote_ip, remote_port);
printf("SOCK_INIT \r\n");
break;
case SOCK_ESTABLISHED:
if (getSn_IR(SOCK_SUBSCRIBED)&Sn_IR_CON)
{
printf("TCP established \r\n");
setSn_IR(SOCK_SUBSCRIBED, Sn_IR_CON);
}
data.clientID.cstring = mqtt_clientID; //client ID
data.keepAliveInterval = 20; //keep alive time
data.cleansession = 1; // clean the last info after re-link (1: clean; 0: not clean)
data.username.cstring = mqtt_account; // the username if MQTT server need
data.password.cstring = mqtt_password; // the password if MQTT server need
len = MQTTSerialize_connect(buf, buflen, &data); // Serialize the MQTT Packet according the connect data
printf("Serialize the MQTT Packet according the connect data %d buf: %s \r\n",len,buf);
rc = transport_sendPacketBuffer(mysock, buf, len); // sned packet to Server by driver
printf("sned packet to Server by driver %d \r\n",rc);
vTaskDelay(5*1000);
/*wait for connack*/
if (MQTTPacket_read(buf, buflen, transport_getdata2)==CONNACK) // call the driver to get conn ack packet from Server
{
unsigned char sessionPresent, connack_rc;
if (MQTTDeserialize_connack(&sessionPresent, &connack_rc, buf, buflen) != 1 || connack_rc != 0) //deserialize packet to confirm the MQTT connect success
{
printf("Unable to connect, return code %d \r\n", connack_rc);
transport_close(mysock);
// return 0;
}
else
{
printf("Connect succeed!\r\n");
}
}
else
{
transport_close(mysock);
// return -1;
}
printf("into subscribe topic name from Server \r\n");
/*subscribe*/
topicString.cstring =pTopic; // subscribe topic name from Server
len = MQTTSerialize_subscribe(buf, buflen, 0, msgid, 1, &topicString, &req_qos); //serialize subscribe topic packet
rc = transport_sendPacketBuffer(mysock, buf, len); // sned packet to Server by driver
/* wait for suback */
if (MQTTPacket_read(buf, buflen, transport_getdata2) == SUBACK) // call the driver to get subscribe ack packet from Server
{
unsigned short submsgid;
int subcount;
int granted_qos;
rc = MQTTDeserialize_suback(&submsgid, 1, &subcount, &granted_qos, buf, buflen); // deserialize packet to confirm the MQTT subscribe success
if (granted_qos != 0)
{
printf("granted qos != 0, %d \r\n", granted_qos);
transport_close(mysock);
// return -1;
}
else
{
printf("Received suback \r\n");
}
}
else
{
transport_close(mysock);
// return -1;
}
vTaskDelay(5*1000);
printf("loop get msgs on 'subscribed' topic. %s \r\n",pTopic);
printf("loop get msgs on 'subscribed' topic. \r\n");
/*loop get msgs on 'subscribed' topic and send msgs on 'pubtopic' topic*/
memset(buf,0,buflen);
/*接收数据会阻塞,除非服务器断开连接后才返回*/
while(getSn_SR(SOCK_SUBSCRIBED)==SOCK_ESTABLISHED)
{
printf("接收数据会阻塞. buf: %s buflen= %d\r\n",buf,buflen);
/* transport_getdata() has a built-in 1 second timeout,
your mileage will vary */
if (MQTTPacket_read(buf, buflen, transport_getdata2) == PUBLISH)
{
unsigned char dup; //re-send flag
int qos=0; // Service quality level
unsigned char retained; //keep flag
unsigned short msgid;
int payloadlen_in;
unsigned char* payload_in;
MQTTString receivedTopic;
printf("接收数据会阻塞. buf: %s buflen= %d\r\n",buf,buflen);
rc = MQTTDeserialize_publish(&dup, &qos, &retained, &msgid, &receivedTopic,
&payload_in, &payloadlen_in, buf, buflen);
printf("message arrived %d: %s\n\r", payloadlen_in, payload_in);
if(payload_in!=NULL){
if (strlen((const char *)payload_in) > 0) {
//Base64解密接收到的报文
char outdata[600]; //接收到的报文数据
int outlen;
memset(outdata,0,sizeof(outdata));
int jm= base64_decode((const char *)payload_in, strlen((const char *)payload_in), outdata, &outlen);
if(jm<0){
printf("解密数据错误:\r\n");
}else{
printf("解密后数据: %s \r\n",outdata);
//解析JSON格式字符串
cJSON *root = cJSON_Parse(outdata);
if(root != NULL)
{
char *json_str = cJSON_Print(root);
printf("解析解密后的JSON数据 %s", json_str);
//此处根据获取的物模型功能指令,填写设备需要操作的代码,例如设备关机
char *deviceId = cJSON_GetObjectItem(root,"deviceId")->valuestring;
printf("deviceId = %s\r\n",deviceId);//解析获取的设备ID
char *functionId = cJSON_GetObjectItem(root,"functionId")->valuestring;
printf("functionId = %s\r\n",functionId);//解析获取的物模型功能ID
char *functionName = cJSON_GetObjectItem(root,"functionName")->valuestring;
printf("functionName = %s\r\n",functionName);//解析获取的物模型功能命令字符串
//解析解密后的JSON格式字符串 根据解析的数据,提供设备的功能服务,例如设备关机
/*
{
"deviceId": "44080000001111000019",
"functionId": "F_1696584326733",
"functionName": "close system"
}
*/
cJSON_Delete(root); // 释放内存空间
}
else
{
printf("Error before: [%s]\r\n",cJSON_GetErrorPtr());
}
}
free(outdata);
}
}
}
else
{
printf("No data arrived.\r\n");
}
}
// Delay_s(1);
vTaskDelay(5*1000);
printf("disconnecting. \r\n");
len = MQTTSerialize_disconnect(buf, buflen);
rc = transport_sendPacketBuffer(mysock, buf, len);
free(buf);
break;
case SOCK_CLOSE_WAIT:
close(SOCK_SUBSCRIBED);
printf("SOCK_CLOSE_WAIT. \r\n");
rc=1;
break;
}
// return rc;
}
Mqtt协议接入STM例程打包源码进入IOT中继宝盒主操作界面打开“IOT设备接口”窗口,选择对应的设备–设备接入端接口中对应的协议接入样例中下载。
简介:
本章节以嵌入式芯片设备采用http协议接入本IOT中继平台为例程。 设备采用http协议接入本IOT中继系统平台,主要实现从接入设备上报物模型属性数据。 设备侧根据业务需要周期性调用此接口向平台上报设备属性数据,例如:间隔10分钟上报设备温度。
针对嵌入式设备, 上报设备属性数据报文由json字符串组成,数据报文对json字符串base64加密传输(本例程以stm32开发版+W5500以太网模块设备接入为例)。
设备接入提交报文
设备接入认证与数据json字符串格式如下:
{
"secretKey": "44080000001111000017,134xxxxxxxx,xxxxxx",
"protertiesData": [
{ "propertiesId": "P_1697248637282", "dataValue": "36" },
{ "propertiesId": "P_1697250944699", "dataValue": "55" },
。。。。。。
]
}
参数说明:
| 参数 | 说明 |
|---|---|
| secretKey | 设备认证secretKey,由设备ID,登录账号,密钥加逗号拼接组成。 "44080000001111000017“为接入设备ID标识值 ”134xxxxxxxx“为IOT设备接入设置的连接账号 (此设备采用http协议接入,在IOT设备接入配置中设置的设备连接账号)。 ”xxxxxx"为 IOT设备接入设置的连接口令 (此设备采用http协议接入,在IOT设备接入配置中设置的设备连接口令)。 |
| protertiesData | 为属性数据集合标识,固定字符; |
| propertiesId | 为物模型属性标识,固定字符; “P_1697248637282”、“P_1697250944699” 为在本iot平台设备建模配置的物模型属性ID标识值,根据平台设置替换; |
| dataValue | 为物模型属性数据值标识,固定字符; "“36” 为您要上报的属性实际数值,例如温度36 度(设备的属性值为您程序开发中获取,获取后替换); “55” 为您要上报的属性实际数值,例如湿度55 度(设备的属性值为您程序开发中获取,获取后替换); |
上报属性报文URL: "/httpService/UpPropertiesData"
Request Method:POST
设备接入提交报文
设备接入认证与数据json字符串格式如下:
{
"secretKey": "44080000001111000017,134xxxxxxxx,xxxxxx",
"eventId": "E_1697248913306",
"paramsList": [
{ "paramsId": "aaaaaa", "dataValue": "36" },
{ "paramsId": "bbbbbb", "dataValue": "45" },
。。。。。。
]
}
参数说明:
| 参数 | 说明 |
|---|---|
| secretKey | 设备认证secretKey,由设备ID,登录账号,密钥加逗号拼接组成。 "44080000001111000017“为接入设备ID标识值 ”134xxxxxxxx“为IOT设备接入设置的连接账号 (此设备采用http协议接入,在IOT设备接入配置中设置的设备连接账号)。 ”xxxxxx"为 IOT设备接入设置的连接口令 (此设备采用http协议接入,在IOT设备接入配置中设置的设备连接口令)。 |
| eventId | 为物模型事件标识,固定字符; “E_1697248913306” 为您在本iot平台设备建模配置的物模型事件ID标识值,根据平台设置替换; |
| paramsList | 为上报事件附带的属性数据集合标识,固定字符; |
| paramsId | 为附带的属性数据值标识,固定字符; “aaaaaa” “bbbbbb” 为附带的属性数据值,根据平台设置替换; |
| dataValue | 为物模型属性数据值标识,固定字符; “36” 为您要上报的属性实际数值,例如温度36 度(设备的属性值为您程序开发中获取,获取后替换); “45” 为您要上报的属性实际数值,45 (设备的属性值为您程序开发中获取,获取后替换); |
上报设备事件报文URL: "/httpService/UpEventData"
Request Method: POST
/*******************************************************************************
* @file http协议上报设备属性或设备事件数据 Template ../main.c
* @author txb0727
* @version V1.0.0
* @date 2023-12-10
* @brief Main program body
******************************************************************************
* @attention
* 本范例用于嵌入式开发版采用http协议上报设备属性或设备事件数据,仅供参考
* 本范例硬件为stm32f103开发板,通讯模块为W5500以太网通讯模块
*
* <h2><center>© COPYRIGHT 2023 txb0727.</center></h2>
******************************************************************************/
/* Includes ------------------------------------------------------------------*/
#include <stm32f10x.h>
#include "mcu_init.h"
#include "config.h"
#include "device.h"
#include "spi2.h"
#include "socket.h"
#include "w5500.h"
#include "at24c16.h"
#include "util.h"
#include "dhcp.h"
#include "string.h"
#include <stdio.h>
#include "http_client.h"
/**********************
* 上报设备属性数据报文由此样例json字符串组成, 数据报文对json字符串base64加密传输
* 上报设备属性数据json字符串样例:
* "{\"secretKey\":\"44080000001111000017,13437156569,123456\",\"protertiesData\":[{\"propertiesId\":\"P_1697248637282\",\"dataValue\":\"36\"},{\"propertiesId\":\"P_1697250944699\",\"dataValue\":\"55\"},............{\"propertiesId\":\"P_1697250944999\",\"dataValue\":\"55\"}]}"
* json字符串内容说明:json字符串包含两部分,一是设备认证secretKey,由设备ID,登录账号,密钥加逗号拼接组成;
* 二是设备属性数据集合,可以多个属性数据
* 样例中 "secretKey" 为设备认证secretKey标识, "44080000001111000017" 为在本iot平台添加的设备ID; "13437156569" 为您在本iot平台设备接入配置设置的账户; "123456" 为您在本iot平台设备接入配置设置的接入口令;
* "protertiesData"为属性数据集合标识; "propertiesId"为物模型属性标识,固定字符;
* "P_1697248637282"、"P_1697250944699" 为您在本iot平台设备建模配置的物模型属性ID标识值,根据平台设置替换;
* "dataValue" 为物模型属性数据值标识,固定字符;
* "36" 为您要上报的属性实际数值,例如温度36 度(设备的属性值为您程序开发中获取,获取后替换);
* "55"为您要上报的属性实际数值,例如湿度55 度(设备的属性值为您程序开发中获取,获取后替换);
*
* ***************/
const char *uploadPropertiesData="{\"secretKey\":\"44080000001111000017,13437156569,123456\",\"protertiesData\":[{\"propertiesId\":\"P_1697248637282\",\"dataValue\":\"36\"},{\"propertiesId\":\"P_1697250944699\",\"dataValue\":\"55\"}]}";
/**********************
* 上报设备事件数据报文由此样例json字符串组成, 数据报文对json字符串base64加密传输
* 上报设备事件数据json字符串样例:
* "{\"secretKey\":\"44080000001111000017,13437156569,123456\",\"eventId\":\"E_1697248913306\",\"paramsList\":[{\"paramsId\":\"aaaaaa\",\"dataValue\":\"36\"},{\"paramsId\":\"bbbbbb\",\"dataValue\":\"45\"},.......{\"paramsId\":\"bbbbbb\",\"dataValue\":\"45\"}]}"
* json字符串内容说明:json字符串包含两部分,一是设备认证secretKey,由设备ID,登录账号,密钥加逗号拼接组成;
* 二是设备事件数据集合,用于上传事件发生时上报设备的属性数据,可以多个也可以为空
* 样例中 "secretKey" 为设备认证secretKey标识, "44080000001111000017" 为在本iot平台添加的设备ID; "13437156569" 为您在本iot平台设备接入配置设置的账户; "123456" 为您在本iot平台设备接入配置设置的接入口令;
* "eventId"为物模型事件标识,固定字符;
* "E_1697248913306" 为您在本iot平台设备建模配置的物模型事件ID标识值,根据平台设置替换;
* "paramsList" 为上报事件附带的属性数据集合标识,固定字符;
* "paramsId" 为附带的属性数据值标识,固定字符;
* "aaaaaa" "bbbbbb" 为附带的属性数据值,根据平台设置替换;
* "dataValue" 为物模型属性数据值标识,固定字符;
* "36" 为您要上报的属性实际数值,例如温度36 度(设备的属性值为您程序开发中获取,获取后替换);
* "45"为您要上报的属性实际数值,例如湿度45 度(设备的属性值为您程序开发中获取,获取后替换);
*
* ***************/
const char *uploadEventData="{\"secretKey\":\"44080000001111000017,13437156569,123456\",\"eventId\":\"E_1697248913306\",\"paramsList\":[{\"paramsId\":\"aaaaaa\",\"dataValue\":\"36\"},{\"paramsId\":\"bbbbbb\",\"dataValue\":\"45\"}]}";
uint16 local_port = 5000; //设置开发板本地端口
uint8 remote_ip[4] = {192, 168, 0, 105}; //连接服务器IP,即为iot平台IP
uint16 remote_port = 18080; //连接服务器端口,即为iot平台端口
int main()
{
RCC_Configuration(); /* 配置单片机系统时钟*/
NVIC_Configuration();/* 配置嵌套中断向量*/
Systick_Init(72);/* 初始化Systick工作时钟*/
GPIO_Configuration();/* 配置GPIO*/
Timer_Configuration();/*定时器初始化*/
USART1_Init(); /*初始化串口通信:115200@8-n-1*/
at24c16_init();/*初始化eeprom*/
printf("W5500 EVB initialization over.\r\n");
Reset_W5500();/*硬重启W5500*/
WIZ_SPI_Init();/*初始化SPI接口*/
printf("W5500 initialized!\r\n");
set_default();
init_dhcp_client();
while(1)
{
if(DHCP_run()){
//执行http client主函数,上报属性数据
do_upload_properties_data(uploadPropertiesData,local_port,remote_ip,remote_port);
//执行http client主函数,上报设备事件数据,根据业务情况触发调用
// do_upload_event_data(uploadEventData,local_port,remote_ip,remote_port);
}else{
DHCP_run();
};
}
}
/******************* (C) COPYRIGHT 2023 txb0727 ****** END OF FILE ****/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "http_client.h"
#include "w5500.h"
#include "socket.h"
#include "util.h"
#include "base64.h"
/***************************************************************************
*@brief 执行http client主函数,上报属性数据
*@param uploadPropertiesData 为上传的属性数据json字符串
*@param local_port 为自定义开发版端口
*@param remote_ip 为iot平台IP
*@param remote_port 为iot平台端口
*@return 无
****************************************************************************/
void do_upload_properties_data(const char *uploadPropertiesData,uint16 local_port,uint8 remote_ip[4] ,uint16 remote_port)
{
switch (getSn_SR(SOCK_LOGIN))
{
case SOCK_CLOSED:
socket(SOCK_LOGIN, Sn_MR_TCP, local_port++, Sn_MR_ND);
printf("SOCK_CLOSED \r\n");
break;
case SOCK_INIT:
connect(SOCK_LOGIN, remote_ip, remote_port);
printf("SOCK_INIT \r\n");
break;
case SOCK_ESTABLISHED:
if (getSn_IR(SOCK_LOGIN)&Sn_IR_CON)
{
printf("TCP established \r\n");
setSn_IR(SOCK_LOGIN, Sn_IR_CON);
}
char http_request_body[512];
char *str=(char *)malloc(128);
char secretbody[320]={0};
char secretbodyvalue[300]={0}; //base64加密:后的报文内容
int secretbodyvaluelen;
// printf("base64加密前: %s\r\n",uploadPropertiesData);
base64_encode(uploadPropertiesData,strlen(uploadPropertiesData), secretbodyvalue,&secretbodyvaluelen); //对上传报文base64加密
// printf("base64加密: %s secretbodyvaluelen: %d \r\n\r\n",secretbodyvalue,secretbodyvaluelen);
memset(http_request_body, 0, 512);
strcat(http_request_body, "POST /httpService/UpPropertiesData HTTP/1.1\r\n"); // /httpService/UpPropertiesData 为向iot平台提交数据数据地址
strcat(http_request_body, "Connection:Keep-Alive\r\n");
strcat(http_request_body, "Host: 192.168.0.105:18080\r\n"); //字符串内“192.168.0.105:18080”为iot平台的连接IP和端口
strcat(http_request_body, "Accept: */*\r\n");
strcat(http_request_body, "Content-Type:application/x-www-form-urlencoded; charset=UTF-8\r\n");
strcat(http_request_body, "Content-Length: ");
sprintf(secretbody, "%s", "secretbody=");
strcat(secretbody, secretbodyvalue);
sprintf(str, "%d", strlen(secretbody));
// printf("secretbody:%s strlen(secretbody):%d \r\n",secretbody,strlen(secretbody));
strcat(http_request_body, str);
strcat(http_request_body, "\r\n\r\n");
//secretkey的值为post的数据
strcat(http_request_body, secretbody);
strcat(http_request_body, "\r\n\r\n");
printf("发送请求体:%s\r\n",http_request_body);
send(SOCK_LOGIN, (u_char *)http_request_body, strlen(http_request_body));
//释放内存空间
free(str);
free(secretbody);
free(secretbodyvalue);
free(http_request_body);
Delay_s(60); //延时60秒,根据业务要求的上报时间确定
break;
case SOCK_CLOSE_WAIT:
close(SOCK_LOGIN);
printf("SOCK_CLOSE_WAIT. \r\n");
break;
}
}
/******************************************************
*@brief 执行http client主函数,上报设备事件数据
*@param uploadEventData 为上传的设备事件数据json字符串
*@param local_port 为自定义开发版端口
*@param remote_ip 为iot平台IP
*@param remote_port 为iot平台端口
*@return 无
********************************************************/
void do_upload_event_data(const char *uploadEventData,uint16 local_port,uint8 remote_ip[4] ,uint16 remote_port)
{
switch (getSn_SR(SOCK_LOGIN))
{
case SOCK_CLOSED:
socket(SOCK_LOGIN, Sn_MR_TCP, local_port++, Sn_MR_ND);
printf("SOCK_CLOSED \r\n");
break;
case SOCK_INIT:
connect(SOCK_LOGIN, remote_ip, remote_port);
printf("SOCK_INIT \r\n");
break;
case SOCK_ESTABLISHED:
if (getSn_IR(SOCK_LOGIN)&Sn_IR_CON)
{
printf("TCP established \r\n");
setSn_IR(SOCK_LOGIN, Sn_IR_CON);
}
char http_request_body[512];
char *str=(char *)malloc(128);
char secretbody[320]={0};
char secretbodyvalue[300]={0}; //base64加密:后的报文内容
int secretbodyvaluelen;
// printf("base64加密前: %s\r\n",uploadEventData);
base64_encode(uploadEventData,strlen(uploadEventData), secretbodyvalue,&secretbodyvaluelen); //对上传报文base64加密
// printf("base64加密: %s secretbodyvaluelen: %d \r\n\r\n",secretbodyvalue,secretbodyvaluelen);
memset(http_request_body, 0, 512);
strcat(http_request_body, "POST /httpService/UpEventData HTTP/1.1\r\n");// /httpService/UpEventData 为向iot平台提交设备事件地址
strcat(http_request_body, "Connection:Keep-Alive\r\n");
strcat(http_request_body, "Host: 192.168.0.105:18080\r\n"); //字符串内“192.168.0.105:18080”为iot平台的连接IP和端口
strcat(http_request_body, "Accept: */*\r\n");
strcat(http_request_body, "Content-Type:application/x-www-form-urlencoded; charset=UTF-8\r\n");
strcat(http_request_body, "Content-Length: ");
sprintf(secretbody, "%s", "secretbody=");
strcat(secretbody, secretbodyvalue);
sprintf(str, "%d", strlen(secretbody));
// printf("secretbody:%s strlen(secretbody):%d \r\n",secretbody,strlen(secretbody));
strcat(http_request_body, str);
strcat(http_request_body, "\r\n\r\n");
//secretkey的值为post的数据
strcat(http_request_body, secretbody);
strcat(http_request_body, "\r\n\r\n");
printf("发送请求体:%s\r\n",http_request_body);
send(SOCK_LOGIN, (u_char *)http_request_body, strlen(http_request_body));
//释放内存空间
free(str);
free(secretbody);
free(secretbodyvalue);
free(http_request_body);
// Delay_s(2);
break;
case SOCK_CLOSE_WAIT:
close(SOCK_LOGIN);
printf("SOCK_CLOSE_WAIT. \r\n");
break;
}
}
Http协议接入STM例程打包源码进入IOT中继宝盒主操作界面打开“IOT设备接口”窗口,选择对应的设备–设备接入端接口中对应的协议接入样例中下载。
本章节以嵌入式芯片设备采用Websocket协议接入本IOT中继平台为例程。设备采用Websocket协议接入本IOT中继平台,实现从接入设备上报物模型属性数据。 设备侧根据业务需要周期性调用此接口向平台上报设备属性数据,例如:间隔10分钟上报设备温度、湿度等,本IOT平台websocket协议接入只支持上报物模型属性数据。
针对嵌入式设备, 上报设备属性数据报文由json字符串组成,数据报文对json字符串base64加密传输(本例程以stm32f403开发版+lwip+freeRTOS接入为例)。
服务器地址:ws://192.168.0.105:18080( IOT中继宝盒IOT设备接口–配置说明中显示的连接地址和端口)
用户名: 134xxxxxxxx(IOT中继宝盒IOT设备接入–设备接入配置 填写的连接账号)
密码:XXXXXX(IOT中继宝盒IOT设备接入–设备接入配置 填写的连接口令)
设备连接KEY: NDQwODAwMDAwMDExMTEwMDAwMjEsMTM0MzcxNTY1NjksMTIzNDU2(IOT设备接入key格式为:设备ID+逗号+连接用户名+逗号+连接密码 拼接的字符串BASE64 加密生成 )
设备连接请求地址: ws://192.168.0.105:18080/websocket/NDQwODAwMDAwMDExMTEwMDAwMjEsMTM0MzcxNTY1NjksMTIzNDU2
上报报文请求地址:ws://192.168.0.105:18080/websocket/NDQwODAwMDAwMDExMTEwMDAwMjEsMTM0MzcxNTY1NjksMTIzNDU2
上报报文为json格式字符串:
加密前报文上报属性数据json字符串内容:
{
"secrecetKey": "44080000001111000021,134xxxxxxxx,xxxxxx" , // 设备ID+逗号+连接用户名+逗号+连接密码 拼接的字符串
"secrecetBody": [ // 设备上报物模型属性数据
{"propertiesId": "P_1704161791995", "dataValue": "20" },
{"propertiesId": "P_1704161977952", "dataValue": "42"},
...... ]
}
JSON字段参数说明:
| secrecetKey | 设备连接KEY: 设备ID+逗号+连接用户名+逗号+连接密码 拼接的字符串 “44080000001111000021” 为接入设备ID标识; "134xxxxxxxx“为在设备接入配置里面配置的此设备的接入账号; ”xxxxxx"为在设备接入配置里面配置的此设备的接入口令。 |
|---|---|
| secrecetBody | 上报设备属性数据集合标识 |
| propertiesId | 上报设备属性数据ID标识,为设备物模型配置的属性ID标识 如上例 “P_1704161791995” 、 “P_1704161977952” |
| dataValue | 上报设备属性数据值,dataValue 为属性值标识 上例 “20” 、 “42” 上报设备属性数据值 |
加密后的报文上报属性数据json字符串内容:
eyJzZWNyZWNldEtleSI6IjQ0MDgwMDAwMDAxMTExMDAwMDIxLDEzNDM3MTU2NTY5LHh4eHh4eCIsInNlY3JlY2V0Qm9keSI6W3sicHJvcGVydGllc0lkIjoiUF8xNzA0MTYxNzkxOTk1IiwiZGF0YVZhbHVlIjoiMjAifSx7InByb3BlcnRpZXNJZCI6IlBfMTcwNDE2MTk3Nzk1MiIsImRhdGFWYWx1ZSI6IjQyIn1dfQ==
websocket.h文件中定义:
#define SERVER_IP "192.168.0.105" //本IOT中继平台设备接入配置的IOT平台连接IP #define SERVER_PORT 18080 //本IOT中继平台设备接入配置的IOT平台连接端口 #define SERVER_PATH "/websocket/" //在本IOT中继平台设备接入配置的websocket协议访问地址 #define AUTH_KEY "44080000001111000021,134xxxxxxxx,xxxxxx" //发送的设备认证KEY 由设备ID+逗号+连接用户名+逗号+连接密码 拼接而成
参数说明:
| 参数 | 说明 |
|---|---|
| SERVER_IP | 本IOT中继平台设备接入配置的IOT平台连接IP |
| SERVER_PORT | 本IOT中继平台设备接入配置的IOT平台连接端口 |
| SERVER_PATH | 在本IOT中继平台设备接入配置的websocket协议访问地址 |
| AUTH_KEY | 设备连接KEY: 设备ID+逗号+连接用户名+逗号+连接密码 拼接的字符串 “44080000001111000021” 为接入设备ID标识; "134xxxxxxxx"为在设备接入配置里面配置的此设备的接入账号; "xxxxxx"为在设备接入配置里面配置的此设备的接入口令。 |
/*******************************************************************************
* @file websocket协议上报设备属性或设备事件数据 Template ../main.c
* @author txb0727
* @version V1.0.0
* @date 2023-12-10
* @brief Main program body
******************************************************************************
* @attention
* 本范例用于嵌入式开发版采用websocket协议上报设备属性数据,仅供参考
* 本范例硬件为stm32f407开发板,采用lwip通讯
*
* <h2><center>© COPYRIGHT 2023 txb0727.</center></h2>
******************************************************************************/
/* Includes ------------------------------------------------------------------*/
#include "main.h"
/* FreeRTOS头文件 */
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
#include "client.h"
#include "lwip/opt.h"
#include "lwip/sys.h"
#include "lwip/api.h"
#include <lwip/sockets.h>
/**************************** 任务句柄 ********************************/
/*
* 任务句柄是一个指针,用于指向一个任务,当任务创建好之后,它就具有了一个任务句柄
* 以后我们要想操作这个任务都需要通过这个任务句柄,如果是自身的任务操作自己,那么
* 这个句柄可以为NULL。
*/
static TaskHandle_t AppTaskCreate_Handle = NULL;/* 创建任务句柄 */
static TaskHandle_t UploadData_Task_Handle = NULL;/* 上报数据任务句柄 */
/**************************************************************************
* 函数声明
**************************************************************************/
static void UploadData_Task(void* pvParameters);/* UploadData_Task 任务实现 */
extern void TCPIP_Init(void);
static void AppTaskCreate(void){
BaseType_t xReturn = pdPASS;
taskENTER_CRITICAL();
xReturn = xTaskCreate(
(TaskFunction_t) UploadData_Task,
(const char*) "UploadData_Task",
(uint32_t) 800,
(void*) NULL,
(UBaseType_t) 1,
(TaskHandle_t*) &UploadData_Task_Handle
);
if (pdPASS == xReturn)
printf("Ping_Task created successfully \r\n");
else
printf("Ping_Task created failed \r\n");
vTaskDelete(AppTaskCreate_Handle);
taskEXIT_CRITICAL();
}
/*****************************************************************
* @brief 主函数
* @param 无
* @retval 无
* @note 第一步:开发板硬件初始化
第二步:创建APP应用任务
第三步:启动FreeRTOS,开始多任务调度
****************************************************************/
int main(void)
{
BaseType_t xReturn = pdPASS;
/* 开发板硬件初始化 */
BSP_Init();
TCPIP_Init();
// 创建任务
xReturn = xTaskCreate(
(TaskFunction_t) AppTaskCreate,
(const char*) "AppTaskCreate",
(uint32_t) 128,
(void*) NULL,
(UBaseType_t) 3,
(TaskHandle_t*) &AppTaskCreate_Handle
);
if (xReturn == pdPASS)
vTaskStartScheduler(); // 启动调度器
while(1);
}
/**********************************************************************
* @ 函数名 : uploadData_Task
* @ 功能说明: uploadData_Task 任务主体
* @ 参数 :
* @ 返回值 : 无
********************************************************************/
static void UploadData_Task(void* parameter)
{
while (1)
{
//调用上报物模型属性数据方法
uploadBussinessData();
printf("UploadData_Task min free stack size is %d \r\n",(int32_t)uxTaskGetStackHighWaterMark(NULL));
vTaskDelay(60*1000);/* 延时60秒,实际根据业务需要修改上报业务数据频率 */
}
}
/********************************END OF FILE****************************/
#include "client.h"
#include "lwip/opt.h"
#include "lwip/sys.h"
#include "lwip/api.h"
#include <lwip/sockets.h>
#include "websocket.h"
/*******************
* 上报物模型属性数据方法
* 上报物模型属性数据,上报报文为json格式字符串(样例):
* {"secrecetKey":"44080000001111000021,13437156569,xxxxxx","secrecetBody":[{"propertiesId":"P_1704161791995","dataValue":"20"},{"propertiesId":"P_1704161977952","dataValue":"42"}]}
* 参数说明:
* secrecetKey为设备连接KEY标识,固定值;
* "44080000001111000021,13437156569,xxxxxx"为其值,由设备ID+逗号+连接用户名+逗号+连接密码 拼接而成;
* 44080000001111000021为在本IOT平台配置的接入设备ID,13437156569为设备配置的连接账号,xxxxxx 为连接密码;
* secrecetBody 为上报设备属性数据集合标识,固定值;
* propertiesId 为设备物模型配置的属性ID标识,固定值;
* "P_1704161791995"、"P_1704161977952" 为在IOT平台物模型属性配置的属性ID的值;
* dataValue 为设备物模型属性数据值标识,固定值;
* "20"、"42" 为上报属性数据实际值,例如"20"代表温度,"42"代表湿度数值, 在本程序中通常调用gpio获取替换,在此演示范例代码中写虚拟数据
* **********************************************************/
void uploadBussinessData(void )
{
ip4_addr_t ipaddr;
IP4_ADDR(&ipaddr,DEST_IP_ADDR0,DEST_IP_ADDR1,DEST_IP_ADDR2,DEST_IP_ADDR3);
int port = SERVER_PORT;
char ip[32] = SERVER_IP;
char path[64] = SERVER_PATH;
char secrecetUploadData[200];//报文数据
int fd;
//用本进程pid作为唯一标识
int pid = 1;
printf("client ws://%s:%d%spid/%d \r\n", ip, port, path, pid);
//3秒超时连接服务器
//同时大量接入时,服务器不能及时响应,可以加大超时时间
fd = ws_requestServer(ip, port, path, 0);
printf("连接服务器fd: %d \r\n",fd);
if(fd<=0){
vTaskDelay(10*1000);
// return -1;
}
if(fd>0){
// printf("上报数据fd: %d >>> %s\r\n",fd,path);
char send_buff[512]; //发送数据
memset(send_buff,0,sizeof(send_buff));
memset(secrecetUploadData,0,sizeof(secrecetUploadData));
/**************************************************************************************************************************
* 此处拼接上报报文内容
* 上报报文为json格式字符串(样例):
* {"secrecetKey":"44080000001111000021,13437156569,xxxxxx","secrecetBody":[{"propertiesId":"P_1704161791995","dataValue":"20"},{"propertiesId":"P_1704161977952","dataValue":"42"}]}
* 参数说明:
* secrecetKey为设备连接KEY标识,固定值;
* "44080000001111000021,13437156569,xxxxxx"为其值,由设备ID+逗号+连接用户名+逗号+连接密码 拼接而成;
* 44080000001111000021为在本IOT平台配置的接入设备ID,13437156569为设备配置的连接账号,xxxxxx 为连接密码;
* secrecetBody 为上报设备属性数据集合标识,固定值;
* propertiesId 为设备物模型配置的属性ID标识,固定值;
* "P_1704161791995"、"P_1704161977952" 为在IOT平台物模型属性配置的属性ID的值;
* dataValue 为设备物模型属性数据值标识,固定值;
* "20"、"42" 为上报属性数据实际值,例如"20"代表温度,"42"代表湿度数值, 在本程序中通常调用gpio获取替换,在此演示范例代码中写虚拟数据
* ***********************************************************************************************************************/
char *uploadData="[{\"propertiesId\":\"P_1704161791995\",\"dataValue\":\"20\"},{\"propertiesId\":\"P_1704161977952\",\"dataValue\":\"42\"}]";
// 拼接上报数据
snprintf(secrecetUploadData, sizeof(secrecetUploadData), "{\"secrecetKey\":\"%s\",\"secrecetBody\":%s}",AUTH_KEY,uploadData);
// printf("secrecetUploadData: %s\r\n",secrecetUploadData);
//对拼接的上报报文为json格式字符串base64加密
wss_base64_encode((const uint8_t*)secrecetUploadData, send_buff, strlen(secrecetUploadData));
// printf("send_buff: %s\r\n",send_buff);
//发送加密后的报文
int ret = ws_send(fd, send_buff, strlen(send_buff), true, WDT_TXTDATA);
// delay_us(1000);
vTaskDelay(1000);
free(send_buff);
free(secrecetUploadData);
free(uploadData);
close(fd);
printf("client(%d): close\r\n", pid);
}
vTaskDelay(10*1000);
}
Websocket协议接入STM例程打包源码进入IOT中继宝盒主操作界面打开“IOT设备接口”窗口,选择对应的设备–设备接入端接口中对应的协议接入样例中下载。
本章节以设备侧开发板采用coap协议接入本IOT中继系统平台为例,主要实现从接入嵌入设备上报物模型属性数据。 设备上报报文数据采用字符串BASE64加密传输。
用户名: 159xxxxxxxx(IOT设备接入–设备接入配置 填写的连接账号)
密码: XXXXXX(IOT设备接入–设备接入配置 填写的连接口令)
设备认证请求: 生成认证请求内容,根据设备id 、 连接账号、 连接密钥 、 连接时间戳组成的json字符串BASE64加密生成。 Post请求向COAP服务器设备认证请求地址(如后)提交认证请求报文获取设备认证通过token。
设备认证请求地址: coap://192.168.0.105:5683/coapApi/auth
请求参数说明:
Method:请求方法。只支持POST方法
URL:URL地址,取值: coap://192.168.0.105:5683/coapApi/auth
加密前设备认证请求json字符串格式(样例):
{ "userName": "159xxxxxxxx" , "password": "xxxxxxx" , "clientId": "44080000001111000020.159xxxxxxxx" , "deviceId": "44080000001111000020" , "timestamp": "1695777837040"}
json字符串内容说明:
| 参数 | 说明 |
|---|---|
| userName | 配置的Coap协议连接设备连接账户 如上例 “159xxxxxxxx” |
| password | 配置的Coap协议连接设备连接账户口令 如上例 “xxxxxxx” |
| deviceId | 上报设备ID 上例 “44080000001111000020” |
| clientId | 客户端ID 上例 客户端ID值 “ 44080000001111000020.159xxxxxxxx " 由 “设备ID+”.”+设备连接账户 " 組合而成 |
| timestamp | 时间戳 上例 "1695777837040"为连接时时间戳 |
加密后设备认证请求json字符串(样例):
eyAgInVzZXJOYW1lIjogIjE1OTI3NDk4OTI1IiAsICJwYXNzd29yZCI6ICIxMjM0NTYiICwgImNsaWVudElkIjogIjQ0MDgwMDAwMDAxMTExMDAwMDIwLjE1OTI3NDk4OTI1IiAsICJkZXZpY2VJZCI6ICI0NDA4MDAwMDAwMTExMTAwMDAyMCIgLCAidGltZXN0YW1wIjoiMTY5NTc3NzgzNzA0MCJ
设备认证通过返回的token(样例):
eyJhbGciOiJIUzI1NiJ9.eyJwYXNzd29yZCI6IjEyMzQ1NiIsInVzZXJOYW1lIjoiMTU5Mjc0OTg5MjUiLCJleHAiOjE2OTU5MjYwOTIsImRldmljZUlkIjoiNDQwODAwMDAwMDExMTEwMDAwMjAifQ.mjY_IoGcqQTjlG6uelk_OxQf9AI-yByeqimi1EG0K54
上报报文请求地址: coap://192.168.0.105:5683/coapApi/44080000001111000020
请求参数属性说明:
| 参数 | 说明 | ||||||
|---|---|---|---|---|---|---|---|
| token | 设备连接认证通过返回的token 字符串(见前第2节所述的token) | ||||||
| payLoad | 报文字符串,上报设备属性数据标识,由上报的属性数据JSON字符串BASE64 加密生成 | ||||||
| 加密前报文上报属性数据json字符串内容 |
[
{"propertiesId": "P_1695782510161", "dataValue": "110" },
{"propertiesId": "P_1695888406309", "dataValue": "12"},
......
]
|
||||||
| 加密后的报文上报属性数据json字符串内容(范例) |
W3sicHJvcGVydGllc0lkIjoiUF8xNjk1NzgyNTEwMTYxIiwiZGF0YVZhbHVlIjoiMTEwIn0seyJwcm9wZXJ0aWVzSWQiOiJQXzE2OTU4ODg0MDYzMDkiLCJkYXRhVmFsdWUiOiIxMiJ9XQ== |
||||||
本例程以接入设备为Java客户端设备,接入本IOT中继平台使用。 此设备采用coap协议接入本IOT中继系统平台,主要实现从接入设备上报物模型属性数据。 设备侧根据业务需要周期性调用此接口向平台上报设备属性数据,例如:间隔10分钟上报设备温度、湿度等,本IOT平台coap协议接入只支持上报物模型属性数据。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.2</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.txb</groupId>
<artifactId>CoapClient</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>CoapClient</name>
<description>CoapClient</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!-- coap协议包-->
<dependency>
<groupId>org.eclipse.californium</groupId>
<artifactId>californium-core</artifactId>
<version>2.0.0-M17</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.5</version>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.13</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.83</version>
</dependency>
</dependencies>
<repositories>
<repository>
<id>public</id>
<name>aliyun nexus</name>
<url>https://maven.aliyun.com/repository/public</url>
<releases>
<enabled>true</enabled>
</releases>
</repository>
<repository>
<releases>
<enabled>false</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
<id>ias-snapshots</id>
<name>Infinite Automation Snapshot Repository</name>
<url>https://maven.mangoautomation.net/repository/ias-snapshot/</url>
</repository>
<repository>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
<id>ias-releases</id>
<name>Infinite Automation Release Repository</name>
<url>https://maven.mangoautomation.net/repository/ias-release/</url>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>public</id>
<name>aliyun nexus</name>
<url>https://maven.aliyun.com/repository/public</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
</project>
package com.txb.coap.client;
import com.alibaba.fastjson.JSONObject;
import org.apache.logging.log4j.util.Base64Util;
import org.eclipse.californium.core.CoapResponse;
import org.eclipse.californium.core.Utils;
import org.eclipse.californium.core.coap.*;
import org.eclipse.californium.elements.exception.ConnectorException;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
/******
*@description: $
*
* author: txb0727
* date: 2023-06-06 13:48
****/
public class CoapClient {
private static final int COAP2_OPTION_TOKEN = 2088;
String ip="192.168.0.105"; //为IOT中继平台设备接入接口配置的IP,
String port="5683"; //为IOT中继平台设备接入接口配置的连接端口
URI uri = null;
org.eclipse.californium.core.CoapClient coapClient = null;
String body = "";
public void init(String ip,String port) throws URISyntaxException{
// define the ip and resource name here, ‘test’ is the resource name
this.ip=ip;
this.port=port;
uri = new URI("coap://"+ip+":"+port+"/coapApi/auth");
coapClient = new org.eclipse.californium.core.CoapClient(uri);
// 只支持POST方法。
Request request = new Request(CoAP.Code.POST, CoAP.Type.CON);
// 设置option。
OptionSet optionSet = new OptionSet();
optionSet.addOption(new Option(OptionNumberRegistry.CONTENT_FORMAT, MediaTypeRegistry.APPLICATION_JSON));
optionSet.addOption(new Option(OptionNumberRegistry.ACCEPT, MediaTypeRegistry.APPLICATION_JSON));
request.setOptions(optionSet);
}
public String token(String secrecet) throws URISyntaxException{
// define the ip and resource name here, ‘auth’ is the resource name
uri = new URI("coap://"+ip+":"+port+"/coapApi/auth");
coapClient = new org.eclipse.californium.core.CoapClient(uri);
// 只支持POST方法。
Request request = new Request(CoAP.Code.POST, CoAP.Type.CON);
// 设置option。
OptionSet optionSet = new OptionSet();
optionSet.addOption(new Option(OptionNumberRegistry.CONTENT_FORMAT, MediaTypeRegistry.APPLICATION_JSON));
optionSet.addOption(new Option(OptionNumberRegistry.ACCEPT, MediaTypeRegistry.APPLICATION_JSON));
request.setOptions(optionSet);
// 设置认证uri。
request.setURI(uri);
// 设置认证请求payload。
request.setPayload(secrecet);
// 发送认证请求。
CoapResponse response = null;
try {
response = coapClient.advanced(request);
} catch (ConnectorException e) {
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
}
System.out.println(Utils.prettyPrint(response));
System.out.println("the respnse body is "+response.getResponseText());
return response.getResponseText();
}
// send with post
public void sendPost(String deviceId,String token,int format) throws ConnectorException, IOException, URISyntaxException {
uri = new URI("coap://"+ip+":"+port+"/coapApi/"+deviceId);
coapClient = new org.eclipse.californium.core.CoapClient(uri);
// 只支持POST方法。
Request request = new Request(CoAP.Code.POST, CoAP.Type.CON);
// 设置option。
OptionSet optionSet = new OptionSet();
optionSet.addOption(new Option(OptionNumberRegistry.CONTENT_FORMAT, MediaTypeRegistry.APPLICATION_JSON));
optionSet.addOption(new Option(OptionNumberRegistry.ACCEPT, MediaTypeRegistry.APPLICATION_JSON));
optionSet.addOption(new Option(COAP2_OPTION_TOKEN, token));
request.setOptions(optionSet);
// 设置认证uri。
request.setURI(uri);
// 设置消息payload
request.setPayload(body);
// 发送认证请求。
CoapResponse response = coapClient.advanced(request);
// System.out.println("----------------");
// System.out.println(request.getPayload().length);
// System.out.println("----------------");
System.out.println(Utils.prettyPrint(response));
}
public void setBody(String body) {
this.body = body;
}
/**
* 生成认证请求内容。
*
* @param deviceId,设备ID。
* @param userName,连接账号。
* @param password,连接密钥。
* @return 认证请求。
*/
public String authBody(String deviceId, String userName, String password) {
// 构建认证请求。
JSONObject body = new JSONObject();
body.put("deviceId", deviceId);
body.put("userName", userName);
body.put("clientId", deviceId + "." + userName);
body.put("timestamp", String.valueOf(System.currentTimeMillis()));
body.put("password", password);
System.out.println("----- auth body -----");
System.out.println(body.toJSONString());
String secretResult= Base64Util.encode(body.toJSONString());
return secretResult;
}
public static void main(String[] args) throws ConnectorException, IOException, InterruptedException, URISyntaxException {
/************
* [{"propertiesId":"P_1695782510161","dataValue":"110"},{"propertiesId":"P_1695888406309","dataValue":"12"}]
* 为上报属性数据json字符串内容
* json字符串内容说明 : propertiesId 上报设备属性数据ID标识,上例中"P_1695782510161" 、 "P_1695888406309"为设备物模型配置的属性ID标识值
* dataValue 为属性值标识 上例黄色 "110" 、 "12" 为上报设备属性数据值,为实际获取
*********/
String payLoad = "[{\"propertiesId\":\"P_1695782510161\",\"dataValue\":\"110\"},{\"propertiesId\":\"P_1695888406309\",\"dataValue\":\"12\"}]";
CoapClient myclient = new CoapClient();
/*********
* 客户端连接初始化
* "192.168.0.105" 为IOT中继平台设备接入接口配置的IP,"5683"为IOT中继平台设备接入接口配置的连接端口
*/
myclient.init("192.168.0.105","5683"); //客户端连接初始化
/******
* 生成BASE64加密认证报文
* "44080000001111000020" 为接入设备ID
* "15911111111" 为IOT中继平台设备接入配置配置的连接账号
* "******" 为IOT中继平台设备接入配置配置的连接口令
*/
String secrecet =myclient.authBody("44080000001111000020", "15911111111", "******"); //生成BASE64加密认证报文
String token=myclient.token(secrecet); //客户端连接认证获取token
// System.out.println(token);
/*****
* 上报业务数据
* Base64Util.encode(payLoad) 为base64加密工具类
*/
myclient.setBody(Base64Util.encode(payLoad));//上报base64加密数据
myclient.sendPost("44080000001111000020",token,50);//发送请求
}
}
coap协议接入JAVA客户端例程打包源码进入IOT中继宝盒主操作界面打开“IOT设备接口”窗口,选择对应的设备–设备接入端接口中对应的协议接入样例中下载。
本文档适用对象为嵌入式芯片设备,接入本IOT中继平台使用。 此设备采用coap协议接入本IOT中继系统平台,主要实现从接入设备上报物模型属性数据。 设备侧根据业务需要周期性调用此接口向平台上报设备属性数据,例如:间隔10分钟上报设备温度、湿度等,本IOT平台coap协议接入只支持上报物模型属性数据。
针对嵌入式设备, 上报设备属性数据报文由json字符串组成,数据报文对json字符串base64加密传输(本例程以**STM32L151C8T6A核心板+通讯模块sim7020c芯片+移动物联网卡**接入为例)。
coap.h文件中定义:
#define PRODUCTKEY "44080000001111000020" //本IOT中继平台里面定义的设备ID
#define USERNAME //IOT中继宝盒里面设备接入配置页面配置的设备连接账号
#define DEVICESECRE xxxxxx //IOT中继宝盒里面设备接入配置页面配置的设备连接密钥
#define SUBDOMAIN "" //用户申请的服务器子域名 --- IOT中继宝盒里面内网穿透功能,在IOT终端绑定界面业务平台注册登记的子域名
参数说明:
| 参数 | 说明 |
|---|---|
| PRODUCTKEY | 本IOT中继平台里面定义的设备ID |
| USERNAME | 本IOT中继平台设备接入配置的设备连接账号 |
| DEVICESECRE | 在本IOT中继平台设备接入配置的设备连接密钥 |
| SUBDOMAIN | 用户申请的服务器子域名 ,如果 IOT中继宝盒里面内网穿透功能,在IOT终端绑定界面业务平台注册登记的子域名 |
main.c
/*-----------------------------------------------------------------------------*/
/* COAP协议接入示例 */
/*-----------------------------------------------------------------------------*/
/* @attention
* 本范例用于嵌入式开发版采用coap协议发布上报设备属性数据,仅供参考
* 本范例硬件为 STM32L151C8T6A核心板,通讯模块为sim7020c芯片+移动物联网卡
*
* <h2><center> COPYRIGHT 2023 Wuhan Yilian Technology.</center></h2>
******************************************************************************/
#include "stm32l1xx.h" //包含需要的头文件
#include "main.h" //包含需要的头文件
#include "delay.h" //包含需要的头文件
#include "key.h" //包含需要的头文件
#include "led.h" //包含需要的头文件
#include "usart1.h" //包含需要的头文件
#include "usart2.h" //包含需要的头文件
#include "timer2.h" //包含需要的头文件
#include "timer4.h" //包含需要的头文件
#include "sim7020.h" //包含需要的头文件
#include "dht12.h" //包含需要的头文件
#include "iic.h" //包含需要的头文件
#include "coap.h" //包含需要的头文件
#include "standby.h" //包含需要的头文件
#include "rtc.h" //包含需要的头文件
#include "eeprom.h" //包含需要的头文件
char Sta_flag = 1; //0:配置完成处理数据状态 1:AT指令配置模块状态
int main(void)
{
char num,csq;
Delay_Init(); //延时功能初始化
Usart1_Init(9600); //串口1功能初始化,波特率9600
Usart2_Init(115200); //串口2功能初始化,波特率115200
TIM4_Init(300,3200); //TIM4初始化,定时时间 300*3200*1000/32000000 = 30ms
LED_Init(); //初始化LED指示灯
KEY_Init(); //初始化按键
IIC_Init(); //初始化IIC接口
Rtc_Init(); //初始化RTC
CoapServer_Parameter_Init(); //初始化连接IOT中继宝盒coap服务器的参数
IoT_CoAP_Auth(COAP_MESSAGE_TYPE_CON,COAP_MESSAGE_CODE_POST,&Auth_CB); //初始化认证的数据包
if(PWR_GetFlagStatus(PWR_FLAG_SB) != RESET){ //查看PWR_FLAG_SB标志,如果置位表示系统从待机模式恢复,进入if
u1_printf("系统从待机模式恢复\r\n"); //串口输出信息
PWR_ClearFlag(PWR_FLAG_SB); //清除PWR_FLAG_SB标志
u1_printf("准备退出PSM模式... ...\r\n"); //串口输出信息
if(SIM7020_ExitPSM(30)){ //超时单位1s,超时时间30s
u1_printf("退出PSM模式超时,准备重启\r\n"); //串口输出信息 //返回
}else u1_printf("退出PSM模式成功\r\n"); //串口输出信息
num = 10; //最多查询10次
while(num--){ //循环查询
u1_printf("准备检查信号质量... ...\r\n"); //串口输出信息
csq = SIM7020_CSQ_Cmd(50); //超时单位100ms,超时时间5s
if((csq>0)&&(csq<=31)){ //按到信号范围是否正确
u1_printf("信号强度范围0~31,99表示无信号\r\n"); //串口输出信息
u1_printf("信号强度:%d\r\n",csq); //串口输出信息
break; //跳出while
}
Delay_Ms(1000); //延时
}
u1_printf("检查信号质量成功\r\n"); //串口输出信息
Delay_Ms(1000); //延时
EEPROM_ReadData(0,(unsigned int *)DNSIP,4); //内部EEprom读取数据
u1_printf("EEPROM中读到的IP:%s\r\n",DNSIP); //串口输出信息
TempHumi_State(); //发送数据,然后进入PSM
}
else{
u1_printf("正常开机\r\n"); //串口输出信息
while(SIM7020_Init()){ //初始化7020,向IOT中继宝盒coap服务器发起认证
Delay_Ms(500); //延时
}
TempHumi_State(); //发送数据,然后进入PSM
}
while(1) //主循环
{
}
}
/*-------------------------------------------------*/
/*函数名:采集温湿度,并发布给服务器 */
/*参 数:无 */
/*返回值:无 */
/*-------------------------------------------------*/
char TempHumi_State(void)
{
unsigned char data[5];
DHT12_ReadData(data); //比较校验值,成功,进入if
memset(Data_CB.payload,0,1024); //清空缓冲区
/************
* [{"propertiesId":"P_1695782510161","dataValue":"110"},{"propertiesId":"P_1695888406309","dataValue":"12"}]
* 为上报属性数据json字符串内容
* json字符串内容说明 : propertiesId 上报设备属性数据ID标识,上例中"P_1695782510161" 、 "P_1695888406309"为设备物模型配置的属性ID标识值
* dataValue 为属性值标识 上例黄色 "110" 、 "12" 为上报设备属性数据值,为实际获取
*********/
// sprintf(Data_CB.payload,"[{\"propertiesId\":\"P_1695782510161\",\"dataValue\":\"%d.%d\"},{\"propertiesId\":\"P_1695888406309\",\"dataValue\":\"%d.%d\"}]",data[0],data[1],data[2],data[3]); //构建回复湿度温度数据
sprintf(Data_CB.payload,"[{\"propertiesId\":\"P_1695782510161\",\"dataValue\":\"110\"},{\"propertiesId\":\"P_1695888406309\",\"dataValue\":\"12\"}]"); //构建回复湿度温度数据
u1_printf("%s\r\n",Data_CB.payload);
u1_printf("准备连接CoAP服务器... ...\r\n"); //串口输出信息
if(SIM7020_CCOAPNEW(10)){ //超时单位1s,超时时间10s
u1_printf("连接CoAP服务器超时,准备重启\r\n"); //串口输出信息
}else u1_printf("连接CoAP服务器成功\r\n"); //串口输出信息
u1_printf("准备发送IOT中继宝盒Coap服务器认证CoAP包... ...\r\n"); //串口输出信息
if(SIM7020_CCOASend_Auth(100,CoAPpack,CoAPpack_len)){ //超时单位100ms,超时时间10s
u1_printf("发送IOT中继宝盒Coap服务器认证CoAP包失败\r\n"); //串口输出信息
}else u1_printf("发送IOT中继宝盒Coap服务器认证CoAP包成功\r\n"); //串口输出信息
IoT_CoAP_Data(COAP_MESSAGE_TYPE_CON,COAP_MESSAGE_CODE_POST,&Data_CB); //准备数据上报数据包
u1_printf("准备发送温湿度数据包... ...\r\n"); //串口输出信息
if(SIM7020_CCOASend_Data(100,CoAPpack,CoAPpack_len)){ //超时单位100ms,超时时间10s
u1_printf("发送温湿度数据包失败\r\n"); //串口输出信息
}else u1_printf("发送温湿度数据包成功\r\n"); //串口输出信息
u1_printf("准备关闭连接... ...\r\n"); //串口输出信息
if(SIM7020_CCOAPDEL(100)){ //超时单位100ms,超时时间10s
u1_printf("关闭连接超时,准备重启\r\n"); //串口输出信息
}else u1_printf("关闭连接成功\r\n"); //串口输出信息
u1_printf("准备进入PSM模式... ...\r\n"); //串口输出信息
if(SIM7020_EnterPSM(60)){ //超时单位1s,超时时间60s
u1_printf("进入PSM模式超时,准备重启\r\n"); //串口输出信息
}else{
u1_printf("进入PSM模式成功\r\n"); //串口输出信息
SysEnter_Standby(); //进入待机模式
}
return 0;
}
coap.h
/*-------------------------------------------------*/
/* */
/* 实现COAP协议功能的头文件 */
/* */
/*-------------------------------------------------*/
#ifndef __COAP_H
#define __COAP_H
#define PRODUCTKEY "44080000001111000020" //产品ID --- IOT中继宝盒里面定义的设备ID
#define PRODUCTKEY_LEN strlen(PRODUCTKEY) //产品ID长度
#define USERNAME "19945021328" //设备连接账号 --- IOT中继宝盒里面配置的设备连接账号
#define USERNAME_LEN strlen(DEVICENAME) //设备连接账号长度
#define DEVICESECRE "123456" //设备连接秘钥 --- IOT中继宝盒里面配置的设备连接密钥
#define DEVICESECRE_LEN strlen(DEVICESECRE) //设备连接秘钥长度
#define SUBDOMAIN "txb" //用户申请的服务器子域名 --- IOT中继宝盒里面内网穿透功能,在IOT终端绑定界面业务平台注册登记的子域名
/********
*coap服务器上传数据路径为 "coapApi/44080000001111000020", "coapApi" 为固定值,后面“44080000001111000020”为设备ID
*********************/
#define TOPIC_PATH1 "coapApi\0" //上报数据时路径段1 \0是结束符必须有
#define TOPIC_PATH2 "44080000001111000020\0" //上报数据时路径段2 \0是结束符必须有
#define TOPIC_PATH_NUM 2 //上报数据时路径段的个数
//数据类型化的定义
//Accept和Content_Format 可选的类型
#define COAP_CT_TEXT_PLAIN 0 /* text/plain (UTF-8) */
#define COAP_CT_APP_LINK_FORMAT 40 /* application/link-format */
#define COAP_CT_APP_XML 41 /* application/xml */
#define COAP_CT_APP_OCTET_STREAM 42 /* application/octet-stream */
#define COAP_CT_APP_RDF_XML 43 /* application/rdf+xml */
#define COAP_CT_APP_EXI 47 /* application/exi */
#define COAP_CT_APP_JSON 50 /* application/json */
#define COAP_CT_APP_CBOR 60 /* application/cbor */
//CoAP中所有的Option的编号
//2088 是IOT中继宝盒Coap服务器自定义的
#define COAP_OPTION_IF_MATCH 1 /* C, opaque, 0-8 B, (none) */
#define COAP_OPTION_URI_HOST 3 /* C, String, 1-255 B, destination address */
#define COAP_OPTION_ETAG 4 /* E, opaque, 1-8 B, (none) */
#define COAP_OPTION_IF_NONE_MATCH 5 /* empty, 0 B, (none) */
#define COAP_OPTION_URI_PORT 7 /* C, uint, 0-2 B, destination port */
#define COAP_OPTION_LOCATION_PATH 8 /* E, String, 0-255 B, - */
#define COAP_OPTION_URI_PATH 11 /* C, String, 0-255 B, (none) */
#define COAP_OPTION_CONTENT_FORMAT 12 /* E, uint, 0-2 B, (none) */
#define COAP_OPTION_MAXAGE 14 /* E, uint, 0--4 B, 60 Seconds */
#define COAP_OPTION_URI_QUERY 15 /* C, String, 1-255 B, (none) */
#define COAP_OPTION_ACCEPT 17 /* C, uint, 0-2 B, (none) */
#define COAP_OPTION_LOCATION_QUERY 20 /* E, String, 0-255 B, (none) */
#define COAP_OPTION_BLOCK2 23 /* C, uint, 0--3 B, (none) */
#define COAP_OPTION_BLOCK1 27 /* C, uint, 0--3 B, (none) */
#define COAP_OPTION_PROXY_URI 35 /* C, String, 1-1024 B, (none) */
#define COAP_OPTION_PROXY_SCHEME 39 /* C, String, 1-255 B, (none) */
#define COAP_OPTION_SIZE1 60 /* E, uint, 0-4 B, (none) */
#define COAP_OPTION_AUTH_TOKEN 2088 /* C, String, 1-255B, (none)*/
#define COAP_OPTION_SEQ 2089 /* C, String, 1-255B, (none)*/
//CoAP中 T可选的参数
//4中报文类型
#define COAP_MESSAGE_TYPE_CON 0
#define COAP_MESSAGE_TYPE_NON 1
#define COAP_MESSAGE_TYPE_ACK 2
#define COAP_MESSAGE_TYPE_RST 3
//CoAP中 CODE可选的参数
//4中功能方法
#define COAP_MESSAGE_CODE_GET 0X01
#define COAP_MESSAGE_CODE_POST 0X02
#define COAP_MESSAGE_CODE_PUT 0X03
#define COAP_MESSAGE_CODE_DEL 0X04
//IOT中继宝盒Coap服务器的响应码
#define IOTX_COAP_RESP_CODE_CONTENT 0x45 //正确
#define IOTX_COAP_RESP_CODE_BAD_REQUEST 0x80 //请求发送的Payload非法
#define IOTX_COAP_RESP_CODE_UNAUTHORIZED 0x81 //未授权的请求
#define IOTX_COAP_RESP_CODE_FORBIDDEN 0x83 //禁止的请求
#define IOTX_COAP_RESP_CODE_NOT_FOUND 0x84 //请求的路径不存在
#define IOTX_COAP_RESP_CODE_NOT_METHOD 0x85 //请求方法不是指定值
#define IOTX_COAP_RESP_CODE_UNSUPPORT_ACCPTABLE 0x86 //Accept不是指定的类型
#define IOTX_COAP_RESP_CODE_UNSUPPORT_CF 0x8F //请求的content不是指定类型
#define IOTX_COAP_RESP_CODE_INTERNAL_SERVER_ERROR 0xA0 //auth服务器超时或错误
typedef struct //IOT中继宝盒Coap服务器CoAP控制块
{
char path[128]; //url路径
char host[128]; //主机名
int port; //端口号
unsigned char Accept; //接收类型 仅支持application/json和application/cbor两种格式
unsigned char Content_Format; //内容格式类型 仅支持application/json和application/cbor两种格式
char auth_token[64]; //服务器下发的认证信息,每次post数据,需要携带认证信息,否则上报数据认为是非法数据
unsigned char auth_key[16]; //根据服务器下发的random和设备秘钥计算出来的,共后续的AES加密使用
char payload[1024]; //需要上报的数据
}IOTCoAP_CB;
extern unsigned char ServerIP[128]; //外部变量声明,存放服务器IP或是域名
extern int ServerPort; //外部变量声明,存放服务器的端口号
extern IOTCoAP_CB Auth_CB; //外部变量声明,IOT中继宝盒CoAP认证控制块
extern IOTCoAP_CB Data_CB; //外部变量声明,IOT中继宝盒CoAP数据控制块
extern unsigned char CoAPpack[1024]; //外部变量声明,存放需要发送的coap协议包数据
extern int CoAPpack_len; //外部变量声明,存放需要发送的coap协议包数据长度
void CoapServer_Parameter_Init(void);
void IoT_CoAP_Auth(unsigned char T, unsigned char Code, IOTCoAP_CB * coap_cb);
void IoT_CoAP_Data(unsigned char T, unsigned char Code, IOTCoAP_CB * coap_cb);
#endif
coap.c
/*-------------------------------------------------*/
/* */
/* 实现COAP协议功能的源文件 */
/* */
/*-------------------------------------------------*/
#include "stm32l1xx.h" //包含需要的头文件
#include "coap.h" //包含需要的头文件
#include "string.h" //包含需要的头文件
#include "stdio.h" //包含需要的头文件
#include "base64.h" //包含需要的头文件
#include "usart1.h" //包含需要的头文件
#include "sim7020.h" //包含需要的头文件
unsigned char Passward[128]; //存放密码的缓冲区
unsigned char Certification[256]; //存放发给服务器的认证信息的缓冲区
unsigned char ServerIP[128]; //存放服务器IP或是域名的缓冲区
int ServerPort; //存放服务器的端口号
unsigned char CoAPpack[1024]; //存放需要发送的coap协议包数据
int CoAPpack_len; //存放需要发送的coap协议包数据长度
unsigned short int Message_ID = 0x0001; //CoAP协议ID从1开始
IOTCoAP_CB Auth_CB; //IOT中继宝盒CoAP认证控制块
IOTCoAP_CB Data_CB; //IOT中继宝盒CoAP数据控制块
char Data_Path[TOPIC_PATH_NUM][32]={ //上报数据时的Path
TOPIC_PATH1,
TOPIC_PATH2,
};
/*----------------------------------------------------------*/
/*函数名:coap服务器初始化参数 */
/*参 数:无 */
/*返回值:无 */
/*----------------------------------------------------------*/
void CoapServer_Parameter_Init(void)
{
memset(ServerIP,0,128);
sprintf((char *)ServerIP,"%s.iotrelay.cn",SUBDOMAIN); //构建服务器域名
ServerPort = 5683; //服务器端口号5683
char send_buff[512]; //发送数据
memset(send_buff,0,sizeof(send_buff));
char *uploadAuthData;//认证数据
/***************************
* 下面JSON字符串说明
* userName 为IOT中继宝盒里面配置的设备连接账号
* password 为IOT中继宝盒里面配置的设备连接密钥
* deviceId 为IOT中继宝盒里面定义的设备ID
************************************************************/
sprintf((char *)uploadAuthData,"{\"userName\":\"%s\",\"password\":\"%s\",\"deviceId\":\"%s\"}",USERNAME,DEVICESECRE,PRODUCTKEY); //构建发给服务器的认证信息 明文
//对拼接的上报报文为json格式字符串base64加密
char secretbody[300]={0}; //base64加密:后的报文内容
int secretbodylen;
base64_encode(uploadAuthData,strlen(uploadAuthData), secretbody,&secretbodylen); //对上传报文base64加密
sprintf((char *)Certification,"%s",uploadAuthData); //构建发给服务器的认证信息
u1_printf("服 务 器:%s:%d\r\n",ServerIP,ServerPort); //串口输出调试信息
u1_printf("认证信息:%s\r\n",Certification); //串口输出调试信息
memset(&Auth_CB,0,sizeof(IOTCoAP_CB)); //清空认证控制块缓冲区
sprintf(Auth_CB.path,"coapApi/auth"); //认证URL路径
sprintf(Auth_CB.host,"%s",ServerIP); //主机名
Auth_CB.port = 5683; //端口号
Auth_CB.Accept = 0x32; //Accept类型application/json
Auth_CB.Content_Format = 0x32; //Content_Format类型application/json
sprintf(Auth_CB.payload,"%s",Certification); //认证的时候,需要上报的认证信息数据
memset(&Data_CB,0,sizeof(IOTCoAP_CB)); //清空数据控制块缓冲区
sprintf(Data_CB.host,"%s",ServerIP); //主机名
Data_CB.port = 5683; //端口号
Data_CB.Accept = 0x32; //Accept类型application/json
Data_CB.Content_Format = 0x32; //Content_Format类型application/json
}
/*----------------------------------------------------------*/
/*函数名:IOT中继宝盒coap服务器 认证报文 */
/*参 数:T:报文类型 CON报文,NON报文,ACK报文和RST报文 */
/*参 数:Code:功能码 GET、POST、PUT和DELETE */
/*参 数:coap_cb:IOT中继宝盒CoAP控制块 */
/*返回值:无 */
/*----------------------------------------------------------*/
void IoT_CoAP_Auth(unsigned char T, unsigned char Code, IOTCoAP_CB * coap_cb)
{
int i;
unsigned char CoAP_head[4]; //报文头部,占用4个字节
unsigned char Host_Option[128]; //报文中主机名选项缓冲区
unsigned char Port_Option[3]; //报文中端口号选项缓冲区,占用3个字节
unsigned char Path_Option[128]; //报文中URL路径选项缓冲区
unsigned char Accept_Option[2]; //报文中Accept选项缓冲区,占用2个字节
unsigned char Content_Option[2]; //报文中Content-Format选项缓冲区,占用2个字节
unsigned char Payload[256]; //报文中payload数据缓冲区
int Host_Option_len; //报文中主机名选项的最终长度
int Path_Option_len; //报文中路径选项的最终长度
int Payload_len; //报文中数据的最终长度
CoAP_head[0] = 0x40|T; //T:只有4中选项可选,代表4种类型的报文,一定要注意
CoAP_head[1] = Code; //Code:功能方法,只有4种可选
CoAP_head[2] = Message_ID/256; //消息编码ID,每次都一样
CoAP_head[3] = Message_ID%256; //消息编码ID,每次都一样
Message_ID ++; //Message_ID加一,这样用的时候,都不一样
memset(Host_Option,0,128); //清空缓冲区
if(strlen(coap_cb->host)<=12){ //如果主机名长度小于等于12,进入该if分支
Host_Option[0] = 0x30 | strlen(coap_cb->host); //主机名选项的Option Delta和Option Length
memcpy(&Host_Option[1],coap_cb->host,strlen(coap_cb->host)); //添加主机名选项的Option Value
Host_Option_len = strlen(coap_cb->host) + 1; //报文中主机名选项的最终长度
}else if((strlen(coap_cb->host)>12)&&(strlen(coap_cb->host)<=268)){ //如果主机名长在13至268范围内,进入该分支
Host_Option[0] = 0x3D; //主机名选项的Option Delta和Option Length
Host_Option[1] = strlen(coap_cb->host) - 13; //主机名选项的Option Length的扩展字节
memcpy(&Host_Option[2],coap_cb->host,strlen(coap_cb->host)); //添加主机名选项的Option Value
Host_Option_len = strlen(coap_cb->host) + 2; //报文中主机名选项的最终长度
}else if(strlen(coap_cb->host)>268){ //如果主机名长度大于268了
Host_Option[0] = 0x3E; //主机名选项的Option Delta和Option Length
Host_Option[1] = (strlen(coap_cb->host) - 269)/256; //主机名选项的Option Length的扩展字节
Host_Option[2] = (strlen(coap_cb->host) - 269)%256; //主机名选项的Option Length的扩展字节
memcpy(&Host_Option[3],coap_cb->host,strlen(coap_cb->host)); //添加主机名选项的Option Value
Host_Option_len = strlen(coap_cb->host) + 3; //报文中主机名选项的最终长度
}
Port_Option[0] = 0x42; //端口号选项的Option Delta和Option Length
Port_Option[1] = (coap_cb->port)/256; //添加端口号选项的Option Value
Port_Option[2] = (coap_cb->port)%256; //添加端口号选项的Option Value
memset(Path_Option,0,128); //清空缓冲区
if(strlen(coap_cb->path)<=12){ //如果URL路径长度小于等于12,进入该if分支
Path_Option[0] = 0x40 | strlen(coap_cb->path); //URL路径选项的Option Delta和Option Length
memcpy(&Path_Option[1],coap_cb->path,strlen(coap_cb->path)); //添加URL路径选项的Option Value
Path_Option_len = strlen(coap_cb->path) + 1; //报文中URL路径选项的最终长度
}else if((strlen(coap_cb->path)>12)&&(strlen(coap_cb->path)<=268)){ //如果URL路径长在13至268范围内,进入该分支
Path_Option[0] = 0x4D; //URL路径选项的Option Delta和Option Length
Path_Option[1] = strlen(coap_cb->path) - 13; //URL路径选项的Option Length的扩展字节
memcpy(&Path_Option[2],coap_cb->path,strlen(coap_cb->path)); //添加URL路径选项的Option Value
Path_Option_len = strlen(coap_cb->path) + 2; //报文中URL路径选项的最终长度
}else if(strlen(coap_cb->path)>268){ //如果URL路径长度大于268了
Path_Option[0] = 0x4E; //URL路径选项的Option Delta和Option Length
Path_Option[1] = (strlen(coap_cb->path) - 269)/256; //URL路径选项的Option Length的扩展字节
Path_Option[2] = (strlen(coap_cb->path) - 269)%256; //URL路径选项的Option Length的扩展字节
memcpy(&Path_Option[3],coap_cb->path,strlen(coap_cb->path)); //添加URL路径选项的Option Value
Path_Option_len = strlen(coap_cb->path) + 3; //报文中URL路径选项的最终长度
}
Accept_Option[0] = 0x11; //Accept选项的Option Delta和Option Length
Accept_Option[1] = 0x32; //添加Accept选项的Option Value
Content_Option[0] = 0x51; //Content-Format选项的Option Delta和Option Length
Content_Option[1] = 0x32; //添加Content-Format选项的Option Value
memset(Payload,0,256); //清空缓冲区
Payload[0] = 0xFF; //0xFF作为数据和前面报文内容的分割符
memcpy(&Payload[1],coap_cb->payload,strlen(coap_cb->payload)); //拷贝数据
Payload_len = strlen(coap_cb->payload) + 1; //数据缓冲区的最终长度
memset(CoAPpack,0,1024); //清空缓冲区
memcpy(&CoAPpack[0],CoAP_head,4); //拷贝4个字节的头部
memcpy(&CoAPpack[4],Host_Option,Host_Option_len); //拷贝主机名缓冲区
memcpy(&CoAPpack[4+Host_Option_len],Port_Option,3); //拷贝3个字节的端口号缓冲区
memcpy(&CoAPpack[4+Host_Option_len+3],Path_Option,Path_Option_len); //拷贝路径缓冲区
memcpy(&CoAPpack[4+Host_Option_len+3+Path_Option_len],Accept_Option,2); //拷贝Accept选项缓冲区
memcpy(&CoAPpack[4+Host_Option_len+3+Path_Option_len+2],Content_Option,2); //拷贝Content-Format选项缓冲区
memcpy(&CoAPpack[4+Host_Option_len+3+Path_Option_len+2+2],Payload,Payload_len); //拷贝数据缓冲区
CoAPpack_len = 4+Host_Option_len+3+Path_Option_len+2+2+Payload_len; //最终的报文长度
u1_printf("CoAP认证数据包数据如下:\r\n"); //串口输出信息
for(i=0;i<CoAPpack_len;i++) u1_printf("%02x ",CoAPpack[i]); //串口输出整个报文详细信息
u1_printf("\r\n\r\n"); //串口输出信息
}
/*----------------------------------------------------------*/
/*函数名:IOT中继宝盒coap 数据上报报文 */
/*参 数:T:报文类型 CON报文,NON报文,ACK报文和RST报文 */
/*参 数:Code:功能码 GET、POST、PUT和DELETE */
/*参 数:coap_cb:IOT中继宝盒CoAP控制块 */
/*返回值:无 */
/*----------------------------------------------------------*/
void IoT_CoAP_Data(unsigned char T, unsigned char Code, IOTCoAP_CB * coap_cb)
{
int i;
unsigned char CoAP_head[4]; //报文头部,占用4个字节
unsigned char Host_Option[128]; //报文中主机名选项缓冲区
unsigned char Port_Option[3]; //报文中端口号选项缓冲区,占用3个字节
unsigned char Path_Option[128]; //报文中URL路径选项缓冲区
unsigned char Accept_Option[2]; //报文中Accept选项缓冲区,占用2个字节
unsigned char Content_Option[2]; //报文中Content-Format选项缓冲区,占用2个字节
unsigned char IOT_2088[35]; //报文中IOT中继宝盒自定义的选项缓冲区,占用35个字节
unsigned char Payload[1024]; //报文中payload数据缓冲区
int Host_Option_len; //报文中主机名选项的最终长度
int Path_Option_len; //报文中主机名选项的最终长度
int Payload_len; //报文中数据的最终长度
int temp_len;
CoAP_head[0] = 0x40|T; //T:只有4中选项可选,代表4种类型的报文,一定要注意
CoAP_head[1] = Code; //Code:功能方法,只有4种可选
CoAP_head[2] = Message_ID/256; //消息编码ID,每次都不能一样
CoAP_head[3] = Message_ID%256; //消息编码ID,每次都不能一样
Message_ID ++; //Message_ID加一,这样用的时候,都不一样
memset(Host_Option,0,128); //清空缓冲区
if(strlen(coap_cb->host)<=12){ //如果主机名长度小于等于12,进入该if分支
Host_Option[0] = 0x30 | strlen(coap_cb->host); //主机名选项的Option Delta和Option Length
memcpy(&Host_Option[1],coap_cb->host,strlen(coap_cb->host)); //添加主机名选项的Option Value
Host_Option_len = strlen(coap_cb->host) + 1; //报文中主机名选项的最终长度
}else if((strlen(coap_cb->host)>12)&&(strlen(coap_cb->host)<=268)){ //如果主机名长在13至268范围内,进入该分支
Host_Option[0] = 0x3D; //主机名选项的Option Delta和Option Length
Host_Option[1] = strlen(coap_cb->host) - 13; //主机名选项的Option Length的扩展字节
memcpy(&Host_Option[2],coap_cb->host,strlen(coap_cb->host)); //添加主机名选项的Option Value
Host_Option_len = strlen(coap_cb->host) + 2; //报文中主机名选项的最终长度
}else if(strlen(coap_cb->host)>268){ //如果主机名长度大于268了
Host_Option[0] = 0x3E; //主机名选项的Option Delta和Option Length
Host_Option[1] = (strlen(coap_cb->host) - 269)/256; //主机名选项的Option Length的扩展字节
Host_Option[2] = (strlen(coap_cb->host) - 269)%256; //主机名选项的Option Length的扩展字节
memcpy(&Host_Option[3],coap_cb->host,strlen(coap_cb->host)); //添加主机名选项的Option Value
Host_Option_len = strlen(coap_cb->host) + 3; //报文中主机名选项的最终长度
}
Port_Option[0] = 0x42; //端口号选项的Option Delta和Option Length
Port_Option[1] = (coap_cb->port)/256; //添加端口号选项的Option Value
Port_Option[2] = (coap_cb->port)%256; //添加端口号选项的Option Value
memset(Path_Option,0,128); //清空缓冲区
Path_Option_len = 0; //PATH选项长度变量清零
for(i=0;i<TOPIC_PATH_NUM;i++){
if(strlen(Data_Path[i])<=12){ //如果URL路径长度小于等于12,进入该if分支
Path_Option[0+Path_Option_len] = 0x00 | strlen(Data_Path[i]); //URL路径选项的Option Delta和Option Length
memcpy(&Path_Option[1+Path_Option_len],Data_Path[i],strlen(Data_Path[i])); //添加URL路径选项的Option Value
Path_Option_len += strlen(Data_Path[i]) + 1; //报文中URL路径选项的最终长度
}else if((strlen(Data_Path[i])>12)&&(strlen(Data_Path[i])<=268)){ //如果URL路径长在13至268范围内,进入该分支
Path_Option[0+Path_Option_len] = 0x0D; //URL路径选项的Option Delta和Option Length
Path_Option[1+Path_Option_len] = strlen(Data_Path[i]) - 13; //URL路径选项的Option Length的扩展字节
memcpy(&Path_Option[2+Path_Option_len],Data_Path[i],strlen(Data_Path[i])); //添加URL路径选项的Option Value
Path_Option_len += strlen(Data_Path[i]) + 2; //报文中URL路径选项的最终长度
}else if(strlen(Data_Path[i])>268){ //如果URL路径长度大于268了
Path_Option[0+Path_Option_len] = 0x0E; //URL路径选项的Option Delta和Option Length
Path_Option[1+Path_Option_len] = (strlen(Data_Path[i]) - 269)/256; //URL路径选项的Option Length的扩展字节
Path_Option[2+Path_Option_len] = (strlen(Data_Path[i]) - 269)%256; //URL路径选项的Option Length的扩展字节
memcpy(&Path_Option[3+Path_Option_len],Data_Path[i],strlen(Data_Path[i])); //添加URL路径选项的Option Value
Path_Option_len += strlen(Data_Path[i]) + 3; //报文中URL路径选项的最终长度
}
}
Path_Option[0]|=0x40; //路径段1要或0X40
Accept_Option[0] = 0x11; //Accept选项的Option Delta和Option Length
Accept_Option[1] = 0x32; //添加Accept选项的Option Value
Content_Option[0] = 0x51; //Content-Format选项的Option Delta和Option Length
Content_Option[1] = 0x32; //添加Content-Format选项的Option Value
IOT_2088[0] = 0xED; //IOT中继宝盒coap服务器自定义的选项的Option Delta和Option Length
IOT_2088[1] = 0x07; //IOT中继宝盒coap服务器自定义的选项的Option Delta的扩展字节
IOT_2088[2] = 0x0A; //IOT中继宝盒coap服务器自定义的选项的Option Delta的扩展字节
IOT_2088[3] = 0x12; //IOT中继宝盒coap服务器自定义的选项的Option Length的扩展字节
memcpy(&IOT_2088[4],coap_cb->auth_token,strlen(coap_cb->auth_token)); //拷贝数据,认证时服务器下发的token
memset(Payload,0,1024); //清空缓冲区
Payload[0] = 0xFF; //0xFF作为数据和前面报文内容的分割符
char *uploadData;
memset(uploadData, '\0', strlen(uploadData));
//清空缓冲区
sprintf(uploadData,"%s",coap_cb->payload); //准备要加密的发给服务器的明文
temp_len = strlen(uploadData); //计算要加密的明文的长度
if((temp_len%16)!=0){ //判断是否是32的整数倍,如果不是进入if
for(i=0;i<((temp_len/16)+1)*16;i++){
if(uploadData[i]==0x00)
uploadData[i]=16-temp_len%16;
}
temp_len = ((temp_len/16)+1)*16;
}
//对拼接的上报报文为json格式字符串base64加密
char secretbody[256]={0}; //base64加密:后的报文内容
int secretbodylen;
base64_encode(uploadData,strlen(uploadData), secretbody,&secretbodylen); //对上传报文base64加密
*(&Payload[1])=*secretbody;
Payload_len = temp_len + 1; //数据缓冲区的最终长度.
memset(CoAPpack,0,1024); //清空缓冲区
memcpy(&CoAPpack[0],CoAP_head,4); //拷贝4个字节的头部
memcpy(&CoAPpack[4],Host_Option,Host_Option_len); //拷贝主机名缓冲区
memcpy(&CoAPpack[4+Host_Option_len],Port_Option,3); //拷贝3个字节的端口号缓冲区
memcpy(&CoAPpack[4+Host_Option_len+3],Path_Option,Path_Option_len); //拷贝路径缓冲区
memcpy(&CoAPpack[4+Host_Option_len+3+Path_Option_len],Accept_Option,2); //拷贝Accept选项缓冲区
memcpy(&CoAPpack[4+Host_Option_len+3+Path_Option_len+2],Content_Option,2); //拷贝Content-Format选项缓冲区
memcpy(&CoAPpack[4+Host_Option_len+3+Path_Option_len+2+2],IOT_2088,35); //拷贝IOT中继宝盒coap服务器自定义的选项缓冲区
memcpy(&CoAPpack[4+Host_Option_len+3+Path_Option_len+2+2+35+18],Payload,Payload_len); //拷贝数据缓冲区
CoAPpack_len = 4+Host_Option_len+3+Path_Option_len+2+2+35+18+Payload_len; //最终的报文长度
u1_printf("CoAP数据包数据如下:\r\n"); //串口输出信息
for(i=0;i<CoAPpack_len;i++) u1_printf("%02x ",CoAPpack[i]); //串口输出整个报文详细信息
u1_printf("\r\n\r\n"); //串口输出信息
}
sim7020.h
/*-------------------------------------------------*/
/* */
/* 实现SIM7020功能的头文件 */
/* */
/*-------------------------------------------------*/
#ifndef __SIM7020_H
#define __SIM7020_H
#define POWER_KEY(x) GPIO_WriteBit(GPIOB, GPIO_Pin_0, (BitAction)x) //PB0 控制sim7020模块的开关机按键
#define RESET_KEY(x) GPIO_WriteBit(GPIOA, GPIO_Pin_7, (BitAction)x) //PA7 控制sim7020模块的复位按键
#define POWER_STA GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) //PB1的电平,可以判断sim7020是开机还是关机
#define SIM7020_printf u2_printf //串口2控制 7020模块
#define SIM7020_RxCounter USART2_RxCounter //串口2控制 7020模块
#define SIM7020_RX_BUF USART2_RxBuff //串口2控制 7020模块
#define SIM7020_RXBUFF_SIZE USART2_RXBUFF_SIZE //串口2控制 7020模块
extern char DNSIP[128];
void SIM_PwrKeyInit(void);
void SIM_PwrStaInit(void);
void SIM_RstKeyInit(void);
char SIM_PowerON(void);
char SIM7020_ATTest_Cmd(int counter);
char SIM7020_CPIN_Cmd(int timeout);
char SIM7020_CGREG_Cmd(int timeout);
char SIM7020_CGACT_Cmd(int timeout);
char SIM7020_CSQ_Cmd(int timeout);
char SIM7020_CGCONTRDP_Cmd(int timeout);
char SIM7020_IPR_Cmd(int bound, int timeout);
char SIM7020_PSM_OFF(int timeout);
char SIM7020_eDRX_OFF(int timeout);
char SIM7020_Init(void);
void SIM7020_Hex_to_Str(char *data, int data_len, char *out, int out_len);
void SIM7020_Str_to_Hex(char *data, int data_len, char *out, int out_len);
int SIM7020_StrNum_to_HexNum(char *data, int data_len);
char SIM7020_DNS(unsigned char * domainname, int timeout);
char SIM7020_CCOAPNEW(int timeout);
char SIM7020_CCOAPDEL(int timeout);
char SIM7020_CCOASend_Auth(int timeout,unsigned char *data, int data_len);
char SIM7020_CCOASend_Data(int timeout,unsigned char *data, int data_len);
char SIM7020_EnterPSM(int timeout);
char SIM7020_ExitPSM(int timeout);
#endif
sim7020.c
/*-------------------------------------------------*/
/* */
/* 实现SIM7020功能的源文件 */
/* */
/*-------------------------------------------------*/
#include "stm32l1xx.h" //包含需要的头文件
#include "main.h" //包含需要的头文件
#include "sim7020.h" //包含需要的头文件
#include "delay.h" //包含需要的头文件
#include "usart1.h" //包含需要的头文件
#include "usart2.h" //包含需要的头文件
#include "led.h" //包含需要的头文件
#include "coap.h" //包含需要的头文件
#include "eeprom.h" //包含需要的头文件
char DNSIP[128]; //DNS解析后的IP
char data_temp1[2048]; //处理数据时,需要用的缓冲区
char data_temp2[2048]; //处理数据时,需要用的缓冲区
/*-------------------------------------------------*/
/*函数名:初始化sim7020开关机IO */
/*参 数:无 */
/*返回值:无 */
/*-------------------------------------------------*/
void SIM_PwrKeyInit(void)
{
GPIO_InitTypeDef GPIO_InitStructure; //定义一个设置GPIO的变量
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE); //使能GPIOB端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //准备设置PB0
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //输出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推免输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_400KHz; //400K速度
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; //下拉
GPIO_Init(GPIOB, &GPIO_InitStructure); //设置PB0
POWER_KEY(0); //初始化的时候设置成低电平
}
/*-------------------------------------------------*/
/*函数名:初始化sim7020开关机状态IO */
/*参 数:无 */
/*返回值:无 */
/*-------------------------------------------------*/
void SIM_PwrStaInit(void)
{
GPIO_InitTypeDef GPIO_InitStructure; //定义一个设置GPIO的变量
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE); //使能GPIOB端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //准备设置PB1
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; //输入模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_400KHz; //400K速度
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; //下拉
GPIO_Init(GPIOB, &GPIO_InitStructure); //设置PB1
}
/*-------------------------------------------------*/
/*函数名:初始化sim7020复位IO */
/*参 数:无 */
/*返回值:无 */
/*-------------------------------------------------*/
void SIM_RstKeyInit(void)
{
GPIO_InitTypeDef GPIO_InitStructure; //定义一个设置GPIO的变量
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); //使能GPIO7端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; //准备设置PA7
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; //输入模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_400KHz; //400K速度
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; //下拉
GPIO_Init(GPIOA, &GPIO_InitStructure); //设置PA7
RESET_KEY(0); //初始化的时候设置成低电平
}
/*-------------------------------------------------*/
/*函数名:开机 */
/*参 数:无 */
/*返回值:无 */
/*------------------------------------------------*/
char SIM_PowerON(void)
{
SIM_PwrKeyInit(); //初始化sim7020开关机IO
SIM_PwrStaInit(); //初始化sim7020开关机状态IO
SIM_RstKeyInit(); //初始化sim7020复位IO
if(POWER_STA==0){ //如果PB1是低电平,表示目前处于关机状态
u1_printf("\r\n目前处于关机状态,准备开机\r\n"); //串口输出信息
POWER_KEY(1); //先拉高PB0
Delay_Ms(800); //延时
POWER_KEY(0); //再拉低PB0,开机
}else{ //反之PB1是高电平,表示目前处于开机状态
u1_printf("\r\n目前处于开机状态,准备重启\r\n"); //串口输出信息
POWER_KEY(1); //先拉高PB0
Delay_Ms(1200); //延时
POWER_KEY(0); //再拉低PB0
Delay_Ms(2000); //延时
POWER_KEY(1); //先拉高PB0
Delay_Ms(800); //延时
POWER_KEY(0); //再拉低PB0,开机
}
Delay_Ms(2000); //延时
if(POWER_STA){ //如果PB1是低电平,表示开机或是重启成功
u1_printf("开机成功\r\n"); //串口输出信息
}else{ //反之PB1是高电平,表示开始或是重启失败
u1_printf("开机失败\r\n"); //串口输出信息
return 1; //返回1,表示失败
}
return 0; //返回0,表示成功
}
/*-------------------------------------------------*/
/*函数名:AT测试指令 */
/*参 数:timeout:超时时间(100ms的倍数) */
/*返回值:0:正确 其他:错误 */
/*-------------------------------------------------*/
char SIM7020_ATTest_Cmd(int timeout)
{
while(timeout--){ //等待超时时间到0
SIM7020_RxCounter=0; //7020接收数据量变量清零
memset(SIM7020_RX_BUF,0,SIM7020_RXBUFF_SIZE); //清空7020接收缓冲区
SIM7020_printf("AT\r\n"); //发送指令
u1_printf("%d ",timeout); //串口输出现在的剩余超时时间
Delay_Ms(100); //延时100ms
if(strstr(SIM7020_RX_BUF,"OK")) //如果接收到OK表示指令成功
break; //主动跳出while循环
}
u1_printf("\r\n"); //串口输出信息
if(timeout<=0)return 1; //如果timeout<=0,说明超时时间到零了,也没能收到OK,返回1,表示错误
return 0; //返回0,正确,说明收到OK,通过break主动跳出while
}
/*-------------------------------------------------*/
/*函数名:检查SIM卡状态指令 */
/*参 数:timeout:超时时间(1s的倍数) */
/*返回值:0:正确 其他:错误 */
/*-------------------------------------------------*/
char SIM7020_CPIN_Cmd(int timeout)
{
SIM7020_RxCounter=0; //7020接收数据量变量清零
memset(SIM7020_RX_BUF,0,SIM7020_RXBUFF_SIZE); //清空7020接收缓冲区
SIM7020_printf("AT+CPIN?\r\n"); //发送指令
while(timeout--){ //等待超时时间到0
u1_printf("%d ",timeout); //串口输出现在的剩余超时时间
Delay_Ms(1000); //延时1s
if(strstr(SIM7020_RX_BUF,"READY")) //如果接收到READY表示指令成功
break; //主动跳出while循环
}
u1_printf("\r\n"); //串口输出信息
if(timeout<=0)return 1; //如果timeout<=0,说明超时时间到零了,也没能收到READY,返回1,表示错误
return 0; //返回0,正确,说明收到READY,通过break主动跳出while
}
/*-------------------------------------------------*/
/*函数名:检查网络附着指令 */
/*参 数:timeout:超时时间(1s的倍数) */
/*返回值:0:正确 其他:错误 */
/*-------------------------------------------------*/
char SIM7020_CGREG_Cmd(int timeout)
{
while(timeout--){ //等待超时时间到0
SIM7020_RxCounter=0; //7020接收数据量变量清零
memset(SIM7020_RX_BUF,0,SIM7020_RXBUFF_SIZE); //清空7020接收缓冲区
SIM7020_printf("AT+CGREG?\r\n"); //发送指令
u1_printf("%d ",timeout); //串口输出现在的剩余超时时间
Delay_Ms(1000); //延时1s
if(strstr(SIM7020_RX_BUF,"+CGREG: 0,1")) //如果接收到+CGREG: 0,1表示指令成功
break; //主动跳出while循环
}
u1_printf("\r\n"); //串口输出信息
if(timeout<=0)return 1; //如果timeout<=0,说明超时时间到零了,也没能收到+CGREG: 0,1,返回1,表示错误
return 0; //返回0,正确,说明收到+CGREG: 0,1,通过break主动跳出while
}
/*-------------------------------------------------*/
/*函数名:检查PDN激活状态 */
/*参 数:timeout:超时时间(1s的倍数) */
/*返回值:0:正确 其他:错误 */
/*-------------------------------------------------*/
char SIM7020_CGACT_Cmd(int timeout)
{
while(timeout--){ //等待超时时间到0
SIM7020_RxCounter=0; //7020接收数据量变量清零
memset(SIM7020_RX_BUF,0,SIM7020_RXBUFF_SIZE); //清空7020接收缓冲区
SIM7020_printf("AT+CGACT?\r\n"); //发送指令
u1_printf("%d ",timeout); //串口输出现在的剩余超时时间
Delay_Ms(1000); //延时1s
if(strstr(SIM7020_RX_BUF,"+CGACT: 1,1")) //如果接收到+CGACT: 1,1表示指令成功
break; //主动跳出while循环
}
u1_printf("\r\n"); //串口输出信息
if(timeout<=0)return 1; //如果timeout<=0,说明超时时间到零了,也没能收到+CGACT: 1,1,返回1,表示错误
return 0; //返回0,正确,说明收到+CGACT: 1,1,通过break主动跳出while
}
/*-------------------------------------------------*/
/*函数名:检查信号质量指令 */
/*参 数:timeout:超时时间(100ms的倍数) */
/*返回值:0:正确 其他:错误 */
/*-------------------------------------------------*/
char SIM7020_CSQ_Cmd(int timeout)
{
char temp[20],csq[20]; //临时缓冲区
SIM7020_RxCounter=0; //7020接收数据量变量清零
memset(SIM7020_RX_BUF,0,SIM7020_RXBUFF_SIZE); //清空7020接收缓冲区
memset(temp,0,20); //清空缓冲区
memset(csq,0,20); //清空缓冲区
SIM7020_printf("AT+CSQ\r\n"); //发送指令
while(timeout--){ //等待超时时间到0
u1_printf("%d ",timeout); //串口输出现在的剩余超时时间
Delay_Ms(100); //延时100ms
if(strstr(SIM7020_RX_BUF,"OK")) //如果接收到OK表示指令成功
break; //主动跳出while循环
}
u1_printf("\r\n"); //串口输出信息
if(timeout<=0) return 99; //如果timeout<=0,说明超时时间到零了,也没能收到OK,返回99,表示错误
else{ //反之,表示正确,说明收到OK,通过break主动跳出while
sscanf(SIM7020_RX_BUF,"%[^ ] %[^,],%[^\r]",temp,csq,temp); //格式化搜索,信号质量
}
return SIM7020_StrNum_to_HexNum(csq,strlen(csq));
}
/*-------------------------------------------------*/
/*函数名:查询网络下发APN和分配的IP地址指令 */
/*参 数:timeout:超时时间(100ms的倍数) */
/*返回值:0:正确 其他:错误 */
/*-------------------------------------------------*/
char SIM7020_CGCONTRDP_Cmd(int timeout)
{
char temp[40],apn[40],ip[40]; //临时缓冲区
SIM7020_RxCounter=0; //7020接收数据量变量清零
memset(SIM7020_RX_BUF,0,SIM7020_RXBUFF_SIZE); //清空7020接收缓冲区
memset(temp,0,40); //清空缓冲区
memset(apn,0,40); //清空缓冲区
memset(ip,0,40); //清空缓冲区
SIM7020_printf("AT+CGCONTRDP\r\n"); //发送指令
while(timeout--){ //等待超时时间到0
u1_printf("%d ",timeout); //串口输出现在的剩余超时时间
Delay_Ms(100); //延时100ms
if(strstr(SIM7020_RX_BUF,"OK")) //如果接收到OK表示指令成功
break; //主动跳出while循环
}
u1_printf("\r\n"); //串口输出信息
if(timeout<=0)return 1; //如果timeout<=0,说明超时时间到零了,也没能收到OK,返回1,表示错误
else{ //反之,表示正确,说明收到OK,通过break主动跳出while
sscanf(SIM7020_RX_BUF,"%[^,],%[^,],%[^,],%[^\r]",temp,temp,apn,ip); //格式化搜索,apn和ip信息
u1_printf("APN:%s\r\n",apn); //串口输出信息
u1_printf("ip和子网掩码:%s\r\n",ip); //串口输出信息
}
return 0; //返回0,正确,
}
/*-------------------------------------------------*/
/*函数名:锁定波特率指令 */
/*参 数:bound:波特率 */
/*参 数:timeout:超时时间(100ms的倍数) */
/*返回值:0:正确 其他:错误 */
/*-------------------------------------------------*/
char SIM7020_IPR_Cmd(int bound, int timeout)
{
SIM7020_RxCounter=0; //7020接收数据量变量清零
memset(SIM7020_RX_BUF,0,SIM7020_RXBUFF_SIZE); //清空7020接收缓冲区
SIM7020_printf("AT+IPR=%d\r\n",bound); //发送指令
while(timeout--){ //等待超时时间到0
u1_printf("%d ",timeout); //串口输出现在的剩余超时时间
Delay_Ms(100); //延时100ms
if(strstr(SIM7020_RX_BUF,"OK")) //如果接收到OK表示指令成功
break; //主动跳出while循环
}
u1_printf("\r\n"); //串口输出信息
if(timeout<=0)return 1; //如果timeout<=0,说明超时时间到零了,也没能收到OK,返回1,表示错误
return 0; //返回0,正确,说明收到OK,通过break主动跳出while
}
/*-------------------------------------------------*/
/*函数名:关闭PSM模式指令 */
/*参 数:timeout:超时时间(1s的倍数) */
/*返回值:0:正确 其他:错误 */
/*-------------------------------------------------*/
char SIM7020_PSM_OFF(int timeout)
{
while(timeout--){ //等待超时时间到0
SIM7020_RxCounter=0; //7020接收数据量变量清零
memset(SIM7020_RX_BUF,0,SIM7020_RXBUFF_SIZE); //清空7020接收缓冲区
SIM7020_printf("AT+CPSMS=0\r\n"); //发送指令
u1_printf("%d ",timeout); //串口输出现在的剩余超时时间
Delay_Ms(1000); //延时1s
if(strstr(SIM7020_RX_BUF,"OK")) //如果接收到OK表示指令成功
break; //主动跳出while循环
}
u1_printf("\r\n"); //串口输出信息
if(timeout<=0)return 1; //如果timeout<=0,说明超时时间到零了,也没能收到OK,返回1,表示错误
return 0; //返回0,正确,说明收到OK,通过break主动跳出while
}
/*-------------------------------------------------*/
/*函数名:关闭eDRX模式指令 */
/*参 数:timeout:超时时间(1s的倍数) */
/*返回值:0:正确 其他:错误 */
/*-------------------------------------------------*/
char SIM7020_eDRX_OFF(int timeout)
{
while(timeout--){ //等待超时时间到0
SIM7020_RxCounter=0; //7020接收数据量变量清零
memset(SIM7020_RX_BUF,0,SIM7020_RXBUFF_SIZE); //清空7020接收缓冲区
SIM7020_printf("AT+CEDRXS=0\r\n"); //发送指令
u1_printf("%d ",timeout); //串口输出现在的剩余超时时间
Delay_Ms(1000); //延时1s
if(strstr(SIM7020_RX_BUF,"OK")) //如果接收到OK表示指令成功
break; //主动跳出while循环
}
u1_printf("\r\n"); //串口输出信息
if(timeout<=0)return 1; //如果timeout<=0,说明超时时间到零了,也没能收到OK,返回1,表示错误
else return 0; //返回0,正确,说明收到OK,通过break主动跳出while
}
/*-------------------------------------------------*/
/*函数名:SIM7020 初始化 */
/*参 数:无 */
/*返回值:无 */
/*-------------------------------------------------*/
char SIM7020_Init(void)
{
char num,csq;
SIM_PowerON(); //开机或重启
u1_printf("发送测试指令,等待串口正常... ...\r\n"); //串口输出信息
if(SIM7020_ATTest_Cmd(50)){ //超时单位100ms,超时时间5s
u1_printf("测试指令超时,准备重启\r\n"); //串口输出信息
return 1; //返回1
}else u1_printf("测试指令成功\r\n"); //串口输出信息
u1_printf("准备检查SIM卡状态... ...\r\n"); //串口输出信息
if(SIM7020_CPIN_Cmd(10)){ //超时单位1s,超时时间10s
u1_printf("检查SIM卡状态超时,准备重启\r\n"); //串口输出信息
return 2; //返回2
}else u1_printf("SIM卡状态正常\r\n"); //串口输出信息
num = 5; //最多查询5次
while(num--){ //循环查询
u1_printf("准备检查信号质量... ...\r\n"); //串口输出信息
csq = SIM7020_CSQ_Cmd(50); //超时单位100ms,超时时间5s
if((csq>0)&&(csq<=31)){ //按到信号范围是否正确
u1_printf("信号强度范围0~31,99表示无信号\r\n"); //串口输出信息
u1_printf("信号强度:%d\r\n",csq); //串口输出信息
break; //跳出while
}
Delay_Ms(1000); //延时1s
}
if(num<=0)return 3; //如果num<=0,说明超过最大查询次数,也没成功,返回3,表示错误
else u1_printf("检查信号质量成功\r\n"); //串口输出信息
u1_printf("准备查询网络附着... ...\r\n"); //串口输出信息
if(SIM7020_CGREG_Cmd(10)){ //超时单位1s,超时时间10s
u1_printf("查询网络附着超时,准备重启\r\n"); //串口输出信息
return 4; //返回4
}else u1_printf("网络附着成功\r\n"); //串口输出信息
u1_printf("准备查询PDN 激活... ...\r\n"); //串口输出信息
if(SIM7020_CGACT_Cmd(10)){ //超时单位1s,超时时间10s
u1_printf("查询PDN 激活超时,准备重启\r\n"); //串口输出信息
return 5; //返回5
}else u1_printf("PDN 激活成功\r\n"); //串口输出信息
u1_printf("准备查询APN和分配的IP地址... ...\r\n"); //串口输出信息
if(SIM7020_CGCONTRDP_Cmd(50)){ //超时单位100ms,超时时间5s
u1_printf("查询APN和分配的IP地址超时,准备重启\r\n"); //串口输出信息
return 6; //返回6
}
u1_printf("准备关闭PCM模式... ...\r\n"); //串口输出信息
if(SIM7020_PSM_OFF(20)){ //超时单位1s,超时时间20s
u1_printf("关闭PCM模式超时,准备重启\r\n"); //串口输出信息
return 7; //返回7
}else u1_printf("关闭PCM模式成功\r\n"); //串口输出信息
u1_printf("准备关闭eDRX模式... ...\r\n"); //串口输出信息
if(SIM7020_eDRX_OFF(20)){ //超时单位1s,超时时间20s
u1_printf("关闭eDRX模式超时,准备重启\r\n"); //串口输出信息
return 8; //返回8
}else u1_printf("关闭eDRX模式成功\r\n"); //串口输出信息
u1_printf("准备锁定波特率... ...\r\n"); //串口输出信息
if(SIM7020_IPR_Cmd(115200,100)){ //超时单位100ms,超时时间10s
u1_printf("锁定波特率超时,准备重启\r\n"); //串口输出信息
return 9; //返回9
}else u1_printf("进锁定波特率成功\r\n"); //串口输出信息
u1_printf("准备DNS解析服务器域名... ...\r\n"); //串口输出信息
if(SIM7020_DNS(ServerIP,10)){ //超时单位1s,超时时间10s
u1_printf("解析服务器域名超时,准备重启\r\n"); //串口输出信息
return 10; //返回10
}else u1_printf("解析服务器域名成功\r\n"); //串口输出信息
Sta_flag = 0; //配置完成,模块状态=1,处于处理数据状态
SIM7020_RxCounter=0; //7020接收数据量变量清零
memset(SIM7020_RX_BUF,0,SIM7020_RXBUFF_SIZE); //清空7020接收缓冲区
return 0; //正确返回0
}
/*-------------------------------------------------*/
/*函数名:把16进制数据转换成字符串 */
/*参 数:data:需要转换的数据 */
/*参 数:data_len:需要转换的数据长度 */
/*参 数:out:存放转换后的数据 */
/*参 数:out_len:缓冲区长度 */
/*返回值:无 */
/*-------------------------------------------------*/
void SIM7020_Hex_to_Str(char *data, int data_len, char *out, int out_len)
{
char temp[2];
int i;
memset(out,0,out_len); //清空缓冲区
for(i=0;i<data_len;i++){ //for循环
sprintf(temp,"%02X",data[i]); //转化数据,转成16进制字符串
strcat(out,temp); //追加到out缓冲区
}
}
/*-------------------------------------------------*/
/*函数名:把字符串转换成16进制数据 */
/*参 数:data:需要转换的数据 */
/*参 数:data_len:需要转换的数据长度 */
/*参 数:out:存放转换后的数据 */
/*参 数:out_len:缓冲区长度 */
/*返回值:无 */
/*-------------------------------------------------*/
void SIM7020_Str_to_Hex(char *data, int data_len, char *out, int out_len)
{
int i;
memset(out,0,out_len); //清空临时缓冲区
for(i=0;i<data_len/2;i++){ //for循环
if(((data[2*i]>='0')&&(data[2*i]<='9'))&&((data[2*i+1]>='0')&&(data[2*i+1]<='9')))
out[i] = (data[2*i]-0x30)*16 + (data[2*i+1]-0x30);
else if(((data[2*i]>='0')&&(data[2*i]<='9'))&&((data[2*i+1]>='A')&&(data[2*i+1]<='F')))
out[i] = (data[2*i]-0x30)*16 + (data[2*i+1]-0x37);
else if(((data[2*i]>='0')&&(data[2*i]<='9'))&&((data[2*i+1]>='a')&&(data[2*i+1]<='f')))
out[i] = (data[2*i]-0x30)*16 + (data[2*i+1]-0x57);
else if(((data[2*i]>='A')&&(data[2*i]<='F'))&&((data[2*i+1]>='0')&&(data[2*i+1]<='9')))
out[i] = (data[2*i]-0x37)*16 + (data[2*i+1]-0x30);
else if(((data[2*i]>='a')&&(data[2*i]<='f'))&&((data[2*i+1]>='0')&&(data[2*i+1]<='9')))
out[i] = (data[2*i]-0x57)*16 + (data[2*i+1]-0x30);
else if(((data[2*i]>='A')&&(data[2*i]<='F'))&&((data[2*i+1]>='A')&&(data[2*i+1]<='F')))
out[i] = (data[2*i]-0x37)*16 + (data[2*i+1]-0x37);
else if(((data[2*i]>='a')&&(data[2*i]<='f'))&&((data[2*i+1]>='a')&&(data[2*i+1]<='f')))
out[i] = (data[2*i]-0x57)*16 + (data[2*i+1]-0x57);
}
}
/*-------------------------------------------------*/
/*函数名:把字符串数字转换成16进制数字 */
/*参 数:data:需要转换的数据 */
/*参 数:data_len:需要转换的数据位数 */
/*返回值:转换后的数字 */
/*-------------------------------------------------*/
int SIM7020_StrNum_to_HexNum(char *data, int data_len)
{
int num;
num = 0;
switch(data_len){
case 1: num += data[0] - 0x30;
break;
case 2: num += (data[0] - 0x30)*10;
num += (data[1] - 0x30);
break;
case 3: num += (data[0] - 0x30)*100;
num += (data[1] - 0x30)*10;
num += (data[2] - 0x30);
break;
case 4: num += (data[0] - 0x30)*1000;
num += (data[1] - 0x30)*100;
num += (data[2] - 0x30)*10;
num += (data[3] - 0x30);
break;
}
return num;
}
/*-------------------------------------------------*/
/*函数名:解析域名 */
/*参 数:domainname:域名 */
/*参 数:timeout:超时时间(1s的倍数) */
/*返回值:0:正确 其他:错误 */
/*-------------------------------------------------*/
char SIM7020_DNS(unsigned char * domainname, int timeout)
{
char *ptr;
char temp[64];
SIM7020_RxCounter=0; //7020接收数据量变量清零
memset(SIM7020_RX_BUF,0,SIM7020_RXBUFF_SIZE); //清空7020接收缓冲区
SIM7020_printf("AT+CDNSGIP=\"%s\"\r\n",domainname); //发送指令
while(timeout--){ //等待超时时间到0
u1_printf("%d ",timeout); //串口输出现在的剩余超时时间
Delay_Ms(1000); //延时1s
ptr = strstr(SIM7020_RX_BUF,"+CDNSGIP: 1"); //搜索+CDNSGIP: 1
if(ptr!=NULL) //如果接收到","表示指令成功
break; //主动跳出while循环
}
u1_printf("\r\n"); //串口输出信息
if(timeout<=0)return 1; //如果timeout<=0,说明超时时间到零了,也没能收到",",返回1,表示错误
else{ //反之,表示正确,说明收到",",通过break主动跳出while
memset(DNSIP,0,128); //清空缓冲区
sscanf(ptr,"%[^\"]\"%[^\"]\"%[^\"]\"%[^\"]",temp,temp,temp,DNSIP); //格式化搜索ip信息
u1_printf("DNS解析到的IP:%s\r\n",DNSIP); //串口输出信息
EEPROM_WriteData(0,(unsigned int *)DNSIP,4); //内部EEprom写入数据
}
return 0; //正确返回0
}
/*-------------------------------------------------*/
/*函数名:创建coAP客户端,连接服务器 */
/*参 数:timeout:超时时间(1s的倍数) */
/*返回值:0:正确 其他:错误 */
/*-------------------------------------------------*/
char SIM7020_CCOAPNEW(int timeout)
{
SIM7020_RxCounter=0; //7020接收数据量变量清零
memset(SIM7020_RX_BUF,0,SIM7020_RXBUFF_SIZE); //清空7020接收缓冲区
SIM7020_printf("AT+CCOAPNEW=\"%s\",%d,1\r\n",DNSIP,ServerPort); //发送指令
while(timeout--){ //等待超时时间到0
u1_printf("%d ",timeout); //串口输出现在的剩余超时时间
Delay_Ms(1000); //延时1s
if(strstr(SIM7020_RX_BUF,"OK")) //如果接收到OK表示指令成功
break; //主动跳出while循环
}
u1_printf("\r\n"); //串口输出信息
if(timeout<=0)return 1; //如果timeout<=0,说明超时时间到零了,也没能收到OK,返回1,表示错误
return 0; //正确返回0,说明收到OK,通过break主动跳出while
}
/*-------------------------------------------------*/
/*函数名:关闭coAP客户端,连接服务器 */
/*参 数:timeout:超时时间(100ms的倍数) */
/*返回值:0:正确 其他:错误 */
/*-------------------------------------------------*/
char SIM7020_CCOAPDEL(int timeout)
{
SIM7020_RxCounter=0; //7020接收数据量变量清零
memset(SIM7020_RX_BUF,0,SIM7020_RXBUFF_SIZE); //清空7020接收缓冲区
SIM7020_printf("AT+CCOAPDEL=1\r\n"); //发送指令
while(timeout--){ //等待超时时间到0
u1_printf("%d ",timeout); //串口输出现在的剩余超时时间
Delay_Ms(100); //延时100ms
if(strstr(SIM7020_RX_BUF,"OK")) //如果接收到OK表示指令成功
break; //主动跳出while循环
}
u1_printf("\r\n"); //串口输出信息
if(timeout<=0)return 1; //如果timeout<=0,说明超时时间到零了,也没能收到OK,返回1,表示错误
return 0; //正确返回0,说明收到OK,通过break主动跳出while
}
/*-------------------------------------------------*/
/*函数名:coAP发送认证数据 包 */
/*参 数:timeout:超时时间(100ms的倍数) */
/*参 数:data:需要发送的数据 */
/*参 数:data_len:需要发送的数据位数 */
/*返回值:0:正确 其他:错误 */
/*-------------------------------------------------*/
char SIM7020_CCOASend_Auth(int timeout,unsigned char *data, int data_len)
{
int i;
char *str;
char token_temp[64];
char temp[64];
SIM7020_Hex_to_Str((char *)data,data_len,data_temp1,2048); //转化数据
SIM7020_RxCounter=0; //7020接收数据量变量清零
memset(SIM7020_RX_BUF,0,SIM7020_RXBUFF_SIZE); //清空7020接收缓冲区
SIM7020_printf("AT+CCOAPSEND=1,%d,\"%s\"\r\n",data_len,data_temp1); //发送数据指令
while(timeout--){ //等待超时时间到0
u1_printf("%d ",timeout); //串口输出现在的剩余超时时间
Delay_Ms(100); //延时100ms
if(strstr(SIM7020_RX_BUF,"+CCOAPNMI:")) //如果接收到+CCOAPNMI:表示指令成功,并且服务器回复了数据
break; //主动跳出while循环
}
u1_printf("\r\n"); //串口输出信息
if(timeout<=0)return 1; //如果timeout<=0,说明超时时间到零了,也没能收到+CCOAPNMI:,返回1,表示错误
else{ //反之,表示正确,说明收到+CCOAPNMI:,通过break主动跳出while
str = strstr(SIM7020_RX_BUF,"+CCOAPNMI:"); //找到+CCOAPNMI:开始的位置
memset(data_temp1,0,2048); //清空缓冲区
sscanf(str,"%[^,],%[^,],%[^\r]",temp,temp,data_temp1); //格式化搜索,保存数据信息
SIM7020_Str_to_Hex(data_temp1,strlen(data_temp1),data_temp2,2048); //转换数据
memset(token_temp,0,64); //清空缓冲区
str =data_temp2;
if(str!=NULL){ //如果找到了,进入if
u1_printf("服务器发来的数据:%s\r\n\r\n",str); //串口输出信息
//sscanf(str,"{\"random\":\"%[^\"]\",\"seqOffset\":%[^,],\"token\":\"%[^\"]\"}",random_temp,seqoffset_temp,token_temp); //格式化搜索,保存数据信息
memcpy(Data_CB.auth_token,token_temp,strlen(token_temp)); //拷贝token
u1_printf("token:%s\r\n",Data_CB.auth_token); //串口输出信息
u1_printf("key:"); //串口输出信息
for(i=0;i<16;i++) u1_printf("0x%02x ",Data_CB.auth_key[i]); //串口输出信息
u1_printf("\r\n\r\n"); //串口输出信息
}else{ //如果没找到,进入else
u1_printf("数据格式错误,重启\r\n"); //串口输出信息
return 2; //返回2
}
}
return 0; //正确,返回0
}
/*-------------------------------------------------*/
/*函数名:coAP发送数据 */
/*参 数:timeout:超时时间(100ms的倍数) */
/*参 数:data:需要发送的数据 */
/*参 数:data_len:需要发送的数据位数 */
/*返回值:0:正确 其他:错误 */
/*-------------------------------------------------*/
char SIM7020_CCOASend_Data(int timeout,unsigned char *data, int data_len)
{
char *str;
SIM7020_Hex_to_Str((char *)data,data_len,data_temp1,2048); //转化数据
SIM7020_RxCounter=0; //7020接收数据量变量清零
memset(SIM7020_RX_BUF,0,SIM7020_RXBUFF_SIZE); //清空7020接收缓冲区
SIM7020_printf("AT+CCOAPSEND=1,%d,\"%s\"\r\n",data_len,data_temp1); //发送数据指令
while(timeout--){ //等待超时时间到0
u1_printf("%d ",timeout); //串口输出现在的剩余超时时间
Delay_Ms(100); //延时1s
if(strstr(SIM7020_RX_BUF,"+CCOAPNMI:")) //如果接收到+CCOAPNMI:表示指令成功,并且服务器回复了数据
break; //主动跳出while循环
if(strstr(SIM7020_RX_BUF,"ERROR")) //如果接收到ERROR表示发送失败
return 1; //直接返回1
}
u1_printf("\r\n"); //串口输出信息
if(timeout<=0)return 2; //如果timeout<=0,说明超时时间到零了,也没能收到+CCOAPNMI:,返回2,表示错误
else{ //反之,表示正确,说明收到+CCOAPNMI:,通过break主动跳出while
str = strstr(SIM7020_RX_BUF,",60"); //找到,60的位置
if((str[3]!='4')&&(str[4]!='5')) //如果不是0x45表示错误
return 3; //返回3
else //反之是0x45表示正确
return 0; //返回0
}
}
/*-------------------------------------------------*/
/*函数名:进入PSM模式 */
/*参 数:timeout:超时时间(1s的倍数) */
/*返回值:0:正确 其他:错误 */
/*-------------------------------------------------*/
char SIM7020_EnterPSM(int timeout)
{
SIM7020_RxCounter=0; //7020接收数据量变量清零
memset(SIM7020_RX_BUF,0,SIM7020_RXBUFF_SIZE); //清空7020接收缓冲区
SIM7020_printf("AT+CPSMSTATUS=1\r\n"); //发送指令
while(timeout--){ //等待超时时间到0
u1_printf("%d ",timeout); //串口输出现在的剩余超时时间
Delay_Ms(1000); //延时1s
if(strstr(SIM7020_RX_BUF,"OK")) //如果接收到OK表示指令成功,并且服务器回复了数据
break; //主动跳出while循环
}
u1_printf("\r\n"); //串口输出信息
if(timeout<=0)return 1; //如果timeout<=0,说明超时时间到零了,也没能收到OK,返回1,表示错误
else{ //反之,表示正确,说明收到OK,通过break主动跳出while
SIM7020_RxCounter=0; //7020接收数据量变量清零
memset(SIM7020_RX_BUF,0,SIM7020_RXBUFF_SIZE); //清空7020接收缓冲区
SIM7020_printf("AT+CPSMS=1,,,\"00011111\",\"00000101\"\r\n"); //发送指令
while(timeout--){ //等待超时时间到0
u1_printf("%d ",timeout); //串口输出现在的剩余超时时间
Delay_Ms(1000); //延时1s
if(strstr(SIM7020_RX_BUF,"ENTER PSM")) //如果接收到ENTER PSM表示指令成功,并且服务器回复了数据
break; //主动跳出while循环
}
u1_printf("\r\n"); //串口输出信息
if(timeout<=0)return 2; //如果timeout<=0,说明超时时间到零了,也没能收到ENTER PSM,返回2`,表示错误
else return 0; //反之,表示正确,说明收到ENTER PSM,通过break主动跳出while
}
}
/*-------------------------------------------------*/
/*函数名:退出PSM模式 */
/*参 数:timeout:超时时间(1s的倍数) */
/*返回值:0:正确 其他:错误 */
/*-------------------------------------------------*/
char SIM7020_ExitPSM(int timeout)
{
SIM_PwrKeyInit(); //初始化sim7020开关机IO
SIM_PwrStaInit(); //初始化sim7020开关机状态IO
Delay_Ms(500); //延时
POWER_KEY(1); //先拉高PB0
Delay_Ms(1000); //延时
POWER_KEY(0); //再拉低PB0
while(timeout--){ //等待超时时间到0
u1_printf("%d ",timeout); //串口输出现在的剩余超时时间
Delay_Ms(1000); //延时1s
if(strstr(SIM7020_RX_BUF,"EXIT PSM")) //如果接收到EXIT PSM表示退出PSM成功
break; //主动跳出while循环
if(strstr(SIM7020_RX_BUF,"*MATREADY: 1")) //如果接收到*MATREADY: 1表示退出PSM成功
break; //主动跳出while循环
if(strstr(SIM7020_RX_BUF,"+CFUN: 1")) //如果接收到+CFUN: 1表示退出PSM成功
break; //主动跳出while循环
if(strstr(SIM7020_RX_BUF,"+CPIN: READY")) //如果接收到+CPIN: READY表示退出PSM成功
break; //主动跳出while循环
}
u1_printf("\r\n"); //串口输出信息
if(timeout<=0)return 1; //如果timeout<=0,说明超时时间到零了,也没能收到EXIT PSM,返回1,表示错误
else{ //反之,表示正确,说明收到EXIT PSM,通过break主动跳出while
u1_printf("准备关闭PCM模式... ...\r\n"); //串口输出信息
if(SIM7020_PSM_OFF(10)){ //超时单位1s,超时时间10s
u1_printf("关闭PCM模式超时,准备重启\r\n"); //串口输出信息
return 2; //返回
}else u1_printf("关闭PCM模式成功\r\n"); //串口输出信息
}
return 0;
}
coap协议接入STM例程打包源码进入宜联IOT中继宝盒主操作界面打开“IOT设备接口”窗口,选择对应的设备–设备接入端接口中对应的协议接入样例中下载。
本章节用于指导北向应用开发者,通过IOT平台API接口,获取设备实时数据、设备告警数据、设备事件和服务功能调用实现业务应用接入开发。
应用接入主要分为设备实时数据查询、设备实时控制、设备告警数据接收。IOT平台通过提供Http Rest API用于设备数据查询、设备实时控制和设备实时数据推送、设备告警数据接收。开发者可根据本文档说明基于IOT平台进行北向应用对接。
本API适用对象为用户侧北向应用开发者,供应用业务系统接入本IOT中继平台获取接入设备物模型定义数据、设备上报数据或向接入设备下发指令使用。
用户侧业务系统同本IOT中继系统平台通过http协议通讯,通过http接口调用实现从本IOT中继平台获取接入设备物模型属性、事件数据、设备上报数据或向接入设备下发执行指令。
POST/GET方式调用:(SERVER_URL)/(INTERFACE)
| 参数名称 | 参数类型 | 参数说明 |
|---|---|---|
| Authorization | Header | 用于区分接入方应用身份的验证内容,通常为Bearer XXXXXXX格式 |
| Content-Type | Header | application/json |
| token | Header | 固定值:登陆后调用业务口时设置,内容从登陆鉴权的响应报文中获取 |
接口响应内容为JSON格式报文:
| 报文属性 | 说明 |
|---|---|
| code | 响应标识代码 |
| success | true/false,请求是否成功 |
| data | 请求返回的数据 |
| msg | 请求返回的消息 |
响应代码:
| 代码 | 说明 |
|---|---|
| 200 | 请求正确完成 |
| 0 | 后台处理成功 |
| -1 | 后台处理失败 |
| 401 | 没有授权 |
| 403 | 资源不可用 |
| 404 | 访问地址不存在 |
| 500 | 系统错误 |
如果您使用IOT中继宝盒设备启用了内网穿透功能,在我司业务平台注册了子域名并与本设备进行了域名终端绑定, 那么本API调用接口调用URL地址则分为内网调用地址(通常为局域网内IP地址和端口)和外网调用地址(通常为域名地址和端口), 在本文档后面各章节介绍时默认的API调用URL为内网调用地址,外网API调用地址为子域名加端口号组成,请注意区分。
例如你在我司业务平台申请了子域名 iotbox.iotrelay.cn ,在后面章节中的相关API接口地址会给出对应的子域名调用地址。
服务器地址: http://192.168.0.105:18080
域名访问地址: http://iotbox.iotrelay.cn:8080
用户名: 159xxxxxxxx IOT中继平台的连接账号 (在本IOT中继平台–系统设置–系统参数配置中设置的终端用户账号)
密码: XXXXXX IOT中继平台的连接口令 (在本IOT中继平台–系统设置–系统参数配置中设置的终端用户口令)
Authorization: Bearer xxxxxxxxx (xxxxxxxxx 为登陆鉴权成功返回的token)
特别说明: 此处服务器IP地址为本IOT中继宝盒里面配置的盒子的IP地址,本文档后面出现的IP地址“192.168.0.105 ” 根据您盒子的配置统一替换,在本文档中只是演示使用。
Request URL: http://192.168.0.105:18080/oauth/token
域名访问URL: http://iotbox.iotrelay.cn:8080/api/oauth/token
Request Method: POST
数据提交格式 application/json
请求头 无
请求体格式 :
{ "username": "159xxxxxxxx", "password": "******" }
请求体参数说明:
| 参数名 | 类型 | 必须 | 描述 |
|---|---|---|---|
| username | string | 是 | IOT中继平台的连接账号 (在本IOT中继平台–系统设置–系统参数配置中设置的终端用户账号),此连接账号为: 159xxxxxxxx |
| password | string | 是 | IOT中继平台的连接口令 (在本IOT中继平台–系统设置–系统参数配置中设置的终端用户口令 ******* ) |
正确响应结果示例:
{
"code": "200",
"msg": "success",
"data": {
"token" : "eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiJiNjE3OGVlN2ZhNWM0OWU2ODlmMGEzNjIxNzkxYzk2OCIsInN1YiI6IntcInVzZXJJZFwiOlwiNDlcIixcInVzZXJOYW1lXCI6XCIxMzQzNzE1NjU2OVwiLFwibmlja05hbWVcIjpcIjQ0MDgwMDAwMDAxMTExMDAwMDE3XCJ9IiwiaXNzIjoic2oiLCJpYXQiOjE2OTcxNTk2NjgsImV4cCI6MTY5NzE2MTQ2OH0.4C3GJIF5ejmySHy9l_LmheoCs5jknq17h9tPsZB3dIM"
}
}
错误响应结果示例:
{
"code": "-1",
"msg": "fail:用户登录验证失败"
}
Request URL: http://192.168.0.105:18080/loginOut
域名访问URL: http://iotbox.iotrelay.cn:8080/api/loginOut
Request Method: GET
请求头参数 Authorization
请求头参数说明:
| 参数名 | 类型 | 必须 | 描述 |
|---|---|---|---|
| Authorization | Header | 是 | 固定值:字符串"Bearer" +"token"组成, "token"为上述登录接口获取的属性值,如:请求头中 “Authorization” : “Bearer eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiJiNjE3OGVlN2ZhNWM0OWU2ODlmMGEzNjIxNzkxYzk2OCIsInN1YiI6IntcInVzZXJJZFwiOlwiNDlcIixcInVzZXJOYW1lXCI6XCIxMzQzNzE1NjU2OVwiLFwibmlja05hbWVcIjpcIjQ0MDgwMDAwMDAxMTExMDAwMDE3XCJ9IiwiaXNzIjoic2oiLCJpYXQiOjE2OTcxNTk2NjgsImV4cCI6MTY5NzE2MTQ2OH0.4C3GJIF5ejmySHy9l_LmheoCs5jknq17h9tPsZB3dIM” |
请求体格式 :无
正确响应结果示例:
{
"msg": "注销成功",
"code": "200",
"data": "{ }"
}
错误响应结果示例:
{
"code": "-1",
"msg": "注销失败"
}
接口功能 本接口主要实现查询接入本IOT中继平台的设备信息。
Request URL: http://192.168.0.105:18080/openApi/queryIotDeviceRecord
域名访问URL: http://iotbox.iotrelay.cn:8080/api/openApi/queryIotDeviceRecord
Request Method: GET
数据提交格式 Query String Parameters
请求头参数 Authorization
请求头参数说明:
| 参数名 | 类型 | 必须 | 描述 |
|---|---|---|---|
| Authorization | Header | 是 | 固定值:字符串“Bearer” +“token”组成, "token"为上述登录接口获取的属性值,如:请求头中 “Authorization” : “Bearer eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiJiNjE3OGVlN2ZhNWM0OWU2ODlmMGEzNjIxNzkxYzk2OCIsInN1YiI6IntcInVzZXJJZFwiOlwiNDlcIixcInVzZXJOYW1lXCI6XCIxMzQzNzE1NjU2OVwiLFwibmlja05hbWVcIjpcIjQ0MDgwMDAwMDAxMTExMDAwMDE3XCJ9IiwiaXNzIjoic2oiLCJpYXQiOjE2OTcxNTk2NjgsImV4cCI6MTY5NzE2MTQ2OH0.4C3GJIF5ejmySHy9l_LmheoCs5jknq17h9tPsZB3dIM” |
请求体参数说明:
| 参数名 | 类型 | 必须 | 描述 |
|---|---|---|---|
| deviceId | string | 否 | 接入设备ID标识,黄色为接入设备ID标识值 “44080000001111000020” 此参数非必须项,提交则查询指定ID设备,不填查询所有接入设备数据 |
正确响应结果示例:
{
"code": "0",
"msg": "当前查询条件数据共9条",
"data": [
{
"id": "1668070137338527745",
"deviceSn": "1686533886638-20001",
"deviceName": "智能水表",
"manufacturer": "武汉智能水表制造厂",
"brand": "智光",
"model": "200101-11",
"transportProtocol": "7",
"createTime": "2023-06-12 09:38:06",
"updateTime": "null",
"deviceRegTime": "2023-08-12 09:38:06",
"lastOnlineTime": "2023-10-12 09:38:06",
"status": "1",
"isDeleted": "0",
"remark": "备注",
"deviceId": "<mark>44080000001111000020</mark>",
"onlineStatus": "0"
},
{
"id": "1652585079228186626",
"deviceSn": "1682841961075-12222222",
"deviceName": "采光仪",
"manufacturer": "武汉*****制造厂",
"brand": "智光",
"model": "200101-11",
"transportProtocol": "2",
"createTime": "2023-06-12 09:38:06",
"updateTime": "null",
"deviceRegTime": "2023-08-12 09:38:06",
"lastOnlineTime": "2023-10-12 09:38:06",
"status": "1",
"isDeleted": "0",
"remark": "备注",
"deviceId": "<mark>44080000001111000019</mark>",
"onlineStatus": "0",
},
。。。。。。
]
}
返回参数说明:
| 参数名 | 类型 | 描述 |
|---|---|---|
| id | string | ID |
| deviceSn | string | 设备编号 |
| deviceName | string | 设备名称 |
| manufacturer | string | 设备生产厂家 |
| brand | string | 设备品牌 |
| model | string | 设备型号 |
| transportProtocol | string | 设备接入方式:1、设备直连modbus协议接入;2、MQTT协议接入;3、http协议接入;4、websocket服务接入;7、coap协议接入;8、第三方平台拉取 |
| createTime | datetime | 设备添加时间 |
| updateTime | datetime | 设备修改时间 |
| deviceRegTime | datetime | 设备注册时间 |
| lastOnlineTime | datetime | 设备最后在线时间 |
| status | integer | 设备状态:0、禁用;1、启用 |
| isDeleted | integer | 是否逻辑删除 0、否;1、是 |
| deviceId | string | 接入设备ID标识,例如 :黄色 "44080000001111000020"为接入设备ID标识值 |
| onlineStatus | integer | 设备在线状态 0、离线;1、在线 |
| remark | string | 备注 |
错误响应结果示例:
{
"code": "-1",
"msg": "fail:数据查询失败"
}
接口功能 本接口主要实现查询本IOT中继平台添加的设备物模型信息。
Request URL: http://192.168.0.105:18080/openApi/queryDeviceModelRecord
域名访问URL: http://iotbox.iotrelay.cn:8080/api/openApi/queryDeviceModelRecord
Request Method: GET
数据提交格式 Query String Parameters
请求头参数 Authorization
请求头参数说明:
| 参数名 | 类型 | 必须 | 描述 |
|---|---|---|---|
| Authorization | Header | 是 | 固定值:字符串“Bearer” +“token”组成, "token"为上述登录接口获取的属性值,如:请求头中 “Authorization” : “Bearer eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiJiNjE3OGVlN2ZhNWM0OWU2ODlmMGEzNjIxNzkxYzk2OCIsInN1YiI6IntcInVzZXJJZFwiOlwiNDlcIixcInVzZXJOYW1lXCI6XCIxMzQzNzE1NjU2OVwiLFwibmlja05hbWVcIjpcIjQ0MDgwMDAwMDAxMTExMDAwMDE3XCJ9IiwiaXNzIjoic2oiLCJpYXQiOjE2OTcxNTk2NjgsImV4cCI6MTY5NzE2MTQ2OH0.4C3GJIF5ejmySHy9l_LmheoCs5jknq17h9tPsZB3dIM” |
请求体参数说明:
| 参数名 | 类型 | 必须 | 描述 |
|---|---|---|---|
| deviceId | string | 否 | 接入设备ID标识,黄色为接入设备ID标识值 “44080000001111000020” 此参数非必须项,提交则查询指定ID设备物模型,不填查询所有设备物模型数据 |
正确响应结果示例:
{
"code": "0",
"msg": "当前查询条件数据共9条",
"data": [
{
"deviceId": "<mark>44080000001111000020</mark>",
"deviceSn": "1686533886638-20001",
"deviceName": "智能水表",
"modelPropertiesList": [
{
"id": "1706862023251443713",
"propertiesId": "P_1695782510161",
"propertiesName": "累计流量",
"readWriteType": "3",
"functionDescrible": "水表累计流量数",
"propertiesValueDataType": "float_value",
"measurementUnit": "立方米",
"scaleFactor": "1",
"remark": "备注",
"deviceId": "44080000001111000020"
},
{
"id": "1707306101961216002",
"propertiesId": "P_1695888406309",
"propertiesName": "当天流量",
"readWriteType": "3",
"functionDescrible": "",
"propertiesValueDataType": "float_value",
"measurementUnit": "立方米/日",
"scaleFactor": "1",
"remark": "备注",
"deviceId": "44080000001111000020"
},
。。。。。。
],
"modelEventList": [
{
"id": "1706870477215006721",
"eventId": "E_1695784590868",
"eventName": "关机",
"eventType": "1",
"eventDescrible": "设备关机",
"remark": "备注",
"deviceId": "44080000001111000020"
},
{
"id": "1706870544625860609",
"eventId": "E_1695784610250",
"eventName": "温度超标",
"eventType": "2",
"eventDescrible": "设备关机",
"remark": "备注",
"deviceId": "44080000001111000020"
},
。。。。。。
],
"modelFunctionList": [
{
"id": "1706869281414742017",
"functionId": "F_1695784302400",
"functionName": "开机",
"functionDescrible": "开机",
"isAsynchronous": "0",
"functionValueDataType": "boolean_value",
"outMeasurementUnit": "bool",
"remark": "备注",
"deviceId": "44080000001111000020"
},
{
"id": "1706869330228051970",
"functionId": "F_1695784325940",
"functionName": "关机",
"functionDescrible": "关机",
"isAsynchronous": "0",
"functionValueDataType": "boolean_value",
"outMeasurementUnit": "bool",
"remark": "备注",
"deviceId": "44080000001111000020"
},
。。。。。。
]
},
{
"deviceId": "44080000001111000019",
"deviceSn": "1682841961075-12222222",
"deviceName": "采光仪",
"modelPropertiesList": [
{
"id": "1710221430756483073",
"propertiesId": "P_1696583483495",
"propertiesName": "光照亮度",
"readWriteType": "1",
"functionDescrible": "光照亮度",
"propertiesValueDataType": "float_value",
"measurementUnit": "%",
"scaleFactor": "1",
"remark": "备注",
"deviceId": "44080000001111000019"
},
。。。。。。
],
"modelEventList": [
{
"id": "1710225578575011841",
"eventId": "E_1696584389929",
"eventName": "无光源",
"eventType": "3",
"eventDescrible": "故障",
"remark": "备注",
"deviceId": "44080000001111000019"
},
。。。。。。
],
"modelFunctionList": [
{
"id": "1710224892160385025",
"functionId": "F_1696584326733",
"functionName": "设备故障关机",
"functionDescrible": "下发设备故障关机指令",
"isAsynchronous": "0",
"functionValueDataType": "integer_value",
"outMeasurementUnit": "boolean",
"remark": "下发设备故障关机指令",
"deviceId": "44080000001111000019"
},
。。。。。。
]
},
。。。。。。
]
}
返回参数说明:
| 参数名 | 类型 | 描述 |
|---|---|---|
| id | string | ID |
| deviceId | string | 接入设备ID标识,例如 :黄色 "44080000001111000020"为接入设备ID标识值 |
| deviceSn | string | 设备编号 |
| deviceName | string | 设备名称 |
| remark | string | 备注 |
| modelPropertiesList | array | 物模型属性集合标识 |
| propertiesId | string | 物模型属性ID标识 |
| propertiesName | string | 物模型属性名称 |
| readWriteType | string | 读写类型: 1、读;2、写;3、上报 |
| functionDescrible | string | 物模型属性功能描述 |
| propertiesValueDataType | string | 物模型属性值数据类型:integer_value/float_value/string_value/date_value/time_value/json_value |
| measurementUnit | string | 物模型属性计量单位 |
| scaleFactor | integer | 精度(缩放因子,单位的精度:比如温度、湿度以10倍的数值表示,需要把读取的结果/10) |
| modelEventList | array | 物模型事件集合标识 |
| eventId | string | 物模型事件ID标识 |
| eventName | string | 物模型事件名称 |
| eventType | integer | 物模型事件类别, 事件类型:1、信息;2、告警;3、故障 |
| eventDescrible | string | 物模型事件描述 |
| modelFunctionList | array | 物模型功能集合标识 |
| functionId | string | 物模型功能ID标识 |
| functionName | string | 物模型功能名称 |
| isAsynchronous | integer | 是否异步 1、异步 ;0、否 |
| functionDescrible | string | 物模型功能描述 |
| functionValueDataType | string | 输出参数数据类型(对应 integer_value/float_value/string_value/date_value/time_value/json_value) |
| outMeasurementUnit | string | 输出参数数据单位(如:度、米、转每分钟、流量单位、功率单位等 |
错误响应结果示例:
{
"code": "-1",
"msg": "fail:数据查询失败"
}
接口功能 本接口主要实现查询返回IOT中继平台定义的物模型属性数据记录总数,例如根据时间段,每页数据量大小、指定设备ID 查询返回设备采集上报的温度等属性数据记录数信息。
Request URL: http://192.168.0.105:18080/openApi/queryPropertiesDataRecordCount
域名访问URL: http://iotbox.iotrelay.cn:8080/api/openApi/queryPropertiesDataRecordCount
Request Method: GET
数据提交格式 Query String Parameters
请求头参数 Authorization
请求头参数说明:
| 参数名 | 类型 | 必须 | 描述 |
|---|---|---|---|
| Authorization | Header | 是 | 固定值:字符串“Bearer” +“token”组成, "token"为上述登录接口获取的属性值,如:请求头中 “Authorization” : “Bearer eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiJiNjE3OGVlN2ZhNWM0OWU2ODlmMGEzNjIxNzkxYzk2OCIsInN1YiI6IntcInVzZXJJZFwiOlwiNDlcIixcInVzZXJOYW1lXCI6XCIxMzQzNzE1NjU2OVwiLFwibmlja05hbWVcIjpcIjQ0MDgwMDAwMDAxMTExMDAwMDE3XCJ9IiwiaXNzIjoic2oiLCJpYXQiOjE2OTcxNTk2NjgsImV4cCI6MTY5NzE2MTQ2OH0.4C3GJIF5ejmySHy9l_LmheoCs5jknq17h9tPsZB3dIM” |
请求体参数说明:
| 参数名 | 类型 | 必须 | 描述 |
|---|---|---|---|
| deviceId | string | 否 | 接入设备ID标识,黄色为接入设备ID标识值 “44080000001111000001” |
| propertiesId | string | 否 | IOT接入设备物模型属性ID标识,黄色为物模型属性ID标识值 “P_1696583483495” |
| startDateTime | datime | 是 | 开始时间,"YYYY-MM-DD HH:MM:SS"格式,例如:2023-10-01 00:00:00 |
| endDateTime | datime | 是 | 截止时间,"YYYY-MM-DD HH:MM:SS"格式,例如:2023-10-01 23:23:23 |
| pageSize | integer | 是 | 每页大小,设置分页每页数据量,最大数值限制10000条 |
正确响应结果示例:
{
"code": "0",
"msg": "当前查询条件数据共4条,每页10000条,合计1页",
"data": {
"msg": "当前查询条件数据共4条,每页10000条,合计1页",
"success": "true",
"count": "4",
"pageSize": "10000",
"pageNum": "1"
}
}
返回参数说明:
| 参数名 | 类型 | 描述 |
|---|---|---|
| msg | string | 返回结果信息说明 |
| count | integer | 符合条件的数据记录总条数 |
| pageSize | integer | 每页大小 |
| pageNum | integer | 按当前每页大小可分多少页 |
错误响应结果示例:
{
"code": "-1",
"msg": "fail:数据查询失败"
}
接口功能 本接口主要实现查询接入设备向本中继平台上报的或本IOT中继本平台从接入设备读取的物模型属性数据,根据时间段、设备ID等查询条件返回数据信息。例如:接入设备上报的设备工作温度,读取设备的压力等物模型属性数据。
Request URL: http://192.168.0.105:18080/openApi/queryPropertiesDataRecord
域名访问URL: http://iotbox.iotrelay.cn:8080/api/openApi/queryPropertiesDataRecord
Request Method: GET
数据提交格式 Query String Parameters
请求头参数 ** Authorization**
请求头参数说明:
| 参数名 | 类型 | 必须 | 描述 |
|---|---|---|---|
| Authorization | Header | 是 | 固定值:字符串“Bearer” +“token”组成, "token"为上述登录接口获取的属性值,如:请求头中 “Authorization” : “Bearer eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiJiNjE3OGVlN2ZhNWM0OWU2ODlmMGEzNjIxNzkxYzk2OCIsInN1YiI6IntcInVzZXJJZFwiOlwiNDlcIixcInVzZXJOYW1lXCI6XCIxMzQzNzE1NjU2OVwiLFwibmlja05hbWVcIjpcIjQ0MDgwMDAwMDAxMTExMDAwMDE3XCJ9IiwiaXNzIjoic2oiLCJpYXQiOjE2OTcxNTk2NjgsImV4cCI6MTY5NzE2MTQ2OH0.4C3GJIF5ejmySHy9l_LmheoCs5jknq17h9tPsZB3dIM” |
请求体参数说明:
| 参数名 | 类型 | 必须 | 描述 |
|---|---|---|---|
| deviceId | string | 否 | 接入设备ID标识,黄色为接入设备ID标识值 “44080000001111000017” |
| propertiesId | string | 否 | IOT接入设备物模型属性ID标识,黄色为物模型属性ID标识值 “P_1697248637282” |
| startDateTime | datime | 是 | 开始时间,"YYYY-MM-DD HH:MM:SS"格式,例如:2023-10-01 00:00:00 |
| endDateTime | datime | 是 | 截止时间,"YYYY-MM-DD HH:MM:SS"格式,例如:2023-10-01 23:23:23 |
| pageSize | integer | 是 | 每页大小,设置分页每页数据量,最大数值限制10000条 |
| queryPageNo | integer | 是 | 查询的当前页号 |
正确响应结果示例:
{
"code": "0",
"msg": "当前页查询返回数据共4条,当前页是:1页",
"data": {
"msg": "当前页查询返回数据共4条,当前页是:1页",
"propertiesDataRecords":[
{
"deviceId": "<mark>44080000001111000017</mark>",
"propertiesId": "P_1697248637282",
"dataTime": "2023-10-14 10:38:25"
"pointName": "溫度"
"dataValueDataType": "null"
"integerValue": 36
"longValue": "null"
"floatValue": "null"
"doubleValue": "null"
"stringValue": "null"
"booleanValue": "null"
"dateValue": "null"
"timeValue": "null"
"jsonValue": "null"
},
{
"deviceId": "<mark>44080000001111000017</mark>",
"propertiesId": "P_1697248637282",
"dataTime": "2023-10-14 10:51:40"
"pointName": "溫度"
"dataValueDataType": "null"
"integerValue": 37
"longValue": "null"
"floatValue": "null"
"doubleValue": "null"
"stringValue": "null"
"booleanValue": "null"
"dateValue": "null"
"timeValue": "null"
"jsonValue": "null"
},
{
"deviceId": "<mark>44080000001111000017</mark>",
"propertiesId": "P_1697248637282",
"dataTime": "2023-10-14 11:12:33"
"pointName": "溫度"
"dataValueDataType": "null"
"integerValue": 36
"longValue": "null"
"floatValue": "null"
"doubleValue": "null"
"stringValue": "null"
"booleanValue": "null"
"dateValue": "null"
"timeValue": "null"
"jsonValue": "null"
},
{
"deviceId": "44080000001111000017",
"propertiesId": "P_1697248637282",
"dataTime": "2023-10-16 11:33:25"
"pointName": "溫度"
"dataValueDataType": "null"
"integerValue": 38
"longValue": "null"
"floatValue": "null"
"doubleValue": "null"
"stringValue": "null"
"booleanValue": "null"
"dateValue": "null"
"timeValue": "null"
"jsonValue": "null"
}
],
"success": true,
"count": 4
}
}
返回参数说明:
| 参数名 | 类型 | 描述 |
|---|---|---|
| msg | string | 返回结果信息说明 |
| count | integer | 符合条件的数据记录总条数 |
| propertiesDataRecords | array | 查询返回的数据集合标识 |
| deviceId | string | 设备ID标识 |
| propertiesId | string | 物模型属性ID标识 |
| pointName | string | 数据(测点)名称 |
| dataTime | dataTime | 数据上报(读取)时间 |
| dataValueDataType | string | 数据值类别:对应 integer_value/float_value/string_value/date_value/time_value/json_value |
| integerValue | integer | 数据值 |
| float_value | float | 数据值 |
| string_value | string | 数据值 |
| date_value | date | 数据值 |
| time_value | time | 数据值 |
| json_value | json | 数据值 |
错误响应结果示例:
{
"code": "-1",
"msg": "fail:查询物模型属性数据失败"
}
接口功能 本接口主要实现获取接入设备向本中继平台上报的物模型事件数据,根据时间段、设备ID等查询条件返回数据记录统计信息。例如:接入设备上报的设备开机、关机、故障、预警等设备事件信息。
Request URL: http://192.168.0.105:18080/openApi/queryEventDataRecordCount
域名访问URL: http://iotbox.iotrelay.cn:8080/api/openApi/queryEventDataRecordCount
Request Method: GET
数据提交格式 Query String Parameters
请求头参数 Authorization
请求头参数说明:
| 参数名 | 类型 | 必须 | 描述 |
|---|---|---|---|
| Authorization | Header | 是 | 固定值:字符串“Bearer” +“token”组成, "token"为上述登录接口获取的属性值,如:请求头中 “Authorization” : “Bearer eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiJiNjE3OGVlN2ZhNWM0OWU2ODlmMGEzNjIxNzkxYzk2OCIsInN1YiI6IntcInVzZXJJZFwiOlwiNDlcIixcInVzZXJOYW1lXCI6XCIxMzQzNzE1NjU2OVwiLFwibmlja05hbWVcIjpcIjQ0MDgwMDAwMDAxMTExMDAwMDE3XCJ9IiwiaXNzIjoic2oiLCJpYXQiOjE2OTcxNTk2NjgsImV4cCI6MTY5NzE2MTQ2OH0.4C3GJIF5ejmySHy9l_LmheoCs5jknq17h9tPsZB3dIM” |
请求体参数说明:
| 参数名 | 类型 | 必须 | 描述 |
|---|---|---|---|
| deviceId | string | 否 | 接入设备ID标识,黄色为接入设备ID标识值 “44080000001111000017” |
| eventId | string | 否 | IOT接入设备物模型事件ID标识,黄色为物模型事件ID标识值 “E_1697248913306” |
| startDateTime | datime | 是 | 开始时间,"YYYY-MM-DD HH:MM:SS"格式,例如:2023-10-01 00:00:00 |
| endDateTime | datime | 是 | 截止时间,"YYYY-MM-DD HH:MM:SS"格式,例如:2023-10-01 23:23:23 |
| pageSize | integer | 是 | 每页大小,设置分页每页数据量,最大数值限制10000条 |
正确响应结果示例:
{
"code": "0",
"msg": "当前查询条件数据共4条,每页10000条,合计1页",
"data": {
"msg": "当前查询条件数据共4条,每页10000条,合计1页",
"success": "true",
"count": "4",
"pageSize": "10000",
"pageNum": "1"
}
}
返回参数说明:
| 参数名 | 类型 | 描述 |
|---|---|---|
| msg | string | 返回结果信息说明 |
| count | integer | 符合条件的数据记录总条数 |
| pageSize | integer | 每页大小 |
| pageNum | integer | 按当前每页大小可分多少页 |
错误响应结果示例:
{
"code": "-1",
"msg": "fail:物模型事件数据查询失败"
}
接口功能 本接口主要实现获取接入设备向本中继平台上报的物模型事件数据,根据时间段、设备ID等查询条件返回数据记录信息。例如:接入设备上报的设备开机、关机、故障、预警等设备事件信息。
Request URL: http://192.168.0.105:18080/openApi/queryEventDataRecord
域名访问URL: http://iotbox.iotrelay.cn:8080/api/openApi/queryEventDataRecord
Request Method: GET
数据提交格式 Query String Parameters
请求头参数 Authorization
请求头参数说明:
| 参数名 | 类型 | 必须 | 描述 |
|---|---|---|---|
| Authorization | Header | 是 | 固定值:字符串“Bearer” +“token”组成, "token"为上述登录接口获取的属性值,如:请求头中 “Authorization” : “Bearer eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiJiNjE3OGVlN2ZhNWM0OWU2ODlmMGEzNjIxNzkxYzk2OCIsInN1YiI6IntcInVzZXJJZFwiOlwiNDlcIixcInVzZXJOYW1lXCI6XCIxMzQzNzE1NjU2OVwiLFwibmlja05hbWVcIjpcIjQ0MDgwMDAwMDAxMTExMDAwMDE3XCJ9IiwiaXNzIjoic2oiLCJpYXQiOjE2OTcxNTk2NjgsImV4cCI6MTY5NzE2MTQ2OH0.4C3GJIF5ejmySHy9l_LmheoCs5jknq17h9tPsZB3dIM” |
请求体参数说明:
| 参数名 | 类型 | 必须 | 描述 |
|---|---|---|---|
| deviceId | string | 否 | 接入设备ID标识,黄色为接入设备ID标识值 “44080000001111000017” |
| eventId | string | 否 | IOT接入设备物模型事件ID标识,黄色为物模型事件ID标识值 “E_1697248913306” |
| startDateTime | datime | 是 | 开始时间,"YYYY-MM-DD HH:MM:SS"格式,例如:2023-10-01 00:00:00 |
| endDateTime | datime | 是 | 截止时间,"YYYY-MM-DD HH:MM:SS"格式,例如:2023-10-01 23:23:23 |
| pageSize | integer | 是 | 每页大小,设置分页每页数据量,最大数值限制10000条 |
| queryPageNo | integer | 是 | 查询的当前页号 |
正确响应结果示例:
{
"code": "0",
"msg": "当前页查询返回数据共4条,当前页是:1页",
"data": {
"msg": "当前页查询返回数据共4条,当前页是:1页",
"eventDataRecords":[
{
"deviceId": "44080000001111000017",
"eventId": "E_1697248913304",
"dataTime": "2023-10-14 10:38:25"
"pointName": "溫度超高报警"
"dataValueDataType": "null"
"integerValue": 40
"longValue": "null"
"floatValue": "null"
"doubleValue": "null"
"stringValue": "null"
"booleanValue": "null"
"dateValue": "null"
"timeValue": "null"
"jsonValue": "null"
},
{
"deviceId": "44080000001111000017",
"eventId": "E_1697248913305",
"dataTime": "2023-10-14 10:51:40"
"pointName": "关机"
"dataValueDataType": "null"
"integerValue": 36
"longValue": "null"
"floatValue": "null"
"doubleValue": "null"
"stringValue": "null"
"booleanValue": "null"
"dateValue": "null"
"timeValue": "null"
"jsonValue": "null"
},
{
"deviceId": "44080000001111000017",
"eventId": "E_1697248913306",
"dataTime": "2023-10-14 11:12:33"
"pointName": "故障关机"
"dataValueDataType": "null"
"integerValue": 61
"longValue": "null"
"floatValue": "null"
"doubleValue": "null"
"stringValue": "null"
"booleanValue": "null"
"dateValue": "null"
"timeValue": "null"
"jsonValue": "null"
},
{
"deviceId": "44080000001111000017",
"eventId": "E_1697248913306",
"dataTime": "2023-10-16 11:33:25"
"pointName": "故障关机"
"dataValueDataType": "null"
"integerValue": null
"longValue": "null"
"floatValue": "80.0"
"doubleValue": "null"
"stringValue": "null"
"booleanValue": "null"
"dateValue": "null"
"timeValue": "null"
"jsonValue": "null"
}
],
"success": true,
"count": 4
}
}
返回参数说明:
| 参数名 | 类型 | 描述 |
|---|---|---|
| msg | string | 返回结果信息说明 |
| count | integer | 符合条件的数据记录总条数 |
| eventDataRecords | array | 查询返回的数据集合标识 |
| deviceId | string | 设备ID标识 |
| eventId | string | 物模型事件ID标识 |
| pointName | string | 数据(事件)名称 |
| dataTime | dataTime | 数据上报(读取)时间 |
| dataValueDataType | string | 数据值类别:对应 integer_value/float_value/string_value/date_value/time_value/json_value |
| integerValue | integer | 数据值 |
| float_value | float | 数据值 |
| string_value | string | 数据值 |
| date_value | date | 数据值 |
| time_value | time | 数据值 |
| json_value | json | 数据值 |
错误响应结果示例:
{
"code": "-1",
"msg": "fail:物模型事件数据查询失败"
}
本接口主要针对采用Mqtt协议接入本IOT中继平台的设备,用于通过http API向本IOT中继平台Mqtt消息服务器订阅、发布物模型Topic,用于获取设备向IOT中继平台Mqtt消息服务器订阅、发布的Topic物模型数据,例如:通过操作http API 接口获取接入设备上报到本IOT中继平台Mqtt消息服务器的的设备工作温度。
MQTT消息服务器Topic组成: 在本IOT中继平台中订阅、发布物模型Topic由 标识符 “/iotboxProperties”、“/iotboxEvent”、“/iotboxFunction” +“/”+“设备ID”+“/”+“物模型属性ID”、“物模型事件ID”、“物模型功能ID”组成,
例如:物模型属性Topic “/iotboxProperties/44080000001111000016/P_1697771488743” ---- 格式: “/iotboxProperties/设备ID/物模型属性ID”;
物模型事件Topic “/iotboxEvent/44080000001111000016/E_1697248913306” ---- 格式:“/iotboxEvent/设备ID/物模型事件ID”;
物模型功能Topic “/iotboxFunction/44080000001111000016/F_1697771488743” ---- 格式:“/iotboxFunction/设备ID/物模型功能ID”。
MQTT协议中有三种消息发布服务质量:
1、 “QOS0” : “至多一次”,消息发布完全依赖底层 TCP/IP 网络。会发生消息丢失或重复。这一级别可用于如下情况,环境传感器数据,丢失一次读记录无所谓,因为不久后还会有第二次发送。
2、 “QOS1” :“至少一次”,确保消息到达,但消息重复可能会发生。
3、 “QOS2” :“只有一次”,确保消息到达一次。这一级别可用于如下情况,在计费系统中,消息重复或丢失会导致不正确的结果,资源开销大.
在订阅、发布Topic时根据需要设置MQTT消息发布服务质量。
接口功能 本接口主要针对采用Mqtt协议接入本IOT中继平台的设备,用于通过http API向本IOT中继平台Mqtt消息服务器订阅物模型属性Topic,用于获取设备向IOT中继平台Mqtt消息服务器发布的Topic物模型属性数据,例如:接入设备上报的设备工作温度,把工作温度数据发布到本IOT中继平台Mqtt消息服务器的Topic。
MQTT消息服务器Topic组成: 在本接口中订阅物模型属性Topic由 “/iotboxProperties”+“/”+“设备ID”+“/”+“物模型属性ID” 组成,
例如: “/iotboxProperties/44080000001111000016/P_1697771488743”。
Request URL: http://192.168.0.105:18080/openApi/subscribeModelProperties
域名访问URL: http://iotbox.iotrelay.cn:8080/api/openApi/subscribeModelProperties
Request Method:GET
数据提交格式 Query String Parameters
请求头参数 Authorization
请求头参数说明:
| 参数名 | 类型 | 必须 | 描述 |
|---|---|---|---|
| Authorization | Header | 是 | 固定值:字符串“Bearer” +“token”组成, "token"为上述登录接口获取的属性值,如:请求头中 “Authorization” : “Bearer eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiJiNjE3OGVlN2ZhNWM0OWU2ODlmMGEzNjIxNzkxYzk2OCIsInN1YiI6IntcInVzZXJJZFwiOlwiNDlcIixcInVzZXJOYW1lXCI6XCIxMzQzNzE1NjU2OVwiLFwibmlja05hbWVcIjpcIjQ0MDgwMDAwMDAxMTExMDAwMDE3XCJ9IiwiaXNzIjoic2oiLCJpYXQiOjE2OTcxNTk2NjgsImV4cCI6MTY5NzE2MTQ2OH0.4C3GJIF5ejmySHy9l_LmheoCs5jknq17h9tPsZB3dIM” |
请求体参数说明:
| 参数名 | 类型 | 必须 | 描述 |
|---|---|---|---|
| deviceId | string | 是 | 接入设备ID标识,黄色 "44080000001111000016"为接入设备ID标识值 |
| propertiesId | string | 是 | IOT接入设备物模型属性ID标识,黄色 "P_1697771488743"为物模型属性ID标识值 |
| qos | string | 是 | Mqtt消息服务质量, 此处根据需要在三个值 “QOS0”、“QOS1”、“QOS2” 选择一个 |
正确响应结果示例:
{
"code": "0",
"msg": "订阅物模型属性成功,订阅topic为:/iotboxProperties/44080000001111000016/P_1697771488743 消息服务质量为QOS1",
"data": "true",
}
错误响应结果示例:
{
"code": "-1",
"msg": "fail:物模型属性订阅失败"
}
接口功能 本接口主要取消通过本IOT中继平台向Mqtt消息服务器订阅的物模型属性Topic,例如取消上一章节接口《 1) 订阅物模型属性 》中订阅的Topic
“/iotboxProperties/44080000001111000016/P_1697771488743”。
MQTT消息服务器Topic组成: 在本接口中订阅物模型属性Topic由 “/iotboxProperties”+“/”+“设备ID”+“/”+“物模型属性ID” 组成,
例如: “/iotboxProperties/44080000001111000016/P_1697771488743”。
Request URL: http://192.168.0.105:18080/openApi/unSubscribeModelProperties
域名访问URL: http://iotbox.iotrelay.cn:8080/api/openApi/unSubscribeModelProperties
Request Method: GET
数据提交格式 Query String Parameters
请求头参数 Authorization
请求头参数说明:
| 参数名 | 类型 | 必须 | 描述 |
|---|---|---|---|
| Authorization | Header | 是 | 固定值:字符串“Bearer” +“token”组成, "token"为上述登录接口获取的属性值,如:请求头中 “Authorization” : “Bearer eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiJiNjE3OGVlN2ZhNWM0OWU2ODlmMGEzNjIxNzkxYzk2OCIsInN1YiI6IntcInVzZXJJZFwiOlwiNDlcIixcInVzZXJOYW1lXCI6XCIxMzQzNzE1NjU2OVwiLFwibmlja05hbWVcIjpcIjQ0MDgwMDAwMDAxMTExMDAwMDE3XCJ9IiwiaXNzIjoic2oiLCJpYXQiOjE2OTcxNTk2NjgsImV4cCI6MTY5NzE2MTQ2OH0.4C3GJIF5ejmySHy9l_LmheoCs5jknq17h9tPsZB3dIM” |
请求体参数说明:
| 参数名 | 类型 | 必须 | 描述 |
|---|---|---|---|
| deviceId | string | 是 | 接入设备ID标识,黄色 "44080000001111000016"为接入设备ID标识值 |
| propertiesId | string | 是 | IOT接入设备物模型属性ID标识,黄色 "P_1697771488743"为物模型属性ID标识值 |
正确响应结果示例:
{
"code": "0",
"msg": "取消订阅物模型属性成功,取消订阅topic为:/iotboxProperties/44080000001111000016/P_1697771488743",
"data": "true",
}
错误响应结果示例:
{
"code": "-1",
"msg": "fail:取消订阅Mqtt物模型属性失败"
}
接口功能 本接口主要针对采用Mqtt协议接入本IOT中继平台的设备,用于通过http API向本IOT中继平台Mqtt消息服务器订阅物模型事件Topic,用于获取设备向IOT中继平台Mqtt消息服务器发布的Topic物模型事件数据,例如:接入设备运行故障时,把工作温度数据发布到本IOT中继平台Mqtt消息服务器的Topic。
MQTT消息服务器Topic组成: 在本接口中订阅物模型事件Topic由 “/iotboxEvent”+“/”+“设备ID”+“/”+“物模型事件ID” 组成,
例如: “/iotboxEvent/44080000001111000017/E_1697771992900”。
Request URL: http://192.168.0.105:18080/openApi/subscribeModelEvent
域名访问URL: http://iotbox.iotrelay.cn:8080/api/openApi/subscribeModelEvent
Request Method:GET
数据提交格式 Query String Parameters
请求头参数 Authorization
请求头参数说明:
| 参数名 | 类型 | 必须 | 描述 |
|---|---|---|---|
| Authorization | Header | 是 | 固定值:字符串“Bearer” +“token”组成, "token"为上述登录接口获取的属性值,如:请求头中 “Authorization” : “Bearer eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiJiNjE3OGVlN2ZhNWM0OWU2ODlmMGEzNjIxNzkxYzk2OCIsInN1YiI6IntcInVzZXJJZFwiOlwiNDlcIixcInVzZXJOYW1lXCI6XCIxMzQzNzE1NjU2OVwiLFwibmlja05hbWVcIjpcIjQ0MDgwMDAwMDAxMTExMDAwMDE3XCJ9IiwiaXNzIjoic2oiLCJpYXQiOjE2OTcxNTk2NjgsImV4cCI6MTY5NzE2MTQ2OH0.4C3GJIF5ejmySHy9l_LmheoCs5jknq17h9tPsZB3dIM” |
请求体参数说明:
| 参数名 | 类型 | 必须 | 描述 |
|---|---|---|---|
| deviceId | string | 是 | 接入设备ID标识,黄色 "44080000001111000017"为接入设备ID标识值 |
| eventId | string | 是 | IOT接入设备物模型事件ID标识,黄色 "E_1697771992900"为物模型事件ID标识值 |
| qos | string | 是 | Mqtt消息服务质量, 此处根据需要在三个值 “QOS0”、“QOS1”、“QOS2” 选择一个 |
正确响应结果示例:
{
"code": "0",
"msg": "订阅物模型事件成功,订阅topic为:/iotboxEvent/44080000001111000016/E_1697771992900 消息服务质量为QOS1",
"data": "true",
}
错误响应结果示例:
{
"code": "-1",
"msg": "fail:物模型事件订阅失败"
}
接口功能 本接口主要取消通过本IOT中继平台向Mqtt消息服务器订阅的物模型事件Topic,例如取消上一章节接口《 3) 订阅物模型事件 》中订阅的Topic
“/iotboxEvent/44080000001111000016/E_1697771992900”。
MQTT消息服务器Topic组成: 在本接口中订阅物模型事件Topic由 “/iotboxEvent”+“/”+“设备ID”+“/”+“物模型事件ID” 组成,
例如: “/iotboxEvent/44080000001111000016/E_1697771992900”。
Request URL: http://192.168.0.105:18080/openApi/unSubscribeModelEvent
域名访问URL: http://iotbox.iotrelay.cn:8080/api/openApi/unSubscribeModelEvent
Request Method: GET
数据提交格式 Query String Parameters
请求头参数 Authorization
请求头参数说明:
| 参数名 | 类型 | 必须 | 描述 |
|---|---|---|---|
| Authorization | Header | 是 | 固定值:字符串“Bearer” +“token”组成, "token"为上述登录接口获取的属性值,如:请求头中 “Authorization” : “Bearer eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiJiNjE3OGVlN2ZhNWM0OWU2ODlmMGEzNjIxNzkxYzk2OCIsInN1YiI6IntcInVzZXJJZFwiOlwiNDlcIixcInVzZXJOYW1lXCI6XCIxMzQzNzE1NjU2OVwiLFwibmlja05hbWVcIjpcIjQ0MDgwMDAwMDAxMTExMDAwMDE3XCJ9IiwiaXNzIjoic2oiLCJpYXQiOjE2OTcxNTk2NjgsImV4cCI6MTY5NzE2MTQ2OH0.4C3GJIF5ejmySHy9l_LmheoCs5jknq17h9tPsZB3dIM” |
请求体参数说明:
| 参数名 | 类型 | 必须 | 描述 |
|---|---|---|---|
| deviceId | string | 是 | 接入设备ID标识,黄色 "44080000001111000016"为接入设备ID标识值 |
| eventId | string | 是 | IOT接入设备物模型事件ID标识,黄色 "E_1697771992900"为物模型事件ID标识值 |
正确响应结果示例:
{
"code": "0",
"msg": "取消订阅物模型事件成功,取消订阅topic为:/iotboxEvent/44080000001111000016/E_1697771992900",
"data": "true",
}
错误响应结果示例:
{
"code": "-1",
"msg": "fail:取消订阅Mqtt物模型事件失败"
}
接口功能 本接口主要针对采用Mqtt协议接入本IOT中继平台的设备,用于通过http API向本IOT中继平台Mqtt消息服务器发布物模型功能Topic,用于向IOT中继平台Mqtt消息服务器发布的Topic物模型功能数据,实现向接入设备下发指令。例如:需要向接入设备下发设备重启、关机指令时,把下发的指令消息发布到本IOT中继平台Mqtt消息服务器的Topic。
MQTT消息服务器Topic组成: 在本接口中发布物模型功能Topic由 “/iotboxFunction”+“/”+“设备ID”+“/”+“物模型功能ID” 组成,
例如: “/iotboxFunction/44080000001111000016/F_1697774598222”。
Request URL: http://192.168.0.105:18080/openApi/pushModelFunction
域名访问URL: http://iotbox.iotrelay.cn:8080/api/openApi/pushModelFunction
Request Method: GET
数据提交格式 Query String Parameters
请求头参数 Authorization
请求头参数说明:
| 参数名 | 类型 | 必须 | 描述 |
|---|---|---|---|
| Authorization | Header | 是 | 固定值:字符串“Bearer” +“token”组成, "token"为上述登录接口获取的属性值,如:请求头中 “Authorization” : “Bearer eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiJiNjE3OGVlN2ZhNWM0OWU2ODlmMGEzNjIxNzkxYzk2OCIsInN1YiI6IntcInVzZXJJZFwiOlwiNDlcIixcInVzZXJOYW1lXCI6XCIxMzQzNzE1NjU2OVwiLFwibmlja05hbWVcIjpcIjQ0MDgwMDAwMDAxMTExMDAwMDE3XCJ9IiwiaXNzIjoic2oiLCJpYXQiOjE2OTcxNTk2NjgsImV4cCI6MTY5NzE2MTQ2OH0.4C3GJIF5ejmySHy9l_LmheoCs5jknq17h9tPsZB3dIM” |
请求体参数说明:
| 参数名 | 类型 | 必须 | 描述 | ||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| deviceId | string | 是 | 接入设备ID标识,黄色 "44080000001111000016"为接入设备ID标识值 | ||||||||||||||||||||
| functionId | string | 是 | IOT接入设备物模型功能ID标识,黄色 "F_1697774598222"为物模型功能ID标识值 | ||||||||||||||||||||
| sendMsg | string | 是 | 向MQTT服务器发布消息体格式采用json字符串BASE64加密传输。
|
||||||||||||||||||||
| qos | string | 是 | Mqtt消息服务质量, 此处根据需要在三个值 “QOS0”、“QOS1”、“QOS2” 选择一个 |
正确响应结果示例:
{
"code": "0",
"msg": "发布物模型功能成功,发布topic为:/iotboxFunction/44080000001111000016/F_1697774598222 消息服务质量为QOS2",
"data": "true",
}
错误响应结果示例:
{
"code": "-1",
"msg": "fail:发布物模型功能失败"
}
Modbus是一种串行通信协议,是Modicon公司(现在的施耐德电气 Schneider Electric)于1979年为使用可编程逻辑控制器(PLC)通信而发表。Modbus已经成为工业领域通信协议的业界标准(De facto),并且现在是工业电子设备之间常用的连接方式。
Modbus协议是一个master/slave架构的协议。有一个节点是master节点,其他使用Modbus协议参与通信的节点是slave节点。每一个slave设备都有一个唯一的地址。在串行和MB+网络中,只有被指定为主节点的节点可以启动一个命令(在以太网上,任何一个设备都能发送一个Modbus命令,但是通常也只有一个主节点设备启动指令)。
本接口主要针对采用Modbus协议接入本IOT中继平台的设备,用于通过http API向本IOT中继平台调用Modbus服务主动读取接入设备的物模型数据或向接入的设备写入物模型数据,例如:通过操作http API 接口获取接入设备的工作温度,或向设备寄存器写入数值等。
说明:Modbus协议在本IOT中继平台只支持读写物模型属性数据。
接口功能 本接口主要实现调用Modbus服务主动读取接入设备的物模型数据,例如:读取接入设备温度传感器的温度。
Request URL: http://192.168.0.105:18080/openApi/modbusReadModelProperties
域名访问URL: http://iotbox.iotrelay.cn:8080/api/openApi/modbusReadModelProperties
Request Method: GET
数据提交格式 Query String Parameters
请求头参数 Authorization
请求头参数说明:
| 参数名 | 类型 | 必须 | 描述 |
|---|---|---|---|
| Authorization | Header | 是 | 固定值:字符串“Bearer” +“token”组成, "token"为上述登录接口获取的属性值,如:请求头中 “Authorization” : “Bearer eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiJiNjE3OGVlN2ZhNWM0OWU2ODlmMGEzNjIxNzkxYzk2OCIsInN1YiI6IntcInVzZXJJZFwiOlwiNDlcIixcInVzZXJOYW1lXCI6XCIxMzQzNzE1NjU2OVwiLFwibmlja05hbWVcIjpcIjQ0MDgwMDAwMDAxMTExMDAwMDE3XCJ9IiwiaXNzIjoic2oiLCJpYXQiOjE2OTcxNTk2NjgsImV4cCI6MTY5NzE2MTQ2OH0.4C3GJIF5ejmySHy9l_LmheoCs5jknq17h9tPsZB3dIM” |
请求体参数说明:
| 参数名 | 类型 | 必须 | 描述 |
|---|---|---|---|
| deviceId | string | 是 | 接入设备ID标识,黄色为接入设备ID标识值 “44080000001111000001” |
| propertiesId | string | 是 | IOT接入设备物模型属性ID标识,黄色为物模型属性ID标识值 “P_1696583483495” “P_1696583483496” |
正确响应结果示例:
{
"code": "0",
"msg": "success",
"data": {
"id": "null",
"applyType": "1",
"pointName": "温度",
"deviceId": "44080000001111000015",
"deviceSn": "1682824504262-1001111",
"createTime": "2023-05-05 20:37:54",
"readWriteType": "1",
"dataValueDataType": "integer_value",
"propertiesId": "P_1697276433454",
"functionId": "null",
"eventId": "null",
"integerValue": "22",
"longValue": "null",
"floatValue": "null",
"doubleValue": "null",
"stringValue": "null",
"booleanValue": "null",
"dateValue": "null",
"timeValue": "null",
"jsonValue": "null"
}
}
返回参数说明:
| 参数名 | 类型 | 描述 |
|---|---|---|
| deviceId | string | 接入设备ID标识,黄色为接入设备ID标识值 “44080000001111000015” |
| applyType | Integer | 数据主题应用类别(对应模型3个类别:1、属性;2、功能服务;3、事件) 此处黄色"1"对应属性 |
| pointName | string | 测点(数据点)名称 |
| deviceSn | string | 设备编号 |
| createTime | string | 数据时间 |
| readWriteType | string | 数据读写类型(1、读;2、写;3、上报 ) |
| propertiesId | string | IOT接入设备物模型属性ID标识,黄色为物模型属性ID标识值 “P_1697276433454” |
| functionId | string | IOT接入设备物模型功能定义ID标识,黄色为物模型功能定义ID标识值 |
| eventId | string | IOT接入设备物模型事件定义ID标识,黄色为物模型事件定义ID标识值 |
| dataValueDataType | string | 测点数据值数据类型(对应integer_value/float_value/string_value/boolean_value/date_value/time_value/json_value) |
| integerValue | integer | 测点数据整型值 |
错误响应结果示例:
{
"code": "-1",
"msg": "fail:Modbus服务读取物模型属性数据失败"
"data": "null"
}
写入物模型功能操作简介
写入物模型功能操作 主要实现调用Modbus服务向接入设备写入物模型功能数据,通常用于向设备下发执行指令操作,在本IOT中继平台中,IOT中继平台作为主设备可以向从设备执行下面7个操作功能。 在本IOT中继平台中,物模型功能配置同MODBUS数据点写入功能向对应。
特别说明:向设备写入数据前提必须是接入设备是可以写入的,物模型功能属性数据读写类型配置为写。
接口功能 本接口主要实现调用Modbus服务向接入设备写入物模型功能数据,用于写单个线圈,例如:控制设备的开关等。
特别说明:向设备写入数据前提必须是接入设备是可以写入的,物模型属性数据读写类型配置为写。
Request URL: http://192.168.0.105:18080/openApi/writeCoil
域名访问URL: http://iotbox.iotrelay.cn:8080/api/openApi/writeCoil
Request Method: POST
数据提交格式 application/json
请求头参数 Authorization
请求头参数说明:
| 参数名 | 类型 | 必须 | 描述 |
|---|---|---|---|
| Authorization | Header | 是 | 固定值:字符串“Bearer” +“token”组成, "token"为上述登录接口获取的属性值,如:请求头中 “Authorization” : “Bearer eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiJiNjE3OGVlN2ZhNWM0OWU2ODlmMGEzNjIxNzkxYzk2OCIsInN1YiI6IntcInVzZXJJZFwiOlwiNDlcIixcInVzZXJOYW1lXCI6XCIxMzQzNzE1NjU2OVwiLFwibmlja05hbWVcIjpcIjQ0MDgwMDAwMDAxMTExMDAwMDE3XCJ9IiwiaXNzIjoic2oiLCJpYXQiOjE2OTcxNTk2NjgsImV4cCI6MTY5NzE2MTQ2OH0.4C3GJIF5ejmySHy9l_LmheoCs5jknq17h9tPsZB3dIM” |
请求体格式 Content-Type
{
"deviceId": "44080000001111000018",
"functionId": "F_1714449278021",
"writeBooleanValue": "true"
}
请求体参数说明:
| 参数名 | 类型 | 必须 | 描述 |
|---|---|---|---|
| deviceId | string | 是 | 接入设备ID标识,黄色为接入设备ID标识值 “44080000001111000018” |
| functionId | string | 是 | IOT接入设备物模型功能ID标识,黄色为物模型功能ID标识值 “F_1714449278021” |
| writeBooleanValue | boolean | 是 | 设备物模型数据写入数据类型值( 布尔类型:true/false 两个选项 ) 黄色标识值 “true” |
正确响应结果示例:
{
"code": "0",
"msg": "success",
"data": "true",
}
错误响应结果示例:
{
"code": "-1",
"msg": "此设备非modbus协议接入,不可以写入"
"data": "false"
}
接口功能 本接口主要实现调用Modbus服务向接入设备写入物模型功能数据,用于写多个线圈,例如:向设备写入多个开关状态数据。
Request URL: http://192.168.0.105:18080/modbusOperate/writeCoils
域名访问URL: http://txb.iotrelay.cn:8080/api/modbusOperate/writeCoils
Request Method: POST
数据提交格式 application/json
请求头参数 Authorization
请求头参数说明:
| 参数名 | 类型 | 必须 | 描述 |
|---|---|---|---|
| Authorization | Header | 是 | 固定值:字符串"Bearer" +"token"组成, "token"为上述登录接口获取的属性值,如:请求头中 “Authorization” : “Bearer eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiJiNjE3OGVlN2ZhNWM0OWU2ODlmMGEzNjIxNzkxYzk2OCIsInN1YiI6IntcInVzZXJJZFwiOlwiNDlcIixcInVzZXJOYW1lXCI6XCIxMzQzNzE1NjU2OVwiLFwibmlja05hbWVcIjpcIjQ0MDgwMDAwMDAxMTExMDAwMDE3XCJ9IiwiaXNzIjoic2oiLCJpYXQiOjE2OTcxNTk2NjgsImV4cCI6MTY5NzE2MTQ2OH0.4C3GJIF5ejmySHy9l_LmheoCs5jknq17h9tPsZB3dIM” |
请求体格式 Content-Type
{
"deviceId": "44080000001111000018",
"functionId": "F_1714449278021",
"writeBooleanValues": "[true,false]"
}
请求体参数说明:
| 参数名 | 类型 | 必须 | 描述 |
|---|---|---|---|
| deviceId | string | 是 | 接入设备ID标识,黄色为接入设备ID标识值 “44080000001111000018” |
| functionId | string | 是 | IOT接入设备物模型功能ID标识,黄色为物模型功能ID标识值 “F_1714449278021” |
| writeBooleanValues | boolean[] | 是 | 设备物模型数据写入布尔类型数组值( 布尔类型:true/false 两个选项 ) 黄色标识值 “[true,false]” |
正确响应结果示例:
{
"code": "0",
"msg": "success",
"data": "true",
}
错误响应结果示例:
{
"code": "-1",
"msg": "此设备非modbus协议接入,不可以写入"
"data": "false"
}
接口功能 本接口主要实现调用Modbus服务向接入设备写入物模型功能数据,用于写单个保持寄存器。
Request URL: http://192.168.0.105:18080/modbusOperate/writeRegister
域名访问URL: http://txb.iotrelay.cn:8080/api/modbusOperate/writeRegister
Request Method: POST
数据提交格式 application/json
请求头参数 Authorization
请求头参数说明:
| 参数名 | 类型 | 必须 | 描述 |
|---|---|---|---|
| Authorization | Header | 是 | 固定值:字符串"Bearer" +"token"组成, "token"为上述登录接口获取的属性值,如:请求头中 “Authorization” : “Bearer eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiJiNjE3OGVlN2ZhNWM0OWU2ODlmMGEzNjIxNzkxYzk2OCIsInN1YiI6IntcInVzZXJJZFwiOlwiNDlcIixcInVzZXJOYW1lXCI6XCIxMzQzNzE1NjU2OVwiLFwibmlja05hbWVcIjpcIjQ0MDgwMDAwMDAxMTExMDAwMDE3XCJ9IiwiaXNzIjoic2oiLCJpYXQiOjE2OTcxNTk2NjgsImV4cCI6MTY5NzE2MTQ2OH0.4C3GJIF5ejmySHy9l_LmheoCs5jknq17h9tPsZB3dIM” |
请求体格式 Content-Type
{
"deviceId": "44080000001111000018",
"functionId": "F_1714449278021",
"writeShortValue": "1"
}
请求体参数说明:
| 参数名 | 类型 | 必须 | 描述 |
|---|---|---|---|
| deviceId | string | 是 | 接入设备ID标识,黄色为接入设备ID标识值 “44080000001111000018” |
| functionId | string | 是 | IOT接入设备物模型功能ID标识,黄色为物模型功能ID标识值 “F_1714449278021” |
| writeShortValue | short | 是 | 设备物模型数据写入数据类型值(short类型) 黄色标识值 “1” |
正确响应结果示例:
{
"code": "0",
"msg": "success",
"data": "true",
}
错误响应结果示例:
{
"code": "-1",
"msg": "此设备非modbus协议接入,不可以写入"
"data": "false"
}
接口功能 本接口主要实现调用Modbus服务向接入设备写入物模型功能数据,用于写多个保持寄存器。
Request URL: http://192.168.0.105:18080/modbusOperate/writeRegisters
域名访问URL: http://txb.iotrelay.cn:8080/api/modbusOperate/writeRegisters
Request Method: POST
数据提交格式 application/json
请求头参数 Authorization
请求头参数说明:
| 参数名 | 类型 | 必须 | 描述 |
|---|---|---|---|
| Authorization | Header | 是 | 固定值:字符串"Bearer" +"token"组成, "token"为上述登录接口获取的属性值,如:请求头中 “Authorization” : “Bearer eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiJiNjE3OGVlN2ZhNWM0OWU2ODlmMGEzNjIxNzkxYzk2OCIsInN1YiI6IntcInVzZXJJZFwiOlwiNDlcIixcInVzZXJOYW1lXCI6XCIxMzQzNzE1NjU2OVwiLFwibmlja05hbWVcIjpcIjQ0MDgwMDAwMDAxMTExMDAwMDE3XCJ9IiwiaXNzIjoic2oiLCJpYXQiOjE2OTcxNTk2NjgsImV4cCI6MTY5NzE2MTQ2OH0.4C3GJIF5ejmySHy9l_LmheoCs5jknq17h9tPsZB3dIM” |
请求体格式 Content-Type
{
"deviceId": "44080000001111000018",
"functionId": "F_1714449278021",
"writeShortValues": "[1,0]"
}
请求体参数说明:
| 参数名 | 类型 | 必须 | 描述 |
|---|---|---|---|
| deviceId | string | 是 | 接入设备ID标识,黄色为接入设备ID标识值 “44080000001111000018” |
| functionId | string | 是 | IOT接入设备物模型功能ID标识,黄色为物模型功能ID标识值 “F_1714449278021” |
| writeShortValues | short[] | 是 | 设备物模型数据写入整型数组值(short数组类型: [1,0] ) 黄色标识值 “[1,0]” |
正确响应结果示例:
{
"code": "0",
"msg": "success",
"data": "true",
}
错误响应结果示例:
{
"code": "-1",
"msg": "此设备非modbus协议接入,不可以写入"
"data": "false"
}
接口功能 本接口主要实现调用Modbus服务向接入设备写入物模型功能数据,用于写入数字类型的模拟量。
Request URL: http://192.168.0.105:18080/modbusOperate/writeHoldingRegister
域名访问URL: http://txb.iotrelay.cn:8080/api/modbusOperate/writeHoldingRegister
Request Method: POST
数据提交格式 application/json
请求头参数 Authorization
请求头参数说明:
| 参数名 | 类型 | 必须 | 描述 |
|---|---|---|---|
| Authorization | Header | 是 | 固定值:字符串"Bearer" +"token"组成, "token"为上述登录接口获取的属性值,如:请求头中 “Authorization” : “Bearer eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiJiNjE3OGVlN2ZhNWM0OWU2ODlmMGEzNjIxNzkxYzk2OCIsInN1YiI6IntcInVzZXJJZFwiOlwiNDlcIixcInVzZXJOYW1lXCI6XCIxMzQzNzE1NjU2OVwiLFwibmlja05hbWVcIjpcIjQ0MDgwMDAwMDAxMTExMDAwMDE3XCJ9IiwiaXNzIjoic2oiLCJpYXQiOjE2OTcxNTk2NjgsImV4cCI6MTY5NzE2MTQ2OH0.4C3GJIF5ejmySHy9l_LmheoCs5jknq17h9tPsZB3dIM” |
请求体格式 Content-Type
{
"deviceId": "44080000001111000018",
"functionId": "F_1714449278021",
"writeNumberValue": "1"
"dataType": "2"
}
请求体参数说明:
| 参数名 | 类型 | 必须 | 描述 |
|---|---|---|---|
| deviceId | string | 是 | 接入设备ID标识,黄色为接入设备ID标识值 “44080000001111000018” |
| functionId | string | 是 | IOT接入设备物模型功能ID标识,黄色为物模型功能ID标识值 “F_1714449278021” |
| writeNumberValue | number | 是 | 设备物模型数据写入数字类型值,写入数字类型的模拟量(如:写入Float类型的模拟量、Double类型模拟量、整数类型Short、Integer、Long) 黄色标识值 “1” |
| dataType | string | 是 | 设备Modbus数据类型值,(1、布尔类型;2、整型;3、短整型;4、长整型;8、float) |
正确响应结果示例:
{
"code": "0",
"msg": "success",
"data": "true",
}
错误响应结果示例:
{
"code": "-1",
"msg": "此设备非modbus协议接入,不可以写入"
"data": "false"
}
接口功能 本接口主要实现调用Modbus服务向接入设备写入物模型功能数据,用于串口Rtu模式 写保持寄存器。
Request URL: http://192.168.0.105:18080/modbusOperate/writeRegisterByRtuSerial
域名访问URL: http://txb.iotrelay.cn:8080/api/modbusOperate/writeRegisterByRtuSerial
Request Method: POST
数据提交格式 application/json
请求头参数 Authorization
请求头参数说明:
| 参数名 | 类型 | 必须 | 描述 |
|---|---|---|---|
| Authorization | Header | 是 | 固定值:字符串"Bearer" +"token"组成, "token"为上述登录接口获取的属性值,如:请求头中 “Authorization” : “Bearer eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiJiNjE3OGVlN2ZhNWM0OWU2ODlmMGEzNjIxNzkxYzk2OCIsInN1YiI6IntcInVzZXJJZFwiOlwiNDlcIixcInVzZXJOYW1lXCI6XCIxMzQzNzE1NjU2OVwiLFwibmlja05hbWVcIjpcIjQ0MDgwMDAwMDAxMTExMDAwMDE3XCJ9IiwiaXNzIjoic2oiLCJpYXQiOjE2OTcxNTk2NjgsImV4cCI6MTY5NzE2MTQ2OH0.4C3GJIF5ejmySHy9l_LmheoCs5jknq17h9tPsZB3dIM” |
请求体格式 Content-Type
{
"deviceId": "44080000001111000018",
"functionId": "F_1714449278021",
"writeIntValue": "1"
}
请求体参数说明:
| 参数名 | 类型 | 必须 | 描述 |
|---|---|---|---|
| deviceId | string | 是 | 接入设备ID标识,黄色为接入设备ID标识值 “44080000001111000018” |
| functionId | string | 是 | IOT接入设备物模型功能ID标识,黄色为物模型功能ID标识值 “F_1714449278021” |
| writeIntValue | int | 是 | 设备物模型数据写入数据类型值为整型值 黄色标识值 “1” |
正确响应结果示例:
{
"code": "0",
"msg": "success",
"data": "true",
}
错误响应结果示例:
{
"code": "-1",
"msg": "此设备非modbus协议接入,不可以写入"
"data": "false"
}
接口功能 本接口主要实现调用Modbus服务向接入设备写入物模型功能数据,用于写入一个String数据。
Request URL: http://192.168.0.105:18080/modbusOperate/writeString
域名访问URL: http://txb.iotrelay.cn:8080/api/modbusOperate/writeString
Request Method: POST
数据提交格式 application/json
请求头参数 Authorization
请求头参数说明:
| 参数名 | 类型 | 必须 | 描述 |
|---|---|---|---|
| Authorization | Header | 是 | 固定值:字符串"Bearer" +"token"组成, "token"为上述登录接口获取的属性值,如:请求头中 “Authorization” : “Bearer eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiJiNjE3OGVlN2ZhNWM0OWU2ODlmMGEzNjIxNzkxYzk2OCIsInN1YiI6IntcInVzZXJJZFwiOlwiNDlcIixcInVzZXJOYW1lXCI6XCIxMzQzNzE1NjU2OVwiLFwibmlja05hbWVcIjpcIjQ0MDgwMDAwMDAxMTExMDAwMDE3XCJ9IiwiaXNzIjoic2oiLCJpYXQiOjE2OTcxNTk2NjgsImV4cCI6MTY5NzE2MTQ2OH0.4C3GJIF5ejmySHy9l_LmheoCs5jknq17h9tPsZB3dIM” |
请求体格式 Content-Type
{
"deviceId": "44080000001111000018",
"functionId": "F_1714449278021",
"writeStringValue": "test"
}
请求体参数说明:
| 参数名 | 类型 | 必须 | 描述 |
|---|---|---|---|
| deviceId | string | 是 | 接入设备ID标识,黄色为接入设备ID标识值 “44080000001111000018” |
| functionId | string | 是 | IOT接入设备物模型功能ID标识,黄色为物模型功能ID标识值 “F_1714449278021” |
| writeStringValue | string | 是 | 设备物模型数据写入字符串类型值 黄色标识值 “test” |
正确响应结果示例:
{
"code": "0",
"msg": "success",
"data": "true",
}
错误响应结果示例:
{
"code": "-1",
"msg": "此设备非modbus协议接入,不可以写入"
"data": "false"
}
视频接口简介
视频功能基于GB/T 28181国标协议开发,是一个功能齐全的视频管理中心。该视频中心旨在提供高效、可靠的视频监控和管理解决方案,满足各类场景下的实时监控要求。
本IOT中继平台集成了开源流媒体服务器ZLMediaServer提供流转发服务,负责将GB28181设备/平台推送的PS流转成 ES流,然后提供RTSP、RTMP、FLV、HLS多种格式进行分发,实现web浏览器、手 机浏览器、微信、PC客户端等各种终端无插件播放。 支持视频设备 IPC、NVR的接入。
视频中心提供的功能有:
视频直播:支持FLV、HLS格式的多路视频直播
视频录制:支持录制视频到服务器中进行存储;支持视频录制计划,按设置计划时间录制视频;提供录制视频的查询、回放、下载服务。
云台控制:支持转向、聚焦等云台控制,提供httpAPI接口向接入的视频设备下达云台控制指令。控制云台进行上、下、左、右、左上、左下、右上、右下等八方位方向的移动;控制云台镜头的变倍、聚焦和光圈大小、预置点、巡航等功能
接口功能 本接口主要提供httpAPI接口查询接入本IOT中继平台的视频设备列表。
Request URL: http://192.168.0.105:18080/nvrDevice/getNvrDeviceList
域名访问URL: http://iotbox.iotrelay.cn:8080/api/nvrDevice/getNvrDeviceList
Request Method: GET
数据提交格式 Query String Parameters
请求头参数 Authorization
请求头参数说明:
| 参数名 | 类型 | 必须 | 描述 |
|---|---|---|---|
| Authorization | Header | 是 | 固定值:字符串"Bearer" +"token"组成, "token"为上述登录接口获取的属性值,如:请求头中 “Authorization” : “Bearer eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiJiNjE3OGVlN2ZhNWM0OWU2ODlmMGEzNjIxNzkxYzk2OCIsInN1YiI6IntcInVzZXJJZFwiOlwiNDlcIixcInVzZXJOYW1lXCI6XCIxMzQzNzE1NjU2OVwiLFwibmlja05hbWVcIjpcIjQ0MDgwMDAwMDAxMTExMDAwMDE3XCJ9IiwiaXNzIjoic2oiLCJpYXQiOjE2OTcxNTk2NjgsImV4cCI6MTY5NzE2MTQ2OH0.4C3GJIF5ejmySHy9l_LmheoCs5jknq17h9tPsZB3dIM” |
请求体参数说明:
| 参数名 | 类型 | 必须 | 描述 |
|---|---|---|---|
| sipId | string | 否 | 接入视频设备SIP_ID标识,对应位置在 视频设备–我的接入配置–监控设备接入配置信息–SIP用户认证ID 如:黄色 "44080000001111000001"为接入视频设备SIP用户认证ID值 备注: 视频设备SIP_ID标识参数不填,则查询接入本IOT中继平台的所有视频设备列表。 |
正确响应结果示例:
{
"code": "0",
"msg": "success",
"data": [
{
"id": "1568447122901069825",
"sipId": "44090000001111000001",
"deviceSn": "20220910",
"deviceName": "我的NVR",
"manufacturer": "浙江海康",
"brand": "海康",
"model": "HIKI12324332",
"createTime": "2022-09-10 11:51:49",
"updateTime": "null",
"status": "0",
"isDeleted": "0",
"onlineStatus": "1",
"remark": "备注说明",
"channelsData": [
{
"id": "1568447122922041345",
"channelSn": "44090000001321000001",
"channelName": "通道44090000001321000001",
"nvrDeviceId": "1568447122901069825",
"monitorType": "2",
"address": "大门口",
"isControl": "1",
"createTime": "2022-09-10 11:51:49",
"updateTime": "null",
"status": "1",
"isDeleted": "0",
"onlineStatus": "1",
"isRecording": "0",
"remark": "null",
"offlineTime": "null",
"onlineTime": "null",
},
{
"id": "1568447122989150209",
"channelSn": "44090000001321000002",
"channelName": "通道44090000001321000002",
"nvrDeviceId": "1568447122901069825",
"monitorType": "1",
"address": "作业面",
"isControl": "1",
"createTime": "2022-09-10 11:51:49",
"updateTime": "null",
"status": "0",
"isDeleted": "0",
"onlineStatus": "0",
"isRecording": "0",
"remark": "null",
"offlineTime": "null",
"onlineTime": "null",
},
{
"id": "1568447123052064769",
"channelSn": "44090000001321000003",
"channelName": "通道44090000001321000003",
"nvrDeviceId": "1568447122901069825",
"monitorType": "2",
"address": "塔吊",
"isControl": "1",
"createTime": "2022-09-10 11:51:49",
"updateTime": "null",
"status": "1",
"isDeleted": "0",
"onlineStatus": "0",
"isRecording": "0",
"remark": "null",
"offlineTime": "null",
"onlineTime": "null",
}
],
"sipService": "null",
"sipServiceRealm": "null",
"sipLocalPort": "null",
"sipServicePort": "null",
"sipPassword": "null",
"sipServiceAddress": "null"
},
]
}
响应体参数说明:
| 参数名 | 类型 | 描述 |
|---|---|---|
| sipId | string | 接入视频设备ID标识,对应位置在 视频设备–我的接入配置–监控设备接入配置信息–SIP用户认证ID 如:黄色 "44080000001111000001"为接入视频设备SIP用户认证ID值 |
| deviceSn | string | 视频设备编号 如:黄色 “20220910” |
| deviceName | string | 视频设备名称 如:黄色 “我的NVR” |
| manufacturer | string | 生产厂家 如:黄色 “浙江海康” |
| brand | string | 品牌 如:黄色 “海康” |
| model | string | 型号 如:黄色 “HIKI12324332” |
| createTime | datetime | 创建时间 |
| updateTime | datetime | 修改时间 |
| status | integer | 设备状态1、有效,0、无效 |
| isDeleted | integer | 是否逻辑删除 0、否;1、是 |
| onlineStatus | integer | 在线状态 0、离线;1、在线 2、待接入 |
| remark | string | 备注描述 |
| channelSn | string | 通道编号 如:黄色 “44090000001321000001” |
| channelName | string | 通道名称 如:黄色 “通道44090000001321000001” |
| nvrDeviceId | integer | NVR设备ID 如:黄色 “1568447122901069825” |
| monitorType | integer | 监控类别1、枪机2、球机3、半球4、红外相机5、其他 |
| address | string | 安装地址 |
| isControl | integer | 是否可云台控制, 1、 可控制 ; 0 、不可控制 |
| isRecording | integer | 录像状态 0、停止;1、录像进行中 |
| offlineTime | datetime | 最新离线时间 |
| onlineTime | datetime | 最新上线时间 |
错误响应结果示例:
{
"code": "-1",
"msg": "fail:数据查询失败"
}
接口功能 本接口主要提供httpAPI接口查询接入本IOT中继平台的视频通道列表。
Request URL: http://192.168.0.105:18080/nvrDevice/getNvrDeviceChannelList
域名访问URL: http://iotbox.iotrelay.cn:8080/api/nvrDevice/getNvrDeviceChannelList
Request Method: GET
数据提交格式 Query String Parameters
请求头参数 Authorization
请求头参数说明:
| 参数名 | 类型 | 必须 | 描述 |
|---|---|---|---|
| Authorization | Header | 是 | 固定值:字符串"Bearer" +"token"组成, "token"为上述登录接口获取的属性值,如:请求头中 “Authorization” : “Bearer eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiJiNjE3OGVlN2ZhNWM0OWU2ODlmMGEzNjIxNzkxYzk2OCIsInN1YiI6IntcInVzZXJJZFwiOlwiNDlcIixcInVzZXJOYW1lXCI6XCIxMzQzNzE1NjU2OVwiLFwibmlja05hbWVcIjpcIjQ0MDgwMDAwMDAxMTExMDAwMDE3XCJ9IiwiaXNzIjoic2oiLCJpYXQiOjE2OTcxNTk2NjgsImV4cCI6MTY5NzE2MTQ2OH0.4C3GJIF5ejmySHy9l_LmheoCs5jknq17h9tPsZB3dIM” |
请求体参数说明:
| 参数名 | 类型 | 必须 | 描述 |
|---|---|---|---|
| sipId | string | 否 | 接入视频设备SIP_ID标识,对应位置在 视频设备–我的接入配置–监控设备接入配置信息–SIP用户认证ID 如:黄色 "44080000001111000001"为接入视频设备SIP用户认证ID值 |
| channelSn | string | 否 | IOT接入视频设备通道编号ID,对应位置在 视频设备–我的接入配置–监控设备接入配置信息–视频监控通道编号ID 如:黄色 “44090000001321000002” |
| channelName | string | 否 | 视频设备通道名称 |
| monitorType | integer | 否 | 监控类别:1、枪机;2、球机;3、半球;4、红外相机;5、其他; |
正确响应结果示例:
{
"code": "0",
"msg": "success",
"data": [
{
"id": "1568447122922041345",
"channelSn": "44090000001321000001",
"channelName": "通道44090000001321000001",
"nvrDeviceId": "1568447122901069825",
"monitorType": "2",
"address": "大门口",
"isControl": "1",
"createTime": "2022-09-10 11:51:49",
"updateTime": "null",
"status": "1",
"isDeleted": "0",
"onlineStatus": "1",
"isRecording": "0",
"offlineTime": "null",
"onlineTime": "null",
"sipId": "44090000001111000001",
"deviceSn": "20220910",
"deviceName": "我的NVR",
"brand": "null",
"model": "null",
"regTime": "null",
"remark": "null"
},
{
"id": "1568447122989150209",
"channelSn": "44090000001321000002",
"channelName": "通道44090000001321000002",
"nvrDeviceId": "1568447122901069825",
"monitorType": "1",
"address": "作业面",
"isControl": "0",
"createTime": "2022-09-10 11:51:49",
"updateTime": "null",
"status": "1",
"isDeleted": "0",
"onlineStatus": "1",
"isRecording": "0",
"offlineTime": "null",
"onlineTime": "null",
"sipId": "44090000001111000001",
"deviceSn": "20220910",
"deviceName": "我的NVR",
"brand": "null",
"model": "null",
"regTime": "null",
"remark": "null"
}
]
}
响应体参数说明:
| 参数名 | 类型 | 描述 |
|---|---|---|
| channelSn | string | IOT接入视频设备视频监控通道编号ID, 如:黄色 “44090000001321000002” |
| channelName | string | 通道名称 |
| nvrDeviceId | integer | NVR设备ID |
| monitorType | integer | 监控类别1、枪机2、球机3、半球4、红外相机5、其他 |
| address | string | 视频通道安装地址 如:黄色 “大门口” |
| isControl | integer | 是否可云台控制, 1、 可控制; 0、 不可控制 |
| createTime | datetime | 创建时间 |
| updateTime | datetime | 修改时间 |
| status | integer | 设备状态1、有效,0、无效 |
| isDeleted | integer | 是否逻辑删除 0、否;1、是 |
| onlineStatus | integer | 在线状态 0、离线;1、在线 2、待接入 |
| isRecording | integer | 录像状态 0、停止;1、录像进行中 |
| offlineTime | datetime | 最新离线时间 |
| onlineTime | datetime | 最新上线时间 |
| sipId | string | 接入视频设备ID标识 如:黄色 "44080000001111000001"为接入视频设备SIP用户认证ID值 |
| channelSn | string | 通道编号 如:黄色 “44090000001321000001” |
| deviceSn | string | 视频设备编号 如:黄色 “20220910” |
| deviceName | string | 视频设备名称 如:黄色 “我的NVR” |
| manufacturer | string | 视频设备生产厂家 |
| brand | string | 视频设备品牌 |
| model | string | 设备型号 |
| regTime | datetime | 设备注册时间 |
| remark | string | 备注描述 |
错误响应结果示例:
{
"code": "-1",
"msg": "fail:数据查询失败"
}
接口功能 本接口主要提供httpAPI接口用于查询对应通道视频流是否在线。
Request URL: http://192.168.0.105:18080/api/media/getIsMediaOnline
域名访问URL: http://iotbox.iotrelay.cn:8080/api/api/media/getIsMediaOnline
Request Method: GET
数据提交格式 Query String Parameters
请求头参数 Authorization
请求头参数说明:
| 参数名 | 类型 | 必须 | 描述 |
|---|---|---|---|
| Authorization | Header | 是 | 固定值:字符串"Bearer" +"token"组成, "token"为上述登录接口获取的属性值,如:请求头中 “Authorization” : “Bearer eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiJiNjE3OGVlN2ZhNWM0OWU2ODlmMGEzNjIxNzkxYzk2OCIsInN1YiI6IntcInVzZXJJZFwiOlwiNDlcIixcInVzZXJOYW1lXCI6XCIxMzQzNzE1NjU2OVwiLFwibmlja05hbWVcIjpcIjQ0MDgwMDAwMDAxMTExMDAwMDE3XCJ9IiwiaXNzIjoic2oiLCJpYXQiOjE2OTcxNTk2NjgsImV4cCI6MTY5NzE2MTQ2OH0.4C3GJIF5ejmySHy9l_LmheoCs5jknq17h9tPsZB3dIM” |
请求体参数说明:
| 参数名 | 类型 | 必须 | 描述 |
|---|---|---|---|
| deviceId | string | 是 | 接入视频设备ID标识,对应位置在 视频设备–我的接入配置–监控设备接入配置信息–SIP用户认证ID 如:黄色 "44080000001111000001"为接入视频设备SIP用户认证ID值 |
| channelId | string | 是 | IOT接入视频设备视频监控通道编号ID,对应位置在 视频设备–我的接入配置–监控设备接入配置信息–视频监控通道编号ID 如:黄色 “44090000001321000001” |
正确响应结果示例:
{
"code": "0",
"msg": "媒体流在线",
"data": {
"code": "0",
"online": "true"
}
}
响应体参数说明:
| 参数名 | 类型 | 描述 |
|---|---|---|
| code | integer | 状态码,0、成功;-1 代表失败 |
| msg | string | 查询返回消息说明 |
| online | boolean | 媒体流在线状态:true 媒体流在线,false 媒体流不在线 |
错误响应结果示例:
{
"code": "-1",
"msg": "fail:数据查询失败"
}
接口功能 本接口主要提供httpAPI接口通知流媒体服务器开始上传视频媒体流。
Request URL: http://192.168.0.105:18080/api/play/startPushStream
域名访问URL: http://iotbox.iotrelay.cn:8080/api/api/play/startPushStream
Request Method: GET
数据提交格式 Query String Parameters
请求头参数 Authorization
请求头参数说明:
| 参数名 | 类型 | 必须 | 描述 |
|---|---|---|---|
| Authorization | Header | 是 | 固定值:字符串"Bearer" +"token"组成, "token"为上述登录接口获取的属性值,如:请求头中 “Authorization” : “Bearer eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiJiNjE3OGVlN2ZhNWM0OWU2ODlmMGEzNjIxNzkxYzk2OCIsInN1YiI6IntcInVzZXJJZFwiOlwiNDlcIixcInVzZXJOYW1lXCI6XCIxMzQzNzE1NjU2OVwiLFwibmlja05hbWVcIjpcIjQ0MDgwMDAwMDAxMTExMDAwMDE3XCJ9IiwiaXNzIjoic2oiLCJpYXQiOjE2OTcxNTk2NjgsImV4cCI6MTY5NzE2MTQ2OH0.4C3GJIF5ejmySHy9l_LmheoCs5jknq17h9tPsZB3dIM” |
请求体参数说明:
| 参数名 | 类型 | 必须 | 描述 |
|---|---|---|---|
| deviceId | string | 是 | 接入视频设备ID标识,对应位置在 视频设备–我的接入配置–监控设备接入配置信息–SIP用户认证ID 如:黄色 "44080000001111000001"为接入视频设备SIP用户认证ID值 |
| channelId | string | 是 | IOT接入视频设备视频监控通道编号ID,对应位置在 视频设备–我的接入配置–监控设备接入配置信息–视频监控通道编号ID 如:黄色 “44090000001321000002” |
*正确响应结果示例:
"code": "0",
"msg": "success",
"data": {
"app": "rtp",
"stream": "44090000001111000001_44090000001321000002",
"deviceID": "44090000001111000001",
"channelId": "44090000001321000002",
"flv": "http://192.168.0.105:8088/rtp/44090000001111000001_44090000001321000002.live.flv",
"https_flv": "https://192.168.0.105:443/rtp/44090000001111000001_44090000001321000002.live.flv",
"ws_flv": "ws://192.168.0.105:8088/rtp/44090000001111000001_44090000001321000002.live.flv",
"wss_flv": "wss://192.168.0.105:443/rtp/44090000001111000001_44090000001321000002.live.flv",
"fmp4": "http://192.168.0.105:8088/rtp/44090000001111000001_44090000001321000002.live.mp4",
"https_fmp4": ""https://192.168.0.105:443/rtp/44090000001111000001_44090000001321000002.live.mp4",
"ws_fmp4": "ws://192.168.0.105:8088/rtp/44090000001111000001_44090000001321000002.live.mp4",
"hls": "http://192.168.0.105:8088/rtp/44090000001111000001_44090000001321000002/hls.m3u8",
"https_hls": "https://192.168.0.105:443/rtp/44090000001111000001_44090000001321000002/hls.m3u8",
"ws_hls": "ws://192.168.0.105:8088/rtp/44090000001111000001_44090000001321000002/hls.m3u8",
"wss_hls": "wss://192.168.0.105:443/rtp/44090000001111000001_44090000001321000002/hls.m3u8",
"ts": "http://192.168.0.105:8088/rtp/44090000001111000001_44090000001321000002.live.ts",
"https_ts": "https://192.168.0.105:443/rtp/44090000001111000001_44090000001321000002.live.ts",
"ws_ts": "ws://192.168.0.105:8088/rtp/44090000001111000001_44090000001321000002.live.ts",
"wss_ts": "wss://192.168.0.105:443/rtp/44090000001111000001_44090000001321000002.live.ts",
"rtmp": "rtmp://192.168.0.105:1935/rtp/44090000001111000001_44090000001321000002",
"rtmps": "rtmps://192.168.0.105:19350/rtp/44090000001111000001_44090000001321000002",
"rtsp": "rtsp://192.168.0.105:554/rtp/44090000001111000001_44090000001321000002",
"rtsps": "rtsps://192.168.0.105:332/rtp/44090000001111000001_44090000001321000002",
"rtc": "https://192.168.0.105:443/index/api/webrtc?app=rtp&stream=44090000001111000001_44090000001321000002&type=play",
"mediaServerId": "bHYYBssB9jtwVkca",
"tracks": [
{
"codecIdName": "null",
"codecId": "0",
"channels": "1",
"sampleBit": "0",
"ready": "true",
"fps": "0",
"width": "0",
"codecType": "0",
"sampleRate": "0",
"height": "0",
},
{
"codecIdName": "null",
"codecId": "0",
"channels": "0",
"sampleBit": "0",
"ready": "true",
"fps": "25",
"width": "1280",
"codecType": "0",
"sampleRate": "0",
"height": "720",
}
],
"transactionInfo": "null"
}
响应体参数说明:
| 参数名 | 类型 | 描述 |
|---|---|---|
| deviceID | string | 接入视频设备ID标识,对应位置在 视频设备–我的接入配置–监控设备接入配置信息–SIP用户认证ID 如:黄色 "44080000001111000001"为接入视频设备SIP用户认证ID值 |
| channelId | string | IOT接入视频设备视频监控通道编号ID,对应位置在 视频设备–我的接入配置–监控设备接入配置信息–视频监控通道编号ID 如:黄色 “44090000001321000002” |
| app | string | 名称 |
| stream | string | 视频媒体流ID |
| flv | string | 视频FLV格式拉流地址 |
| hls | string | 视频.m3u8格式拉流地址 |
| ts | string | 视频ts格式拉流地址 |
| rtmp | string | 视频rtmp协议拉流地址 |
| rtsp | string | 视频rtsp协议拉流地址 |
| mediaServerId | string | 视频流媒体服务器ID |
错误响应结果示例:
{
"code": "-1",
"msg": "fail:数据查询失败"
}
接口功能 本接口主要提供httpAPI接口通知流媒体服务器停止上传视频媒体流。
Request URL: http://192.168.0.188:18080/api/play/stopPushStream
域名访问URL: http://iotbox.iotrelay.cn:8080/api/api/play/stopPushStream
Request Method: GET
数据提交格式 Query String Parameters
请求头参数** Authorization**
请求头参数说明:
| 参数名 | 类型 | 必须 | 描述 |
|---|---|---|---|
| Authorization | Header | 是 | 固定值:字符串"Bearer" +"token"组成, "token"为上述登录接口获取的属性值,如:请求头中 “Authorization” : “Bearer eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiJiNjE3OGVlN2ZhNWM0OWU2ODlmMGEzNjIxNzkxYzk2OCIsInN1YiI6IntcInVzZXJJZFwiOlwiNDlcIixcInVzZXJOYW1lXCI6XCIxMzQzNzE1NjU2OVwiLFwibmlja05hbWVcIjpcIjQ0MDgwMDAwMDAxMTExMDAwMDE3XCJ9IiwiaXNzIjoic2oiLCJpYXQiOjE2OTcxNTk2NjgsImV4cCI6MTY5NzE2MTQ2OH0.4C3GJIF5ejmySHy9l_LmheoCs5jknq17h9tPsZB3dIM” |
请求体参数说明:
| 参数名 | 类型 | 必须 | 描述 |
|---|---|---|---|
| deviceId | string | 是 | 接入视频设备ID标识,对应位置在 视频设备–我的接入配置–监控设备接入配置信息–SIP用户认证ID 如:黄色 "44080000001111000001"为接入视频设备SIP用户认证ID值 |
| channelId | string | 是 | IOT接入视频设备视频监控通道编号ID,对应位置在 视频设备–我的接入配置–监控设备接入配置信息–视频监控通道编号ID 如:黄色 “44090000001321000002” |
正确响应结果示例:
{
"code": "0",
"msg": "success",
"data": "true",
}
错误响应结果示例:
{
"code": "-1",
"msg": "fail:视频点播未找到"
}
接口功能 本iot视频平台提供的接入NVR设备或摄像头设备拉流地址如下。
视频播放 URL: http://192.168.0.188:8088/rtp/44090000001111000001_44090000001321000002.live.flv (http协议flv播放格式)
http://192.168.0.188:8088/rtp/44090000001111000001_44090000001321000002/hls.m3u8 (http协议hls播放格式)
http://192.168.0.188:8088/rtp/44090000001111000001_44090000001321000002.live.ts (http协议ts播放格式)
rtmp://192.168.0.188:1935/rtp/44090000001111000001_44090000001321000002 (rtmp协议播放地址)
rtsp://192.168.0.188:554/rtp/44090000001111000001_44090000001321000002 (rtsp协议播放地址)
视频播放 域名访问URL:
http://video.iotbox.iotrelay.cn:8080/rtp/44090000001111000001_44090000001321000002.live.flv (http协议flv播放格式)
http://video.iotbox.iotrelay.cn:8080/rtp/44090000001111000001_44090000001321000002/hls.m3u8 (http协议hls播放格式)
http://video.iotbox.iotrelay.cn:8080/rtp/44090000001111000001_44090000001321000002.live.ts (http协议ts播放格式)
rtmp://iotbox.iotrelay.cn:1935/rtp/44090000001111000001_44090000001321000002 (rtmp协议播放地址)
rtsp://iotbox.iotrelay.cn:554/rtp/44090000001111000001_44090000001321000002 (rtsp协议播放地址)
视频播放URL组成说明:
视频播放URL组成说明:
| 参数名 | 描述 |
|---|---|
| 192.168.0.105:8088 | 固定值:拉流访问的流媒体ip和端口 |
| 44090000001111000001_44090000001321000002 | 固定值:字符串44090000001111000001_44090000001321000002由“接入的视频设备SIP_id” +“_”+“设备国标通道ID”组成, "44090000001111000001"为接入的视频设备SIP_id, "44090000001321000002"为接入的视频设备国标通道ID |
| 说明 | 在调用本拉流接口前需先调用《a、设备开始上传媒体流》接口,否则拉不到媒体流。 上述播放地址根据所选用的协议和拉流格式使用,通常基于HTML5开发项目采用http协议的.flv .m3u8 .ts 播放格式地址,基于应用程序的项目使用rtmp、rtsp协议播放地址。 http rtmp rtsp 为协议头 192.168.0.105 为拉流访问的流媒体ip 8088 1935 554 为拉流访问的流媒体端口 |
前端拉流地址的使用,只需把上述对应视频通道的播放地址加入视频播放器的URL即可。
接口功能 本接口主要提供httpAPI接口向接入的视频设备下达云台控制指令。控制摄像头设备进行上、下、左、右、左上、左下、右上、右下等八方位方向的移动;控制云台镜头的变倍、聚焦和光圈大小功能(说明:此接口功能只对支持云台控制的终端设备有效,例如海康、大华的球机)。
Request URL: http://192.168.0.105:18080/api/ptz/control/
域名访问URL: http://iotbox.iotrelay.cn:8080/api/api/ptz/control/
Request Method: POST
数据提交格式 form-data
请求头参数 Authorization
请求头参数说明:
| 参数名 | 类型 | 必须 | 描述 |
|---|---|---|---|
| Authorization | Header | 是 | 固定值:字符串“Bearer” +“token”组成, "token"为上述登录接口获取的属性值,如:请求头中 “Authorization” : “Bearer eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiJiNjE3OGVlN2ZhNWM0OWU2ODlmMGEzNjIxNzkxYzk2OCIsInN1YiI6IntcInVzZXJJZFwiOlwiNDlcIixcInVzZXJOYW1lXCI6XCIxMzQzNzE1NjU2OVwiLFwibmlja05hbWVcIjpcIjQ0MDgwMDAwMDAxMTExMDAwMDE3XCJ9IiwiaXNzIjoic2oiLCJpYXQiOjE2OTcxNTk2NjgsImV4cCI6MTY5NzE2MTQ2OH0.4C3GJIF5ejmySHy9l_LmheoCs5jknq17h9tPsZB3dIM” |
请求体格式 form-data
请求体参数说明:
| 参数名 | 类型 | 必须 | 描述 |
|---|---|---|---|
| deviceId | string | 是 | 接入视频设备ID标识,对应位置在 视频设备–我的接入配置–监控设备接入配置信息–SIP用户认证ID 如:黄色 "44080000001111000001"为接入视频设备SIP用户认证ID值 |
| channelId | string | 是 | IOT接入视频设备视频监控通道编号ID,对应位置在 视频设备–我的接入配置–监控设备接入配置信息–视频监控通道编号ID 如:黄色 “44090000001321000002” |
| command | string | 是 | IOT接入视频设备(摄像头)控制指令,允许值: left, right, up, down, upleft, upright, downleft, downright, zoomin, zoomout, stop |
| horizonSpeed | integer | 否 | 摄像头控制指令,摄像头水平移动速度,数值不要太大,尽量小于50 |
| verticalSpeed | integer | 否 | 摄像头控制指令,摄像头水平垂直速度,数值不要太大,尽量小于50 |
| zoomSpeed | integer | 否 | 摄像头控制指令,摄像头水平缩放速度,数值不要太大,尽量小于50 |
正确响应结果示例:
{
"code": "0",
"msg": "success",
"data": "true",
}
错误响应结果示例:
{
"code": "-1",
"msg": "fail:发送指令执行失败"
}
接口功能 本接口主要提供httpAPI接口向接入的视频设备下达云台控制指令,包括PTZ指令、FI指令、巡航指令、扫描指令和辅助开关指令。
Request URL: http://192.168.0.105:18080/api/ptz/front_end_command/
域名访问URL: http://iotbox.iotrelay.cn:8080/api/api/ptz/front_end_command/
Request Method: POST
数据提交格式 form-data
请求头参数 Authorization
请求头参数说明:
| 参数名 | 类型 | 必须 | 描述 |
|---|---|---|---|
| Authorization | Header | 是 | 固定值:字符串“Bearer” +“token”组成, "token"为上述登录接口获取的属性值,如:请求头中 “Authorization” : “Bearer eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiJiNjE3OGVlN2ZhNWM0OWU2ODlmMGEzNjIxNzkxYzk2OCIsInN1YiI6IntcInVzZXJJZFwiOlwiNDlcIixcInVzZXJOYW1lXCI6XCIxMzQzNzE1NjU2OVwiLFwibmlja05hbWVcIjpcIjQ0MDgwMDAwMDAxMTExMDAwMDE3XCJ9IiwiaXNzIjoic2oiLCJpYXQiOjE2OTcxNTk2NjgsImV4cCI6MTY5NzE2MTQ2OH0.4C3GJIF5ejmySHy9l_LmheoCs5jknq17h9tPsZB3dIM” |
请求体格式 form-data
请求体参数说明:
| 参数名 | 类型 | 必须 | 描述 |
|---|---|---|---|
| deviceId | string | 是 | 接入视频设备ID标识,对应位置在 视频设备–我的接入配置–监控设备接入配置信息–SIP用户认证ID 如:黄色 "44080000001111000001"为接入视频设备SIP用户认证ID值 |
| channelId | string | 是 | IOT接入视频设备视频监控通道编号ID,对应位置在 视频设备–我的接入配置–监控设备接入配置信息–视频监控通道编号ID 如:黄色 “44090000001321000002” |
| cmdCode | string | 是 | IOT接入视频设备(摄像头)控制指令指令码 |
| parameter1 | integer | 否 | 数据一 |
| parameter2 | integer | 否 | 数据二 |
| combindCode2 | integer | 组合码二 | 摄像头控制指令,摄像头水平缩放速度,数值不要太大,尽量小于50 |
正确响应结果示例:
{
"code": "0",
"msg": "success",
"data": "true"
}
错误响应结果示例:
{
"code": "-1",
"msg": "fail:发送指令执行失败"
}
接口功能 本接口主要提供httpAPI接口向支持云台控制的接入的视频设备下达云台控制指令,查询当前摄像头的预置位。
Request URL: http://192.168.0.105:18080/api/ptz/preset/query
域名访问URL: http://iotbox.iotrelay.cn:8080/api/api/ptz/preset/query
Request Method: GET
数据提交格式 Query String Parameters
请求头参数 Authorization
请求头参数说明:
| 参数名 | 类型 | 必须 | 描述 |
|---|---|---|---|
| Authorization | Header | 是 | 固定值:字符串“Bearer” +“token”组成, "token"为上述登录接口获取的属性值,如:请求头中 “Authorization” : “Bearer eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiJiNjE3OGVlN2ZhNWM0OWU2ODlmMGEzNjIxNzkxYzk2OCIsInN1YiI6IntcInVzZXJJZFwiOlwiNDlcIixcInVzZXJOYW1lXCI6XCIxMzQzNzE1NjU2OVwiLFwibmlja05hbWVcIjpcIjQ0MDgwMDAwMDAxMTExMDAwMDE3XCJ9IiwiaXNzIjoic2oiLCJpYXQiOjE2OTcxNTk2NjgsImV4cCI6MTY5NzE2MTQ2OH0.4C3GJIF5ejmySHy9l_LmheoCs5jknq17h9tPsZB3dIM” |
请求体参数说明:
| 参数名 | 类型 | 必须 | 描述 |
|---|---|---|---|
| deviceId | string | 是 | 接入视频设备ID标识,对应位置在 视频设备–我的接入配置–监控设备接入配置信息–SIP用户认证ID 如:黄色 "44080000001111000001"为接入视频设备SIP用户认证ID值 |
| channelId | string | 是 | IOT接入视频设备视频监控通道编号ID,对应位置在 视频设备–我的接入配置–监控设备接入配置信息–视频监控通道编号ID 如:黄色 “44090000001321000002” |
正确响应结果示例:
{
"code": "0",
"msg": "success",
"data": "true",
}
错误响应结果示例:
{
"code": "-1",
"msg": "fail:数据查询失败"
}
接口功能 本接口主要实现通过httpAPI接口选择摄像头设备,向流媒体服务器下达开始视频录像的指令。
Request URL: http://192.168.0.105:18080/api/record/startRecord
域名访问URL: http://iotbox.iotrelay.cn:8080/api/api/record/startRecord
Request Method: POST
数据提交格式 application/json
请求头参数 Authorization
请求头参数说明:
| 参数名 | 类型 | 必须 | 描述 |
|---|---|---|---|
| Authorization | Header | 是 | 固定值:字符串“Bearer” +“token”组成, "token"为上述登录接口获取的属性值,如:请求头中 “Authorization” : “Bearer eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiJiNjE3OGVlN2ZhNWM0OWU2ODlmMGEzNjIxNzkxYzk2OCIsInN1YiI6IntcInVzZXJJZFwiOlwiNDlcIixcInVzZXJOYW1lXCI6XCIxMzQzNzE1NjU2OVwiLFwibmlja05hbWVcIjpcIjQ0MDgwMDAwMDAxMTExMDAwMDE3XCJ9IiwiaXNzIjoic2oiLCJpYXQiOjE2OTcxNTk2NjgsImV4cCI6MTY5NzE2MTQ2OH0.4C3GJIF5ejmySHy9l_LmheoCs5jknq17h9tPsZB3dIM” |
请求体格式 Content-Type
{
"sipId": "44080000001111000001",
"channelSn": "44090000001321000002"
}
请求体参数说明:
| 参数名 | 类型 | 必须 | 描述 |
|---|---|---|---|
| sipId | string | 是 | 接入视频设备ID标识,对应位置在 视频设备–我的接入配置–监控设备接入配置信息–SIP用户认证ID 如:黄色 "44080000001111000001"为接入视频设备SIP用户认证ID值 |
| channelSn | string | 是 | IOT接入视频设备视频监控通道编号ID,对应位置在 视频设备–我的接入配置–监控设备接入配置信息–视频监控通道编号ID 如:黄色 “44090000001321000002” |
正确响应结果示例:
{
"code": "0",
"msg": "success",
"data": "true",
}
错误响应结果示例:
{
"code": "-1",
"msg": "fail:录像执行失败"
}
接口功能 本接口主要实现通过httpAPI接口选择摄像头设备,向流媒体服务器下达停止视频录像的指令。
Request URL: http://192.168.0.105:18080/api/record/stopRecord
域名访问URL: http://iotbox.iotrelay.cn:8080/api/api/record/stopRecord
Request Method: POST
数据提交格式 application/json
请求头参数 Authorization
请求头参数说明:
| 参数名 | 类型 | 必须 | 描述 |
|---|---|---|---|
| Authorization | Header | 是 | 固定值:字符串“Bearer” +“token”组成, "token"为上述登录接口获取的属性值,如:请求头中 “Authorization” : “Bearer eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiJiNjE3OGVlN2ZhNWM0OWU2ODlmMGEzNjIxNzkxYzk2OCIsInN1YiI6IntcInVzZXJJZFwiOlwiNDlcIixcInVzZXJOYW1lXCI6XCIxMzQzNzE1NjU2OVwiLFwibmlja05hbWVcIjpcIjQ0MDgwMDAwMDAxMTExMDAwMDE3XCJ9IiwiaXNzIjoic2oiLCJpYXQiOjE2OTcxNTk2NjgsImV4cCI6MTY5NzE2MTQ2OH0.4C3GJIF5ejmySHy9l_LmheoCs5jknq17h9tPsZB3dIM” |
请求体格式 Content-Type
{
"sipId": "44080000001111000001",
"channelSn": "44090000001321000002"
}
请求体参数说明:
| 参数名 | 类型 | 必须 | 描述 |
|---|---|---|---|
| sipId | string | 是 | 接入视频设备ID标识,对应位置在 视频设备–我的接入配置–监控设备接入配置信息–SIP用户认证ID 如:黄色 "44080000001111000001"为接入视频设备SIP用户认证ID值 |
| channelSn | string | 是 | IOT接入视频设备视频监控通道编号ID,对应位置在 视频设备–我的接入配置–监控设备接入配置信息–视频监控通道编号ID 如:黄色 “44090000001321000002” |
正确响应结果示例:
{
"code": "0",
"msg": "success",
"data": "true",
}
错误响应结果示例:
{
"code": "-1",
"msg": "fail:录像停止执行失败"
}
接口功能 本接口主要提供httpAPI接口查询通道视频是否正在录制中。
Request URL: http://192.168.0.105:18080/api/record/queryIsRecording
域名访问URL: http://iotbox.iotrelay.cn:8080/api/api/record/queryIsRecording
Request Method: GET
数据提交格式 Query String Parameters
请求头参数 Authorization
请求头参数说明:
| 参数名 | 类型 | 必须 | 描述 |
|---|---|---|---|
| Authorization | Header | 是 | 固定值:字符串“Bearer” +“token”组成, "token"为上述登录接口获取的属性值,如:请求头中 “Authorization” : “Bearer eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiJiNjE3OGVlN2ZhNWM0OWU2ODlmMGEzNjIxNzkxYzk2OCIsInN1YiI6IntcInVzZXJJZFwiOlwiNDlcIixcInVzZXJOYW1lXCI6XCIxMzQzNzE1NjU2OVwiLFwibmlja05hbWVcIjpcIjQ0MDgwMDAwMDAxMTExMDAwMDE3XCJ9IiwiaXNzIjoic2oiLCJpYXQiOjE2OTcxNTk2NjgsImV4cCI6MTY5NzE2MTQ2OH0.4C3GJIF5ejmySHy9l_LmheoCs5jknq17h9tPsZB3dIM” |
请求体参数说明:
| 参数名 | 类型 | 必须 | 描述 |
|---|---|---|---|
| deviceId | string | 是 | 接入视频设备ID标识,对应位置在 视频设备–我的接入配置–监控设备接入配置信息–SIP用户认证ID 如:黄色 "44080000001111000001"为接入视频设备SIP用户认证ID值 |
| channelId | string | 是 | IOT接入视频设备视频监控通道编号ID,对应位置在 视频设备–我的接入配置–监控设备接入配置信息–视频监控通道编号ID 如:黄色 “44090000001321000002” |
正确响应结果示例:
{
"code": "0",
"msg": "查询流媒体视频是否正在录制中,true 为正在录制,false 为没有录制",
"data": "true",
}
错误响应结果示例:
{
"code": "-1",
"msg": "fail:数据查询失败"
}
接口功能 本接口主要提供httpAPI接口查询获取通道对应的录像文件列表。
Request URL: http://192.168.0.105:18080/api/record/queryRecordMp4File
域名访问URL: http://iotbox.iotrelay.cn:8080/api/api/record/queryRecordMp4File
Request Method:GET
数据提交格式 Query String Parameters
请求头参数 Authorization
请求头参数说明:
| 参数名 | 类型 | 必须 | 描述 |
|---|---|---|---|
| Authorization | Header | 是 | 固定值:字符串“Bearer” +“token”组成, "token"为上述登录接口获取的属性值,如:请求头中 “Authorization” : “Bearer eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiJiNjE3OGVlN2ZhNWM0OWU2ODlmMGEzNjIxNzkxYzk2OCIsInN1YiI6IntcInVzZXJJZFwiOlwiNDlcIixcInVzZXJOYW1lXCI6XCIxMzQzNzE1NjU2OVwiLFwibmlja05hbWVcIjpcIjQ0MDgwMDAwMDAxMTExMDAwMDE3XCJ9IiwiaXNzIjoic2oiLCJpYXQiOjE2OTcxNTk2NjgsImV4cCI6MTY5NzE2MTQ2OH0.4C3GJIF5ejmySHy9l_LmheoCs5jknq17h9tPsZB3dIM” |
请求体参数说明:
| 参数名 | 类型 | 必须 | 描述 |
|---|---|---|---|
| deviceId | string | 是 | 接入视频设备ID标识,对应位置在 视频设备–我的接入配置–监控设备接入配置信息–SIP用户认证ID 如:黄色 "44080000001111000001"为接入视频设备SIP用户认证ID值 |
| channelId | string | 是 | IOT接入视频设备视频监控通道编号ID,对应位置在 视频设备–我的接入配置–监控设备接入配置信息–视频监控通道编号ID 如:黄色 “44090000001321000002” |
| queryDate | string | 是 | 录像日期 yyyy-mm-dd格式, 如:黄色 “2023-10-08” 查询2023-10-08日的录像列表文件 |
正确响应结果示例:
{
"code": "0",
"msg": "共查询到2个录像文件",
"data": [
{
"deviceId": "44090000001111000001",
"channelId": "44090000001321000002",
"fileName": "11-40-16.mp4",
"filePath": "http://192.168.0.139:8010/recordPath/record/rtp/44090000001111000001_44090000001321000002/2023-10-08/11-40-16.mp4",
"recordDate": "2023-10-08",
"duration": "35",
"bitRate": "2026000",
"frameRaten": "25.0",
"decoder": "h264 (Main) (avc1 / 0x31637661)",
},
{
"deviceId": "44090000001111000001",
"channelId": "44090000001321000002",
"fileName": "11-41-54.mp4",
"filePath": "http://192.168.0.139:8010/recordPath/record/rtp/44090000001111000001_44090000001321000002/2023-10-08/11-41-54.mp4",
"recordDate": "2023-10-08",
"duration": "37",
"bitRate": "2035000",
"frameRaten": "25.0",
"decoder": "h264 (Main) (avc1 / 0x31637661)",
},
。。。。。。
]
}
响应体参数说明:
| 参数名 | 类型 | 描述 |
|---|---|---|
| deviceId | string | 接入视频设备ID标识,对应位置在 视频设备–我的接入配置–监控设备接入配置信息–SIP用户认证ID 如:黄色 "44080000001111000001"为接入视频设备SIP用户认证ID值 |
| channelId | string | IOT接入视频设备视频监控通道编号ID,对应位置在 视频设备–我的接入配置–监控设备接入配置信息–视频监控通道编号ID 如:黄色 “44090000001321000002” |
| fileName | string | 录像文件名称 |
| filePath | string | 视频录像文件所在路径 |
| recordDate | string | 录像日期 yyyy-mm-dd格式, 如:黄色 “2023-10-08” 查询2023-10-08日的录像列表文件 |
| duration | string | 录像文件视频时长,单位秒 |
| bitRate | string | 视频码率 |
| frameRaten | string | 录像文件视频帧率 |
| decoder | string | 录像视频解码器名称 |
错误响应结果示例:
{
"code": "-1",
"msg": "fail:数据查询失败"
}
接口功能 本接口主要实现通过httpAPI接口查询iot流媒体服务器录像计划列表。
Request URL: http://192.168.0.105:18080/api/record/queryZLMRecordPlanList
域名访问URL: http://iotbox.iotrelay.cn:8080/api/api/record/queryZLMRecordPlanList
Request Method: GET
数据提交格式 Query String Parameters
请求头参数 Authorization
请求头参数说明:
| 参数名 | 类型 | 必须 | 描述 |
|---|---|---|---|
| Authorization | Header | 是 | 固定值:字符串“Bearer” +“token”组成, "token"为上述登录接口获取的属性值,如:请求头中 “Authorization” : “Bearer eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiJiNjE3OGVlN2ZhNWM0OWU2ODlmMGEzNjIxNzkxYzk2OCIsInN1YiI6IntcInVzZXJJZFwiOlwiNDlcIixcInVzZXJOYW1lXCI6XCIxMzQzNzE1NjU2OVwiLFwibmlja05hbWVcIjpcIjQ0MDgwMDAwMDAxMTExMDAwMDE3XCJ9IiwiaXNzIjoic2oiLCJpYXQiOjE2OTcxNTk2NjgsImV4cCI6MTY5NzE2MTQ2OH0.4C3GJIF5ejmySHy9l_LmheoCs5jknq17h9tPsZB3dIM” |
请求体参数说明:
| 参数名 | 类型 | 必须 | 描述 |
|---|---|---|---|
| deviceId | string | 是 | 接入视频设备ID标识,对应位置在 视频设备–我的接入配置–监控设备接入配置信息–SIP用户认证ID 如:黄色 "44080000001111000001"为接入视频设备SIP用户认证ID值 |
| channelId | string | 是 | IOT接入视频设备视频监控通道编号ID,对应位置在 视频设备–我的接入配置–监控设备接入配置信息–视频监控通道编号ID 如:黄色 “44090000001321000002” |
正确响应结果示例:
{
"code": "0",
"msg": "success",
"data": [
{
"id": "1719706668054454274",
"channelName": "cameria_01",
"sipId": "44090000001111000001",
"channelSn": "44090000001321000002",
"startTime": "2023-11-01 21:22:50",
"stopTime": "2023-11-01 22:22:54",
"isDeleted": "0",
"isExecuted": "1",
"startExecuteTime": "2023-11-01T21:51:22.920",
"stopExecuteTime": "null",
"remark": "null",
},
{
"id": "1719706668054454275",
"channelName": "cameria_03",
"sipId": "44090000001111000001",
"channelSn": "44090000001321000003",
"startTime": "2023-11-01 21:22:50",
"stopTime": "2023-11-01 22:22:54",
"isDeleted": "0",
"isExecuted": "1",
"startExecuteTime": "2023-11-01T21:51:22.920",
"stopExecuteTime": "null",
"remark": "null",
},
。。。。。。
]
}
响应体参数说明:
| 参数名 | 类型 | 描述 |
|---|---|---|
| id | string | 录像计划ID,序列号 |
| channelName | string | 接入视频设备通道名称 |
| sipId | string | 接入视频设备ID标识,对应位置在 视频设备–我的接入配置–监控设备接入配置信息–SIP用户认证ID 如:黄色 "44080000001111000001"为接入视频设备SIP用户认证ID值 |
| channelSn | string | IOT接入视频设备视频监控通道编号,对应位置在 视频设备–我的接入配置–监控设备接入配置信息–视频监控通道编号ID 如:黄色 “44090000001321000002” |
| startTime | datetime | 视频录像计划的开始时间 |
| stopTime | datetime | 视频录像计划的截止时间 |
| isDeleted | integer | 录像计划是否有效,0、有效;1、无效 |
| isExecuted | integer | 录像计划是否已执行,0、未执行;1、已执行 |
| startExecuteTime | datetime | 录像计划开始执行时间 |
| stopExecuteTime | datetime | 录像计划停止执行时间 |
| remark | string | 备注 |
错误响应结果示例:
{
"code": "-1",
"msg": "fail:录像计划数据查询失败"
}
接口功能 本接口主要实现通过httpAPI接口选择摄像头设备,根据不同时间段添加录像计划。 注:每个摄像头通道可以添加多个录像执行计划,录像执行计划时间段不能重复,录像时间段时长不要设置太长,避免生成的录像数据占用大量磁盘空间。
Request URL: http://192.168.0.105:18080/api/record/setZLMRecordPlan
域名访问URL: http://iotbox.iotrelay.cn:8080/api/api/record/setZLMRecordPlan
Request Method: POST
数据提交格式 application/json
请求头参数 Authorization
请求头参数说明:
| 参数名 | 类型 | 必须 | 描述 |
|---|---|---|---|
| Authorization | Header | 是 | 固定值:字符串“Bearer” +“token”组成, "token"为上述登录接口获取的属性值,如:请求头中 “Authorization” : “Bearer eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiJiNjE3OGVlN2ZhNWM0OWU2ODlmMGEzNjIxNzkxYzk2OCIsInN1YiI6IntcInVzZXJJZFwiOlwiNDlcIixcInVzZXJOYW1lXCI6XCIxMzQzNzE1NjU2OVwiLFwibmlja05hbWVcIjpcIjQ0MDgwMDAwMDAxMTExMDAwMDE3XCJ9IiwiaXNzIjoic2oiLCJpYXQiOjE2OTcxNTk2NjgsImV4cCI6MTY5NzE2MTQ2OH0.4C3GJIF5ejmySHy9l_LmheoCs5jknq17h9tPsZB3dIM” |
请求体格式 Content-Type
{
"deviceId": "44080000001111000001",
"channelId": "44090000001321000002"
"recordPlanList": [
{
"startTime": "2023-11-04 10:38:00",
"stopTime": "2023-11-04 10:45:00"
},
{
"startTime": "2023-11-05 20:00:00",
"stopTime": "2023-11-05 20:30:00"
},
。。。。。。
]
}
请求体参数说明:
| 参数名 | 类型 | 必须 | 描述 |
|---|---|---|---|
| deviceId | string | 是 | 接入视频设备ID标识,对应位置在 视频设备–我的接入配置–监控设备接入配置信息–SIP用户认证ID 如:黄色 "44080000001111000001"为接入视频设备SIP用户认证ID值 |
| channelId | string | 是 | IOT接入视频设备视频监控通道编号ID,对应位置在 视频设备–我的接入配置–监控设备接入配置信息–视频监控通道编号ID 如:黄色 “44090000001321000002” |
| startTime | datetime | 是 | 视频录像计划的开始时间 |
| stopTime | datetime | 是 | 视频录像计划的截止时间 |
正确响应结果示例:
{
"code": "0",
"msg": "保存录像计划成功",
"data": "true",
}
错误响应结果示例:
{
"code": "-1",
"msg": "fail:保存录像计划失败"
}
接口功能 本接口主要实现通过httpAPI接口实现删除取消iot流媒体服务器录像计划。
Request URL: http://192.168.0.105:18080/api/record/cancelZLMRecordPlan
域名访问URL: http://iotbox.iotrelay.cn:8080/api/api/record/cancelZLMRecordPlan
Request Method: POST
数据提交格式 application/json
请求头参数 Authorization
请求头参数说明:
| 参数名 | 类型 | 必须 | 描述 |
|---|---|---|---|
| Authorization | Header | 是 | 固定值:字符串“Bearer” +“token”组成, "token"为上述登录接口获取的属性值,如:请求头中 “Authorization” : “Bearer eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiJiNjE3OGVlN2ZhNWM0OWU2ODlmMGEzNjIxNzkxYzk2OCIsInN1YiI6IntcInVzZXJJZFwiOlwiNDlcIixcInVzZXJOYW1lXCI6XCIxMzQzNzE1NjU2OVwiLFwibmlja05hbWVcIjpcIjQ0MDgwMDAwMDAxMTExMDAwMDE3XCJ9IiwiaXNzIjoic2oiLCJpYXQiOjE2OTcxNTk2NjgsImV4cCI6MTY5NzE2MTQ2OH0.4C3GJIF5ejmySHy9l_LmheoCs5jknq17h9tPsZB3dIM” |
请求体格式 form-data
请求体参数说明:
| 参数名 | 类型 | 必须 | 描述 |
|---|---|---|---|
| ids | string | 是 | 录像计划ID,对应《5)、查询iot流媒体服务器录像计划列表接口》章节接口查询返回的录像计划ID,序列号。 如:黄色 "1719706668054454275"为录像计划ID值。 如果有多个可以为逗号分隔, 如: “1719706668054454274,1719706668054454275” |
正确响应结果示例:
{
"code": "0",
"msg": "success",
"data": "true",
}
错误响应结果示例:
{
"code": "-1",
"msg": "fail:操作失败"
}
接口功能 本iot视频平台录像文件路径由《 4)、获取通道对应的录像文件列表》章节接口查询获取。
例如获取到的视频录像文件地址: http://192.168.0.105:8010/recordPath/record/rtp/44090000001111000001_44090000001321000002/2023-10-08/11-41-54.mp4
特别说明: 如果您IOT中继宝盒申请了子域名启用了内网穿透功能,既外网调用接口,对照获取的内网录像文件地址,则外网视频录像文件地址为: http://video.iotbox.iotrelay.cn:8080/recordPath/record/rtp/44090000001111000001_44090000001321000002/2023-10-08/11-41-54.mp4
可以通过程序io流下载,也可以在本IOT中继平台–视频管理–通道–录像查询—选择录像文件下载。
本IOT中继平台面向业务平台提供数据转发功能,通过转发配置把从设备侧采集读取的数据转发到对应的业务平台或应用服务。数据转发有三种方式:
1)、http转发:通过http协议把数据转发至用户的http业务平台。
2)、kafka转发:把数据推送至用户部署的kafka消息服务器。
3)、RabbitMQ转发:把数据推送至用户部署的RabbitMQ消息服务器。
数据转发功能的使用需要先到本IOT中继平台–数据转发配置界面,根据界面配置要求选择要转发的数据的设备,选择转发属性或事件数据类型,选择转发方式,填写转发目标服务器鉴权账号和口令等参数保存配置即可。
数据转发鉴权是指本IOT中继平台转发数据需要连接目标服务器,目标服务器的鉴权要求。转发至用户的http业务平台,需要提供访问http业务平台的账号口令,访问地址等鉴权信息。
关于http协议转发,本IOT中继平台提供了两种鉴权服务支持,一是用户名+密钥基础认证方式;二是HTTP Bearer Token认证方式。
关于kafka、RabbitMQ转发,只需要按转发配置界面要求填写相应的服务器连接地址、端口号、账号和口令即可。
数据转发配置操作具体到数据转发配置界面进行。
数据转发topic: 关于数据转发topic,如果选择http协议转发,系统需要配置数据转发的请求地址,此请求地址后面的一串字符即为http协议转发的topic。 比如:设备温度属性的数据的转发地址为 “http://127.0.0.1:80/aaaa”,在此处的“/aaaa” 即为http协议转发的topic。这个topic需要在数据转发配置界面配置转发的数据明细时填写, 这个topic地址需要转发的目标业务平台提供。
特别说明:http转发,请求提交方法统一为post请求。
关于kafka、RabbitMQ转发,数据转发的topic格式为在本IOT中继平台–数据转发配置–选择转发明细项时填写的对应的topic 。
数据转发消息体内容为json格式数据,需要应用端平台对josn数据解析。
转发的消息体格式样例:
{
"createTime": "2023-11-26 23:11:16",
"dataName": "温度",
"dataResource": "1",
"iotRelayDeviceSn": "202403200101001",
"deviceId": "44080000001111000015",
"forwardingDataType": "2",
"integerValue": "19",
"measurementUnit": "度",
"propertiesId": "P_1697276433454",
"propertiesValueDataType": "integer_value",
"scaleFactor": "10"
}
消息体参数说明:
| 参数名 | 类型 | 描述 |
|---|---|---|
| createTime | datetime | 数据时间 yyyy-mm-dd hh:mm:ss 格式 |
| dataName | string | 数据属性名称,如黄色 "温度"为对应值 |
| dataResource | integer | 数据来源类型(1、读;3、上报 ) |
| iotRelayDeviceSn | string | IOT中继宝盒设备编号,黄色为IOT中继宝盒设备编号标识值 “202403200101001” |
| deviceId | string | 接入设备ID标识,黄色为接入设备ID标识值 “44080000001111000015” |
| forwardingDataType | integer | 转发数据类别:1、上报属性数据 2、读取的属性数据 3、上报的事件数据 |
| integerValue | integer | 整型数据值标识, 如黄色值"19" |
| propertiesValueDataType | string | 值数据类型标识,对应(integer_value/long_value/float_value/double_value/string_value/date_value/time_value/json_value) |
| measurementUnit | string | 单位(如:度、米、转每分钟、流量单位、功率单位等) |
| scaleFactor | integer | 数据精度(缩放因子),如黄色值"10" |
| propertiesId | string | 物模型属性ID标识,黄色为接入设备物模型属性ID标识值 “P_1697276433454” |
{
"createTime": "2023-11-26 23:11:16",
"dataName": "故障关机",
"dataResource": "3",
"iotRelayDeviceSn": "202403200101001",
"deviceId": "44080000001111000017",
"eventId": "E_1697248913306",
"forwardingDataType": "3",
}
消息体参数说明:
| 参数名 | 类型 | 描述 |
|---|---|---|
| createTime | datetime | 数据时间 yyyy-mm-dd hh:mm:ss 格式 |
| dataName | string | 数据属性名称,如黄色 "故障关机"为对应值 |
| dataResource | integer | 数据来源类型(1、读;3、上报 ) |
| iotRelayDeviceSn | string | IOT中继宝盒设备编号,黄色为IOT中继宝盒设备编号标识值 “202403200101001” |
| deviceId | string | 接入设备ID标识,黄色为接入设备ID标识值 “44080000001111000017” |
| eventId | string | 物模型事件ID标识,黄色为接入设备物模型事件ID标识值 “E_1697248913306” |
| forwardingDataType | integer | 转发数据类别:1、上报属性数据 2、读取的属性数据 3、上报的事件数据 |