当前位置:网站首页>ESP8266连接乐鑫云平台IOT_Demo
ESP8266连接乐鑫云平台IOT_Demo
2022-07-26 22:43:00 【Paradise_Violet】
前言
介绍8266如何连接到乐鑫云平台,以及如何与乐鑫云平台进行交互
在此之前我们已经在乐鑫云平台创建了云端设备,并且获取到了云端设备所对应的设备秘钥
云端设备和云下设备需要靠秘钥进行连接

我们将秘钥下载下来 秘钥就是个二进制文件,我们可以将这个二进制文件烧录到8266模组当中,这样的话8266就可以使用这个二进制秘钥来连接乐鑫云平台
那么8266如何连接这个云平台以及如何使用这个秘钥呢?
这里8266将使用不加密的tcp通讯来和乐鑫云平台进行交互,端口号是8000
云下设备与乐鑫云平台的交互,他使用的是json字符串,json字符串中有GET指令,“tock 000”设备秘钥,等等参数
当接收方接收到发送方发送的json报文后,接收方需要向发送方响应
注意程序当中会根据我们flash大小,决定系统扇区的起始位置
case FLASH_SIZE_32M_MAP_512_512:
rf_cal_sec = 1024 - 5;
priv_param_start_sec = 0x7C; // 【设备密钥】烧录到【0x7D】
break;
case FLASH_SIZE_32M_MAP_1024_1024:
rf_cal_sec = 1024 - 5;
priv_param_start_sec = 0xFC; // 【设备密钥】烧录到【0xFD】
break;
user_init
我们只关心这个函数
user_esp_platform_init(); // 查询复位状态、参数初始化user_esp_platform_init
首先它读取0x7D扇区的数据,这里面有设备秘钥等参数,
system_param_load(priv_param_start_sec+1,0,&esp_param,sizeof(esp_param)); // 读取【0x7D(0x7C+1)扇区】的数据(KEY_BIN)
os_printf("esp_param.devkey = %s\n",esp_param.devkey); // 串口打印【devkey】
os_printf("esp_param.token = %s\n",esp_param.token); // 串口打印【token】
os_printf("esp_param.pad = %s\n",esp_param.pad); // 串口打印【pad】
os_printf("esp_param.activeflag = %d\n",esp_param.activeflag); // 串口打印【activeflag】
之后连接WiFi
// 判断ESP8266是否为SoftAP模式
//-------------------------------------------------------------------------------------------
if (wifi_get_opmode() != SOFTAP_MODE) // 不是SoftAP模式
{
// 设置定时器(定时查询ESP8266的IP情况)
//----------------------------------------
os_timer_disarm(&client_timer);
os_timer_setfn(&client_timer, (os_timer_func_t *)user_esp_platform_check_ip,(void *)1); // 参数3=1:表示当前是刚复位状态
os_timer_arm(&client_timer, 100, 0); // 使能毫秒定时器(100Ms定时)
}user_esp_platform_check_ip
如果成功连接到WiFi的话
// ESP8266获取到IP地址
//---------------------------------------------------------------------------
if (wifi_station_get_connect_status()==STATION_GOT_IP && ipconfig.ip.addr!=0)进行tcp连接设置
// TCP连接设置
//------------------------------------------------------------------
user_conn.proto.tcp = &user_tcp; // 开辟内存
user_conn.type = ESPCONN_TCP; // 设为TCP连接
user_conn.state = ESPCONN_NONE;
device_status = DEVICE_CONNECTING; // 设备(8266)状态设为【正在连接】
if (reset_flag) // 判断是否是刚复位
{ device_recon_count = 0;} // 系统复位后,ESP8266_TCP重连计数=0(reset_flag==1表示为系统复位)
#if (PLUG_DEVICE || LIGHT_DEVICE)
os_timer_disarm(&beacon_timer); // 设置心跳定时器定时器
os_timer_setfn(&beacon_timer, (os_timer_func_t *)user_esp_platform_sent_beacon, &user_conn);并进行DNS域名解析
#ifdef USE_DNS
user_esp_platform_start_dns(&user_conn); // DNS设置如果域名解析成功的话,那么就将8266作为tcp_client,连接到tcp_server也就是乐鑫云平台
espconn_regist_connectcb(pespconn, user_esp_platform_connect_cb); // TCP连接成功_回调函数
espconn_regist_disconcb(pespconn, user_esp_platform_discon_cb); // TCP断开成功_回调函数
espconn_regist_reconcb(pespconn, user_esp_platform_recon_cb); // TCP异常断开_回调函数
user_esp_platform_connect(pespconn); // ESP8266(Client)连接TCP Server当tcp连接成功之后,我们向乐鑫云平台发送数据报
// TCP连接成功_回调函数
//==================================================================================================================
LOCAL void ICACHE_FLASH_ATTR user_esp_platform_connect_cb(void *arg)
{
struct espconn *pespconn = arg;
ESP_DBG("user_esp_platform_connect_cb\n");
// 如果与服务器的TCP连接建立,那就关闭softAP模式
//-----------------------------------------------
if (wifi_get_opmode() == STATIONAP_MODE ) // 【开启AP模式使为了使用APP来向ESP8266发送路由器WIFI的SSID、PASS】
{
wifi_set_opmode(STATION_MODE); // 设为STA模式
}
#if (PLUG_DEVICE || SENSOR_DEVICE)
user_link_led_timer_done();
#endif
device_recon_count = 0; // ESP8266_TCP重连计数 = 0
espconn_regist_recvcb(pespconn, user_esp_platform_recv_cb); // 网络数据接收成功_回调函数
espconn_regist_sentcb(pespconn, user_esp_platform_sent_cb); // 网络数据发送成功_回调函数
user_esp_platform_sent(pespconn); // ESP8266发送TCP数据(设备向乐鑫云平台发送数据包)
}8266会根据云端设备是否激活来选择向乐鑫云平台发送云端设备激活的json字符串还是标识身份的json字符串
if (pbuf != NULL)
{
//【云端设备】未激活
//----------------------------------------------------------
if (esp_param.activeflag == 0) // 【0】:云端设备未激活
{
uint8 token[token_size] = {0};
uint8 bssid[6];
active_nonce = os_random()&0x7FFFFFFF; // 第一次激活,获取随机的【激活加密码】
os_memcpy(token, esp_param.token, 40); // 获取esp_param.token值
wifi_get_macaddr(STATION_IF, bssid); // 获取STA的MAC地址
// 格式化【ACTIVE_FRAME】,激活云端设备。【参数见"ACTIVE_FRAME"定义】
//--------------------------------------------------------------------------------------
os_sprintf(pbuf, ACTIVE_FRAME, active_nonce, token, MAC2STR(bssid),iot_version, devkey);
}
//【云端设备】激活(类似于执行RESET操作)
//-------------------------------------------------------------------------------------------------------------
//【"nonce"可选参数:用于 MD5-NONCE,SHA1-NONCE,HMAC-SHA1-NONCE 加密算法,是一个随机的整数,用来混淆加密算法】
//【"encrypt_method"必要参数:激活方式(这里设为PLAIN方式)】
//【"token"可选参数:是40位随机字符,用于"拥有者授权",在实际情况中可能是出厂说明书里面的“二维码”】
//【"bssid"可选参数:设置该设备的MAC地址】
//【"rom_version"可选参数:版本信息】
//【"Authorization"必选参数:验证设备身份(Master Device Key)】
//--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
#define ACTIVE_FRAME "{\"nonce\": %d,\"path\": \"/v1/device/activate/\", \"method\": \"POST\", \"body\": {\"encrypt_method\": \"PLAIN\", \"token\": \"%s\", \"bssid\": \""MACSTR"\",\"rom_version\":\"%s\"}, \"meta\": {\"Authorization\": \"token %s\"}}\n"
//【云下设备】向云平台标识身份,表明是设备发出的连接(ESP8266与乐鑫云平台建立连接后需向云平台标识身份,建立连接之后使用一次即可)
//-------------------------------------------------------------------------------------------------------------------------------
//【"nonce"可选参数:用于 MD5-NONCE,SHA1-NONCE,HMAC-SHA1-NONCE 加密算法,是一个随机的整数,用来混淆加密算法】
//【"Authorization"必选参数:验证设备身份(Master Device Key)】
//-----------------------------------------------------------------------------------------------------------------------------------------------
#define FIRST_FRAME "{\"nonce\": %d, \"path\": \"/v1/device/identify\", \"method\": \"GET\",\"meta\": {\"Authorization\": \"token %s\"}}\n"
关于创建数据点,修改数据点,定时等等的许多功能先不细讲
RPC(Remote Procedure Call Protocol)远程过程调用协议。一个通俗的描述是:客户端在不知道调用细节的情况下,调用存在于远程计算机上的某个对象,就像调用本地应用程序中的对象一样
最后看一下8266接收乐鑫云平台向它发送的RPC请求,他会作何处理,当8266接收乐鑫云平台向它发送的RPC请求请求内容是LED_ON时8266会将led点亮,LED_OFF时,8266将会把led熄灭
if( ((char *)os_strstr(pbuffer, "{\"deliver_to_device\": true, \"get\": {\"action\": \"LED_ON\"}")) != NULL )
{
PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO4_U, FUNC_GPIO4);
GPIO_OUTPUT_SET(GPIO_ID_PIN(4),0); // LED亮
}
else if( ((char *)os_strstr(pbuffer, "{\"deliver_to_device\": true, \"get\": {\"action\": \"LED_OFF\"}")) != NULL )
{
PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO4_U, FUNC_GPIO4);
GPIO_OUTPUT_SET(GPIO_ID_PIN(4),1); // LED灭
}所谓的设备接入云平台,实际上就是设备与云平台建立网络连接,之后按照云平台规定的数据格式,来收发网络数据,设备就能与云平台进行交互,实现设备接入云平台
边栏推荐
- Cannot find a valid baseurl for repo: HDP-3.1-repo-1
- Jenkins--基础--5.1--系统配置--插件管理
- The setup of KEIL development environment is delivered to the installation package
- 3. Boxing champion Ali
- 2. Wrong odometer
- 物联网改善我们生活的 6 种方式
- Play guest cloud brush machine 5.9
- DataNode Decommision
- Jenkins -- Basic -- 5.2 -- system configuration -- system configuration
- Android -- basic usage of litepal database framework
猜你喜欢

Unity CharacterController

Li Hongyi machine learning (2017 Edition)_ P5: error

什么是数字经济,它是如何改变商业模式的?

C语言之数据存储汇总

Android -- Data Persistence Technology (III) database storage

Li Hongyi machine learning (2017 Edition)_ P14: back propagation

SQL learning (2) -- basic query and sorting of tables

力扣刷题量300记录帖

Are you ready for the Internet of things to revolutionize manufacturing?

Come and help you understand the Internet of things in three minutes
随机推荐
Keil开发环境的搭建送安装包
李宏毅机器学习(2017版)_P3-4:回归
4. European Champions League
Verilog过程赋值语句
Li Hongyi machine learning (2017 Edition)_ P3-4: Regression
Play guest cloud with zerotier nanny level teaching to ensure learning waste
Surrounded area
非递归前中后序遍历二叉树
Jenkins--基础--02--安装
Jenkins--基础--04--安装中文插件
Small programs related to a large number of digital collections off the shelves of wechat: is NFT products the future or a trap?
VIS工作流 - PlantCV
1. 众数
Li Hongyi machine learning (2017 Edition)_ P6-8: gradient descent
数据库期中(二)
Doris or starrocks JMeter pressure measurement
基于485总线的评分系统
7. Formula F1 champion
VSCode2015下编译darknet生成darknet.ext时error MSB3721:XXX已退出,返回代码为 1。
初中高三部曲音视频下载Pronunciation Pairs+Ship or Sheep+Tree or Three


