使用ESP8266腾讯云定制固件对接腾讯云物联网平台IoT Explorer

1. 腾讯云ESP8266定制固件烧录

固件烧录请参考腾讯云官方文档:腾讯云 IoT AT ESP8266 定制固件及说明

AT指令详细说明也请参考其中腾讯的文档。

腾讯云配套的AT测试工具也在其中。

2. 云端配置

登录腾讯云物联网开发平台(IoT Explorer),点击“立即使用”进入控制台。

2.1. 新建项目

项目是为了用户面对不同的产品迭代或不同的项目角色而设计的一种隔离机制,便于用户清晰管理物联网项目,并能灵活地配置项目权限。

  • 项目下可以建立多个产品与应用,应用默认有权限访问该项目下的所有产品
  • 每个项目会有自己的唯一 ID,数据会根据项目进行隔离,以确保数据安全;
  • 项目删除后,该项目所属产品等数据都将被删除且不能恢复;
  • 开发平台提供资源级的权限控制,可为不同的子用户分配项目级、产品级的权限控制;

点击新建项目,填写项目名称和简介:
使用ESP8266腾讯云定制固件对接腾讯云物联网平台IoT Explorer

2.2. 产品开发

2.2.1. 新建产品

点击项目名称进入到该项目中,点击新建产品:
使用ESP8266腾讯云定制固件对接腾讯云物联网平台IoT Explorer
填写产品的一些信息:

  • 产品名称:名称为中文、字母、数字、下划线的组合,1 - 20位且不能为空。
  • 产品品类:选择您所创建产品的所属品类,不同类型产品的属性、事件等数据模板会有所不同。详情请参见 数据模板。
  • 设备类型:设备使用2G/3G/4G/Wi-Fi无线通信或有线通信方式,网关可提供云端通信能力,帮助设备与平台通信。
  • 认证方式:物联网开发平台提供两种认证方式用于设备与平台之间鉴权认证。
    • 证书认证:在创建设备时,平台将为设备生成一个证书文件和一个私钥文件,实现设备与云之间的双向认证。
    • 密钥认证:在创建设备时,使用平台为设备随机生成的 PSK。
  • 通信方式:您可以选择 Wi-Fi、移动蜂窝(2G/3G/4G)和其他通信方式。
  • 数据协议:默认采用数据模板的数据协议,您也可以自定义协议进行透传。
  • 描述:字数不能超过80个,您可以根据需要选填。

使用ESP8266腾讯云定制固件对接腾讯云物联网平台IoT Explorer

产品新建成功后,可在产品列表页查看到“智能灯”。
使用ESP8266腾讯云定制固件对接腾讯云物联网平台IoT Explorer

2.2.2. 数据模板

数据模板是将物理实体设备进行数字化描述,构建其数字模型。在物联网开发平台定义数据模板即定义产品功能。完成功能定义后,系统将自动生成该产品的数据模板。

进入产品,点击新建功能:

使用ESP8266腾讯云定制固件对接腾讯云物联网平台IoT Explorer
填写功能信息。

功能类型包含三元素:

  • 属性:包括布尔型、整数型、字符型、浮点型、枚举型和时间型等6种基本数据类型;
  • 事件:包括告警、故障和信息三种类型,事件型功能属性可以添加具体的事件参数,这些参数可以由属性中6种基本数据类型组成;
  • 行为:用于实现更复杂的业务逻辑,可包含输入参数和输出参数,可用于让设备执行某项特定的任务。行为的输入参数和输出参数可添加上述6种属性的基本数据类型。
功能元素 功能描述 功能标识符
属性 用于描述设备的实时状态,支持读取和设置,如模式、亮度、开关等。 PropertiesId
事件 用于描述设备运行时的事件,包括告警、信息和故障等三种事件类型,可添加多个输出参数,如环境传感器检测到空气质量很差,空调异常告警等。 EventId
行为 用于描述复杂的业务逻辑,可添加多个调用参数和返回参数,用于让设备执行某项定特定的任务,例如,开锁动作需要知道是哪个用户在什么时间开锁,锁的状态如何等。 ActionId

数据类型支持6种:

  • 布尔型:非真即假的二值型变量。例如,开关功能。
  • 整数型:可用于线性调节的整数变量。例如,空调的温度。
  • 字符型:以字符串形式表达的功能点,例如,灯的位置。
  • 浮点型:精度为浮点型的功能点。例如,压力值的范围:0.0 - 24.0。
  • 枚举型:自定义的有限集合值。例如,灯的颜色:白色、红色、黄色等。
  • 时间型:string 类型的 UTC 时间戳(毫秒)。

选择“智能灯”类型后,系统会自动生成标准功能:
使用ESP8266腾讯云定制固件对接腾讯云物联网平台IoT Explorer

数据模板是一个 JSON 格式的文件,使用数据模板协议,用户的设备需按数据模板定义要求传输设备数据到云端,并可使用基于数据模板的诸多业务功能,点击查看json可以看到上面创建功能的json格式:

{
  "version": "1.0",
  "properties": [
    {
      "id": "power_switch",
      "name": "电灯开关",
      "desc": "控制电灯开灭",
      "required": true,
      "mode": "rw",
      "define": {
        "type": "bool",
        "mapping": {
          "0": "关",
          "1": "开"
        }
      }
    },
    {
      "id": "color",
      "name": "颜色",
      "desc": "灯光颜色",
      "mode": "rw",
      "define": {
        "type": "enum",
        "mapping": {
          "0": "Red",
          "1": "Green",
          "2": "Blue"
        }
      }
    },
    {
      "id": "brightness",
      "name": "亮度",
      "desc": "灯光亮度",
      "mode": "rw",
      "define": {
        "type": "int",
        "unit": "%",
        "step": "1",
        "min": "0",
        "max": "100",
        "start": "1"
      }
    },
    {
      "id": "name",
      "name": "灯位置名称",
      "desc": "灯位置名称:书房、客厅等",
      "mode": "rw",
      "required": false,
      "define": {
        "type": "string",
        "min": "0",
        "max": "64"
      }
    }
  ],
  "events": [
    {
      "id": "status_report",
      "name": "DeviceStatus",
      "desc": "Report the device status",
      "type": "info",
      "required": false,
      "params": [
        {
          "id": "status",
          "name": "running_state",
          "desc": "Report current device running state",
          "define": {
            "type": "bool",
            "mapping": {
              "0": "normal",
              "1": "fault"
            }
          }
        },
        {
          "id": "message",
          "name": "Message",
          "desc": "Some extra message",
          "define": {
            "type": "string",
            "min": "0",
            "max": "64"
          }
        }
      ]
    },
    {
      "id": "low_voltage",
      "name": "LowVoltage",
      "desc": "Alert for device voltage is low",
      "type": "alert",
      "required": false,
      "params": [
        {
          "id": "voltage",
          "name": "Voltage",
          "desc": "Current voltage",
          "define": {
            "type": "float",
            "unit": "V",
            "step": "1",
            "min": "0.0",
            "max": "24.0",
            "start": "1"
          }
        }
      ]
    },
    {
      "id": "hardware_fault",
      "name": "Hardware_fault",
      "desc": "Report hardware fault",
      "type": "fault",
      "required": false,
      "params": [
        {
          "id": "name",
          "name": "Name",
          "desc": "Name like: memory,tf card, censors ...",
          "define": {
            "type": "string",
            "min": "0",
            "max": "64"
          }
        },
        {
          "id": "error_code",
          "name": "Error_Code",
          "desc": "Error code for fault",
          "define": {
            "type": "int",
            "unit": "",
            "step": "1",
            "min": "0",
            "max": "2000",
            "start": "1"
          }
        }
      ]
    }
  ],
  "profile": {
    "ProductId": "FWR8PGACUS",
    "CategoryId": "3"
  },
  "actions": []
}

2.3. 创建设备

进入设备调试界面,新建设备:
使用ESP8266腾讯云定制固件对接腾讯云物联网平台IoT Explorer
使用ESP8266腾讯云定制固件对接腾讯云物联网平台IoT Explorer
进入设备之后即可看到对接信息。

3. 设备端对接测试

使用USB转串口将烧录好腾讯云定制固件的ESP8266连接到PC,使用串口助手打开串口开始调试。

3.1. 入网

测试AT指令是否正常:

AT

OK

设置ESP8266工作模式为AP和STA并存:

AT+CWMODE=3

OK

设置传输模式为普通传输模式:

AT+CIPMODE=0

OK

开启多路模式:

AT+CIPMUX=1

OK

入网:

AT+CWJAP="Mculover666","mculover666"
WIFI CONNECTED
WIFI GOT IP

OK

3.2. 设置腾讯云对接信息

示例:

AT+TCDEVINFOSET=1,"WDRRDCF1TE","dev1","ULtbpSxXtSQyaFyeaax6pw=="
OK
+TCDEVINFOSET:OK

此信息会保存到Flash中,可以使用下面的命令查看:

AT+TCDEVINFOSET?
+TCDEVINFOSET:1,"WDRRDCF1TE","dev1",113

OK

3.3. 连接腾讯云

示例:

AT+TCMQTTCONN=1,5000,240,1,1
OK
+TCMQTTCONN:OK

连接成功,此时在腾讯云IoT Explorer平台即可看到设备在线:

使用ESP8266腾讯云定制固件对接腾讯云物联网平台IoT Explorer

3.4. 订阅和发布主题

Explorer平台相比IoThub平台,支持的topic比较多,主要有如下功能:

  • 设备属性上报:设备端将定义的属性根据设备端的业务逻辑向云端上报。
  • 设备远程控制:从云端向设备端下发控制指令,即设置设备可写属性。
  • 获取设备最新上报信息:获取设备最新的上报数据。
  • 设备事件上报:设备可根据定义的数据模板中的事件,当事件被触发,则根据设备事件上报的协议上报告警、故障等事件信息。
  • 设备行为:云端可以通过 RPC 的方式来要求设备执行某个动作行为,适用于应用需要实时获取设备的执行结果的场景。

3.4.1. 设备属性上报

设备向云端上报数据的topic如下:

  • 上行请求 Topic: $thing/up/property/{ProductID}/{DeviceName}
  • 上行响应 Topic: $thing/down/property/{ProductID}/{DeviceName}

这两个topic咋玩呢?

首先订阅上行响应topic:

AT+TCMQTTSUB="$thing/down/property/FWR8PGACUS/ESP8266_Dev_001",0

返回结果如下:

OK
+TCMQTTSUB:OK

接着向上行请求topic上报数据,上报数据时平台不仅规定了topic,还规定了数据内容,如下:

{
	"method":"report",
	"clientToken":"clientToken-145023f5-bc9b-4174-ba3b-430ba5956e5c",
	"params":
	{
		"brightness":55,
		"name":"bedroom",
		"power_switch":1,
		"color":2
	}
}

其中每一项的意义如下;

参数 类型 说明
method String report 表示设备属性上报。
clientToken String 用于上下行消息配对标识
timestamp Integer 属性上报的时间
params JSON JSON 结构内为设备上报的属性值

所以组合出来上报数据的AT指令如下:

AT+TCMQTTPUB="$thing/up/property/FWR8PGACUS/ESP8266_Dev_001",0,"{\"method\":\"report\"\,\"clientToken\":\"clientToken-145023f5-bc9b-4174-ba3b-430ba5956e5c\"\,\"params\":{\"brightness\":55\,\"name\":\"bedroom\"\,\"power_switch\":1\,\"color\":2}}"

返回结果如下:

OK
+TCMQTTPUB:OK

同时,因为订阅了上行响应topic,所以模组会收到云端下发的响应并通过URC模式上报:

+TCMQTTRCVPUB:"$thing/down/property/FWR8PGACUS/ESP8266_Dev_001",118,"{"method":"report_reply","clientToken":"clientToken-145023f5-bc9b-4174-ba3b-430ba5956e5c","code":0,"status":"success"}"

云端响应报文整理一下格式如下:

{
	"method":"report_reply",
	"clientToken":"clientToken-145023f5-bc9b-4174-ba3b-430ba5956e5c",
	"code":0,
	"status":"success"
}

其中每一项也有具体的含义:

参数 类型 说明
method String report_reply 表示云端接收设备上报后的响应报文
clientToken String 用于上下行消息配对标识
code Integer 0表示云端成功收到设备上报的属性
status String 当code非0的时候, 提示错误信息

在云端查看设备上报的数据:
使用ESP8266腾讯云定制固件对接腾讯云物联网平台IoT Explorer
同时在设备日志中可以查看设别上报的数据内容。

3.4.2. 设备远程控制

经过3.4.1节的玩法说明,后续都是一样的玩法。

云端下发控制指令的 Topic如下:

  • 下发 Topic: $thing/down/property/{ProductID}/{DeviceName}
  • 响应 Topic: $thing/up/property/{ProductID}/{DeviceName}

下面讲述如何玩。

首先订阅下发Topic:

AT+TCMQTTSUB="$thing/down/property/FWR8PGACUS/ESP8266_Dev_001",0

返回结果如下,订阅成功:

OK
+TCMQTTSUB:OK

然后在云端进入设备在线调试,修改灯的属性,然后下发控制命令:
使用ESP8266腾讯云定制固件对接腾讯云物联网平台IoT Explorer
在串口助手中可以看到设备收到了云端下发的数据,并以URC模式上报:

+TCMQTTRCVPUB:"$thing/down/property/FWR8PGACUS/ESP8266_Dev_001",156,"{"method":"control","clientToken":"clientToken-e037d04b-c3a4-4350-8d67-5c6be19b888a","params":{"name":"bedroom","power_switch":0,"color":0,"brightness":30}}"

整理一下json内容的格式,可以看到与我们期待下发的数据相对应:

{
	"method":"control",
	"clientToken":"clientToken-e037d04b-c3a4-4350-8d67-5c6be19b888a",
	"params":
	{
		"name":"bedroom",
		"power_switch":0,
		"color":0,
		"brightness":30
	}
}

注意,此时设备还需要手动给平台回复内容给下发响应topic,内容格式如下:

{
   "method":"control_reply",
   "clientToken":"clientToken-e037d04b-c3a4-4350-8d67-5c6be19b888a",
   "code":0,
   "status":"success"
}

组合出来发布回应消息的AT指令如下:

AT+TCMQTTPUB="$thing/up/property/FWR8PGACUS/ESP8266_Dev_001",0,"{    \"method\":\"control_reply\"\,    \"clientToken\":\"clientToken-e037d04b-c3a4-4350-8d67-5c6be19b888a\"\,    \"code\":0\,    \"status\":\"success\" }"

返回结果如下:

OK
+TCMQTTPUB:OK

3.4.3. 获取设备最新上报信息

设备从云端接收最新消息使用的 Topic如下:

  • 请求 Topic: $thing/up/property/{ProductID}/{DeviceName}
  • 响应 Topic: $thing/down/property/{ProductID}/{DeviceName}

首先订阅响应topic(之前已经订阅过,不用重复订阅)。

向请求Topic发送数据,请求内容如下:

{
   "method": "get_status",
   "clientToken": "123",
   "type" : "report", 
   "showmeta": 0
}

组合一下发出的AT指令如下:

AT+TCMQTTPUB="$thing/up/property/FWR8PGACUS/ESP8266_Dev_001",0,"{    \"method\": \"get_status\"\,    \"clientToken\": \"123\"\,    \"type\" : \"report\"\,     \"showmeta\": 0 }"

返回结果如下:

OK
+TCMQTTPUB:OK

同时设备收到了云端的响应:

+TCMQTTRCVPUB:"$thing/down/property/FWR8PGACUS/ESP8266_Dev_001",175,"{"method":"get_status_reply","clientToken":"123","code":0,"status":"success","type":"report","data":{"reported":{"brightness":55,"name":"bedroom","power_switch":1,"color":2}}}"

将其中的json内容整理格式如下,和当前设备最后一次上报数据的状态对应:

{
	"method":"get_status_reply",
	"clientToken":"123",
	"code":0,
	"status":"success",
	"type":"report",
	"data":
	{
		"reported":
		{
			"brightness":55,
			"name":"bedroom",
			"power_switch":1,
			"color":2
		}
	}
}

3.4.4. 设备事件上报

设备向云端上报事件的 Topic如下:

  • 上行请求 Topic: $thing/up/event/{ProductID}/{DeviceName}
  • 上行响应 Topic: $thing/down/event/{ProductID}/{DeviceName}

首先订阅上行响应Topic:

AT+TCMQTTSUB="$thing/down/event/FWR8PGACUS/ESP8266_Dev_001",0

返回结果如下:

OK
+TCMQTTSUB:OK

接着向上行请求Topic发布消息,事件内容格式如下:

{
   "method":"event_post",
   "clientToken":"123",
   "version":"1.0",
   "eventId":"low_voltage",
   "type":"alert ",
   "params":
   {
   		"Voltage":2.8
   }
}

其中参数说明如下:

参数 类型 说明
method String event_post 表示事件上报。
clientToken String 消息 ID,回复的消息将会返回该数据, 用于请求响应消息的对比。
version String 协议版本,默认为1.0。
eventId String 事件的 ID,在数据模板事件中定义。
params String 事件的参数,在数据模板事件中定义。
timestamp Integer 事件上报的时间,不填写该字段表示就使用事件上报本身的时间。
type String 事件类型,info 为信息,alert 为告警,fault 为故障。

组合出向上行请求发送的AT命令如下:

AT+TCMQTTPUB="$thing/up/event/FWR8PGACUS/ESP8266_Dev_001",0,"{    \"method\":\"event_post\"\,    \"clientToken\":\"123\"\,    \"version\":\"1.0\"\,    \"eventId\":\"low_voltage\"\,    \"type\":\"alert \"\,    \"params\":    { 	\"voltage\":2.8    } }"

返回结果如下,上报成功:

OK
+TCMQTTPUB:OK

同时收到平台发给设备的回应:

+TCMQTTRCVPUB:"$thing/down/event/FWR8PGACUS/ESP8266_Dev_001",75,"{"method":"event_reply","clientToken":"123","code":0,"status":"","data":{}}"

其中的json数据整理一下如下:

{
	"method":"event_reply",
	"clientToken":"123",
	"code":0,
	"status":"",
	"data":{}
}

在云端设备事件日志中可以看到:
使用ESP8266腾讯云定制固件对接腾讯云物联网平台IoT Explorer

3.4.5. 设备行为调用

当应用通过云端向设备发起某个行为调用时,开发平台为设备行为的处理设定了默认的 Topic 如下:

  • 应用调用设备行为 Topic: $thing/down/action/{ProductID}/{DeviceName}
  • 设备响应行为执行结果 Topic: $thing/up/action/{ProductID}/{DeviceName}

首先订阅设备应用调用设备行为的Topic:

AT+TCMQTTSUB="$thing/down/action/FWR8PGACUS/ESP8266_Dev_001",0

返回结果如下:

OK
+TCMQTTSUB:OK

智能灯默认数据模板中没有……需要手动创建,新建一个行为功能:
使用ESP8266腾讯云定制固件对接腾讯云物联网平台IoT Explorer
新建之后在自定义功能这一栏即可看到:
使用ESP8266腾讯云定制固件对接腾讯云物联网平台IoT Explorer
进入设备在线调试界面,发送行为:
使用ESP8266腾讯云定制固件对接腾讯云物联网平台IoT Explorer
在串口助手中可以看到模组接收到云端的消息:

+TCMQTTRCVPUB:"$thing/down/action/FWR8PGACUS/ESP8266_Dev_001",132,"{"method":"action","clientToken":"1d603a84c71e4d1da38c2dacce27112e","actionId":"blink","timestamp":1593396804,"params":{"period":5}}"

整理一下json格式如下:

{
	"method":"action",
	"clientToken":"1d603a84c71e4d1da38c2dacce27112e",
	"actionId":"blink",
	"timestamp":1593396804,
	"params":
	{
		"period":5
	}
}

在串口助手中向设备响应行为执行结果 Topic回复响应,响应内容格式如下:

{
   "method": "action_reply",
   "clientToken": "1d603a84c71e4d1da38c2dacce27112e",
   "code": 0,
   "status": "success",
   "response": {
   "Code":  0
   }
}

组合出发送响应的AT指令如下;

AT+TCMQTTPUB="$thing/up/action/FWR8PGACUS/ESP8266_Dev_001",0,"{    \"method\": \"action_reply\"\,    \"clientToken\": \"1d603a84c71e4d1da38c2dacce27112e\"\,    \"code\": 0\,    \"status\": \"success\"\,    \"response\": {    \"Code\":  0    } }"

返回结果为:

OK
+TCMQTTPUB:OK

至此,使用ESP8266腾讯云定制固件对接腾讯云IoT Explorer平台的测试完成。

上一篇:LPC (Local procedure calls) (一)数据结构


下一篇:文件IO模型