赞
踩
购买课程后可添加老师QQ:2123933105,获取课程相关资料。
关于如何搭建ArduinoIDE/Platformio跨平台开发环境,请详看下面的文章:
关于库文件如何添加到ArduinoIDE中使用,请详看下面的文章:
Arduino Library库文件安装教程
基于ESP32/ESP8266 Arduino软件框架使用同步MQTT通信接入阿里云物联网平台,功能强大,简单易用。
/**
* 函数功能:设置设备密钥认证类型
* 参数1:[_deviceKeyAuthenticationType] [DeviceKeyAuthenticationType] 设备密钥认证类型
* 返回值:无
* 注意事项:无
*/
void setDeviceKeyAuthenticationType(DeviceKeyAuthenticationType _deviceKeyAuthenticationType);
/**
* 函数功能:设置产品标识符
* 参数1:[_productKey] [String] 产品标识符
* 返回值:无
* 注意事项:1、所有设备密钥认证都必须使用该函数
*/
void setProductKey(String _productKey);
/**
* 函数功能:设置产品密钥
* 参数1:[_productSecret] [String] 产品密钥
* 返回值:无
* 注意事项:1、仅一型一密预注册和一型一密免预注册必须使用该函数
*/
void setProductSecret(String _productSecret);
/**
* 函数功能:设置设备名称
* 参数1:[_deviceName] [String] 设备名称
* 返回值:无
* 注意事项:1、如果是一机一密必须使用该函数,DeviceName在云平台添加设备后获取
* 2、如果是一型一密预注册使用该函数则为用户自定义的设备名称,但需要和云平台预注册设备DeviceName相同
* 3、如果是一型一密免预注册使用该函数则为用户自定义的设备名称,但需要注意每个设备的设备名称不要相同
* 4、如果是一型一密预注册或一型一密免预注册不使用该函数,则DeviceName默认为STA MAC地址,比如"AC08D6E4321F",12字节十六进制字符串(英文全部大写)
* 5、如果是一型一密预注册不使用该函数,ESP32和ESP8266均使用STA MAC地址且字符串长度都是12字节,需要在云平台添加相同的DeviceName
* 6、如果是一型一密免预注册不使用该函数,ESP32和ESP8266均使用STA MAC地址且字符串长度都是12字节,不需要在云平台添加相同的DeviceName
*/
void setDeviceName(String _deviceName);
/**
* 函数功能:获取设备名称
* 参数:无
* 返回值:[String] 设备名称
* 注意事项:1、如果已使用setDeviceName函数设置过设备名称,DeviceName则为前面使用setDeviceName函数设置的设备名称
* 2、如果未使用setDeviceName函数设置过设备名称,则DeviceName默认为STA MAC地址,比如"AC08D6E4321F",12字节十六进制字符串(英文全部大写)
*/
String getDeviceName();
/**
* 函数功能:设置设备密钥
* 参数1:[_deviceSecret] [String] 设备密钥
* 返回值:无
* 注意事项:1、仅一机一密必须使用该函数
*/
void setDeviceSecret(String _deviceSecret);
/**
* 函数功能:设置地区
* 参数1:[_region] [String] 地区,默认为上海,即"cn-shanghai"
* 返回值:无
* 注意事项:1、一般免费版本都是华东2(上海),即"cn-shanghai",如果是企业实例,则需要设置对应的地区
* 2、地域列表和Region ID:https://help.aliyun.com/document_detail/427435.htm?spm=a2c4g.147356.0.0.ce8a7bc8alfOOf#concept-2211170
*/
void setRegion(String _region);
/**
* 函数功能:设置实例类型
* 参数1:[_type] [InstanceType] 实例类型,默认为旧版公共实例
* 参数2:[_instanceId] [String] 实例ID,仅新版公共实例或企业版实例需要填写该参数,默认为空
* 返回值:无
* 注意事项:1、查看新版公共实例和企业版实例终端节点信息(实例ID):https://help.aliyun.com/document_detail/147356.htm?spm=a2c4g.356505.0.0.b76e7c0dnCvoiX#section-rtu-6kn-kru
*/
void setInstanceType(InstanceType _type, String _instanceId = "");
/**
* 函数功能:设置回调函数的最大数量
* 参数1:[_number] [uint8_t] 回调函数的最大数量,默认为50
* 返回值:无
* 注意事项:无
*/
void setCallbackCountMax(uint8_t _number);
/**
* 函数功能:设置调试打印,如果未设置,则不开启打印,如果传入串口,则开启打印
* 参数1:[_serial] [Stream&] 串口
* 返回值:无
* 注意事项:无
*/
void setDebug(Stream& _serial);
/**
* 函数功能:设置MQTT接收和发送数据缓冲区大小,单位是:字节
* 参数1:[_receiveBufferSize] [uint32_t] MQTT接收数据缓冲区大小,默认最大为1024字节
* 参数1:[_sendBufferSize] [uint32_t] MQTT发送数据缓冲区大小,默认最大为256字节,此缓冲区仅包含MQTT编码包头和主题,一般256字节就够用了,而消息负载是在发布期间直接发送
* 返回值:无
* 注意事项:1、此函数必须在setClient函数前使用才有效
*/
void setBufferSize(uint32_t _receiveBufferSize, uint32_t _sendBufferSize);
/**
* 函数功能:设置MQTT已连接回调函数
* 参数1:[_cb] [mqttConnectedCallbackPoint] 回调函数
* 返回值:无
* 注意事项:无
*/
void setConnectedCallback(mqttConnectedCallbackPoint _cb);
/**
* 函数功能:MQTT连接失败或断开连接回调函数
* 参数1:[_cb] [mqttDisconnectedCallbackPoint] 回调函数(MQTT连接失败或者断开连接的原因,请见"lwmqtt.h"文件中的lwmqtt_err_t枚举说明)
* 返回值:无
* 注意事项:无
*/
void setDisconnectedCallback(mqttDisconnectedCallbackPoint _cb);
/**
* 函数功能:设置MQTT动态注册连接失败回调函数
* 参数1:[_cb] [mqttDynamicRegistrationFailCallbackPoint] 回调函数
* 返回值:无
* 注意事项:无
*/
void setDynamicRegistrationFailCallback(mqttDynamicRegistrationFailCallbackPoint _cb);
/**
* 函数功能:设置MQTT重连间隔时间
* 参数1:[_time] [uint32_t] MQTT重连间隔时间,单位为:ms,默认为10000ms,最小为1000ms
* 返回值:无
* 注意事项:1、重连间隔时间同样也是连接MQTT超时时间
*/
void setReconnectTime(uint32_t _time);
/**
* 函数功能:设置client
* 参数1:[_client] [Client&] client
* 返回值:无
* 注意事项:无
*/
void setClient(Client& _client);
/**
* 函数功能:获取MQTT连接状态
* 参数:无
* 返回值:[MqttConnectState] 见MqttConnectState枚举说明
* 注意事项:无
*/
MqttConnectState getConnectStatus();
/**
* 函数功能:清空保存在EEPROM中的设备配置信息
* 参数:无
* 返回值:无
* 注意事项:无
*/
void clearEepromDeviceInfo();
/**
* 函数功能:读取保存在EEPROM中的设备配置信息
* 参数:无
* 返回值:[String] 设备配置信息
* 注意事项:无
*/
String getEepromDeviceInfo();
/**
* 函数功能:立即重连MQTT
* 参数:[_deviceInfo] [String] 设备配置信息
* 返回值:[bool] true--重连成功,false,重连失败
* 注意事项:1、如果MQTT已连接状态下使用该函数,则只会返回true
*/
bool immediateReconnect();
/**
* 函数功能:MQTT任务运行
* 参数:无
* 返回值:无
* 注意事项:1、尽量不要在程序中使用delay等延时堵塞程序的代码
*/
void runTask();
MQTTClient* mqttClient = NULL; // 实例化mqttClient
/**
* 函数功能:发送 double 类型数据到云平台,同时兼容float
* 参数1:[_attributeName] [String] 属性名称
* 参数2:[_data] [double] 数据,最外层不需要加花括号
* 参数3:[_decimalPlaces] [uint8_t] 保留小数点后几位,默认为2位
* 参数4:[_qos] [uint8_t] qos等级,默认为0
* 返回值:[bool] true--发送成功,false--发送失败,未联网
* 注意事项:无
*/
bool sendAttributeData(String _attributeName, double _data, uint8_t _decimalPlaces = 2, uint8_t _qos = 0);
/**
* 函数功能:发送 int32_t 类型数据到云平台,同时兼容整数类型和bool类型
* 参数1:[_attributeName] [String] 属性名称
* 参数2:[_data] [int32_t] 数据,最外层不需要加花括号
* 参数3:[_qos] [uint8_t] qos等级,默认为0
* 返回值:[bool] true--发送成功,false--发送失败,未联网
* 注意事项:无
*/
bool sendAttributeData(String _attributeName, int32_t _data, uint8_t _qos = 0);
/**
* 函数功能:发送 String 类型数据到云平台
* 参数1:[_attributeName] [String] 属性名称
* 参数2:[_data] [String] 数据,最外层不需要加花括号
* 参数3:[_qos] [uint8_t] qos等级,默认为0
* 返回值:[bool] true--发送成功,false--发送失败,未联网
* 注意事项:无
*/
bool sendAttributeData(String _attributeName, String _data, uint8_t _qos = 0);
/**
* 函数功能:发送多个数据到云平台
* 参数1:[_data] [String] 数据内容,需要提前拼接好,_data格式为:{"name":"一叶遮天","age":22,"site":"blog.yyzt.site","height":182.34},仿照这个格式根据实际情况改写,最外层需要加花括号
* 参数2:[_qos] [uint8_t] qos等级,默认为0
* 返回值:[bool] true--发送成功,false--发送失败,未联网
* 注意事项:1、可自行将整数型、单精度浮点型、双精度浮点型、枚举型、布尔型、字符串、时间型、结构体、数组等数据类型打包成JSON字符串,再使用此函数发送打包的数据到云平台
*/
bool sendMultipleAttributeData(String _data, uint8_t _qos = 0);
/**
* 函数功能:发送事件到云平台
* 参数1:[_eventId] [String] 事件ID,即标识符
* 参数2:[_data] [String] 数据内容,默认为空则发送空数据,最外层需要加花括号
* 参数3:[_qos] [uint8_t] qos等级,默认为0
* 返回值:[bool] true--发送成功,false--发送失败,未联网
* 注意事项:无
*/
bool sendEventData(String _eventId, String _data = "{}", uint8_t _qos = 0);
/**
* 函数功能:发送自定义主题和数据到云平台
* 参数1:[_topic] [String] 主题,即Topic类,在产品中的Topic类列表中查看
* 参数2:[_data] [String] 数据内容,默认为空,最外层需要加花括号
* 参数3:[_qos] [uint8_t] qos等级,默认为0
* 返回值:[bool] true--发送成功,false--发送失败,未联网
* 注意事项:1、数据格式不能错误,否则会导致云平台接收或者解析不了
*/
bool sendCustomData(String _topic, String _data = "{}", uint8_t _qos = 0);
/**
* 函数功能:绑定属性以及设置接收回调函数
* 参数1:[_attributeName] [String] 属性名称
* 参数2:[_cb] [poniterReceiveDeserialization] 回调函数
* 返回值:[bool] true--设置成功,false--设置失败,属性名称为空或者回调函数为空或者已超过最大设置数量,默认最大为50
* 注意事项:1、如果已设置过相同属性名称,则后面的会覆盖前面的
*/
bool bindAttribute(String _attributeName, poniterReceiveDeserialization _cb);
/**
* 函数功能:取消绑定的属性
* 参数1:[_attributeName] [String] 属性名称
* 返回值:[bool] true--取消绑定成功,false--取消绑定失败,属性名称为空或者不存在该属性名称
* 注意事项:无
*/
bool unbindAttribute(String _attributeName);
/**
* 函数功能:订阅主题
* 参数1:[_topicName] [String] 主题名称
* 参数2:[_cb] [poniterReceiveDeserialization] 回调函数
* 参数3:[_qos] [uint8_t] qos等级,默认为0
* 返回值:[bool] true--订阅成功,为false--订阅失败,主题名称为空或者或者回调函数为空或者回调函数已超过最大设置数量(默认最大为50)或者未联网
* 注意事项:无
*/
bool subscribeTopic(String _topicName, poniterReceiveDeserialization _cb, uint8_t _qos = 0);
/**
* 函数功能:取消订阅主题
* 参数1:[_topicName] [String] 主题名称
* 返回值:[bool] true--取消订阅成功,false--取消订阅失败,主题名称为空或者不存在该主题名称或者未联网
* 注意事项:无
*/
bool unsubscribeTopic(String _topicName);
/**
* 函数功能:订阅设备属性设置主题
* 参数1:[_qos] [uint8_t] qos等级,默认为0
* 返回值:[bool] true--订阅成功,为false--订阅失败,未联网
* 注意事项:1、此功能仅订阅设备属性设置主题
*/
bool subscribeAttributeSetting(uint8_t _qos = 0);
/**
* 函数功能:设置接收的数据解析成JSON数据错误的回调函数
* 参数1:[_cb] [receivedDataParsingErrorCallback] 回调函数
* 返回值:无
* 注意事项:1、因为本库不管是接收还是发送数据,仅支持JSON格式的数据,不支持用户自定义透传的数据,所以如果不是JSON数据或者数据丢包,则会进入设置的回调函数
*/
void setReceivedDataParsingErrorCallback(receivedDataParsingErrorCallbackPoint _cb);
/**
* 函数功能:设置未知主题或JSON数据回调函数
* 参数1:[_cb] [unknownTopicDataCallbackPoint] 回调函数
* 返回值:无
* 注意事项:1、进入此回调函数则表示主题名称不存在或对应的回调函数未设置
*/
void setUnknownTopicDataCallback(unknownTopicDataCallbackPoint _cb);
/**
* 枚举功能:设备密钥认证类型
* 参考文档:https://help.aliyun.com/document_detail/42649.html?spm=a2c4g.74005.0.0.5929b91eKnQ1tl
*/
typedef enum {
OneMachineOneSecret = 0, // 一机一密(已支持)
OneTypeOnePasswordPreRegistration, // 一型一密预注册(已支持)
OneTypeOnePasswordNoPreRegistration, // 一型一密免预注册(已支持)
DynamicRegistrationOfSubDevices // 子设备动态注册(暂不支持)
} DeviceKeyAuthenticationType;
/**
* 枚举功能:实例类型
* 参考文档:https://help.aliyun.com/document_detail/356505.html?spm=a2c4g.148361.0.0.52bb13ddtDmA6Y
*/
typedef enum {
OldVersionPublicInstance = 0, // 旧版公共实例
NewPublicOrEnterpriseVersionInstances // 新版公共实例或企业版实例
} InstanceType;
// MQTT的连接状态
typedef enum {
MqttDisconnected = 0, // MQTT已断开连接
MqttConnecting, // MQTT连接中
MqttConnected // MQTT已连接
} MqttConnectState;
typedef void (*poniterReceiveDeserialization)(JsonVariant _data); // 定义一个接收json字符串反序列化的函数指针
typedef void (*mqttConnectedCallbackPoint)(void); // 定义一个MQTT已连接回调函数的函数指针
typedef void (*mqttDisconnectedCallbackPoint)(lwmqtt_err_t _state); // 定义一个MQTT断开连接回调函数的函数指针
typedef void (*receivedDataParsingErrorCallbackPoint)(String _topic, String _data); // 定义一个接收数据解析成JSON数据错误的回调函数的函数指针
typedef void (*unknownTopicDataCallbackPoint)(String _topic, JsonVariant _data); // 定义一个未知主题或JSON数据回调函数指针
typedef void (*mqttDynamicRegistrationFailCallbackPoint)(void); // 定义一个MQTT动态注册失败回调函数的函数指针
数据流转脚本代码模板参考:
// 通过payload函数,获取设备上报的消息内容,并按照JSON格式转换。
var data = payload("json");
// 直接流转物模型上报数据。
writeIotTopic(数据目的ID,"流转目的的主题", data);
1、增加了自定义订阅和发布的示例,可以使用阿里云物联网平台的消息转发(云产品流转),自由接入自主开发的APP、小程序、web网页等,对设备进行操作。
2、增加了设备动态注册功能(仅支持一型一密预注册和一型一密免预注册),无需为每个设备逐一烧录设备证书,可批量烧录相同的产品证书,适合量产的产品。
3、增加了接入阿里云生活物联网平台功能,使用云智能App(公版App)对设备进行操作。
4、库底层将StaticJsonDocument更换为DynamicJsonDocument,解决ESP32S2解析JSON数据为null的问题。
5、将异步MQTT库"AsyncMqttClient"更换为同步MQTT库"arduino-mqtt",解决频繁发送消息导致设备重启的问题。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。