本篇介绍RVB2601与ESP8266无线TCP通信,使得RVB2601无线控制ESP8266上的LED亮灭。
这里将RVB2601作为客户端,ESP8266板子作为服务器,当RVB2601连上WIFI后,再连接ESP8266板子。RVB2601与ESP8266处于同一局域网下,我这个ESP8266连上网后的IP为192.168.5.108,端口号可任选,我用的是666。
void connect_tcp_server(char *server_ip, uint16_t port)
{
char ssid[32];
int bssid[6];
int channel;
int rssi;
w800_ap_info( ssid, bssid , &channel, &rssi);
printf("ssid: %s\r\n", ssid);
printf("channel: %d\r\n", channel);
printf("rssi: %d\r\n", rssi);
w800_connect_remote(0, NET_TYPE_TCP_CLIENT, server_ip, port);
}
static void network_event(uint32_t event_id, const void *param, void *context)
{
switch(event_id) {
case EVENT_NETMGR_GOT_IP:
LOGD(TAG, "net got ip");
connect_tcp_server("192.168.5.108", 666); //网络连接成功之后连接服务器(测试另一个ESP8266上的LED控制)
break;
case EVENT_NETMGR_NET_DISCON:
LOGD(TAG, "net disconnect");
break;
}
/*do exception process */
app_exception_event(event_id);
}
为了方便测试LED控制指令,可以先利用串口指令来测试:
static void cmd_tcp_client_handler(char *wbuf, int wbuf_len, int argc, char **argv)
{
const uint8_t pdata[] = "Hello RVB2601!";
const uint8_t pledon[] = "led on";
const uint8_t pledoff[] = "led off";
int timeout=120;
LOGD(TAG, "[%s] argc:%d\n", __func__, argc);
for (int i=0; i<argc; i++)
{
LOGD(TAG, "[%s] argv:%s\n", __func__, argv[i]);
}
if (argc == 3 && strcmp(argv[1],"led") == 0)
{
if (strcmp(argv[2],"on") == 0)
{
w800_send_data(pledon, sizeof(pledon), timeout);
}
else if (strcmp(argv[2],"off") == 0)
{
w800_send_data(pledoff, sizeof(pledoff), timeout);
}
else
{
LOGD(TAG, "[%s] para err\n", __func__);
}
}
else
{
w800_send_data(pdata, sizeof(pdata), timeout);
}
}
int cli_reg_cmd_tcp_client_test(void)
{
static const struct cli_command tcp_client_cmd_info = {
"tcp_client_test",
"tcp client test",
cmd_tcp_client_handler,
};
aos_cli_register_command(&tcp_client_cmd_info);
return 0;
}
void board_cli_init()
{
aos_cli_init();
extern void cli_reg_cmd_ps(void);
cli_reg_cmd_ps();
extern void cli_reg_cmd_free(void);
cli_reg_cmd_free();
cli_reg_cmd_kvtool();
cli_reg_cmd_ping();
cli_reg_cmd_ifconfig();
cli_reg_cmd_factory();
cli_reg_cmd_sysinfo();
cli_reg_cmd_tcp_client_test();//<--------加上这句
}
ESP8266使用Arduino IDE进行开发与程序编写,主程序逻辑如下,主要就是等待客户端连接,并接收客户端的指令,接收到后,对指令进行解析,执行对应的LED亮灭操作。
这里是以字符串的形式进行数据传送,比如“led on”就是开灯,“led off”就是关灯,如果还想控制其它电器,如风扇,可以定义如“fan on"和“fan off”这类的指令。
void loop()
{
uint8_t i;
if (server.hasClient())
{ //判断是否有新的client请求进来
for (i = 0; i < MAX_SRV_CLIENTS; i++)
{
//释放旧无效或者断开的client
if (!serverClients[i] || !serverClients[i].connected())
{
if (!serverClients[i])
{
serverClients[i].stop(); //停止指定客户端的连接
}
serverClients[i] = server.available();//分配最新的client
Serial.print("1个新的客户端: ");
Serial.println(i);
break; //跳出一层for循环
}
}
//当达到最大连接数 无法释放无效的client,需要拒绝连接
if (i == MAX_SRV_CLIENTS)
{
WiFiClient client = server.available();
client.stop();
Serial.println("连接被拒绝 ");
}
}
//检测client发过来的数据
for (i = 0; i < MAX_SRV_CLIENTS; i++)
{
if (serverClients[i] && serverClients[i].connected())
{
if (serverClients[i].available())
{
String recvStr = "";
while (serverClients[i].available())
{
recvStr += char(serverClients[i].read());
}
Serial.println("收到客户端的信息:");
Serial.println(recvStr);
std::vector<String> splitStr;
splitBySpace(recvStr, splitStr);
if (splitStr.size() == 2)
{
if (splitStr[0] == "led")
{
if (splitStr[1] == "on")
{
Serial.println("开灯");
digitalWrite(2, LOW); // 点亮LED
}
else if (splitStr[1] == "off")
{
Serial.println("关灯");
digitalWrite(2, HIGH); // 熄灭LED
}
}
}
}
}
}
}
通过串口指令,可以先测试通信是否正常:
然后可以通过按键以及屏幕来进行LED的亮灭控制:
本篇介绍了RVB2601,作为客户端,通过TCP协议,与作为服务端的ESP8266进行无线通信,控制ESP8266上LED的亮灭。
最后,感谢之前各位网友关于RVB2601对于WIFI的使用介绍,本篇参考如下几篇,收获颇多: