前言

巴法云物联网云平台,就如它的文档介绍的,是一个专注物体联网的神奇的设备云平台(cloud.bemfa.com),它有以下特征,轻量级,支持发布/订阅模式,提供遗嘱机制,支持TCP长连接,全平台兼容。本文,将介绍如何通过esp8266这个芯片连接到巴法云的TCP设备云。

(一)注册添加TCP设备

(1)注册巴法云账号

到巴法云官网或直接进入 https://cloud.bemfa.com/u_login.php?reurl=https://cloud.bemfa.com/tcp/index.html
如下图,点击“微信一键登录”,扫码直接登录注册,然后直接进入“控制台

在这里插入图片描述

(2)创建主题

登录后,会直接跳转到巴法云云平台的个人控制台,如下图,选中TCP设备云,输入主题名“test”,点击新建主题,便可以创建一个名为test的主题,之后我们就可以对这个主题进行订阅或发布了。

在这里插入图片描述

(二)订阅发布主题

完成上面后,我们可以使用 SSCOM5 串口/网络调试助手来调试我们之前创建的主题。uid即用户私钥,可以直接在用户控制台获取

(1)TCP设备相关指令

这主要参考官方文档关于 TCP设备云部分。
TCP服务器地址IP: bemfa.com 服务器端口:8340

订阅主题格式
  cmd=1&uid=7d54f85af42976ee3c2693e6xxxxxxxx&topic=light002\r\n
正常返回:
cmd=1&res=1

发布信息格式
  cmd=2&uid=7d54f85af42976ee3c2693e6xxxxxxxx&topic=light002&msg=off\r\n
正常返回:
cmd=2&res=1

订阅主题,并获取一次已推送的消息
  cmd=3&uid=7d54f85af42976ee3c2693e6xxxxxxxx&topic=light002\r\n
正常返回:
cmd=3&uid=7d54f85af42976ee3c2693e6xxxxxxxx&topic=light002&msg=on

获取一次时间
  cmd=7&uid=7d54f85af42976ee3c2693e6xxxxxxxx&type=1\r\n
正常返回:
2021-06-11 16:39:27

获取一次已发消息
  cmd=9&uid=7d54f85af42976ee3c2693e6xxxxxxxx&topic=light002\r\n
正常返回:
cmd=9&uid=7d54f85af42976ee3c2693e6xxxxxxxx&topic=light002&msg=on

发送心跳
  ping\r\n
正常返回:
cmd=0&res=1

json响应
上述任意指令中加入 mode=1 时,服务器响应的数据格式是 json 类型。
例如发送:
cmd=2&uid=4d9ec352e0376f2110a0c601a2857225&topic=light002&msg=on&mode=1
正常响应:
{“cmd”:2,“res”:1}
此时订阅light002的设备将收到:
{“cmd”:2,“time”:1623402740,“uid”:“4d9ec352e0376f2110a0c601a2857225”,“topic”:“light002”,“msg”:“on”}
其中time为发送消息的时间戳

字段说明
cmd:为消息类型
cmd=1 时为订阅消息,当设备发送一次此消息类型,之后就可以收到发往该主题的消息
cmd=2 时为发布消息,向订阅该主题的设备发送消息
cmd=3 是订阅消息,和cmd=1相同,并且会拉取一次已发送过的消息
cmd=7 是获取时间,获取当前北京时间
cmd=9 为遗嘱消息,拉取一次已经发送的消息
uid:用户私钥

可在控制台获取
topic:用户主题
可以在控制台创建主题,格式为英文或数字,相当于设备标识
msg: 为消息体
用户想要发送到某个主题的数据

获取时间指令说明
type=1 获取当前日期和时间,例如:2021-06-11 17:20:54
type=2 获取当前时间,例如:17:20:54
type=3 获取当前时间戳,例如:1623403325

符号说明
\r\n: 为回车换符,每条指令后都需要有回车换行
&: 为连接符,各字段间用’&'隔离

心跳说明
发送任意数据 为心跳消息,包括上述指令也算是心跳,但要以回车换行结尾。
心跳消息是告诉服务器设备还在线,可30秒发送一次,结尾以\r\n结尾。

可选功能
推送消息时:主题名后加/set推送消息,表示向所有订阅这个主题的设备们推送消息,假如推送者自己也订阅了这个主题,消息不会被推送给它自己,以防止自己推送的消息被自己接收。

推送消息时:主题名后加/up推送消息,表示只更新云端数据,不进行任何推送。
例如向主题 light002推送数据,可为 light002/set , light002/up

示例:cmd=2&uid=4d9ec352e0376f2110a0c601a2857225&topic=light002/set&msg=on

(2)调试

测试的内容就是上面的指令,使用网络调试助手连接上巴法云后,修改uid,就可以直接发送指令了。下面图片是返回的结果。

在这里插入图片描述

(三)ESP8266接入巴法云

这里给出测试代码,ESP8266 Arduino IDE开发环境的配置,以及ESP8266的相关编程,可以参考我的另一篇博文《esp8266环境配置以及相关学习资料》。下面代码,订阅了一个test主题,当有信息下发时,会直接将数据输出到ArduinoIDE的串口查看器上。

#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
 
ESP8266WiFiMulti wifiMulti;           // 建立ESP8266WiFiMulti对象

const char* host = "bemfa.com"; // 网络服务器地址
const int httpPort = 8340;              // http端口80
 
// WiFi连接信息
const char*  WiFi_SSID = "ling";
const char*  WiFi_Password = "ling....9";

// 建立WiFi客户端对象,对象名称client
WiFiClient client;
  
void setup(){
  Serial.begin(9600);          
  WiFi.mode(WIFI_STA);    // 设置ESP8266为无线终端模式
  
  wifiMulti.addAP(WiFi_SSID, WiFi_Password); 
  Serial.println("Connecting ..."); 
 
  // 尝试进行wifi连接。
  int i = 0;  
  while (wifiMulti.run() != WL_CONNECTED) { 
    delay(1000);
    Serial.print(i++); Serial.print(' ');
  }
  
  // WiFi连接成功后将通过串口监视器输出连接成功信息 
  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(WiFi.SSID());              // WiFi名称
  Serial.print("IP address:\t");
  Serial.println(WiFi.localIP());           // IP

  //连接巴法云
  client.connect(host, httpPort);
  Serial.print("conneted bamfa!\n");
  //订阅主题test
  client.print("cmd=1&uid=<填你们自己的uid>&topic=test\r\n");
  
}
 
void loop(){
  // 判断登录状态
  if(not client.connected()){
    //连接巴法云
    client.connect(host, httpPort);
    Serial.print("reconneted bamfa!\n");
    //订阅主题test
    client.print("cmd=1&uid=<填你们自己的uid>&topic=test\r\n");
    
  }

  //输出结果
  while (client.connected() || client.available()){ 
      if (client.available()){
        String line = client.readStringUntil('\n');
        Serial.println(line);
      }
    }
  delay(10);
}

更多推荐