概述
AliyunIoTSDK库使用问题和阿里云错误编码解决
- 一、遇到的问题及解决方法
- 1. 提示未使用json格式
- 2. 阿里云5096错误
- 3. 阿里云6304错误
- 二、总结
本例TSL物模型:
{
"schema": "https://iotx-tsl.oss-ap-southeast-1.aliyuncs.com/schema.json",
"profile": {
"version": "1.0",
"productKey": "a10rLI27mdn"
},
"properties": [],
"events": [
{
"identifier": "testid",
"name": "test",
"type": "info",
"required": false,
"desc": "事件测试",
"method": "thing.event.testid.post",
"outputData": [
{
"identifier": "outputid",
"name": "output",
"dataType": {
"type": "bool",
"specs": {
"0": "关",
"1": "开"
}
}
}
]
}
],
"services": [],
"functionBlockId": "001",
"functionBlockName": "事件01"
}
本例应用的代码:
#include <ESP8266WiFi.h>
#include <ArduinoJson.h>
#include <AliyunIoTSDK.h>
AliyunIoTSDK iot;
static WiFiClient espClient;
#define PRODUCT_KEY "xxxxxxx"
#define DEVICE_NAME "xxxxxxx"
#define DEVICE_SECRET "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
#define REGION_ID "cn-shanghai"
#define WIFI_SSID "xxxxxxx"
#define WIFI_PASSWD "xxxxxxx"
void wifiInit(const char *ssid, const char *passphrase)
{
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, passphrase);
WiFi.setAutoConnect (true);
WiFi.setAutoReconnect (true);
while (WiFi.status() != WL_CONNECTED)
{
delay(1000);
Serial.println("WiFi not Connect");
}
Serial.println("Connected to AP");
}
void setup()
{
Serial.begin(115200);
wifiInit(WIFI_SSID, WIFI_PASSWD);
AliyunIoTSDK::begin(espClient, PRODUCT_KEY, DEVICE_NAME, DEVICE_SECRET, REGION_ID);
// 绑定属性回调
AliyunIoTSDK::bindData("testid", powerCallback);
}
unsigned long lastMsMain = 0;
void loop()
{
AliyunIoTSDK::loop();
if (millis() - lastMsMain >= 5000)
{
lastMsMain = millis();
// 发送事件到阿里云平台
AliyunIoTSDK::sendEvent(“testid",a);
}
}
一、遇到的问题及解决方法
1. 提示未使用json格式
- 用<arduinojson.h>库捏一个json数据后,把生成的变量a传递到
AliyunIoTSDK::sendEvent();
这个函数的第二个参数中,方法如下:
StaticJsonDocument<200> doc;//创建一个名字叫doc的隐藏json文档(因为不需要传递到最终函数中)
StaticJsonDocument<200> doc1;//再创建一个json文档,因为json数据需要多层嵌套
doc1["id"] = "123";
doc1["version"] = "1.0";
doc1["method"] = "thing.event.testid.post";
JsonObject myO = doc.createNestedObject("Power"); //添加一个对象节点
myO["value"] = "on";
JsonObject myO1 = doc.createNestedObject("Power1"); //添加一个对象节点
myO1["value1"] = "23.6";
JsonObject myO2 = doc1.createNestedObject("params");//添加一个对象节点
myO2["power"] = myO;
myO2["wf"] = myO1;
void a ;
serializeJsonPretty(doc1, a);
结果编译结果提示数据类型错误
- 于是查阅
<AliyunIoTSDK.h>
文件内对函数中变量类型的定义,发现函数的第二个参数的数据类型为字符类型:
/*
* 发送事件到云平台(附带数据)
* @param eventId 事件名,在阿里云物模型中定义好的
* @param param 字符串形式的json 数据,例如 {"${key}":"${value}"}
*/
static void sendEvent(const char *eventId, const char *param);
- 于是定义一个 char a
AliyunIoTSDK::sendEvent("testid",a);
——不成功 - 定义一个 const char *a
AliyunIoTSDK::sendEvent("testid",a);
——不成功 - 参数直接换doc1
AliyunIoTSDK::sendEvent("testid",doc1);
——不成功 - 考虑使用esp官方SDK,太复杂——暂时放弃json数据类型的研究(以后再研究)
- 第二天决定不用变量传递了,将函数的第二个参数直接转义为字符串
AliyunIoTSDK::sendEvent("testid",""output":"0"");
2. 阿里云5096错误
阿里云官方文档给出的错误原因:
物模型中未定义事件,或事件入参与定义不符。
注意: 如果是自定义物模型模块中的事件,需拼接自定义模块标识符,格式为{tsl.functionBlockId}:{tsl.event.identifier}。
- 所以拼接模块id和事件id
AliyunIoTSDK::sendEvent(“001:testid",""output":“0"");
——5096问题解决
3. 阿里云6304错误
阿里云官方文档给出的错误原因:
TSL校验时,传入的参数在结构体中不存在。
-
添加value(提示output参数不存在)
AliyunIoTSDK::sendEvent(“001:testid","001:testid","value":{"output":"0"}}");
——不成功 -
添加空格
AliyunIoTSDK::sendEvent(“001:testid","001:testid","value": {"output": "0"}}");
——不成功 -
把“0”字符串改为数值
AliyunIoTSDK::sendEvent(“001:testid","001:testid","value":{"output": }}");
——不成功 -
改输出参数名称为输出参数标识符
AliyunIoTSDK::sendEvent(“001:testid","001:testid","value":{"outputid":"0"}}");
成功!
二、总结
- 学会查阅头文件
- 学会查看官方文档,逐逐字逐句斟酌文档含义
- 上报的json数据中要键值对应,key是TSL物模型中的标识符,value要对应设置好的数据类型
- 可以不用加value键,有真实参数键值就可以
- 第二个函数参数不用加{“id”: “123”,“version”:“1.0”,“params”:“method”:“thing.event.001:testid.post”},AliyunIoTSDK库会自动加(6304提示method不存在的可能所在)
如果有其他问题可以评论我们一起交流讨论
最后
以上就是深情玫瑰为你收集整理的AliyunIoTSDK库使用问题和阿里云错误码解决一、遇到的问题及解决方法二、总结的全部内容,希望文章能够帮你解决AliyunIoTSDK库使用问题和阿里云错误码解决一、遇到的问题及解决方法二、总结所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复