CC2530+ESP8266与手机APP通信

本文涉及的产品
数据传输服务 DTS,数据同步 small 3个月
推荐场景:
数据库上云
数据传输服务 DTS,数据迁移 small 3个月
推荐场景:
MySQL数据库上云
数据传输服务 DTS,数据同步 1个月
简介: 通过CC2530控制ESP8266将其配置成AP+TCP服务器模式,并通过手机APP连接到TCP服务器并完成数据传输。ESP8266将作为一个热点(AP)来工作,其WiFi模块被配置为建立一个TCP服务器并监听端口号。CC2530将使用其串口与ESP8266进行通信,并通过AT指令控制ESP8266的WiFi模块设置和数据传输。

一、案例介绍

下面是一个基于CC2530和ESP8266的项目示例,它演示了如何使用CC2530与ESP8266通信以及使用AT指令控制其WiFi模块设置和数据传输。

项目概述: 通过CC2530控制ESP8266将其配置成AP+TCP服务器模式,并通过手机APP连接到TCP服务器并完成数据传输。ESP8266将作为一个热点(AP)来工作,其WiFi模块被配置为建立一个TCP服务器并监听端口号。CC2530将使用其串口与ESP8266进行通信,并通过AT指令控制ESP8266的WiFi模块设置和数据传输。

image.png

硬件组件:

  1. CC2530芯片
  2. ESP8266 WiFi模块
  3. USB转TTL串口转接板
  4. Android手机

软件组件:

  1. IAR Embedded Workbench for 8051
  2. ESP8266 AT指令集
  3. Android Studio

实现步骤:

  1. 硬件连接: 将ESP8266模块与USB转TTL串口转接板相连,然后将串口转接板连接到PC上的USB接口。 在开发板上焊接CC2530,然后将其连接到ESP8266模块的TXD和RXD引脚上(即CC2530的P0.2与P0.3引脚,分别连接到ESP8266的RXD和TXD引脚)。
  2. 配置ESP8266模块: 使用串口工具连接到ESP8266模块,然后根据AT指令集将其配置为AP+TCP服务器模式。例如,可以使用以下AT指令来配置ESP8266的WiFi模块:
AT+CWMODE=3
AT+CWSAP="MyWiFi","12345678",1,0
AT+CIPMUX=1
AT+CIPSERVER=1,8080

其中,“MyWiFi”和“12345678”分别是热点的名称和密码,“1”表示加密方式为WPA2-PSK,“0”表示不隐藏SSID,而“8080”则是TCP服务器监听的端口号。

编写CC2530程序: 在IAR Embedded Workbench for 8051中创建一个新的工程,在其中添加串口驱动程序以及ESP8266通信所需的AT指令函数。然后,编写主程序代码来实现以下功能:

  • 初始化串口
  • 向ESP8266发送AT指令以配置其WiFi模块
  • 等待ESP8266向CC2530发送TCP连接请求
  • 接受从ESP8266传回的数据并将其显示在串口工具中

以下是示例代码的一部分,用于初始化串口并向ESP8266发送AT指令:

#include "uart.h"
#include <string.h>

// AT指令函数
void at_command(char* cmd)
{
   
   
    uart_puts(cmd);
    uart_puts("\r\n");
    delay_ms(1000);
}

int main()
{
   
   
    // 初始化串口
    uart_init();

    // 发送AT指令以配置ESP8266的WiFi模块
    at_command("AT+CWMODE=3");
    at_command("AT+CWSAP=\"MyWiFi\",\"12345678\",1,0");
    at_command("AT+CIPMUX=1");
    at_command("AT+CIPSERVER=1,8080");

    while (1)
    {
   
   
        // 接受从ESP8266传回的数据并将其显示在串口工具中
        if (uart_available())
        {
   
   
            char c = uart_read();
            uart_putc(c);
        }
    }

    return 0;
}

二、CC2530与ESP8266科普

CC2530是德州仪器(Texas Instruments,简称TI)公司推出的一款基于ZigBee协议的SoC单芯片解决方案,它集成了一个8051内核、硬件AES加密加速器、具备丰富外设的低功耗射频芯片和物理层。CC2530支持IEEE 802.15.4标准和ZigBee协议,并且具有低功耗、高可靠性和长距离等特点,广泛应用于物联网、智能家居、智能医疗、无线传感网和工业自动化等领域。

ESP8266是一款由中国企业乐鑫(Espressif Systems)研发的超低功耗Wi-Fi芯片,被广泛应用于物联网相关设备的开发中。该芯片采用Tensilica L106 32位处理器,内置TCP/IP协议,可以实现Wi-Fi通信,同时也支持传统的UART协议、SPI协议等串行通信方式。ESP8266芯片集成了射频电路、天线、Flash存储器和电源管理等,体积小巧、功耗低,具有高度集成性和低成本的特点。

ESP8266芯片的主要特点如下:

1.  支持802.11 b/g/n Wi-Fi协议,通信距离远,数据传输速度快;
2.  内置32位低功耗Tensilica L106 CPU,主频可达80MHz;
3.  支持UART、SPI、I2C等多种串行通信协议;
4.  集成了高速缓存和SRAM,具有强大的处理性能和存储能力;
5.  支持蓝牙4.2、BLE等无线通信协议(部分型号支持);
6.  能够与各种MCU和传感器等外设进行协同工作,大大降低了开发成本和门槛。

ESP8266芯片具有成本低、功耗低、尺寸小和易于开发等优点,在物联网、智能家居、智能手环、智能家电等领域广泛应用。同时,ESP8266芯片也被视为低功耗Wi-Fi IoT领域中的杀手锏,为物联网设备的互联提供了更为简便、稳定、高效的解决方案。

三、功能代码实现介绍

在CC2530上实现控制ESP8266配置成AP+TCP服务器模式,与手机APP之间完成数据传输,需要使用CC2530的串口与ESP8266通信,以及使用ESP8266 AT指令控制ESP8266的WiFi模块设置和数据的发送,代码如下:

#include <stdio.h>
#include <stdint.h>
#include <string.h>

#define ESP_ON  P1_0 // ESP8266电源控制引脚
#define ESP_RST P1_1 // ESP8266复位引脚
#define UART_TX P0_2 // CC2530串口发送引脚
#define UART_RX P0_3 // CC2530串口接收引脚

// ESP8266 AT指令常用指令
const char* AT_RST = "AT+RST";
const char* AT_CWMODE = "AT+CWMODE=3"; // 设置ESP8266为AP+STA模式
const char* AT_CWSAP = "AT+CWSAP="ssid","pass",1,3"; // 设置ESP8266 AP模式下的WiFi名称和密码
const char* AT_CIPMUX = "AT+CIPMUX=1"; // 设置ESP8266多路连接模式
const char* AT_CIPSERVER = "AT+CIPSERVER=1,8888"; // 设置ESP8266 TCP服务器端口
const char* AT_CIPSEND = "AT+CIPSEND=0,50"; // 设定ESP8266发送数据的长度,50字节

// ESP8266 AT指令回应标志
const char* RESPONSE_OK = "OK"; // AT指令执行成功
const char* RESPONSE_ERROR = "ERROR"; // AT指令执行失败
const char* RESPONSE_READY = "ready"; // ESP8266已经准备就绪
const char* RESPONSE_CONNECT = "CONNECT"; // ESP8266连接成功
const char* RESPONSE_CLOSED = "CLOSED"; // ESP8266连接关闭

// ESP8266的WIFI名称和密码
const char* SSID = "esp8266";
const char* PASSWORD = "wifipassword";

// 存储ESP8266返回的数据
char response[100];

// 延时函数
void delay(int ms) {
   
   
    while (--ms > 0) __delay_cycles(48000);
}

// 向ESP8266发送AT指令,并获取ESP8266的回应
void sendATCommand(const char* cmd, uint8_t wait) {
   
   
    uint8_t i = 0;
    memset(response, 0, sizeof(response));
    printf("AT command: %s\n", cmd);
    printf("AT response:\n");
    while (cmd[i]) {
   
   
        while (!(UCA0IFG & UCTXIFG));
        UCA0TXBUF = cmd[i++];
    }
    while (wait && !(UCA0IFG & UCRXIFG));
    while (UCA0IFG & UCRXIFG) {
   
   
        if (response[0] == '\0' && UCA0RXBUF != '\r' && UCA0RXBUF != '\n') {
   
   
            response[0] = UCA0RXBUF;
            response[1] = '\0';
            continue;
        }
        if (strlen(response) < sizeof(response) - 1) {
   
   
            int len = strlen(response);
            response[len] = UCA0RXBUF;
            response[len + 1] = '\0';
        }
    }
    printf("%s", response);
}

void main(void) {
   
   
    uint8_t retry = 5;
    _BIS_SR(GIE);

    // 配置IO口
    P1DIR |= BIT0 + BIT1;
    P1OUT &= ~(BIT0 + BIT1);
    P1OUT |= ESP_ON; // 打开ESP8266电源
    P1OUT &= ~ESP_RST; // 复位ESP8266
    delay(500);
    P1OUT |= ESP_RST;
    delay(1000);

    // 配置串口
    P0SEL |= BIT2 + BIT3;
    UCA0CTL1 = UCSSEL_2;
    UCA0BR0 = 130;
    UCA0BR1 = 6;
    UCA0MCTL = UCBRS_4;

    // 逐步执行AT指令,确保每一步配置都执行成功
    while (retry-- > 0) {
   
   
        sendATCommand(AT_RST, 1);
        sendATCommand(AT_CWMODE, 1);
        sendATCommand(AT_CWSAP, 1);
        sendATCommand(AT_CIPMUX, 1);
        sendATCommand(AT_CIPSERVER, 1);
        if (strstr(response, RESPONSE_OK) != NULL) break;
    }
    if (retry == 0) return; // 配置失败,退出程序

    // 等待ESP8266准备就绪
    while (1) {
   
   
        sendATCommand("", 1);
        if (strstr(response, RESPONSE_READY) != NULL) break;
        delay(500);
    }

    // 等待手机APP连接
    while (1) {
   
   
        sendATCommand("", 1);
        if (strstr(response, RESPONSE_CONNECT) != NULL) {
   
   
            printf("Client connected.\n");
            // 发送数据
            sendATCommand(AT_CIPSEND, 0);
            while (!(UCA0IFG & UCTXIFG));
            UCA0TXBUF = 'H'; UCA0TXBUF = 'e';
            UCA0TXBUF = 'l'; UCA0TXBUF = 'l';
            UCA0TXBUF = 'o'; UCA0TXBUF = ',';
            UCA0TXBUF = 'W'; UCA0TXBUF = 'o';
            UCA0TXBUF = 'r'; UCA0TXBUF = 'l';
            UCA0TXBUF = 'd'; UCA0TXBUF = '!';
            delay(100); // 延时确保数据发送完成
            // 关闭连接
            sendATCommand("AT+CIPCLOSE=0", 1);
            printf("Client disconnected.\n");
        }
        delay(10);
    }
}

这是CC2530的代码,其中ESP8266的控制使用了AT指令。也就是说,ESP8266作为网络模块,只是负责在指定的端口上监听客户端的连接和传输数据,真正控制数据传输的是CC2530,CC2530还要负责ESP8266的WiFi模块设置和TCP服务器的建立。这里只是给出了用CC2530控制ESP8266的代码,手机APP的代码需要自行开发。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
Sqoop 企业级大数据迁移方案实战
Sqoop是一个用于在Hadoop和关系数据库服务器之间传输数据的工具。它用于从关系数据库(如MySQL,Oracle)导入数据到Hadoop HDFS,并从Hadoop文件系统导出到关系数据库。 本课程主要讲解了Sqoop的设计思想及原理、部署安装及配置、详细具体的使用方法技巧与实操案例、企业级任务管理等。结合日常工作实践,培养解决实际问题的能力。本课程由黑马程序员提供。
目录
相关文章
|
2月前
|
小程序 JavaScript API
微信小程序开发之:保存图片到手机,使用uni-app 开发小程序;还有微信原生保存图片到手机
这篇文章介绍了如何在uni-app和微信小程序中实现将图片保存到用户手机相册的功能。
967 0
微信小程序开发之:保存图片到手机,使用uni-app 开发小程序;还有微信原生保存图片到手机
|
3月前
|
移动开发 Android开发 数据安全/隐私保护
移动应用与系统的技术演进:从开发到操作系统的全景解析随着智能手机和平板电脑的普及,移动应用(App)已成为人们日常生活中不可或缺的一部分。无论是社交、娱乐、购物还是办公,移动应用都扮演着重要的角色。而支撑这些应用运行的,正是功能强大且复杂的移动操作系统。本文将深入探讨移动应用的开发过程及其背后的操作系统机制,揭示这一领域的技术演进。
本文旨在提供关于移动应用与系统技术的全面概述,涵盖移动应用的开发生命周期、主要移动操作系统的特点以及它们之间的竞争关系。我们将探讨如何高效地开发移动应用,并分析iOS和Android两大主流操作系统的技术优势与局限。同时,本文还将讨论跨平台解决方案的兴起及其对移动开发领域的影响。通过这篇技术性文章,读者将获得对移动应用开发及操作系统深层理解的钥匙。
102 12
|
4月前
|
网络协议 程序员 5G
IM开发者的零基础通信技术入门(十三):为什么手机信号差?一文即懂!
本系列文章尽量使用最浅显易懂的文字、图片来组织内容,力求通信技术零基础的人群也能看懂。但个人建议,至少稍微了解过网络通信方面的知识后再看,会更有收获。如果您大学学习过《计算机网络》这门课,那么一定不要错过本系列文章。
58 0
|
5月前
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的多功能智能手机阅读APP的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的多功能智能手机阅读APP的详细设计和实现(源码+lw+部署文档+讲解等)
|
5月前
|
存储 移动开发 Android开发
使用kotlin Jetpack Compose框架开发安卓app, webview中h5如何访问手机存储上传文件
在Kotlin和Jetpack Compose中,集成WebView以支持HTML5页面访问手机存储及上传音频文件涉及关键步骤:1) 添加`READ_EXTERNAL_STORAGE`和`WRITE_EXTERNAL_STORAGE`权限,考虑Android 11的分区存储;2) 配置WebView允许JavaScript和文件访问,启用`javaScriptEnabled`、`allowFileAccess`等设置;3) HTML5页面使用`<input type="file">`让用户选择文件,利用File API;
|
5月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的多功能智能手机阅读APP附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的多功能智能手机阅读APP附带文章源码部署视频讲解等
86 1
|
5月前
|
机器学习/深度学习 人工智能 视频直播
AI直播手机APP震撼发布!3大场景直播,60秒一键开播!
🎉 青否数字人AI直播APP发布!🚀 在抖音等平台60秒一键开播,简化直播流程。💡 3种AI直播模式,融合6大AIGC技术,助力新手轻松直播带货且避免违规。💪 AI主播、声音克隆,实时话术改写,智能互动与讲品同步,提升转化。📊 实景与视频直播结合,适应多种场景。🌐 独立部署,自定义版权,1年免费升级,专业售后支持。🚀 (直播: zhibo175) #青否数字人 #AI直播
AI直播手机APP震撼发布!3大场景直播,60秒一键开播!
|
4月前
|
Java Android开发 UED
安卓scheme_url调端:如果手机上多个app都注册了 http或者https 的 intent。 调端的时候,调起哪个app呢?
当多个Android应用注册了相同的URL Scheme(如http或https)时,系统会在尝试打开这类链接时展示一个选择对话框,让用户挑选偏好应用。若用户选择“始终”使用某个应用,则后续相同链接将直接由该应用处理,无需再次选择。本文以App A与App B为例,展示了如何在`AndroidManifest.xml`中配置对http与https的支持,并提供了从其他应用发起调用的示例代码。此外,还讨论了如何在系统设置中管理这些默认应用选择,以及建议开发者为避免冲突应注册更独特的Scheme。
|
6月前
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的多功能智能手机阅读APP的详细设计和实现
基于SpringBoot+Vue+uniapp的多功能智能手机阅读APP的详细设计和实现
90 12
|
6月前
|
人工智能 搜索推荐 机器人
随着AI控制你的智能手机,App时代的结束可能已经指日可待
随着AI控制你的智能手机,App时代的结束可能已经指日可待