基于OneNet平台设计的物联网温度采集系统-4G模块+STM32上云

举报
DS小龙哥 发表于 2022/10/25 23:03:55 2022/10/25
【摘要】 当前采用的物联网平台是OneNET云平台,OneNET中国移动物联网开放平台是由中国移动打造的PaaS物联网开放平台。平台能够帮助开发者轻松实现设备接入与设备连接,提供综合性的物联网解决方案,实现物联网设备的数据获取,数据存储,数据展现。

一、设计说明

设计思路: 每个测量点采用4G+STM32+温度测量模块组成;采集温度数据之后直接上传到OneNet物联网云平台,在OneNET云平台上设计可视化界面进行显示,并且也可以在手机APP设备云上显示。

当前采用的物联网平台是OneNET云平台,OneNET中国移动物联网开放平台是由中国移动打造的PaaS物联网开放平台。平台能够帮助开发者轻松实现设备接入与设备连接,提供综合性的物联网解决方案,实现物联网设备的数据获取,数据存储,数据展现。

当前这个设计算是物联网技术的一个典型应用。目前物联网产业正在飞快发展着,从智能电视、智能家居、智能汽车、医疗健康、智能玩具、机器人等延伸到可穿戴设备领域。 物联网将赋能智能硬件向多元的消费场景渗透,从而创造更加便捷、舒适、安全、节能的生活环境。 物联网是通过约定的协议将原本独立存在的设备相互连接起来,并最终实现智能识别、定位、跟踪、监测、控制和管理的一种网络,无需人与人、或人与设备的互动。通俗来说物联网就是“物物相连的网”,主要应用于智能交通、智能医疗、智能家居、智能物流、智能电力等领域。

二、硬件选型

2.1 4G模块-WH-LTE-7S1

4G模块选择有人科技的WH-LTE-7S1 模块,支持全网通,外置了卡槽,可以插卡,本身模块也内置了电信卡,可以直接使用,不用考虑买卡,不用考虑卡接触不良等问题,内置的卡目前是8年免费使用,每月100M免费流量。

image-20221023153016207

有人科技,插针式Cat-1模块(WH-LTE-7S1) 4G模块使用介绍:https://www.usr.cn/Product/294.html

image-20221023152804012

下面是4G模块的功能参数:

透传模式, HTTPD模式 工作模式
AT+命令结构 设置指令
TCP/UDP/DNS/FTP/HTTP 网络协议
4 Socket数量
串口AT指令、网络AT指令 用户配置

 

域名解析DNS 支持
简单透传方式 支持TCP Client /UDP Client
心跳数据包 支持自定义心跳包/SN心跳包/ICCID心跳包/IMEI心跳包/LBS心跳包
注册包机制 支持自定义注册包/SN注册包/ICCID注册包/IMEI注册包/CLOUD注册包
FOTA升级 支持
套接字分发协议 支持
基站定位 支持
FTP他升级协议 支持
NTP校时功能 支持
工作状态指引脚 支持

通过该模块可以快速实现串口与网络的双向数据透传:

image-20221023153126414

农业物联网环境监测案例: 可将农业大棚里各类传感器采集的数据,通过LTE或GPRS网络快速上传 至远程服务器,方便控制中心实时监测大棚动态,及时作出响应。

cat1插针式模块的农业物联网环境监测案例

两个WH-LTE-7S1通过有人云实现一对一透传: https://www.usr.cn/Faq/1217.html

2.2 铂电阻PT100

铂电阻,简称为:铂热电阻,它的阻值会随着温度的变化而改变。它有PT100和 PT1000等等系列产品,它适用于医疗、电机、工业、温度计算、卫星、气象、阻值计算等高精温度设备,应用范围非常之广泛。

PT100铂电阻是PT100的简称,其中PT100是铂热电阻的分度号,PT代表热电阻的材质是铂,PT后的100即表示它在0℃时阻值为100欧姆,在100℃时它的阻值约为138.5欧姆。它的阻值会随着温度的变化而改变。

image-20221024132551524

2.3 STM32系统板

STM32采用STM32F103RCT6,FLASH256KB,RAM48KB,主频72MHZ。

image-20221024132630779

三、OneNet云平台创建

OneNET资源模型如下图:

image-20221024141219406

下面是名词的解释:

【1】产品(product) 用户的最大资源集为产品,产品下资源包括设备、设备数据、设备权限、数据触发服务以及基于设备数据的应用等多种资源,用户可以创建多个产品。

【2】设备(device) 设备为真实终端在平台的映射,真实终端连接平台时,需要与平台设备建立一一对应关系,终端上传的数据被存储在数据流中,设备可以拥有一个或者多个数据流。

【3】数据流与数据点 数据流用于存储设备的某一类属性数据,例如温度,湿度,坐标等信息;平台要求设备上传并存储数据时,必须以key-value的格式上传数据,其中key即为数据流名称,value为实际存储的数据点,value格式可以为int、float、string、json等多种自定义格式。

【4】APIkey APIkey为用户进行API调用时的密钥,用户访问产品资源时,必须使用该产品目录下对应的APIkey。

【5】触发器(trigger) 触发器为产品目录下的消息服务,可以进行基于数据流的简单逻辑判断并触发HTTP请求或者邮件。

【6】应用(application) 应用编辑服务,支持用户以拖拽控件并关联设备数据流的方式,生成简易网页展示应用。

3.1 官网首页

地址: https://open.iot.10086.cn/

如果没有onenet的账号,点击右上角进行账号注册,注册之后完成实名认证即可。

image-20221024134219312

在产品服务里可以看到常见物联网接入服务:

image-20221024134455310

3.2 创建产品

(1)控制台页面

点击右上角的控制台按钮,进入旧版控制台。 (切换成旧版,需要使用多协议接入)

image-20221024134649971

(2)多协议接入

选择多协议接入:

image-20221024134828537

(3)HTTP协议

选择HTTP协议,点击添加产品。

image-20221024135003675

(4)填写产品信息

根据自己的项目情况,去填写这里的产品信息。

image-20221024135217040

image-20221024135305474

填好之后,点击确定即可。

3.3 添加设备

产品创建完之后,点击添加设备。

image-20221024135346136

(1)添加设备

image-20221024135419147

(2)设置设备信息

根据自己的设备信息填写。

image-20221024135540472

(3)添加多个采集点设备

因为采集点有多个,一个采集点就是一个独立的设备,如果有40个采集点,就创建40个设备。

我这里为了方便测试,就创建3个设备,对应3个采集点。

添加完成:

image-20221024135824884

3.4 创建数据流模板

(1)添加数据流模板

数据流模板是设置设备上报数据时存放的属性字段。

image-20221024135949257

(2)添加温度字段

添加温度字段。 目前采集点只是采集温度,这里创建一个温度字段就行了。 如果采集点还需要采集更多的数据类型,这里按格式添加即可。

image-20221024140124571

(3)添加完成

添加后,如果页面没有出来,鼠标右键刷新一下页面就能看到。

image-20221024140259387

3.5 数据点上传

多协议接入帮助文档地址:https://open.iot.10086.cn/doc/v5/develop/detail/multiprotocol

平台通过数据流与数据点来组织设备上行数据,如下图所示:

image-20221024141048604

设备上传并存储数据时,必须以key-value的格式上传数据,其中key即为数据流(stream)名称,value为实际存储的数据点(point),value格式可以为int、float、string、json等多种自定义格式。

在实际应用中,数据流可以被用于分类描述设备的某一类属性数据,例如温度,湿度,坐标等信息,用户可以自定义数据流的数据范围,将相关性较高的数据归类为一个数据流。

(1)平台接入地址

目前是采用HTTP协议上传数据,HTTP协议是短连接,所以在设备页面是看不到设备在线的情况。

IP地址: 183.230.40.33
端口号: 80

(2)创建设备APIKey

通过HTTP协议上传数据时,需要设备的apikey作为密匙。

【1】在设备列表页面,单击详情:

image-20221024142223627

【2】点击添加APIKey

image-20221024142312677

因为我这是设备节点3,为了好区别,我这里设置dev3

image-20221024142411059

【3】添加成功

image-20221024142454503

【4】将剩下的2个温度采集设备也创建APIKey

image-20221024142611828

image-20221024142629488

(3)设备ID

每个设备创建后都有一个ID,上传数据时,需要填写这个ID。

在设备详情页面可以看到这个ID。

image-20221024142737388

(4)列出当前设备的ID和APIkey

为了方便接下来测试,我把3个设备的ID和APIkey先贴出来待用。

温度采集设备1
设备ID:  1009326949
APIKey:  Q1=mhFwn=zt6nfp1EYvSsUcwUX8=
​
温度采集设备2
设备ID:  1009327662
APIKey:  ezI=f3T=47=jlJssgKH2xVcLtBU=
​
温度采集设备3
设备ID:  1009327756
APIKey:  KkHKbNWmy4diHtpT=D=AfoZxy3w=

(5)数据点上传格式

当前选择的是HTTP协议上传数据,下面是标准的HTTP报文格式:

POST /devices/<填设备ID>/datapoints HTTP/1.1
api-key:<填设备的ApiKey>
Host:api.heclouds.com
Connection:close
Content-Length:<填下面需要上传的数据总字节数>
​
{"datastreams":[{"id":"<填数据流名称>","datapoints":[{"value":<上传的值>}]}]}

比如:我给设备采集节点1,上传一个温度值。HTTP的报文格式按如下填写。

POST /devices/1009326949/datapoints HTTP/1.1
api-key:Q1=mhFwn=zt6nfp1EYvSsUcwUX8=
Host:api.heclouds.com
Connection:close
Content-Length:61
​
{"datastreams":[{"id":"temp","datapoints":[{"value":24.5}]}]}

手动测试组合报文赋值的时候,这个数据长度的计算可以通过编辑器(我用的notepad++)完成。

如果在程序里发送数据时,下面的数据长度可以动态计算的(strlen)。

image-20221024143600107

3.6 模拟数据上传测试

为了方便验证云平台是否能正常使用,下面使用TCP调试助手来模拟设备发出HTTP报文(上传数据点)给OneNet平台完成测试。

(1)打开网络调试助手

输入远程IP地址和端口号,然后点击连接。

IP地址: 183.230.40.33
端口号: 80

image-20221024145256062

连接成功:

image-20221024145352113

(2)输入发送的数据

POST /devices/1009326949/datapoints HTTP/1.1
api-key:Q1=mhFwn=zt6nfp1EYvSsUcwUX8=
Host:api.heclouds.com
Connection:close
Content-Length:61
​
{"datastreams":[{"id":"temp","datapoints":[{"value":24.5}]}]}

特别说明:

【1】 复制上面代码到下面的网络调试助手的时候,要注意格式。因为PDF文档复制的时候会导致换行符这些丢失。 要按下面红色框框这样的格式贴进去,才能发送。

【2】HTTP端口连接上之后,如果没有发送数据,过一会会自动断开连接的,或者一次数据发送成功,服务器也会断开连接。每次发送之前重新连接上,再发送即可。

image-20221024145513093

发送成功的提示:

image-20221024145542258

(3)登录云平台查看数据

刚才测试数据上传的是设备1,在设备详情页面找打设备1,点开设备详情页面,找到数据流展示页面,可以看到刚才上传的数据。

image-20221024150015195

(4)剩下的温度采集节点上传温度测试

其他的温度检测设备节点如果要上传数据,也是一样的方式。

下面将3个设备的发送数据格式都列出来,方便填入调试助手发送测试:

温度采集设备1: 
POST /devices/1009326949/datapoints HTTP/1.1
api-key:Q1=mhFwn=zt6nfp1EYvSsUcwUX8=
Host:api.heclouds.com
Connection:close
Content-Length:61
​
{"datastreams":[{"id":"temp","datapoints":[{"value":24.5}]}]}
​
​
温度采集设备2: 
POST /devices/1009327662/datapoints HTTP/1.1
api-key:ezI=f3T=47=jlJssgKH2xVcLtBU=
Host:api.heclouds.com
Connection:close
Content-Length:61
​
{"datastreams":[{"id":"temp","datapoints":[{"value":25.5}]}]}
​
​
温度采集设备3: 
POST /devices/1009327756/datapoints HTTP/1.1
api-key:KkHKbNWmy4diHtpT=D=AfoZxy3w=
Host:api.heclouds.com
Connection:close
Content-Length:61
​
{"datastreams":[{"id":"temp","datapoints":[{"value":26.5}]}]}

四、可视化页面设计

为了方便展示温度信息,可以利用onenet提供的可视化组件设计一个网页进行显示。

地址: https://open.iot.10086.cn/studio/view/project

image-20221024150657802

目前OneNet的View数据可视化组件分为3个权限: 基础版、企业版、专业版; 基础版也就是免费版,可以使用基本的组件。 一般要求不高的数据展示,基础版就差不多够用的。

下面是企业版的价格费用:

image-20221024150902203

4.1 创建数据源模板

可视化页面上的控件显示数据时,需要设置数据来源。所以,这里先创建数据的来源。

(1)创建源模板

image-20221024151427600

(2)填写数据源的信息

根据提示填写产品ID和Key,下面的设备和数据流选择对应的设备即可。每个设备都需要建立一个数据源模板。

image-20221024151741442

(3)产品ID和key在哪里看?

在产品的概述页面,可以找到产品ID和对应的key。

image-20221024152351841

(4)创建完成

为了好区分名字,可以将数据源模板的名称按照序号设置,这样一个设备对应一个数据源。

因为我创建了3个设备,这里对应创建了3个数据源模板。

image-20221024152514795

4.2 创建可视化页面

(1)新建项目

image-20221024152754341

新建项目可以选择空白模板,也可以选择现有的模板创建。 就算选择空白模板,也可以去参考现成的模块设计的。

image-20221024152851564

我这里选择空白模板创建新项目。

image-20221024153021763

新建成功后,点击编辑按钮进行页面设计。

image-20221024153040503

(2)控件介绍

进入到编辑页面,可以看到有很多的控件可以选择使用。其中带的表示,当前基础版无法使用,高级控件需要升级专业版才可以使用。(新用户有7天的专业版试用期,可以体验一下专业版的控件)

image-20221024153218889

(3)新建多个子页面

为了方便显示每个采集点的温度信息,可以新建多个子页面显示数据,也可以在一个页面显示,具体看自己需求。

我这里新建了3个页面,分别显示3个采集点的温度数据。 并且页面的名字,页面的类型都可以修改。 页面类似可以选择PC端样式,也可以选择手机端样式。

image-20221024153514941

(4)控件选择数据源

每个控件显示的数据,可以选择数据的来源。

比如: 我使用仪表盘显示温度信息,点击仪表盘控件,在右边选择数据源。

第一步,选择管理数据源。

image-20221024154149404

第二步。使用数据源模板新建数据源

image-20221024154226176

新建成功的3个数据源。

image-20221024154247815

第三步,设置控件的数据源

比如:我这个仪表盘显示温度采集点1的数据,就选择数据源为设备1的数据。 并且需要把下面的数据过滤器去掉。

image-20221024154344353

(5)界面样式设计

【1】修改表盘显示的单位为摄氏度。

image-20221024154739030

【2】为了方便区分设备,添加一个标题,显示文字提示

image-20221024155334415

记得去掉数据过滤器。

image-20221024155508209

界面的背景也可以设置,也可以设置图片作为背景。

image-20221024160543418

(6)保存界面发布

由于onenet的可视化界面处于维护期,这个期间编写的界面无法保存,发布。 但是在编辑页面的仪表盘还是可以看到数据的实时变化,可以测试整套流程。 等10.24之后,应该就可以正常使用了,到时候在重新设计页面。

image-20221024160613772

(7)设备云APP

在手机上安装设备云APP,如果项目发布之后,除了分享链接浏览器打开查看以外,也可以登录手机APP查看页面。

下面是手机APP上的效果:

image-20221024161714772

image-20221024161748215

image-20221024161804728

image-20221024161817464

五、规则引擎与触发器

5.1 触发器设置

触发器可以设置一些简单的条件,比如,温度大于多少,小于多少。 可以让OneNet给指定地址发送邮件通知。或者当指定范围内的数据点满足触发条件的要求时,也可以向url参数指定的地址发送post请求(可以对接自己的服务器)。

(1)添加触发器

image-20221024162258351

(2)设置触发条件

可以选择关联指定设备,或者关联全部设备。然后设置触发条件,设置关联的邮箱。

当温度超出某个阀值,可以触发条件,发送邮件通知。

image-20221024162411312

(3)设置成功

image-20221024162614137

(4)测试触发条件

我这里的触发条件是温度大于50就会发送邮件。这里采用网络调试助手测试,上传一个大于50的温度,触发条件发送邮件。

发送数据之后,可以看到邮件已经收到了。

image-20221024163015706

image-20221024163053950

5.2 添加规则

(1)添加规则

image-20221024163545180

(2)设置规则

可以设置规则的筛选方式。

image-20221024163650406

image-20221024163714343

(3)开通SMS短信服务

地址: https://open.iot.10086.cn/sms/console/product/#/openSms

目前短信服务是针对企业开放。

六、硬件部分

6.1 有人云WH-LTE-7S1模块调试

(1)模块引脚功能说明

模块的使用说明书:https://www.usr.cn/Down/WH-LTE-7S1_V1.0.4.pdf

拿到模块之后首先就是要了解引脚说明,明白每个引脚的功能。 在手册的第9页,有对模块引脚的介绍。

image-20221024213617690

下面是模块的实物图:

image-20221024213837732

调试模块时,必接的引脚有5个。 分别是:电源VCC(5V),电源GND,串口发送,串口接收,开机引脚。

下面标出这几个引脚的位置:

image-20221024214219905

下面是接好线的实物图:

image-20221024214336126

下面是标出引脚的排线编号规律:

image-20221024214710273

接线说明: 接线时认真看IO口编号,对号入座,千万别接错了。

目前模块供电的VCC+正极有2个脚。一个支持3.4-4.2V (第16脚),一个支持5V16V(第13脚和第14脚)。供电的时候,这两个脚只能选择其中一个。 其中,3.4-4.2V 供电是留给锂电池使用的,5V16V的供电接口方便接单片机的电源。

当前的这个项目是需要使用STM32开发板来驱动模块完成网络连接,处理。 所以,这里模块供电引脚直接选择5V,方便接在单片机开发板引出的电源口上。

接线总结:

模块的第6个脚(UART-TX): 接单片机或者USB转TTL模块的RXD
模块的第7个脚(UART-RX): 接单片机或者USB转TTL模块的TXD
模块的第10个脚(key):    接单片机的电源正-3.3v (表示模块开机)
模块的第12个脚(GND):    接单片机的电源地-GND (给模块供电)
模块的第13个脚(DCIN):   接单片机的电源正-5v (给模块供电)

(2)模块接上位机软件测试

第一次拿到模块,肯定要先测试模块是否正常。 有人科技提供了模块对应的串口调试上位机,可以直接在官网下载。

【1】下载上位机调试软件

下载地址:https://www.usr.cn/Download/939.html

image-20221024215446806

【2】将模块与USB-TTL模块接好线,连接到电脑USB口上。

接线按下面的来:

模块的第6个脚(UART-TX): 接单片机或者USB转TTL模块的RXD
模块的第7个脚(UART-RX): 接单片机或者USB转TTL模块的TXD
模块的第10个脚(key):    接单片机的电源正-3.3v (表示模块开机)
模块的第12个脚(GND):    接单片机的电源地-GND (给模块供电)
模块的第13个脚(DCIN):   接单片机的电源正-5v (给模块供电)

【3】打开软件测试模块

软件打开后,选择串口后,打开串口。 点击获取当前参数,就能看到串口打印获取到数据。

image-20221024220916426

依次可以点击查询信号强度,查询当前版本,查询DMEI:

image-20221024221212774

注意: 模块默认的工作模式是NET模式,他也就是连接的有人的服务器。 如果要执行AT指令,需要先进入配置状态才可以正常执行。

image-20221024224621605

(3)模块状态指示灯

模块的第9个引脚是状态指示灯输出接口,正常启动后,这个引脚会按照1 秒的频率输出高低电平变化,可以将这个引脚接在单片机上的某个LED灯口上,通过观察LED灯的闪烁状态确定模块是否正常工作。也可以作为输入脚接到单片机的某个IO口上,用于判断模块是否工作正常。

image-20221024221848778

(4)模块的AT指令手册

下载地址:https://www.usr.cn/Download/940.html

image-20221024223354071

image-20221024223500602

(5)有人的测试服务器

服务器: socket.usr.cn

端口号: 2317

这是有人的公网测试TCP服务器,向这个服务器发送数据,服务器会将发送的数据返回。 可以用这个服务器测试4G模块的联网情况。

image-20221025222353782

6.2 示例代码

下面是STM32ZET6 + 4G +DS18B20的代码,利用4G模块将采集的DS18B20温度上传到OneNet平台。

#include "stm32f10x.h"
#include "led.h"
#include "delay.h"
#include "key.h"
#include "usart.h"
#include <string.h>
#include "timer.h"
#include "ds18b20.h"
​
​
/*
硬件连接方式:
​
(1) 有人的WH-LTE-7S1-4G模块与STM32的串口3连接。
​
模块的第6个脚(UART-TX): 接单片机PB11(RXD)
模块的第7个脚(UART-RX): 接单片机PB10(TXD)
模块的第10个脚(key)   : 接单片机的电源正-3.3v (表示模块开机)
模块的第12个脚(GND)   : 接单片机的电源地-GND (给模块供电)
模块的第13个脚(DCIN)  : 接单片机的电源正-5v (给模块供电)
​
​
(2) DS18B20温度传感器
VCC---3.3V
GND---GND
PB15---DS18B20(IN)
​
*/
​
​
/*
函数功能: 清理串口3接收缓冲区
*/
void ClearUSART3_RxBuff()
{
   //清理串口接收缓冲区
    USART3_RX_FLAG=0;
    USART3_RX_CNT=0;
    memset(USART3_RX_BUFFER,0,sizeof(USART3_RX_BUFFER));
}
​
​
/*
函数功能: 向4G模块发送命令
函数返回值:0表示成功  1表示失败
*/
u8 LTE4G_TCP_SendCmd(char *cmd)
{
    u8 i=0;
    ClearUSART3_RxBuff();
    USARTx_StringSend(USART3,cmd);
​
    //等待模块响应
    for(i=0;i<5;i++)
    {
        delay_ms(200);
        if(USART3_RX_FLAG)
        {
            USART3_RX_BUFFER[USART3_RX_CNT]='\0';
            printf("RX: %s\r\n",USART3_RX_BUFFER);  
            if(strstr((char*)USART3_RX_BUFFER,"OK"))
            {
                return 0;
            }
        }
    }
    
    return 1;
}
​
/*
函数功能: 查询信号强度
*/
u8 LTE4G_GetCSQ(void)
{
    u8 run=0;
    //发送查询信号强指令
    //在透传模式下, 可以在命令前面加  usr.cn#  即可正常使用命令,而不用进入到配置模式(AT指令模式)。
    run=LTE4G_TCP_SendCmd("usr.cn#AT+CSQ\r\n");
    
    //处理数据
    //....
    return run;
}
​
​
/*
函数功能: 查询SOCKA连接的服务器配置
*/
u8 LTE4G_GetSOCKA()
{
    u8 run=0;
    //发送查询连接服务器的指令
    //在透传模式下, 可以在命令前面加  usr.cn#  即可正常使用命令,而不用进入到配置模式(AT指令模式)。
    run=LTE4G_TCP_SendCmd("usr.cn#AT+SOCKA\r\n");
    //处理数据
    //....
  
    return run;
}
​
​
/*
函数功能: 查询socket重连时间间隔
*/
u8 LTE4G_GetSOCKRSTIM()
{
    u8 run=0;
    //在透传模式下, 可以在命令前面加  usr.cn#  即可正常使用命令,而不用进入到配置模式(AT指令模式)。
    run=LTE4G_TCP_SendCmd("usr.cn#AT+SOCKRSTIM\r\n");
    //处理数据
    //....
  
    return run;
}
​
​
​
​
/*
函数功能: 4G模块连接TCP服务器配置
函数返回值:0表示成功  1表示失败
*/
u8 LTE4G_TCP_ConnectCogfig(void)
{
    u8 run;
    
    //清理串口接收缓冲区
    ClearUSART3_RxBuff();
    
    //配置模块退出透传模式,进入AT指令配置模式
    USARTx_StringSend(USART3,"+++");
    delay_ms(200);
    USARTx_StringSend(USART3,"a");
    delay_ms(200);
    
    //判断是否成功
    if(USART3_RX_FLAG)
    {
        USART3_RX_BUFFER[USART3_RX_CNT]='\0';
        printf("RX: %s\r\n",USART3_RX_BUFFER);  
        if(strstr((char*)USART3_RX_BUFFER,"ok"))
        {
            //1. 配置4G模块的模式为NET模式(可以理解为TCP透传模式)
            run=LTE4G_TCP_SendCmd("AT+WKMOD=NET\r\n");
            if(run)return 1;                
            
            //2. 配置4G模块连接的服务器地址信息
            run=LTE4G_TCP_SendCmd("AT+SOCKA=TCP,183.230.40.33,80\r\n");
            if(run)return 2;   
                        
            //3. 保存配置并重启
            run=LTE4G_TCP_SendCmd("AT+S\r\n");
            if(run)return 3; 
​
            //等待4秒,模块重启成功
            delay_ms(4000);
        }
    }
    else
    {
        return 1;   
    } 
    
    return 0;
}
​
​
/*
函数功能  : 发送数据
函数返回值: 0表示成功  1表示失败
*/
u8 LTE4G_TCP_SendData(char *data)
{
    u8 i=0;
    //清理接收缓冲区
    ClearUSART3_RxBuff();
    //发送查询服务器连接状态指令
    //在透传模式下, 可以在命令前面加  usr.cn#  即可正常使用命令,而不用进入到配置模式(AT指令模式)。
    USARTx_StringSend(USART3,"usr.cn#AT+SOCKALK\r\n");
    //等待模块响应
    for(i=0;i<5;i++)
    {
        delay_ms(200);
        if(USART3_RX_FLAG)
        {
            USART3_RX_BUFFER[USART3_RX_CNT]='\0';
            printf("RX: %s\r\n",USART3_RX_BUFFER); 
​
            //断开状态
            if(strstr((char*)USART3_RX_BUFFER,"Dis"))
            {
               break;
            }
            //连接状态
            else if(strstr((char*)USART3_RX_BUFFER,"Connect"))
            {
                //发送数据
                USARTx_StringSend(USART3,data);
                printf("TX:\r\n%s\r\n",data);
                return 0;
            }
        }
    }
    return 1;    
}
​
​
/*
函数功能: 发送一次温度数据到OneNet
*/
u8 SendTemp_To_OneNet(char *ds18b20_tmp)
{
    char send_http_cmd[300];
    //拼接数据
    snprintf(send_http_cmd,sizeof(send_http_cmd)-1,
                                "POST /devices/1009326949/datapoints HTTP/1.1\r\n" \
                                "api-key:Q1=mhFwn=zt6nfp1EYvSsUcwUX8=\r\n" \
                                "Host:api.heclouds.com\r\n" \
                                "Connection:close\r\n" \
                                "Content-Length:%d\r\n" \
                                "\r\n" \
                                "{"datastreams":[{"id":"temp","datapoints":[{"value":%s}]}]}",
                                57+strlen(ds18b20_tmp),
                                ds18b20_tmp
            );
    
    return LTE4G_TCP_SendData(send_http_cmd);
    
    /*
    说明:  上面的57+strlen(ds18b20_tmp)是什么含义?
           为了方便计算最下面这一行的数据长度,
            提前算好固定的字符串长度 +  传入的温度字符串 就是最终的数据长度。
    */
    
}
​
​
//判断网络是否建立连接
// 建立后输出高电平  否则是低电平
//STM32的PE0接在模块的第1个脚
#define m_LTE4G_LINKA PEin(0) 
void LTE4G_GetLINKA_State()
{
  //开时钟
    RCC->APB2ENR|=1<<6;
    //配置模式
    GPIOE->CRL&=0xFFFFFFF0;
    GPIOE->CRL|=0x00000008;
}
​
int main()
{
    u8 i;
    u8 run=0;
    u32 time_cnt=0;
    u16 ds18b20_temp;
    char tmp_buffer[10];
    
​
    USART1_Init(115200); //串口1用于Debug打印
    
    USART3_Init(115200);   //串口3接4G模块
    TIMER3_Init(72,20000); //超时时间20ms
    
    DS18B20_Init(); //温度传感器
    
    LTE4G_GetLINKA_State();
  
    //检测DS18B20硬件状态
    run=DS18B20_Check();
    if(run==0)
    {
        printf("DS18B20 温度传感器正常.\r\n");
    }
    else
    {
        printf("DS18B20 温度传感器不存在.\r\n");
    }
    
    
    printf("正在初始化4G模块请稍等.\r\n");
    for(i=0;i<5;i++)
    {
        printf("配置第%d次\r\n",i);
        run=LTE4G_TCP_ConnectCogfig();
        if(run==0)
        {
            printf("配置成功.\r\n");
            break;
        }
        else
        {
            printf("本次配置失败,错误编号:%d\r\n",run);
        }
        
        delay_ms(1000);
    }
    
    
    while(1)
    {  
        //2秒钟上传一次
        if(time_cnt>200)
        {
            time_cnt=0;
            
            //读取一次温度
            ds18b20_temp=DS18B20_ReadTemp();
            if(ds18b20_temp==65535)
            {
                 //默认温度
                sprintf(tmp_buffer,"%s","26.8");
            }
            else
            {
              //转换后得到温度
              sprintf(tmp_buffer,"%d.%d",ds18b20_temp>>4,ds18b20_temp&0xF);
            }
           
            //查询信号质量
            LTE4G_GetCSQ();
            
            //查询连接的服务器配置
            LTE4G_GetSOCKA();
            
            //查询重连时间间隔
            LTE4G_GetSOCKRSTIM();
            
            
            if(m_LTE4G_LINKA)
            {
                printf("网络连接正常...\r\n");
            }
            else
            {
                 printf("模块网络未连接...\r\n");
            }
          
            
            //发送一次温度
            run=SendTemp_To_OneNet(tmp_buffer);
            if(run)
            {
                printf("本次温度发送失败.\r\n");
            }
            else
            {
                printf("温度上传成功.\r\n");
            }
            //清理接收缓冲区
            ClearUSART3_RxBuff();
        }
        
        //接收4G模块返回的数据
        if(USART3_RX_FLAG)
        {
            USART3_RX_BUFFER[USART3_RX_CNT]='\0';
            
            printf("4G模块收到数据.....\r\n");
            //向串口打印4G模块返回的数据
            for(i=0;i<USART3_RX_CNT;i++)
            {
                printf("%c",USART3_RX_BUFFER[i]);
            }
            
            USART3_RX_CNT=0;
            USART3_RX_FLAG=0;
        }
​
​
        //轮询记时
        DelayMs(10);
        time_cnt++;
    }
}
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。