itead / iteadlib_arduino_nextion Goto Github PK
View Code? Open in Web Editor NEWLicense: MIT License
License: MIT License
please help!
i need to hide and show a button in a nextion display at runnig time, how can i do?
thanks a lot
Hi,
I am uploading example code to my arduino UNO using only nexSerial. I am unable to see any changes on the display. It always shows me the default screen by ITLEADS STUDIO.
Am I missing anything? or doing anything wrong
Can I ask please why you find it necessary to use foul language in the documentation for this library? (see file "index.html" in directory "html")
I've been told that it is a valid software licence. Most certainly it is not a professional one.
Could it be removed please?
Any chance for add newline ending on each command on nextion hardware firmware and Arduino firmware
it would be more reliable using
nexSerial.readBytesUntil('\r\n',(char *)temp,10)
instead of
if (sizeof(temp) != nexSerial.readBytes((char *)temp, sizeof(temp)))
three 0xFF 0xFF 0xFF bytes implementation isnt reliable
I would suggest to use '\r\n'
Although many features are there in the library but they are unstable and its really too hard to use for any big project.
Readme.md should have a link to online doc available at http://docs.iteadstudio.com/ITEADLIB_Arduino_Nextion/index.html
I downloaded the latest version: git clone https://github.com/itead/ITEADLIB_Arduino_Nextion and I copied it on the path C: \Program Files\Arduino\libraries, I then tried to create a project in the Arduino Ide and added #include "Nextion.h". but the project does not compile.
error:
fatal error: Nextion.h: No such file or directory #include "Nextion.h"
What am I doing wrong?
If you add a library through IDE menu, there are many #include and another error appears:
In file included from C:\Program Files\Arduino\libraries\ITEADLIB_Arduino_Nextion\NexHardware.h:18:0,
from C:\Program Files\Arduino\libraries\ITEADLIB_Arduino_Nextion\NexHardware.cpp:15:
C:\Program Files\Arduino\libraries\ITEADLIB_Arduino_Nextion\NexHardware.cpp: In function 'bool recvRetNumber(uint32_t*, uint32_t)':
C:\Program Files\Arduino\libraries\ITEADLIB_Arduino_Nextion\NexConfig.h:37:19: error: 'Serial2' was not declared in this scope
#define nexSerial Serial2
^
C:\Program Files\Arduino\libraries\ITEADLIB_Arduino_Nextion\NexHardware.cpp:55:5: note: in expansion of macro 'nexSerial'
nexSerial.setTimeout(timeout);
^
C:\Program Files\Arduino\libraries\ITEADLIB_Arduino_Nextion\NexHardware.cpp:67:31: warning: left shift count >= width of type [enabled by default]
*number = (temp[4] << 24) | (temp[3] << 16) | (temp[2] << 8) | (temp[1]);
^
C:\Program Files\Arduino\libraries\ITEADLIB_Arduino_Nextion\NexHardware.cpp:67:49: warning: left shift count >= width of type [enabled by default]
*number = (temp[4] << 24) | (temp[3] << 16) | (temp[2] << 8) | (temp[1]);
^
In file included from C:\Program Files\Arduino\libraries\ITEADLIB_Arduino_Nextion\NexHardware.h:18:0,
from C:\Program Files\Arduino\libraries\ITEADLIB_Arduino_Nextion\NexHardware.cpp:15:
C:\Program Files\Arduino\libraries\ITEADLIB_Arduino_Nextion\NexHardware.cpp: In function 'uint16_t recvRetString(char*, uint16_t, uint32_t)':
C:\Program Files\Arduino\libraries\ITEADLIB_Arduino_Nextion\NexConfig.h:37:19: error: 'Serial2' was not declared in this scope
#define nexSerial Serial2
^
C:\Program Files\Arduino\libraries\ITEADLIB_Arduino_Nextion\NexHardware.cpp:114:16: note: in expansion of macro 'nexSerial'
while (nexSerial.available())
^
C:\Program Files\Arduino\libraries\ITEADLIB_Arduino_Nextion\NexHardware.cpp: In function 'void sendCommand(const char*)':
C:\Program Files\Arduino\libraries\ITEADLIB_Arduino_Nextion\NexConfig.h:37:19: error: 'Serial2' was not declared in this scope
#define nexSerial Serial2
^
C:\Program Files\Arduino\libraries\ITEADLIB_Arduino_Nextion\NexHardware.cpp:166:12: note: in expansion of macro 'nexSerial'
while (nexSerial.available())
^
C:\Program Files\Arduino\libraries\ITEADLIB_Arduino_Nextion\NexConfig.h:37:19: error: 'Serial2' was not declared in this scope
#define nexSerial Serial2
^
C:\Program Files\Arduino\libraries\ITEADLIB_Arduino_Nextion\NexHardware.cpp:171:5: note: in expansion of macro 'nexSerial'
nexSerial.print(cmd);
^
C:\Program Files\Arduino\libraries\ITEADLIB_Arduino_Nextion\NexHardware.cpp: In function 'bool recvRetCommandFinished(uint32_t)':
C:\Program Files\Arduino\libraries\ITEADLIB_Arduino_Nextion\NexConfig.h:37:19: error: 'Serial2' was not declared in this scope
#define nexSerial Serial2
^
C:\Program Files\Arduino\libraries\ITEADLIB_Arduino_Nextion\NexHardware.cpp:192:5: note: in expansion of macro 'nexSerial'
nexSerial.setTimeout(timeout);
^
C:\Program Files\Arduino\libraries\ITEADLIB_Arduino_Nextion\NexHardware.cpp: In function 'bool nexInit()':
C:\Program Files\Arduino\libraries\ITEADLIB_Arduino_Nextion\NexConfig.h:37:19: error: 'Serial2' was not declared in this scope
#define nexSerial Serial2
^
C:\Program Files\Arduino\libraries\ITEADLIB_Arduino_Nextion\NexHardware.cpp:226:5: note: in expansion of macro 'nexSerial'
nexSerial.begin(9600);
^
C:\Program Files\Arduino\libraries\ITEADLIB_Arduino_Nextion\NexHardware.cpp: In function 'void nexLoop(NexTouch**)':
C:\Program Files\Arduino\libraries\ITEADLIB_Arduino_Nextion\NexConfig.h:37:19: error: 'Serial2' was not declared in this scope
#define nexSerial Serial2
^
C:\Program Files\Arduino\libraries\ITEADLIB_Arduino_Nextion\NexHardware.cpp:242:12: note: in expansion of macro 'nexSerial'
while (nexSerial.available() > 0)
^
exit status 1
Error compiling for board Arduino Nano.
in project i have 12 pages with cca 150 buttons where many buttons has same functionality
now i have to create many NexText and NexButton object and create callback function with parameter "void *ptr" for each object
maybe would be better have only one callback function with parameter "NexObject *ptr"
Let the user set the serial port. Teensy 3.6 has 5 serial ports. Hardcoding nexSerial = Serial2 in NexConfig.h is not ideal.
Hello,
On my 8bit avrs (like Arduino Leonardo)
setVal function is not converting numbers larger than 16bit
(input number of 6900 is converted to 3464)
Solution I used:
changed
utoa(number, buf, 10);
to
sprintf (buf, "%lu", number);
Hello,
it will be nice to add this library to
Arduino library manager
https://github.com/arduino/Arduino/wiki/Arduino-IDE-1.5:-Library-specification
a library.properties
file is required
PlatformIO
http://docs.platformio.org/en/latest/librarymanager/config.html
a library.json
file is required
Kind regards
Hello,
If you implement this code in a device where you are using a microcontroller to refresh the Nextion screen with new data periodically, as well as allow user touch input, user input ends up often being ignored because of this way this code is written, especially when the microcontroller is busy doing something else when the input is sent from the Nextion to the microcontroller. As it stands, you have to call nexLoop before sending any command to the Nextion to make sure the serial buffer isn't cleared out from the code below, which in itself could create all sorts of user interaction timing issue. Also, if you were to eliminate clearing the serial buffer and send a command without calling nexLoop before sending the command, each of the three methods below that also read from the Serial buffer will also cause a problem since there will be user touch input queued in the serial buffer, not the response!
bool recvRetNumber(uint32_t *number, uint32_t timeout)
uint16_t recvRetString(char *buffer, uint16_t len, uint32_t timeout)
bool recvRetCommandFinished(uint32_t timeout)
Take a look at the beginning of the below method. Why would you clear out the serial buffer from queued commands?
void sendCommand(const char* cmd)
{
while (nexSerial.available())
{
nexSerial.read();
}
There should be only one method doing nexSerial.read() in NexHardware.cpp. It should read the serial buffer stack, and based on the byte code header sent from the Nextion, call the appropriate method based on the data received from the Nextion after receiving a full command.
Please contact me if you need assistance as I'm already starting a full rewrite.
Clearly the only issue with a proper implementation is that you may want to eliminate confirmation of commands to the Nextion as there's no way to really implement this without queuing the user input. Leave it up to the use to re-read the value sent to the Nextion to validate that it is set properly.
Tags:
Nextion Arduino Library Intermittently Missing Button Presses and User Input
I want to make the monitor com port. How do I display the Nextion data from com port? Can I do that with just Nextion or need a microcontroller?
In ITEADLIB_Arduino_Nextion/examples/CompHotspot there are two files named, "CompHotspot_v0_32.HMI" and "CompHotSpot_v0_32.HMI". This does not work on Windows which has case sensitive file system and causes issues with git which thinks a file is modified.
Hello guys,
Nextion has two libs to upload.
NextionUpload that uses Serial or Serial Software with SD
EspNextionUpload that uses softwareserial and SPIFFS
For example in my project using ESP8266 with SD Card and HardwareSerial I had to make some adjustments.
Hello,
A lot have been done since latest release (v0.7.0 - 20 Aug 2015) https://github.com/itead/ITEADLIB_Arduino_Nextion/releases/tag/v0.7.0
see 2e268a4...master for a comparison.
Maybe a new release should be tagged
Kind regards
According https://nextion.itead.cc/resources/documents/instruction-set/
Configure Nextion GPIOusage: cfgpio <io><mode><comp>
--
<io> is the number of the extended I/O pin.- Valid values in PWM output mode: 4 to 7, all other modes 0 to 7.<mode> is the working mode of pin selected by <io>.- Valid values: 0-pull up input, 1-input binding, 2-push pull output,3-PWM output, 4-open drain output.
Maybe constants or enum should be defined
I tried many of the examples with both an Arduino UNO and a NodeMCU v0.9 (ESP8266) and all of them worked in case of the UNO and none of them in case of the NodeMCU.
I connected the Nextion's RX to NodeMCU's D10 pin and Nextion's TX to NodeMCU's D9 pin. Also, I disabled Serial debugging and set #define nexSerial Serial
I found no relevant information on the Internet to solve this issue.
Any help would be appreciated!
The eclipse environment can not see this library.
Hello,
I wonder what is the license of this library.
There is (at least) 3 conflicting informations about license.
https://github.com/itead/ITEADLIB_Arduino_Nextion/blob/master/license.md
states is MIT licensed
ITEADLIB_Arduino_Nextion/html/index.html
Lines 132 to 134 in 5a5cf0a
ITEADLIB_Arduino_Nextion/Nextion.h
Lines 11 to 15 in 5a5cf0a
Kind regards
PS : see also #48 (comment)
Hi
Arduino zero, SAMD, do not accept #include <SoftwareSerial.h>
Can please you move inside #ifdef USE_SOFTWARE_SERIAL ?
/**
* @file NexUpload.cpp
*
* The implementation of download tft file for nextion.
*
* @author Chen Zengpeng (email:<[email protected]>)
* @date 2016/3/29
* @copyright
* Copyright (C) 2014-2015 ITEAD Intelligent Systems Co., Ltd. \n
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
*/
#include "NexUpload.h"
//#define USE_SOFTWARE_SERIAL
#ifdef USE_SOFTWARE_SERIAL
#include <SoftwareSerial.h>
SoftwareSerial dbSerial(3, 2); /* RX:D3, TX:D2 */
#define DEBUG_SERIAL_ENABLE
#endif
I was working on interfacing a Nextion Display with Arduino Mega.
The GUI has 3 Pages. The first page is used to display data, while the other two are used to take inputs and set some parameters.
After the user inputs data into the text box, I tried to get the value of the text box with the getText() method which is a member function of the NexText calss.
The method works fine if the text box is on the first page, but fails if it is on the second or the third page.
When getting the values the screen in not in the foreground on the Nextion Display
The Dualstatebutton implementation should be derived fomr the NexButton class preventing all kinds of methods that have to be defined again
I have made changed to the NexButton to allow enable and disable touch and change pic and pic2 attributes. Please find files attached
http://docs.iteadstudio.com/ITEADLIB_Arduino_Nextion/classes.html
Class Index > NexSlider
http://docs.iteadstudio.com/ITEADLIB_Arduino_Nextion/class_nex_slider.html
404 Not Found
What I need to do to make this library works with Arduino DUE?
I've already level shifted it from 5v to 3.3v, only need a working library.
Hi everyone :) Can I use this library for ESP32 board?
Hi,
how I can to read with arduino interface, data from serial input (RX) and put it on display ?
for example, a device send to Nextion numbers from 1 to 9 like 123456789, and I need to see it on diplay.
please a sample code..
Hello,
There seems to be a conflict between the math.h and the Nextion Lib.
J0 and J1 are allready in use. I am not sure if this problem also exists for other devices.
CompProgressBar:22: error: 'NexProgressBar j0' redeclared as different kind of symbol
In file included from C:\Users\xxx\AppData\Roaming\Arduino15\packages\arduino\hardware\sam\1.6.4\cores\arduino/Arduino.h:26:0,
from C:\Users\xxx\Documents\Arduino\libraries\ITEADLIB_Arduino_Nextion/Nextion.h:20,
from CompProgressBar.ino:20:
c:\users\xxx\appdata\roaming\arduino15\packages\arduino\tools\arm-none-eabi-gcc\4.8.3-2014q1\arm-none-eabi\include\math.h:471:15: error: previous declaration of 'double j0(double)'
extern double j0 PARAMS((double));
^
CompProgressBar.ino: In function 'void buttonUpPopCallback(void)':
CompProgressBar:38: error: request for member 'getValue' in 'j0', which is of non-class type 'double(double)'
CompProgressBar:46: error: request for member 'setValue' in 'j0', which is of non-class type 'double(double)'
CompProgressBar.ino: In function 'void buttonDownPopCallback(void_)':
CompProgressBar:54: error: request for member 'getValue' in 'j0', which is of non-class type 'double(double)'
CompProgressBar:61: error: request for member 'setValue' in 'j0', which is of non-class type 'double(double)'
Multiple libraries were found for "Nextion.h"
Used: C:\Users\xxx\Documents\Arduino\libraries\ITEADLIB_Arduino_Nextion
Not used: C:\Users\xxx\Documents\Arduino\libraries\nextion-bborncr
'NexProgressBar j0' redeclared as different kind of symbol
there is a sd card slot at the back of the screen for updating the GUI. However is it possible to get access (read/write) to the card for user data with the serial connection? thank you
How to use the this library to track the click of a button?
Hi,
I have some problem to communicate between my ESP32 and my nextion screen.
I try with a default example CompButton_v0_32 and when I call nexinit()
I have a false error code recvRetCommandFinished err
I investigate and modify NexHardware.cpp to show the result from the display.
In function bool recvRetCommandFinished(uint32_t timeout)
, I just add 1 line :
for (int i = 0; i < 4; i++) Serial.println(temp[i], HEX);
The result, in the Arduino serial monitor was very strange for me and corresponding to nothing:
`recvRetCommandFinished err
FE
FF
FF
62
0
recvRetCommandFinished err
70
61
67
65
0`
Could you help me ?
Regards
[email protected]
PS : I work on an EP32 (v1.0.1), ITEADLIB Arduino Nextion library get from github (v0.9.0)
Hello,
You should ensure that this library can be compiled.
Adding this .travis.yml
(or something close to this) is necessary
language: python
python:
- "2.7"
# Cache PlatformIO packages using Travis CI container-based infrastructure
sudo: false
cache:
directories:
- "~/.platformio"
env:
- PLATFORMIO_CI_SRC=examples/CompButton
- PLATFORMIO_CI_SRC=examples/CompCrop
#- PLATFORMIO_CI_SRC=...
install:
- pip install -U platformio
# Libraries from PlatformIO Library Registry:
#- platformio lib -g install ...
script:
#- platformio ci --board=uno --board=teensy31 --board=due --lib="."
- platformio ci --board=uno --lib="."
See
http://docs.platformio.org/en/latest/ci/travis.html
Adding unit tests could also help to improve quality (but that could be done in a next iteration)
Kind regards
I have created some missing control function for display.
/**
* Set the brightness of the display.
*
* @param buffer - number (0 - 100).
*/
bool setBrightness(byte buffer);
/**
* Set Nextion sleep mode.
*/
bool Sleep();
/**
* Set Nextion awake mode.
*/
bool Wakeup();
/**
* Set Auto Wake on Touch.
*
* @param buffer - number, 0 (do not wake), 1 (wake on touch), default 0.
*/
bool setAutoWakeup(byte buffer);
/**
* Set Sleep on No Touch.
*
* @param buffer - number of second, 3 - 65535, default 0 (means no timeout)
*/
bool setScreenTouchTimeout(int buffer);
MCU: Arduino ATMEGA 2560
Editor: V0.43
Library: V0.9.0
See attached test case: setValue and getValue do not work correctly for values bigger than 32767 on 8 bit systems.
To make at least setValue work correctly, I had to change NexNumber.cpp line 36 from 'utoa' to 'ultoa'. All in all, I am wondering if in setValue the size of the variable 'buffer' is big enough. The max value of uint32_t is supposed to be 4294967296. These are already 10 digits, and the string previx "obj.val=" is still missing. So 'buffer[10]' seems to be far too small and we are risiking a buffer overflow, aren't we?
With the above changes, I could make at least setValue work. But getValue still does not work although the code in NexHardware.cpp recvRetNumber, line 45 seems to be correct and ready for 4 byte uint32_t's. What's going on on the Nextion display side?
Use F("") each time possible to use less memory in RAM.
In the Nextion editor you can create objects with same name on different pages. The library use the following code to identify the object:
String cmd = String("get ");
cmd += getObjName();
This is not enough because more object can be with same name.
It is better to use this:
String cmd = String("get ");
cmd += "page";
cmd += getObjPid();
cmd += ".";
cmd += getObjName();
BR,
Kosza
Its more of a design descicion in the Nextion firmware than the lib here, but still ...
It took me quite some time to realize that all command regarding components on te nextion are send using the component ObjName as the identifying element, while th object name can easily appear on multiple pages. This means that I have to check and control on the arduino which components I can reach and which I don;t.
It would be a major improvement if identifiation of componts would be by PageId and ObjId .. (i would think they are made for this).
It does mean that the GUI editor for Nextion should keep its hands off of the PageIds and ObjIds of exisiting component and not start renumbering them while addng or moving components around
It's not possible to compile for some Arduino Boards which are not compatible with the Libary "SoftwareSerial". Probably it would be good, to switch off the #include from the config-File.
File NexUpload.cpp.
17 //#include <SoftwareSerial.h>
18
19 //#define USE_SOFTWARE_SERIAL
20 #ifdef USE_SOFTWARE_SERIAL
Comment out the Line 17 to compile for Arduino DUE which is using the 3 Uarts.
Thanks
In NexVariable.h getValue command is marked as:
/**
* Get val attribute of component
* @param number - buffer storing data retur
* @return the length of the data
*/
uint32_t getValue(uint32_t *number);
This functions returns value from "recvRetNumber(number);" which is placed in NexHardware.h as:
bool recvRetNumber(uint32_t *number, uint32_t timeout = 100);
I think "uint32_t getValue(uint32_t *number);" should change to "bool getValue(uint32_t *number);" in NexVariable.h and NexVariable.cpp
Thank you
When using the getvalue() method to get a value from a slider, i get the serial output.
get h0.val���recvRetNumber err
source code used
uint32_t number = 0;
char temp[10] = {0};
h0.getValue(&number);
utoa(number, temp, 10);
We're working on an Intel Edison which uses GNU libc/c++ and we've been trying to compile our nextion code but it doesn't work because utoa
is not included in the base C/C++ lib. The only workaround I can currently think of is to modify the library to include utoa
. Do you have any other suggestions?
Functions for "set" (SetText, SetValue, ...) uses only getObjName() for object identification, doesn't matter which pid is set:
e.g. i have 2 pages, p0 and p1
on both pages is text element t1
in arduino code is defined:
NexText txt0 = NexText(0, 1, "t1");
whet i use function txt1.setText(buffer), this function change txt value of component t1 on actual page
so when actual page in p1 then t1.txt on this page is changed
but txt0 was defined for page 0, not for page 1
If one removes upload.cpp and upload.h from the library after compiling lot of space in ram(local variables)is freed.
what could be the reason.
if one keeps those files you hardly get 40 to 80 bytes for local variables(depending upon your program).
With the same program and with out these files after compilation you get allmost 1000 bytes free.
so one can easily use UNO.
Hello,
Each Arduino sketch should be in a directory
for example:
should be moved to
Kind regards
Running Arduino 1.0.5
Added Nextion Library and have consistent compile errors all related to NextionButton.cpp. All similar to below.
/libraries/Nextion/NexButton.cpp: In member function 'uint16_t NexButton::getText(char*, uint16_t)':
/libraries/Nextion/NexButton.cpp:29: error: 'class String' has no member named 'c_str'
Hello,
I noticed that several libraries for Arduino and Nextion smart display exist.
What are pros and cons of each libraries?
Pinging @shennongmin @bborncr @DanNixon
After enumerating differences, a paragraph about this could probably be added to https://github.com/itead/ITEADLIB_Arduino_Nextion/blob/master/readme.md
Kind regards
Hi,
I'm trying your library (release 7.0), when i added it to Arduino IDE, i can't view CompDSButton example and others.
I copied your example from Github, and when it's compiled i get
//
ArduinoMEGA_Nextion:68: error: 'bt0' was not declared in this scope
bt0.getValue(&dual_state);
^
D:\Arduino\ArduinoMEGA_Nextion\ArduinoMEGA_Nextion.ino: In function 'void setup()':
ArduinoMEGA_IR_Reles_LED_Nextion:112: error: 'bt0' was not declared in this scope
bt0.attachPop(bt0PopCallback, &bt0);
^
exit status 1
'NexDSButton' does not name a type
ArduinoMEGA_Nextion:68: error: 'bt0' was not declared in this scope
bt0.getValue(&dual_state);
^
D:\Arduino\ArduinoMEGA_Nextion\ArduinoMEGA_Nextion.ino: In function 'void setup()':
ArduinoMEGA_IR_Reles_LED_Nextion:112: error: 'bt0' was not declared in this scope
bt0.attachPop(bt0PopCallback, &bt0);
^
exit status 1
'NexDSButton' does not name a type
//
This with release v0.7.0
And in this release v0.7.0 doesn't show CompDualStateButton Example
And if i download zip from Github repository (ITEADLIB_Arduino_Nextion-master.zip), CompDSButton seems that are in libraries, but in Arduino IDE only shows examples : CompGPIO, CompRTC and Upload
With "master" release
It's the DS Button working?
Or how i can do to fix it?
Please explain purpose of nexSerial.read() in sendCommand? I think it just drops cache of received data, therefore data is lost. Problem on Nano V3 328P. Thanks!
void sendCommand(const char* cmd)
{
while (nexSerial.available())
{
nexSerial.read();
}
nexSerial.print(cmd);
nexSerial.write(0xFF);
nexSerial.write(0xFF);
nexSerial.write(0xFF);
}
Hello,
You might have a look at https://gist.github.com/vidavidorra/548ffbcdae99d752da02
You can publish automatically doc to GitHub page using Travis-CI
Kind regards
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.