ESP8266与ONENET物联网平台(2)

7 篇文章 1 订阅
1 篇文章 1 订阅

ESP8266与ONENET物联网平台(2)

使用arduino ide开发ESP8266
本文选用的ESP8266与ONENET物联网平台,采用MQTT通信方式与物联网平台连接,
采用ESP8266WIFI库
本文的程序代码使传输2个数据,各自每秒加1,上传到ONENET
代码:

#include <ESP8266WiFi.h>
#include <PubSubClient.h>
 
 const char* ssid = "********";//WIFI名
 const char* password = "********";//密码
 const char* mqtt_server = "183.230.40.39";//onenet服务器
 const char* DEV_ID = "********"; //设备ID
 const char* DEV_PRO_ID = "*******"; //产品ID
 const char* DEV_KEY = "**************"; //API KEY
 WiFiClient espClient;
 PubSubClient client(espClient);
 long lastMsg = 0;
 char msg[50];
 int value = 0;
 char tmp[50];
 char d[3];
float temp=0;                          
float humi=0;                          
//wifi初始化
 void setup_wifi() {//判断WiFi是否连接成功
   delay(10);
   
   Serial.println();
   Serial.print("Connecting to ");
   Serial.println(ssid);
   WiFi.begin(ssid, password);
   while (WiFi.status() != WL_CONNECTED) {
     delay(500);
     Serial.print(".");
   }
   randomSeed(micros());
   Serial.println("");
   Serial.println("WiFi connected");
   Serial.println("IP address: ");
   Serial.println(WiFi.localIP());
 }
 void callback(char* topic, byte* payload, unsigned int length) //回调函数  接受数据的作用
 {
   Serial.print("Message arrived [");
   Serial.print(topic);
   Serial.print("] ");
   for (int i = 0; i < length; i++) {
     Serial.print((char)payload[i]);
   }
   Serial.println();
  
   if ((char)payload[0] == '1') {
     digitalWrite(BUILTIN_LED, LOW);   
       } 
    else {
     digitalWrite(BUILTIN_LED, HIGH);  
   }
 }
 void reconnect() {
   //判断是否连接上服务器
   //如果没有连接上服务器等待5秒再次判断
   while (!client.connected()) {
     Serial.print("Attempting MQTT connection...");
     if (client.connect(DEV_ID,DEV_PRO_ID,DEV_KEY)) {
       Serial.println("connected");
     } else {
       Serial.print("failed, rc=");
       Serial.print(client.state());
       Serial.println(" try again in 5 seconds");
     
       delay(5000);
     }
   }
 }
 void setup() {//初始化
   pinMode(BUILTIN_LED, OUTPUT);   
   Serial.begin(115200);
   setup_wifi();
   client.setServer(mqtt_server, 6002);
   client.connect(DEV_ID,DEV_PRO_ID,DEV_KEY);
   client.setCallback(callback);
 }
 void loop() {
   if (!client.connected()) {
     reconnect();
   }
   client.loop();
   {
     delay(1000);
               //上传数据 
                 Serial.println(temp);
                 Serial.println(humi); 
                 snprintf(tmp,sizeof(tmp),"{\"TEMP\":%.2f ,\"HUMI\":%.2f}",temp,humi); 
                 uint16_t streamLen= strlen(tmp);//将采集的数据送到streamLen
                 d[0]='\x03';
                 d[1] = (streamLen >> 8);
                 d[2] = (streamLen & 0xFF);
                 snprintf(msg,sizeof(msg),"%c%c%c%s",d[0],d[1],d[2],tmp);
                 client.publish("$dp", (uint8_t*)msg,streamLen+3,false);
                 //发布到ONENET平台上
                 temp++;
                 humi++;      
                 delay(1000);
   }
 }

代码解读 :
1、我们需要一个ONENET服务平台,网址为https://open.iot.10086.cn/doc/multiprotocol/book/problem/platformaddress.html
在其中查看本地的MQTT 平台地址列表
本文采用的时183.230.40.39

在这里插入图片描述代码中 DEV_KEY是指ONENET平台中产品中的API
在这里插入图片描述点击Master-APIkey 查询API;

2、snprintf(tmp,sizeof(tmp),"{“TEMP”:%.2f ,“HUMI”:%.2f}",temp,humi);
snprintf(tmp,sizeof(tmp),"{“数据流ID1”:%d ,“数据流ID2”:%d}",val_1,val_2);
原式:
snprintf(char *str, size_t size,const char *format, …)
可变个参数(…)按照format格式化成字符串,然后将其复制到str中
(1) 如果格式化后的字符串长度 < size,则将此字符串全部复制到str中,并给其后添加一个字符串结束符(’\0’);
(2) 如果格式化后的字符串长度 >= size,则只将其中的(size-1)个字符复制到str中,并给其后添加一个字符串结束符(’\0’),返回值为欲写入的字符串长度 。

3、回调函数
void callback(char* topic, byte* payload, unsigned int length)
用于接受topic发送的数据。
什么叫回调函数:当 函数指针做为函数的参数,传递给一个被调用函数,
被调用函数就可以通过这个指针调用外部的函数,这就形成了回调

4、client.connect()函数
连接MQTT服务器中的产品以及设备
client.connect(DEV_ID,DEV_PRO_ID,DEV_KEY);
其中DEV_ID填入的为设备ID,DEV_PRO_ID填入的为产品ID,DEV_KEY填入的为产品的API。

5、client.setServer(addr,port);
配置使用客户端
addr为MQTT地址,port为地址使用端口
在ONENET地址服务平台中查找MQTT的IP地址和服务器端口
client.setServer(mqtt_server, 6002);
使用的使中心平台MQTT的IP地址,使用的服务器端口为6002

6、client.publish()函数
发布对应主题消息
boolean PubSubClient::publish(const char* topic, const char* payload)
{
return publish(topic,(const uint8_t*)payload,strlen(payload),false);
}
topic 主题
payload 有效负载
strlen(payload):取有效负载的长度
ESP8266连接上ONENET平台上的创建产品的设备如图:
在这里插入图片描述

设备数据页面:
在这里插入图片描述

TEMP数据流页面:
在这里插入图片描述

HUMI数据流页面:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值