wifi的使用不太顺利,源代码的结构很乱,使用代码的跳转功能,发现socket的函数在sal和socket的头文件之间跳来跳去,成了一个循环,找不到具体在哪里实现的,放弃了。
后来参考多位坛友的分享,使用w800里的函数,创建了一个TCP的客户端。
创建过程如下:
1.连接wifi
整个代码的修改是在"ch2601_webplayer_demo"的例程下进行修改的。首先在"init.c"里的"static void network_init()"修改自己wifi的ssid和密码:
netmgr_config_wifi(app_netmgr_hdl, "ChinaNet-JvAb", strlen("ChinaNet-JvAb"), "s3fackxx", strlen("s3fackxx"));
2.增加收到数据的回调函数
回调函数如下:
void w800_in(int linkid, void *data, size_t len, char remote_ip[16], uint16_t remote_ports)
{
uint8_t* d;
uint8_t speed;
d=(uint8_t *)data;
printf("rev:%sn",data);
// do sth. in here
}
注册回调函数,注册的位置也放到了"init.c"里的"static void network_init()"中,完整的"static void network_init()"函数如下:
static void network_init()
{
w800_wifi_param_t w800_param;
/* init wifi driver and network */
w800_param.reset_pin = PA21;
w800_param.baud = 1*1000000;
w800_param.cs_pin = PA15;
w800_param.wakeup_pin = PA25;
w800_param.int_pin = PA22;
w800_param.channel_id = 0;
w800_param.buffer_size = 4*1024;
wifi_w800_register(NULL, &w800_param);
app_netmgr_hdl = netmgr_dev_wifi_init();
if (app_netmgr_hdl) {
utask_t *task = utask_new("netmgr", 2 * 1024, QUEUE_MSG_COUNT, AOS_DEFAULT_APP_PRI);
netmgr_service_init(task);
netmgr_config_wifi(app_netmgr_hdl, "ChinaNet-JvAb", strlen("ChinaNet-JvAb"), "s3fackxx", strlen("s3fackxx"));
w800_packet_input_cb_register(&w800_in); // 注册回调函数
netmgr_start(app_netmgr_hdl);
}
}
3. 当连上wifi后建立TCP客户端
在"app_main.c"的"main.c"中,注册了2个事件,分别是获取到IP地址和断开连接时的事件。
int main(void)
{
board_yoc_init();
pwm_io_init();
/* Subscribe */
event_subscribe(EVENT_NETMGR_GOT_IP, network_event, NULL);
event_subscribe(EVENT_NETMGR_NET_DISCON, network_event, NULL);
}
在获取到IP地址的事件中,建立TCP客户端
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");
w800_connect_remote(0,2,REMOTE_IP,REMOTE_PORT); //连接到服务器
aos_task_new("dht12_task",dht12_task,NULL,2*1024); //新建线程用于处理数据
break;
case EVENT_NETMGR_NET_DISCON:
LOGD(TAG, "net disconnect");
break;
}
/*do exception process */
app_exception_event(event_id);
}
void dht12_task(void *paras)
{
char str[50];
unsigned char buf[10];
dht12_init();
while(1){
dht12_get_data(buf);
sprintf(str,"temperature:%d.%d;humity:%d.%d;\n",buf[2],buf[3],buf[0],buf[1]);
w800_send_data(str,strlen(str),1000); //使用此函数实现数据的发送
aos_msleep(5000);
}
}
注意要添加头文件 "#include <devices/w800.h>"。使用函数"int w800_send_data(const uint8_t *pdata, int len,int timeout)"实现数据的发送,然后结合第2步中的接收回调函数,就可以实现TCP客户端的任务了。
最后要感谢在前方的坛友,提供了很多特别出色的经验分享。