Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
DIY综合交流区
ART网络相关说明
发布于 2012-11-18 12:21:43 浏览:4979
订阅该版
仅给出个简短说明,后续慢慢丰富,目前ART+WiFi shield具备的相关特性: 1. 具备Arduino兼容的WiFi接口(库),但不建议使用WiFiClient, WiFiServer类; 2. 具备Arduino兼容的Ethernet接口库,同时支持(并兼容)EthernetClient, EthernetServer类; 目前看起来,WiFiClient、 WiFiServer类与EthernetClient、EthernetServer类高度重合,所以建议使用EthernetClient、EthernetServer类。
与WiFi相关(例如关联,获取IP地址,AP mac地址等)都可以使用WiFi类。同时,ART + WiFi shield具备SD卡接口,所以当进行第一次关联无线AP时,第一次会进行扫描,第二次就会自动关联,时间大幅缩短。 在SD卡根目录有一个wlan.nvm文件(文本文件),格式类似: SSID=rtthread password=finsh 可以自行放置一个wlan.nvm文件,并添加上自己希望关联的AP。在finsh shell下可以运行: wlan() wlan_auto() 命令进行自动关联到AP(同样第一次会比较久,第二次速度在5秒左右)。
查看更多
5
个回答
默认排序
按发布时间排序
bernard
2012-11-18
这家伙很懒,什么也没写!
为了支持Arduino的Ethernet接口,在ART固件中提供了libsocket.h/libsocket.c,这些API接口会直接输出到用户面。 例如以下是一个简单的TCP Client。 ``` #include
#include
#include
#include "libsocket.h" #include
int sock = -1; void setup() { } void loop() { sock = socket_create(SOCK_STREAM); if (socket_connect(sock, "192.168.1.5", 2000) == 0) { socket_printf(sock, "Hello ART_work "); } socket_close(sock); sock = -1; delay(10 * 1000); } ```
bernard
2012-11-18
这家伙很懒,什么也没写!
因为ART wifi shield带了TF(microSD)卡的插槽,插入TF卡将是ART上巨大的存储空间(RT-Thread ART最大可以支持32G的卡),所以可以把用户程序直接存放在TF卡上。 为此编写了一个系统常驻的守护线程:daemon,它会监听端口2000。可以由PC上的客户端push一个文件到ART TF卡上。daemon最初版的代码如下: ``` #include
#ifdef RT_USING_LWIP #include
#include
#define SESSION_MAX 5 #define BUF_SZ 1024 #define FILE_PATH "/sd" struct client_request { int socket; rt_uint32_t filesz; rt_uint8_t filename[64]; }; static rt_uint16_t client_session = 0; void client_thread(void* parameter) { int fd; rt_uint32_t level; rt_uint32_t recv_length; rt_uint8_t *buf_ptr = RT_NULL; struct client_request* request; rt_uint8_t fn_full[64]; request = (struct client_request*) parameter; RT_ASSERT(request != RT_NULL); buf_ptr = (rt_uint8_t*) rt_malloc (BUF_SZ); if (buf_ptr == RT_NULL) goto __exit; rt_snprintf(fn_full, sizeof(fn_full), "%s/%s", FILE_PATH, request->filename); rt_kprintf("open file: %s ", fn_full); fd = open(fn_full, O_RDWR | O_TRUNC, 0); if (fd >= 0) { while (1) { recv_length = lwip_recv(request->socket, buf_ptr, BUF_SZ, 0); if (recv_length <= 0) { break; } rt_kprintf("write %d data. ", recv_length); write(fd, buf_ptr, recv_length); } } __exit: if (buf_ptr != RT_NULL) rt_free(buf_ptr); if (request != RT_NULL) rt_free(request); if (fd >= 0) { rt_kprintf("close file. "); close(fd); } level = rt_hw_interrupt_disable(); client_session --; rt_hw_interrupt_enable(level); return; } void daemon_thread(void* parameter) { int timeout; int sock, client; rt_uint32_t level; rt_uint32_t sin_size; struct sockaddr_in server_addr, client_addr; sin_size = sizeof(struct sockaddr_in); /* create server socket */ if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) { rt_kprintf("Socket error "); return; } server_addr.sin_family = AF_INET; server_addr.sin_port = htons(2000); server_addr.sin_addr.s_addr = INADDR_ANY; rt_memset(&(server_addr.sin_zero),8, sizeof(server_addr.sin_zero)); if (lwip_bind(sock, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) == -1) { rt_kprintf("Unable to bind "); lwip_close(sock); return; } if (lwip_listen(sock, 5) == -1) { rt_kprintf("Listen error "); lwip_close(sock); return; } while(1) { client = lwip_accept(sock, (struct sockaddr *)&client_addr, &sin_size); if (client >= 0) { struct client_request* request; level = rt_hw_interrupt_disable(); if (client_session >= SESSION_MAX) { rt_hw_interrupt_enable(level); continue; } rt_hw_interrupt_enable(level); request = (struct client_request*) rt_malloc (sizeof(struct client_request)); if (request != RT_NULL) { rt_thread_t tid; /* set recv timeout */ timeout = 3000; /* 3 seconds */ lwip_setsockopt(client, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout)); if (lwip_recv(client, request, sizeof(struct client_request), 0) != sizeof(struct client_request)) { lwip_close(client); rt_free(request); } else { /* set client socket */ request->socket = client; tid = rt_thread_create("client", client_thread, (void*) request, 1024, 30, 10); if (tid != RT_NULL) { level = rt_hw_interrupt_disable(); client_session ++; rt_hw_interrupt_enable(level); rt_thread_startup(tid); } else { /* create thread failed. */ lwip_close(client); rt_free(request); } } } } } lwip_close(sock); return ; } int daemon(void) { rt_thread_t tid; tid = rt_thread_create("daemon", daemon_thread, RT_NULL, 1024, 20, 10); if (tid != RT_NULL) rt_thread_startup(tid); return 0; } #ifdef RT_USING_FINSH #include
FINSH_FUNCTION_EXPORT(daemon, startup daemon server); #endif #endif ``` PC上使用python编写的客户端代码如下: ``` #! /usr/bin/env python #coding=utf-8 import sys import time import struct import os from socket import socket from socket import AF_INET from socket import SOCK_STREAM PORT = 2000 def daemon_client(filename, host): addr = (host,PORT) TCPSock = socket(AF_INET, SOCK_STREAM) try: TCPSock.connect(addr) except: print 'connect TCP server: %s failed.' % host exit(0) total_length = 0 f = file(filename, 'rb') if f: f.seek(0, os.SEEK_END) length = f.tell() f.seek(0, os.SEEK_SET) request = struct.pack('II64s', 0, length, filename) TCPSock.send(request) print 'Push file to device', while True: data = f.read(1024) if not data: break TCPSock.send(data) print '.', print 'Done.' TCPSock.close() if __name__ == '__main__': if len(sys.argv) != 3: print 'Usage:push file host' exit(0) fn = sys.argv[1] host = sys.argv[2] daemon_client(fn, host) ``` 使用方法,例如这个脚本名称是push.py,则执行push youapp.mo 192.168.0.30
bernard
2012-11-18
这家伙很懒,什么也没写!
WIFI这块,同样支持静态IP和动态IP。 如果是Arduino程序来启动(初始化)WIFI,可以使用如下方法: 静态IP形式 ``` #include
#include
#include
char ssid[] = "RT-Thread_11N"; // your network SSID (name) char pass[] = "finsh"; // your network password char mac[] = {0x11, 0x22, 0x33, 0x44, 0x55, 0x66}; byte ip[] = { 192, 168, 0, 30 }; void setup() { int status; status = WiFi.begin(ssid, pass); if (status == WL_CONNECTED) Serial.print("You're connected to the network"); Ethernet.begin(mac, ip); } void loop() { exit(0); } ``` 注意这里仅指定了ART_device的地址,指定为192.168.0.30,但网关地址,子网掩码,DNS服务器地址都未指定(Arduino Ethernet API支持这种形式),这个会在ART中自动指定网关地址为192.168.0.1,子网掩码为255.255.255.0。同时ART中会内置一个DNS服务器地址。 动态DHCP形式 ``` #include
#include
char ssid[] = "RT-Thread_11N"; // your network SSID (name) char pass[] = "finsh"; // your network password void setup() { int status; status = WiFi.begin(ssid, pass); if (status == WL_CONNECTED) Serial.print("You're connected to the network"); } void loop() { exit(0); } ``` 注:exit函数是ART所自行添加,当使用exit函数时,用户模块会退出,而不是类似Arduino那样傻傻地loop。
bernard
2012-11-22
这家伙很懒,什么也没写!
WIFI另外一个比较麻烦的问题是内存占用: 当关联AP后,memory占用情况: ``` finsh />list_mem() total memory: 78508 used memory : 16116 maximum allocated memory: 52108 ``` 峰值达到52k了,而静态内存也需要占用52k内存,得好好查查。再后面集成到ART_work,基本上就能够做版本发布了。
撰写答案
登录
注册新账号
关注者
0
被浏览
5k
关于作者
bernard
这家伙很懒,什么也没写!
提问
414
回答
5940
被采纳
76
关注TA
发私信
相关问题
1
[项目]搞个开源的硬件项目
2
硬件计划贴,及时更新,欢迎提意见
3
软件计划贴,及时更新,欢迎提意见::WMA,MOUNT,LWIP等问题急需解决.
4
MMS协议
5
定点的wma解压库-libwma
6
QQ群记录 [20090821]
7
STM32网络收音机PCB报名征集
8
第一版调试记录
9
第二版硬件讨论
10
RADIO项目相关模块规格--欢迎大家自己做板时规格与此兼容,减少重复劳动
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
开源共生 商业共赢 | RT-Thread 2024开发者大会议程正式发布!
2
【24嵌入式设计大赛】基于RT-Thread星火一号的智慧家居系统
3
RT-Thread EtherKit开源以太网硬件正式发布
4
如何在master上的BSP中添加配置yml文件
5
使用百度AI助手辅助编写一个rt-thread下的ONVIF设备发现功能的功能代码
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
MicroPython
ulog
C++_cpp
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
a1012112796
19
个答案
2
次被采纳
张世争
9
个答案
2
次被采纳
rv666
6
个答案
2
次被采纳
用户名由3_15位
13
个答案
1
次被采纳
本月文章贡献
程序员阿伟
9
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
RTT_逍遥
1
篇文章
5
次点赞
大龄码农
1
篇文章
5
次点赞
ThinkCode
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部