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数据流页面: