物联网开发必看!手把手用MQTT协议打通OneNet云平台,实现数据秒级上云(附完整代码)
前言
🔥 你是否遇到过这些问题?
手动记录温湿度数据耗时费力,还容易出错?
想用树莓派做物联网监控,却被MQTT配置、平台对接搞到崩溃?
花了半天时间上传数据,却只能在本地查看,无法远程实时监控?
👉 今天这篇教程,让你彻底告别这些烦恼!
✅ 10分钟搞定硬件连接:树莓派+DHT11传感器即插即用
✅ 傻瓜式云平台配置:OneNET平台创建产品/设备,自动生成SDK接入代码
✅ 数据实时查看:网页同步显示温湿度曲线,历史数据自由导出
场景介绍
树莓派连接温湿度传感器,采集数据,使用OneNET平台创建产品和设备,并通过SDK实现数据上传,云平台实时监测查看数据。
准备工作
. 硬件选型
● 主控单元:树莓派4B
● 传感器:温湿度传感器(如DHT11)
● 配件: 杜邦线、面包板、T型扩展
● 其他模块:Wi-Fi和蓝牙模块(树莓派4B内置)
一、注册AlOT物联网平台账号
浏览器输入OneNET平台网址:https://open.iot.10086.cn

二、创建产品
1、登录AlOT平台,点击产品开发

2、创建产品
(1)下拉选择智慧生活——家居安防——温湿度传感器(免)
(2)选择智能化方式,设备接入
(3)填写产品相关信息,产品名称,所属地市,节点类型,接入协议,数据协议,联网方式,开发方案(这里选择自定义方案)
(4)点击确定,产品创建成功
三、添加设备
(1)点击设备管理-添加设备

(2)点击确定后,设备添加完成
四、设置物模型
(1)产品开发——点击设置物模型
(2)添加自定义功能点
(3)自定义温度模型,填写功能名称,标识符,数据类型,取值范围,单位,读取类型
(4)自定义湿度模型,填写功能名称,标识符,数据类型,取值范围,单位,读取类型

(5)保存物模型定义数据

五、下载SDK用于设备接入开发
(1)保存成功后,点击前往设备开发,选择设备开发方式——基于SDK开发
(2)下一步,嵌入式开发找到平台自动生成功能接口SDK代码——点击功能接口SDK获取,将自动生成并下载SDK
用户在平台端获取的设备SDK中,已包括平台根据设备所属产品的物模型自动生成的tm_user.c和tm_user.h文件
注:修改物模型后,会重新生成tm_user文件,需要重新获取新的SDK。
六、上传SDK文件到树莓派
下载好SDK后,将SDK文件传到树莓派上,这里我们使用filezilla工具进行文件传输,当然也可以使用winscp
VNC远程桌面连接树莓派,查看文件传输已经完成
七、修改SDK文件
(1)OneNET平台找到设备管理->设备详情中可以查看设备名称、产品ID、设备密钥三个关键信息
(2)Genay工具打开main.c文件,配置产品id:TM_PRODUCT_ID、设备名称:TM_DEVICE_NAME、设备密钥“TM_ACCESS_KEY”
八、编写DTH11温湿度传感器核心代码
(1)编写代码:DTH11.c
#编写DTH11温湿度传感器代码
#include <wiringPi.h>
#include <stdio.h>
#include <stdlib.h>
#include "DHT11.h"
#include <stdint.h>
typedef unsigned char uint8;
typedef unsigned int uint16;
typedef unsigned long uint32;
#define HIGH_TIME 32
int pinNumber = 0; //gpio17
uint32 databuf;
uint64_t humi, temp;
void updateTemperatureAndHumidity() {
if (readSensorData()) {
humi= (databuf >> 24) & 0xff;
temp= (databuf >> 8) & 0xff;
printf("humi=%lld\n",humi);
printf("temp=%lld\n",temp);
} else {
humi = 0;
temp = 0;
printf("humi=%lld\n",humi);
printf("temp=%lld\n",temp);
}
}
uint8 readSensorData(void)
{
uint8 crc;
uint8 i;
pinMode(pinNumber, OUTPUT);
digitalWrite(pinNumber, 0);
delay(25);
digitalWrite(pinNumber, 1);
pinMode(pinNumber, INPUT);
pullUpDnControl(pinNumber, PUD_UP);
delayMicroseconds(27);
if (digitalRead(pinNumber) == 0)
{
while (!digitalRead(pinNumber));
for (i = 0; i < 32; i++)
{
while (digitalRead(pinNumber));
while (!digitalRead(pinNumber));
delayMicroseconds(HIGH_TIME);
databuf *= 2;
if (digitalRead(pinNumber) == 1)
{
databuf++;
}
}
for (i = 0; i < 8; i++)
{
while (digitalRead(pinNumber));
while (!digitalRead(pinNumber));
delayMicroseconds(HIGH_TIME);
crc *= 2;
if (digitalRead(pinNumber) == 1)
{
crc++;
}
}
return 1;
}
else
{
return 0;
}
}
void cgq()
{
printf("Use GPIO17接口 to read data!\n");
if (-1 == wiringPiSetup()) {
printf("Setup wiringPi failed!");
exit(1);
}
pinMode(pinNumber, OUTPUT);
digitalWrite(pinNumber, 1);
printf("Enter OS-------\n");
pinMode(pinNumber, OUTPUT);
digitalWrite(pinNumber, 1);
delay(3000);
updateTemperatureAndHumidity();
}
(2)编写代码:DTH11.h
#ifndef DHT11_H
#define DHT11_H
#include <stdint.h>
typedef unsigned char uint8;
typedef unsigned long uint32;
extern int pinNumber;
extern uint32 databuf;
extern uint64_t humi, temp;
void updateTemperatureAndHumidity();
void cgq();
uint8 readSensorData(void);
#endif // DHT11_H
(3)在CMakeLists.txt文件中添加路径examples/things_model、examples/things_model/DHT11.c
cmake_minimum_required(VERSION 3.9)
project(mqtts_onejson_soc)
# 设置CXX编译选项
set(WORK_DIR ${CMAKE_CURRENT_SOURCE_DIR})
include_directories(
./
common
onenet/platforms/include
onenet/tm
onenet/utils
onenet/protocols/mqtt/
onenet/protocols/mqtt/paho-mqtt
onenet/protocols/http
tools/cJSON
tools/wolfssl/port
tools/wolfssl/wolfssl-3.15.3
services/ota
onenet/security/tls
examples/things_model
)
file(GLOB src
common/log.c
common/slist.c
common/utils.c
onenet/security/tls/tls.c
onenet/tm/tm_api.c
onenet/tm/tm_data.c
onenet/tm/tm_onejson.c
onenet/tm/tm_mqtt.c
onenet/tm/tm_subdev.c
onenet/tm/dev_discov.c
onenet/utils/dev_token.c
onenet/platforms/linux/osl_linux.c
onenet/platforms/linux/tcp_linux.c
onenet/platforms/linux/time_linux.c
onenet/platforms/linux/udp_linux.c
onenet/protocols/mqtt/paho-mqtt/MQTTConnectClient.c
onenet/protocols/mqtt/paho-mqtt/MQTTSubscribeClient.c
onenet/protocols/mqtt/paho-mqtt/MQTTConnectServer.c
onenet/protocols/mqtt/paho-mqtt/MQTTSubscribeServer.c
onenet/protocols/mqtt/paho-mqtt/MQTTDeserializePublish.c
onenet/protocols/mqtt/paho-mqtt/MQTTUnsubscribeClient.c
onenet/protocols/mqtt/paho-mqtt/MQTTFormat.c
onenet/protocols/mqtt/paho-mqtt/MQTTUnsubscribeServer.c
onenet/protocols/mqtt/paho-mqtt/MQTTPacket.c
onenet/protocols/mqtt/paho-mqtt/mqtt_client.c
onenet/protocols/mqtt/paho-mqtt/MQTTSerializePublish.c
onenet/protocols/http/http_api.c
tools/cJSON/cJSON.c
tools/wolfssl/wolfssl-3.15.3/src/internal.c
tools/wolfssl/wolfssl-3.15.3/src/keys.c
tools/wolfssl/wolfssl-3.15.3/src/ssl.c
tools/wolfssl/wolfssl-3.15.3/src/tls.c
tools/wolfssl/wolfssl-3.15.3/src/wolfio.c
tools/wolfssl/wolfssl-3.15.3/wolfcrypt/src/aes.c
tools/wolfssl/wolfssl-3.15.3/wolfcrypt/src/asn.c
tools/wolfssl/wolfssl-3.15.3/wolfcrypt/src/coding.c
tools/wolfssl/wolfssl-3.15.3/wolfcrypt/src/hash.c
tools/wolfssl/wolfssl-3.15.3/wolfcrypt/src/hmac.c
tools/wolfssl/wolfssl-3.15.3/wolfcrypt/src/integer.c
tools/wolfssl/wolfssl-3.15.3/wolfcrypt/src/md5.c
tools/wolfssl/wolfssl-3.15.3/wolfcrypt/src/misc.c
tools/wolfssl/wolfssl-3.15.3/wolfcrypt/src/random.c
tools/wolfssl/wolfssl-3.15.3/wolfcrypt/src/rsa.c
tools/wolfssl/wolfssl-3.15.3/wolfcrypt/src/sha.c
tools/wolfssl/wolfssl-3.15.3/wolfcrypt/src/sha256.c
tools/wolfssl/wolfssl-3.15.3/wolfcrypt/src/wc_port.c
examples/things_model/main.c
examples/things_model/tm_user.c
examples/things_model/DHT11.c
)
add_definitions(
-g
-DCONFIG_ACCESS_LIFE_TIME=60
-DCONFIG_SEND_BUF_LEN_MAX=1024
-DCONFIG_RECV_BUF_LEN_MAX=1024
-DCONFIG_TM_MQTT
-DCONFIG_PLAT_ARCH_64BIT=1
-DCONFIG_TM=1
-DCONFIG_TM_GATEWAY=1
-DCONFIG_TM_VERSION="1.0"
-DCONFIG_DEFAULT_REQUEST_TIMEOUT=1000
-DCONFIG_PACKET_PAYLOAD_LEN_MAX=2048
-DCONFIG_HAVE_STDINT=1
-DCONFIG_NETWORK_TLS=1
)
add_executable(${CMAKE_PROJECT_NAME} ${src})
target_link_libraries(${CMAKE_PROJECT_NAME} pthread)
target_link_libraries(${CMAKE_PROJECT_NAME} wiringPi)


九、安装cmake
(1)树莓派更新软件包:
sudo apt-get update
安装cmake:
sudo apt-get install cmake

(2)在CMakeLists.txt文件夹的最后一行添加:
target_link_libraries(${CMAKE_PROJECT_NAME} wiringPi)
(3)在编译器里设置生成指令
在Complie、build、Lint 三个框后面加上 空格-|wiringPi
十、传感器数据上传
打开tm_user.h文件,可以看到运用了三种函数,读取温度和湿度的回调函数,下发函数,上报函数
这里我们数据上传云平台只需要在主函数main.c中调用上报函数
将设置个定值测试是否联通(设置温度定值temp:“38.6”,湿度度定值humi:50)
while (1)
{
if (0 != (ret = tm_step(200)))
{
logi("ThingModel tm_step failed,ret is %d", ret);
break;
}
if(0==j++%20)//222
{
cgq();
tm_prop_humi_notify(NULL,50,0,3000);//上传湿度数据
tm_prop_temp_notify(NULL,38.6,0,3000);//上传温度数据
time_delay_ms(50);
}
}
十一、树莓派连接传感器
所需硬件
(1)树莓派4b
(2)杜邦线
(3)DTH11传感器
接线
VCC(或正极) — 树莓派的3v电源
GND (地线或者负极)— 树莓派的gnd接口
DATA (D或者out) —树莓派的GPIO引脚 这里链接gpio17接口
连接示意图:

十二、编译SDK文件包

进行make编译,输入以下指令:
1、 创建build文件夹
mkdir build
2、进入build文件夹
cd build
3、以…/目录下的CMakeLists.txt生成makefile
cmake ..
4、编译
make
5、执行(MQTT协议)
./mqtts_onejson_soc

十三、AloT云平台查看数据
上传数据成功显示在后台


十四、实时监测数据
在主函数main.c中调用上报函数,修改代码,将定值改为对应的标识
重新进行make编译运行



更多推荐

所有评论(0)