tuya-wifi-mcu-sdk-arduino-library
- 1、簡介
- 2、配置Arduino環境
- 2.1 下載Arduino sdk
- 3、剖析SDK
- 3.1 TuyaUart —— 處理和模組進行串口通信(了解即可)
- 3.2 TuyaTools —— 工具類方法(了解即可)
- 3.3 TuyaDataPoint —— 處理資料節點(上傳、下發)
- 3.4 TuyaWifi —— 處理wifi網路相關操作,重點內容
- 3.4.1 unsigned char TuyaWifi::init(unsigned char *pid, unsigned char *mcu_ver) —— 初始化
- 3.4.2 void set_dp_cmd_total(unsigned char download_cmd_array[][2], unsigned char download_cmd_num) —— 配置節點
- 3.4.3 void mcu_set_wifi_mode(unsigned char mode) —— 配網模式
- 3.4.4 void dp_process_func_register(tuya_callback_dp_download _func) —— 下發回呼注冊
- 3.4.5 mcu_dp_update —— 真正上報設備狀態
- 3.4.6 dp_update_all_func_register —— 上報設備狀態函式注冊
- 3.4.7 mcu_get_wifi_work_state —— 獲取wifi連接狀態
- 3.4.8 void TuyaWifi::uart_service(void) —— 輪詢串口資料
- 4、官方案例
1、簡介
Tuya MCU SDK Arduino Library 基于涂鴉Wi-Fi 通用對接方案進行開發的,設備 MCU 通過串口與 Wi-Fi 模組連接實作設備聯網,涂鴉模組中的韌體應為通用韌體,通用韌體支持9600,115200兩種波特率自適應,

注意點:
Arduino板子 + 涂鴉模塊的開發方式,據說后期可以單獨模塊開發,- 串口通信
2、配置Arduino環境
2.1 下載Arduino sdk
- 方式一:
https://gitee.com/ant_onio/tuya-wifi-mcu-sdk-arduino-library 點擊下載
解壓到自己的電腦路徑(此電腦->檔案->Arduino->libraries)
- 方式二(推薦):
Arduino IDE -> 工具 -> 管理庫 -> 搜索 tuya-> 安裝最新版本
3、剖析SDK
記住一點,這種方式是mcu + module 串口通信開發方式
簡單來說,肯定資料是
不斷處理串口通信,那么從另外一個點來說就是模組已經內置了串口協議資料處理邏輯,
博哥大概代碼看了一下:

3.1 TuyaUart —— 處理和模組進行串口通信(了解即可)
class TuyaUart
{
public:
// 主要是定義串口通信buffer快取大小
volatile unsigned char wifi_uart_rx_buf[PROTOCOL_HEAD + WIFI_UART_RECV_BUF_LMT]; //Serial data processing buffer
volatile unsigned char wifi_uart_tx_buf[PROTOCOL_HEAD + WIFIR_UART_SEND_BUF_LMT]; //Serial receive buffer
volatile unsigned char wifi_data_process_buf[PROTOCOL_HEAD + WIFI_DATA_PROCESS_LMT]; //Serial port send buffer
TuyaUart(void);
~TuyaUart(void);
void wifi_protocol_init(void);
// 接收資料
unsigned char uart_receive_input(unsigned char data);
void uart_receive_buff_input(unsigned char value[], unsigned short data_len);
unsigned char take_byte_rxbuff(void);
unsigned char with_data_rxbuff(void);
// 傳輸發送資料
void uart_transmit_output(unsigned char value);
void wifi_uart_write_data(unsigned char *in, unsigned short len);
void wifi_uart_write_frame(unsigned char fr_type, unsigned char fr_ver, unsigned short len);
unsigned short set_wifi_uart_byte(unsigned short dest, unsigned char byte);
unsigned short set_wifi_uart_buffer(unsigned short dest, const unsigned char *src, unsigned short len);
/* serial set */
bool _isHWSerial;
// 串口設定
void set_serial(HardwareSerial *serial);
void set_serial(SoftwareSerial *serial);
void begin(long baud_rate);
char read(void);
size_t write(char value);
int available(void);
private:
volatile unsigned char *rx_buf_in;
volatile unsigned char *rx_buf_out;
Stream *_port;
};
3.2 TuyaTools —— 工具類方法(了解即可)
class TuyaTools
{
public:
TuyaTools(void);
~TuyaTools(void);
unsigned char hex_to_bcd(unsigned char Value_H, unsigned char Value_L);
// 計算字串長度
unsigned long my_strlen(unsigned char *str);
// 設定字串
void *my_memset(void *src, unsigned char ch, unsigned short count);
// 記憶體拷貝
void *my_memcpy(void *dest, const void *src, unsigned short count);
// 字串拷貝
char *my_strcpy(char *dest, const char *src);
// 字串對比
int my_strcmp(char *s1, char *s2);
// int 轉位元組陣列
void int_to_byte(unsigned long number, unsigned char value[4]);
// 位元組陣列 轉int
unsigned long byte_to_int(const unsigned char value[4]);
unsigned char get_check_sum(unsigned char *pack, unsigned short pack_len);
private:
};
3.3 TuyaDataPoint —— 處理資料節點(上傳、下發)
class TuyaDataPoint
{
public:
// TuyaDataPoint(void);
// ~TuyaDataPoint(void);
// 下發節點資料
unsigned char mcu_get_dp_download_bool(const unsigned char value[], unsigned short len);
unsigned char mcu_get_dp_download_enum(const unsigned char value[], unsigned short len);
unsigned long mcu_get_dp_download_value(const unsigned char value[], unsigned short len);
// 上報節點資料
unsigned char mcu_dp_raw_update(unsigned char dpid, const unsigned char value[], unsigned short len);
unsigned char mcu_dp_bool_update(unsigned char dpid, unsigned char value);
unsigned char mcu_dp_value_update(unsigned char dpid, unsigned long value);
unsigned char mcu_dp_string_update(unsigned char dpid, const unsigned char value[], unsigned short len);
unsigned char mcu_dp_enum_update(unsigned char dpid, unsigned char value);
unsigned char mcu_dp_fault_update(unsigned char dpid, unsigned long value);
private:
};
注意區分一下資料型別,
DP為 Data Point 的縮寫,即資料點,偶爾被稱為 DP 點,表示智能設備所具備的功能點,
- 涂鴉智能將每個功能點抽象成資料點,資料點定義成不同的型別,例如布爾、列舉、數值等,
- 資料點具備讀寫屬性,例如,一個兩路的開關,可以抽象成兩個資料點,每個資料點型別為布爾型,可取值為
True或False, - 資料點可讀寫,讀表示獲取開關目前的值,寫表示改變開關目前的值,
DPID:指定通信協議下 DP 事件的 ID,
節點型別:
#define DP_TYPE_RAW 0x00 //RAW type
#define DP_TYPE_BOOL 0x01 //bool type
#define DP_TYPE_VALUE 0x02 //value type
#define DP_TYPE_STRING 0x03 //string type
#define DP_TYPE_ENUM 0x04 //enum type
#define DP_TYPE_BITMAP 0x05 //fault type
3.4 TuyaWifi —— 處理wifi網路相關操作,重點內容
在Arduino中使用該庫進行編程開發時,必須在你的Arduino工程檔案中包含 TuyaWifi.h 頭檔案,
一般很多sdk的開發方式都是:
- 1、創建物件 構造方法
- 2、初始化 init
- 3、回呼配置、資訊注冊 register、callbackHandler
- 4、不斷輪詢處理回應
3.4.1 unsigned char TuyaWifi::init(unsigned char *pid, unsigned char *mcu_ver) —— 初始化
PID通過在 Tuya IoT平臺 上創建產品獲取,wifi類的長度一般為16,mcu_ver 這個引數是軟體的版本號,
3.4.2 void set_dp_cmd_total(unsigned char download_cmd_array[][2], unsigned char download_cmd_num) —— 配置節點
在Tuya IoT平臺創建產品,獲取產品DP點資訊,
DP為 Data Point 的縮寫,即資料點,偶爾被稱為 DP 點,表示智能設備所具備的功能點,
- 涂鴉智能將每個功能點抽象成資料點,資料點定義成不同的型別,例如布爾、列舉、數值等,
- 資料點具備讀寫屬性,例如,一個兩路的開關,可以抽象成兩個資料點,每個資料點型別為布爾型,可取值為
True或False, - 資料點可讀寫,讀表示獲取開關目前的值,寫表示改變開關目前的值,
DPID:指定通信協議下 DP 事件的 ID,
MCU SDK需要知道你創建了哪些DP點,他們是什么型別的,
3.4.3 void mcu_set_wifi_mode(unsigned char mode) —— 配網模式
/**
* @description: MCU set wifi working mode
* @param {unsigned char} mode : enter mode
* 0(SMART_CONFIG):enter smartconfig mode
* 1(AP_CONFIG):enter AP mode
* @return {*}
*/
void TuyaWifi::mcu_set_wifi_mode(unsigned char mode);
3.4.4 void dp_process_func_register(tuya_callback_dp_download _func) —— 下發回呼注冊
當APP控制設備的時候,會從云端下發對應的DP命令到設備,設備對資料進行決議后,對下發的命令執行相對于的動作,
對下發命令的處理,通過回呼函式來呼叫,所以我們需要把你的處理函式注冊一下,
偽代碼:
//register DP download processing callback function
my_device.dp_process_func_register(dp_process);
/**
* @description: DP download callback function.
* @param {unsigned char} dpid
* @param {const unsigned char} value
* @param {unsigned short} length
* @return {unsigned char}
*/
unsigned char dp_process(unsigned char dpid, const unsigned char value[], unsigned short length)
{
switch (dpid) {
case DPID_BOOL:
DebugSerial.println("Bool type:");
dp_bool_value = my_device.mcu_get_dp_download_data(dpid, value, length);
DebugSerial.println(dp_bool_value);
/* After processing the download DP command, the current status should be reported. */
my_device.mcu_dp_update(DPID_BOOL, dp_bool_value, 1);
break;
case DPID_VALUE:
DebugSerial.println("Value type:");
dp_value_value = my_device.mcu_get_dp_download_data(DPID_VALUE, value, length);
DebugSerial.println(dp_value_value);
/* After processing the download DP command, the current status should be reported. */
my_device.mcu_dp_update(DPID_VALUE, dp_value_value, 1);
break;
case DPID_ENUM:
DebugSerial.println("Enum type:");
dp_enum_value = my_device.mcu_get_dp_download_data(dpid, value, length);
DebugSerial.println(dp_enum_value);
/* After processing the download DP command, the current status should be reported. */
my_device.mcu_dp_update(DPID_ENUM, dp_enum_value, 1);
break;
case DPID_STRING:
DebugSerial.println("String type:");
/* */
for (unsigned int i=0; i<length; i++) {
dp_string_value[i] = value[i];
DebugSerial.write(dp_string_value[i]);
}
DebugSerial.println("");
/* After processing the download DP command, the current status should be reported. */
my_device.mcu_dp_update(DPID_STRING, dp_string_value, length);
break;
case DPID_RAW:
DebugSerial.println("Raw type:");
/* */
for (unsigned int i=0; i<length; i++) {
dp_raw_value[i] = value[i];
DebugSerial.write(dp_raw_value[i]);
}
DebugSerial.println("");
/* After processing the download DP command, the current status should be reported. */
my_device.mcu_dp_update(DPID_RAW, dp_raw_value, length);
break;
default:
break;
}
return SUCCESS;
}
這里得注意一個方法:
mcu_get_dp_download_data (`下發DP資料處理`)
對位元組陣列進行資料決議,
3.4.5 mcu_dp_update —— 真正上報設備狀態
/* char * */
unsigned char mcu_dp_update(unsigned char dpid, const unsigned char value[], unsigned short len); /* char raw */
/* unsigned long / long */
unsigned char mcu_dp_update(unsigned char dpid, unsigned long value, unsigned short len);
unsigned char mcu_dp_update(unsigned char dpid, long value, unsigned short len);
/* unsigned char / char */
unsigned char mcu_dp_update(unsigned char dpid, unsigned char value, unsigned short len);
unsigned char mcu_dp_update(unsigned char dpid, char value, unsigned short len);
/* unsigned int / int */
unsigned char mcu_dp_update(unsigned char dpid, unsigned int value, unsigned short len);
unsigned char mcu_dp_update(unsigned char dpid, int value, unsigned short len);
基本上大同小異,注意一下dpid和資料型別即可,
3.4.6 dp_update_all_func_register —— 上報設備狀態函式注冊
#include <TuyaWifi.h>
TuyaWifi my_device;
#define DPID_SWITCH 20
//Record the current status of the led
unsigned char switch_value = 0;
...
void setup()
{
...
//register DP download processing callback function
my_device.dp_update_all_func_register(dp_update_all);
...
}
/**
* @description: Upload all DP status of the current device.
* @param {*}
* @return {*}
*/
void dp_update_all(void)
{
my_device.mcu_dp_update(DPID_SWITCH, switch_v
3.4.7 mcu_get_wifi_work_state —— 獲取wifi連接狀態
3.4.8 void TuyaWifi::uart_service(void) —— 輪詢串口資料
/**
* @description: Wifi serial port processing service
* @param {*}
* @return {*}
*/
void TuyaWifi::uart_service(void)
在arduino loop中呼叫,不斷檢測串口資料,
4、官方案例
/*
* @FileName: DataPointType.ino
* @Author: Tuya
* @Email:
* @LastEditors: Tuya
* @Date: 2021-04-19 14:31:52
* @LastEditTime: 2021-04-28 19:47:36
* @Copyright: HANGZHOU TUYA INFORMATION TECHNOLOGY CO.,LTD
* @Company: http://www.tuya.com
* @Description:
* @Github:https://github.com/tuya/tuya-wifi-mcu-sdk-arduino-library
*/
#include <TuyaWifi.h>
#include <SoftwareSerial.h>
TuyaWifi my_device;
SoftwareSerial DebugSerial(8,9);
/* Current LED status */
unsigned char led_state = 0;
/* Connect network button pin */
int wifi_key_pin = 7;
/* Data point define */
#define DPID_BOOL 101
#define DPID_VALUE 102
#define DPID_ENUM 103
#define DPID_STRING 104
#define DPID_RAW 105
#define DPID_FAULT 106
/* Current device DP values */
unsigned char dp_bool_value = 0;
long dp_value_value = 0;
unsigned char dp_enum_value = 0;
unsigned char dp_string_value[8] = {"Hi,Tuya"};
unsigned char dp_raw_value[8] = {0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef};
int dp_fault_value = 0x01;
/* Stores all DPs and their types. PS: array[][0]:dpid, array[][1]:dp type.
* dp type(TuyaDefs.h) : DP_TYPE_RAW, DP_TYPE_BOOL, DP_TYPE_VALUE, DP_TYPE_STRING, DP_TYPE_ENUM, DP_TYPE_BITMAP
*/
unsigned char dp_array[][2] = {
{DPID_BOOL, DP_TYPE_BOOL},
{DPID_VALUE, DP_TYPE_VALUE},
{DPID_ENUM, DP_TYPE_ENUM},
{DPID_STRING, DP_TYPE_STRING},
{DPID_RAW, DP_TYPE_RAW},
{DPID_FAULT, DP_TYPE_BITMAP},
};
unsigned char pid[] = {"xxxxxxxxxxx"}; // 填上自己的產品ID
unsigned char mcu_ver[] = {"1.0.0"};
/* last time */
unsigned long last_time = 0;
void setup()
{
Serial.begin(9600);
DebugSerial.begin(9600);
//Initialize led port, turn off led.
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, LOW);
//Initialize networking keys.
pinMode(wifi_key_pin, INPUT_PULLUP);
// 三部曲 —— 初始化、配置、注冊回呼
//Enter the PID and MCU software version
my_device.init(pid, mcu_ver);
//incoming all DPs and their types array, DP numbers
my_device.set_dp_cmd_total(dp_array, 6);
//register DP download processing callback function
my_device.dp_process_func_register(dp_process);
//register upload all DP callback function
my_device.dp_update_all_func_register(dp_update_all);
last_time = millis();
}
void loop()
{
// 不斷輪詢
my_device.uart_service();
//Enter the connection network mode when Pin7 is pressed.
if (digitalRead(wifi_key_pin) == LOW) {
delay(80);
if (digitalRead(wifi_key_pin) == LOW) {
my_device.mcu_set_wifi_mode(SMART_CONFIG);
}
}
/* LED blinks when network is being connected */
if ((my_device.mcu_get_wifi_work_state() != WIFI_LOW_POWER) && (my_device.mcu_get_wifi_work_state() != WIFI_CONN_CLOUD) && (my_device.mcu_get_wifi_work_state() != WIFI_SATE_UNKNOW)) {
if (millis() - last_time >= 500) {
last_time = millis();
/* Toggle current LED status */
if (led_state == LOW) {
led_state = HIGH;
} else {
led_state = LOW;
}
digitalWrite(LED_BUILTIN, led_state);
}
}
delay(10);
}
/**
* @description: DP download callback function.
* @param {unsigned char} dpid
* @param {const unsigned char} value
* @param {unsigned short} length
* @return {unsigned char}
*/
unsigned char dp_process(unsigned char dpid, const unsigned char value[], unsigned short length)
{
switch (dpid) {
case DPID_BOOL:
DebugSerial.println("Bool type:");
dp_bool_value = my_device.mcu_get_dp_download_data(dpid, value, length);
DebugSerial.println(dp_bool_value);
/* After processing the download DP command, the current status should be reported. */
my_device.mcu_dp_update(DPID_BOOL, dp_bool_value, 1);
break;
case DPID_VALUE:
DebugSerial.println("Value type:");
dp_value_value = my_device.mcu_get_dp_download_data(DPID_VALUE, value, length);
DebugSerial.println(dp_value_value);
/* After processing the download DP command, the current status should be reported. */
my_device.mcu_dp_update(DPID_VALUE, dp_value_value, 1);
break;
case DPID_ENUM:
DebugSerial.println("Enum type:");
dp_enum_value = my_device.mcu_get_dp_download_data(dpid, value, length);
DebugSerial.println(dp_enum_value);
/* After processing the download DP command, the current status should be reported. */
my_device.mcu_dp_update(DPID_ENUM, dp_enum_value, 1);
break;
case DPID_STRING:
DebugSerial.println("String type:");
/* */
for (unsigned int i=0; i<length; i++) {
dp_string_value[i] = value[i];
DebugSerial.write(dp_string_value[i]);
}
DebugSerial.println("");
/* After processing the download DP command, the current status should be reported. */
my_device.mcu_dp_update(DPID_STRING, dp_string_value, length);
break;
case DPID_RAW:
DebugSerial.println("Raw type:");
/* */
for (unsigned int i=0; i<length; i++) {
dp_raw_value[i] = value[i];
DebugSerial.write(dp_raw_value[i]);
}
DebugSerial.println("");
/* After processing the download DP command, the current status should be reported. */
my_device.mcu_dp_update(DPID_RAW, dp_raw_value, length);
break;
default:
break;
}
return SUCCESS;
}
/**
* @description: Upload all DP status of the current device.
* @param {*}
* @return {*}
*/
void dp_update_all(void)
{
my_device.mcu_dp_update(DPID_BOOL, dp_bool_value, 1);
my_device.mcu_dp_update(DPID_VALUE, dp_value_value, 1);
my_device.mcu_dp_update(DPID_ENUM, dp_enum_value, 1);
my_device.mcu_dp_update(DPID_STRING, dp_string_value, (sizeof(dp_string_value) / sizeof(dp_string_value[0])));
my_device.mcu_dp_update(DPID_RAW, dp_raw_value, (sizeof(dp_raw_value) / sizeof(dp_raw_value[0])));
my_device.mcu_dp_update(DPID_FAULT, dp_fault_value, 1); /* Fault type Only report */
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/298437.html
標籤:其他
下一篇:有關中國服裝制造業轉型升級的看法


