Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
实现在MSH命令行中,输入命令获取指定城市天气信息
发布于 2020-03-31 11:01:01 浏览:2231
订阅该版
**作业题目7:****实现在MSH命令行中,输入命令获取指定城市天气信息 **大家提交作业时,直接在本贴下方跟贴即可
查看更多
19
个回答
默认排序
按发布时间排序
风雨潇潇
2020-04-05
这家伙很懒,什么也没写!
移植需要的cJSON文件,修改需要使用的函数,根据的情况如ESP8266_ExitUnvarnishSend,ESP8266_Close_Link等, 修改主要函数GetNowWeather如下 ``` int GetNowWeather(int argc,char **argv) { rt_uint16_t i; if(argv[1] == NULL) { return 1; } ESP8266_Link_Server(enumTCP, (char*)WEATHER_IP, (char*)WEATHER_PORT,Single_ID_0);//TCP ESP8266_UnvarnishSend ();//传输模式为:透传 sprintf ( cStrBuff, "GET https://api.seniverse.com/v3/weather/now.json?key=ragjskuzlv5jzerq&location=%s\r\n\r\n",argv[1] ); //&language=en for(i = 0; i
yichao
2020-04-06
这家伙很懒,什么也没写!
[md]1. json解析库移植 > 移动rthread完整版CJSON到nano版 2. 构建http请求访问心知天气api ``` int GetNowWeather(void) { ESP8266_Link_Server(enumTCP, (char*)WEATHER_IP, (char*)WEATHER_PORT,Single_ID_0);//TCP ESP8266_UnvarnishSend ();//传输模式为:透传 // macESP8266_Usart ( "GET https://api.seniverse.com/v3/weather/now.json?" // "key=2owqvhhd2dd9o9f9&location=%s&language=zh-Hans&unit=c\r\n\r\n","fuzhou" ); macESP8266_Usart ( "GET https://api.seniverse.com/v3/weather/now.json?key=ragjskuzlv5jzerq&location=fuzhou\r\n\r\n");//以福州天气为例子获取 strEsp8266_Fram_Record .InfBit .FramLength = 0; //重新开始接收新的数据包 rt_thread_mdelay(1000); strEsp8266_Fram_Record .Data_RX_BUF [ strEsp8266_Fram_Record .InfBit .FramLength ] = '\0'; printf("Receive now data:%s\r\n",strEsp8266_Fram_Record .Data_RX_BUF); cJSON_NowWeatherParse((char*)strEsp8266_Fram_Record .Data_RX_BUF, &weather_data); ESP8266_ExitUnvarnishSend ( );//退出透传HZJ ESP8266_Close_Link ( );//关闭TCP或UDP连接HZJ return 0; } MSH_CMD_EXPORT(GetNowWeather, Get Weather Infomation.); ``` 3. 利用cjson解析天气api返回的结果 ``` static int cJSON_NowWeatherParse(char *JSON, WeatherType *result) { cJSON *json,*arrayItem,*object,*subobject,*item; //printf("Receive now data:%s\r\n",JSON); json = cJSON_Parse(JSON);//解析JSON数据包 if(json == NULL) //检测JSON数据包是否存在语法上的错误,返回NULL表示数据包无效 { printf("Error before: [%s]\r\n",cJSON_GetErrorPtr()); //打印数据包语法错误的位置 return 1; } else { if((arrayItem = cJSON_GetObjectItem(json,"results")) != NULL); //匹配字符串"results",获取数组内容 { int size = cJSON_GetArraySize(arrayItem); //获取数组中对象个数 // printf("cJSON_GetArraySize: size=%d\n",size); if((object = cJSON_GetArrayItem(arrayItem,0)) != NULL)//获取父对象内容 { printf("--------------------------------Now Weather Data Begin------------------------------\r\n"); /* 匹配子对象1 */ if((subobject = cJSON_GetObjectItem(object,"location")) != NULL) { printf("---------------------------------subobject1-------------------------------\r\n"); if((item = cJSON_GetObjectItem(subobject,"id")) != NULL) { printf("cJSON_GetObjectItem: %s:%s\r\n",item->string,item->valuestring); } if((item = cJSON_GetObjectItem(subobject,"name")) != NULL) //地名--需要用到的数据 { printf("cJSON_GetObjectItem: %s:%s\r\n",item->string,item->valuestring); } if((item = cJSON_GetObjectItem(subobject,"country")) != NULL) { printf("cJSON_GetObjectItem: %s:%s\r\n",item->string,item->valuestring); } if((item = cJSON_GetObjectItem(subobject,"path")) != NULL) { printf("cJSON_GetObjectItem: %s:%s\r\n",item->string,item->valuestring); } if((item = cJSON_GetObjectItem(subobject,"timezone")) != NULL) { printf("cJSON_GetObjectItem: %s:%s\r\n",item->string,item->valuestring); } if((item = cJSON_GetObjectItem(subobject,"timezone_offset")) != NULL) { printf("cJSON_GetObjectItem: %s:%s\r\n",item->string,item->valuestring); } } /* 匹配子对象2 */ if((subobject = cJSON_GetObjectItem(object,"now")) != NULL) { printf("---------------------------------subobject2-------------------------------\r\n"); if((item = cJSON_GetObjectItem(subobject,"text")) != NULL)//天气预报文字--需要用到的数据 { printf("cJSON_GetObjectItem: %s:%s\r\n",item->string,item->valuestring); } if((item = cJSON_GetObjectItem(subobject,"code")) != NULL)//天气预报代码--需要用到的数据 { printf("cJSON_GetObjectItem: %s:%s\r\n",item->string, item->valuestring); } if((item = cJSON_GetObjectItem(subobject,"temperature")) != NULL) //温度--需要用到的数据 { printf("cJSON_GetObjectItem: %s:%s\r\n",item->string, item->valuestring); } } /* 匹配子对象3 */ if((subobject = cJSON_GetObjectItem(object,"last_update")) != NULL) { printf("---------------------------------subobject3-------------------------------\r\n"); printf("cJSON_GetObjectItem: %s:%s\r\n",subobject->string,subobject->valuestring); } printf("--------------------------------Now Weather Data End--------------------------------\r\n"); } } } cJSON_Delete(json); //释放cJSON_Parse()分配出来的内存空间 return 0; } ```[/md]
赵撵猪
2020-04-07
这家伙很懒,什么也没写!
本次就变得更加的简单了许多,因为只是发送和接收的字符串操作,唯一难点只是数据的CJSON格式化,现在都是开源的。关键难点就是参数的输入,但是因为有finsh框架,加上snprintf,很容易解决。但是中文部分出现了乱码,其他部分都未出现,说明数据接收没问题。 ``` int GetNowWeather(int argc,char **argv) { static uint8_t Data_RX_BUF[1024]; extern int esp8266_connect(const char *ip, const char *port); extern int at_uart_read(uint8_t* buf,uint16_t size_max,uint32_t timeout); extern int esp8266_disconnect(void); esp8266_connect((char*)WEATHER_IP, (char*)WEATHER_PORT);//TCP rt_snprintf((char*)Data_RX_BUF,sizeof(Data_RX_BUF),"GET https://api.seniverse.com/v3/weather/now.json?key=SAU3EChv2RbuMwSKF&location=%s\r\n\r\n",argv[1]); HAL_UART_Transmit(&huart2,(uint8_t*)Data_RX_BUF,rt_strlen((char*)Data_RX_BUF),3000); rt_memset(Data_RX_BUF,0,sizeof(Data_RX_BUF)); at_uart_read(Data_RX_BUF,sizeof(Data_RX_BUF),3000); printf("Receive now data:%s\r\n",Data_RX_BUF); cJSON_NowWeatherParse((char*)Data_RX_BUF, &weather_data); esp8266_disconnect(); return 0; } MSH_CMD_EXPORT(GetNowWeather, Get Weather Infomation.); ``` [attach]14741[/attach]
赵撵猪
2020-04-07
这家伙很懒,什么也没写!
>本次就变得更加的简单了许多,因为只是发送和接收的字符串操作,唯一难点只是数据的CJSON格式化,现在都是 ... --- [attach]14746[/attach] 注意串口字符编码为utf8就可以了。
瑞尧
2020-04-07
这家伙很懒,什么也没写!
需求:获取指定城市天气信息需要用到的工具:网络通信(数据解析) 在数据解析中使用到cJson来解析天气网站发送过来的json数据包,需要导入cJson库,如下: [attach]14767[/attach] 天气信息获取: 在上一次的作业中用到了网络通信的例子,可以直接修改后拿过来,代码如下: ``` void weather(int argc, char **argv) { char data[256] = {0}; rt_kprintf("start esp8266!\n"); esp_start_socket("TCP",0,WEATHER_IP,WEATHER_PORT); rt_kprintf("link server!\n"); rt_kprintf("start send data!\n"); esp_into_trans(); esp_send(0,"GET https://api.seniverse.com/v3/weather/now.json?key=ragjskuzlv5jzerq&location=chongqing\r\n\r\n"); UART4_RX_STA = 0; rt_kprintf("data send ok!\n"); rt_thread_delay(3000); rt_kprintf("get receive data!\n"); rt_kprintf("Receive now data:%s\r\n",UART4_RX_BUF); cJSON_NowWeatherParse((char *)UART4_RX_BUF,&weather_data); esp_out_trans(); esp_close_socket(0); } MSH_CMD_EXPORT(weather, get weather.); ``` 在json数据解析中,用到一下函数进行解析打印数据,代码如下: ``` static int cJSON_NowWeatherParse(char *JSON, WeatherType *result) { cJSON *json,*arrayItem,*object,*subobject,*item; json = cJSON_Parse(JSON);//解析JSON数据包 if(json == NULL) //检测JSON数据包是否存在语法上的错误,返回NULL表示数据包无效 { rt_kprintf("Error before: [%s]\r\n",cJSON_GetErrorPtr()); //打印数据包语法错误的位置 return 1; } else { if((arrayItem = cJSON_GetObjectItem(json,"results")) != NULL); //匹配字符串"results",获取数组内容 { int size = cJSON_GetArraySize(arrayItem); //获取数组中对象个数 if((object = cJSON_GetArrayItem(arrayItem,0)) != NULL)//获取父对象内容 { rt_kprintf("--------------------------------Now Weather Data Begin------------------------------\r\n"); /* 匹配子对象1 */ if((subobject = cJSON_GetObjectItem(object,"location")) != NULL) { rt_kprintf("---------------------------------subobject1-------------------------------\r\n"); if((item = cJSON_GetObjectItem(subobject,"id")) != NULL) { rt_kprintf("cJSON_GetObjectItem: %s:%s\r\n",item->string,item->valuestring); } if((item = cJSON_GetObjectItem(subobject,"name")) != NULL) //地名--需要用到的数据 { rt_kprintf("cJSON_GetObjectItem: %s:%s\r\n",item->string,item->valuestring); } if((item = cJSON_GetObjectItem(subobject,"country")) != NULL) { rt_kprintf("cJSON_GetObjectItem: %s:%s\r\n",item->string,item->valuestring); } if((item = cJSON_GetObjectItem(subobject,"path")) != NULL) { rt_kprintf("cJSON_GetObjectItem: %s:%s\r\n",item->string,item->valuestring); } if((item = cJSON_GetObjectItem(subobject,"timezone")) != NULL) { rt_kprintf("cJSON_GetObjectItem: %s:%s\r\n",item->string,item->valuestring); } if((item = cJSON_GetObjectItem(subobject,"timezone_offset")) != NULL) { rt_kprintf("cJSON_GetObjectItem: %s:%s\r\n",item->string,item->valuestring); } } /* 匹配子对象2 */ if((subobject = cJSON_GetObjectItem(object,"now")) != NULL) { rt_kprintf("---------------------------------subobject2-------------------------------\r\n"); if((item = cJSON_GetObjectItem(subobject,"text")) != NULL)//天气预报文字--需要用到的数据 { rt_kprintf("cJSON_GetObjectItem: %s:%s\r\n",item->string,item->valuestring); } if((item = cJSON_GetObjectItem(subobject,"code")) != NULL)//天气预报代码--需要用到的数据 { rt_kprintf("cJSON_GetObjectItem: %s:%s\r\n",item->string, item->valuestring); } if((item = cJSON_GetObjectItem(subobject,"temperature")) != NULL) //温度--需要用到的数据 { rt_kprintf("cJSON_GetObjectItem: %s:%s\r\n",item->string, item->valuestring); } } /* 匹配子对象3 */ if((subobject = cJSON_GetObjectItem(object,"last_update")) != NULL) { rt_kprintf("---------------------------------subobject3-------------------------------\r\n"); rt_kprintf("cJSON_GetObjectItem: %s:%s\r\n",subobject->string,subobject->valuestring); } rt_kprintf("--------------------------------Now Weather Data End--------------------------------\r\n"); } } } cJSON_Delete(json); //释放cJSON_Parse()分配出来的内存空间 return 0; } ``` 通过以上即可实现对天气数据的获取,我获取的天气信息是重庆的,效果如下: [attach]14768[/attach]
BruceTan
2020-04-08
这家伙很懒,什么也没写!
[https://blog.csdn.net/qq_22902757/article/details/105376531](https://blog.csdn.net/qq_22902757/article/details/105376531)
summer_me
2020-04-08
这家伙很懒,什么也没写!
在MSH命令行输入:GetNowWeather空格加guangzhou(想获取那个城市的天气信息,地名自己输入)
yoowiwi
2020-04-09
这家伙很懒,什么也没写!
[i=s] 本帖最后由 yoowiwi 于 2020-4-9 00:02 编辑 [/i] [md]# 学习笔记(接上次作业) [md]## 小作业:实现在MSH命令行中,输入命令获取指定城市天气信息 * CJSON库:对json格式的字符串进行构件和解析的C语言函数库 * [CJson包下载链接](https://sourceforge.net/projects/cjson/) * json:JavaScript Object Notation,轻量级数据交换格式 * cjson使用示例 ```C /** 假设某个json数据包如下,存在my_json_string字符串中 { "results": [{ "location": { "id": "WS0E9D8WN298", "name": "广州", "country": "CN", "path": "广州,广州,广东,中国", "timezone": "Asia/Shanghai", "timezone_offset": "+08:00" }, "now": { "text": "阴", "code": "9", "temperature": "19" }, "last_update": "2020-04-07T17:50:00+08:00" }] } **/ // 创建一个cJSON对象并解析json字符串: cJSON *root,*array,*object,*subobject; root = cJSON_Parse(my_json_string); //取出root对象中result内的所有元素 array = cJSON_GetObjectItem(root, "results"); int size = cJSON_GetArraySize(res); // 返回元素个数 object = cJSON_GetArrayItem(array,0); // 取出第0个元素 //取出object对象中的location内元素 subobject = cJSON_GetObjectItem(objectm,"location"); //取出subject对象中的name内元素 item = cJSON_GetObjectItem(subobject,"name"); printf("%s",item->string); cJSON_Delete(root); // 使用完后要将cJSON对象释放掉 ``` * 心知天气 API请求: ``` // ip及端口号 IP:116.62.81.138 Port:80 //GET 请求方式 GET https://api.seniverse.com/v3/weather/now.json?key=更改为你的私钥&location=地区名&language=zh-Hans&unit=c\n ``` * 移植cjson相对简单,直接将它的源代码和头文件包括进来即可,还需记得使用`INIT_COMPONENT_EXPORT(cJSON_hook_init)`对cjson进行初始化; * esp8266访问心知天气并使用cjson库进行处理 ```C int esp8266_get_weather(int argc,char **argv) { char buff_send[256]; char buff_reci[256]; cJSON *json,*results,*obj,*location,*now,*name,*weather,*temp; if(argc < 2) { rt_kprintf("please input the area"); return 0; } esp8266_atcmd_send("AT+CIPSTART=\"TCP\",\"116.62.81.138\",80"); rt_thread_mdelay(100); esp8266_atcmd_send("AT+CIPMODE=1"); rt_thread_mdelay(10); esp8266_atcmd_send("AT+CIPSEND"); rt_thread_mdelay(10); sprintf(buff_send, \ "GET /v3/weather/now.json?key=S2lxqfmDHFDHRFqSf" \ "&location=%s\r\n\r\n" ,argv[1]); Usart_SendString(USART3,buff_send); DMA1_Channel3->CNDTR = BUFF_REC_SIZE;// 重新接收字符串 rt_thread_mdelay(500); rt_memcpy(buff_reci,buff3,512); delete_char(buff_reci,0x0D); delete_char(buff_reci,0x0A); rt_thread_mdelay(50); esp8266_atcmd_send("+++"); // 退出透传 rt_thread_mdelay(50); esp8266_atcmd_send("AT+CIPCLOSE"); json = cJSON_Parse(buff_reci);//解析JSON数据包 if(json == NULL) { printf("Error before: [%s]\r\n",cJSON_GetErrorPtr()); return 1; } else { if((results = cJSON_GetObjectItem(json,"results")) != NULL) { if((obj = cJSON_GetArrayItem(results,0)) != NULL) { if((location = cJSON_GetObjectItem(obj,"location")) != NULL) { name = cJSON_GetObjectItem(location,"name"); } if((now = cJSON_GetObjectItem(obj,"now")) != NULL) { weather = cJSON_GetObjectItem(now,"text"); temp = cJSON_GetObjectItem(now,"temperature"); } else { printf("Error before: [%s]\r\n",cJSON_GetErrorPtr()); return 3; } } } else { printf("Error before: [%s]\r\n",cJSON_GetErrorPtr()); return 2; } } rt_kprintf("\n您所在的地区:%s\n明天天气情况为:%s\n明天天气气温为:%s\n\n", \ name->valuestring,weather->valuestring,temp->valuestring); cJSON_Delete(json); return 1; } MSH_CMD_EXPORT(esp8266_get_weather,get weather from xinzhi); ```[/md] 效果截图: [attach]14810[/attach]
bast_xrr
2020-04-09
这家伙很懒,什么也没写!
[md]# **RT-Thread nano学习笔记7-实现在MSH命令行中输入命令获取指定城市天气信息** ## 1. 作业要求 实现在MSH命令行中输入命令获取指定城市天气信息 。 ## 2. 作业思路 跟着学习视频已经初步实现了获取特定城市天气功能,因此本次作业的思路如下: 在老师现有获取天气的函数基础上,增加用于表征城市名称的字符串参数,然后将该字符串参数传递给查询指令,从而实现指定城市的天气查询。 ## 3. 作业实现 (1)新建int GetCityWeather(int argc,char **argv)函数,利用argv参数来传递城市名称,其他函数与教学视频中的int GetNowWeather(void)函数一致,代码如下: ```c int GetCityWeather(int argc,char **argv) { ESP8266_Link_Server(enumTCP, (char*)WEATHER_IP, (char*)WEATHER_PORT,Single_ID_0);//TCP ESP8266_UnvarnishSend ();//传输模式为:透传 macESP8266_Usart ( "GET https://api.seniverse.com/v3/weather/now.json?key=ragjskuzlv5jzerq&location=%s\r\n\r\n",argv[1]);//将指定城市名称作为参数传递给查询指令 strEsp8266_Fram_Record .InfBit .FramLength = 0; //重新开始接收新的数据包 rt_thread_mdelay(1000); strEsp8266_Fram_Record .Data_RX_BUF [ strEsp8266_Fram_Record .InfBit .FramLength ] = '\0'; printf("Receive now data:%s\r\n",strEsp8266_Fram_Record .Data_RX_BUF); cJSON_NowWeatherParse((char*)strEsp8266_Fram_Record .Data_RX_BUF, &weather_data); ESP8266_ExitUnvarnishSend ( );//退出透传 ESP8266_Close_Link ( );//关闭TCP或UDP连接 return 0; } MSH_CMD_EXPORT(GetCityWeather, Get City Weather Infomation.); ``` ## 4. 测试结果 控制台输入“GetCityWeather wuhan”命令后,可以看到能够正常查询武汉市的天气信息,如下图所示: [attach]14840[/attach] )[/md]
。。。
2020-04-10
这家伙很懒,什么也没写!
观看何老师的RT-Thread Nano-CJSON-心知天气获取的视频,完成本次作业。 将何老师提供的代码中CJSON文件中的文档,WeatherInfo.c文档复制到自己创建的工程中。 然后将文档添加进工程中,并添加好头文件的路径。 我在WifiCmdTest.c文档中添加一个连接热点的线程,代码如下: ``` #define WIFI_IP "MERCURY_CC72" //热点名称 #define WIFI_password "fxmfy210." //热点密码 void WIFI_thread_entry(void *parameter)//用户消息处理入口函数 { ESP8266_Cmd ( "AT", "OK", NULL, 500 );//AT命令 ESP8266_Rst(); ESP8266_Net_Mode_Choose ( STA );//设置为工作站模式 while(!ESP8266_JoinAP ( WIFI_IP, WIFI_password));//加入热点 printf("ESP8266 Connect hotspot successfully.\r\n"); } int WIFI_process_init(void) { rt_thread_t tid; tid = rt_thread_create("WIFI_process", WIFI_thread_entry, RT_NULL, 512, 4, 10); if (tid != NULL) rt_thread_startup(tid); return 0; } INIT_APP_EXPORT(WIFI_process_init); ``` 修改何老师提供的GetNowWeather函数,结果如下: ``` /* 心知天气(api.seniverse.com)--天气数据的来源 */ #define WEATHER_IP "116.62.81.138" #define WEATHER_PORT "80" //所需要的天气数据,供其他应用使用 WeatherType weather_data; int GetNowWeather(int argc,char **argv) { ESP8266_Link_Server(enumTCP, (char*)WEATHER_IP, (char*)WEATHER_PORT,Single_ID_0);//TCP ESP8266_UnvarnishSend ();//传输模式为:透传 macESP8266_Usart ( "GET https://api.seniverse.com/v3/weather/now.json?key=SQWfEfkHI8C6Mjn9x&location=%s\r\n\r\n",argv[1]);//以福州天气为例子获取 strEsp8266_Fram_Record .InfBit .FramLength = 0; //重新开始接收新的数据包 rt_thread_mdelay(1000); strEsp8266_Fram_Record .Data_RX_BUF [ strEsp8266_Fram_Record .InfBit .FramLength ] = '\0'; cJSON_NowWeatherParse((char*)strEsp8266_Fram_Record .Data_RX_BUF, &weather_data); ESP8266_ExitUnvarnishSend ( );//退出透传HZJ ESP8266_Close_Link ( );//关闭TCP或UDP连接HZJ return 0; } MSH_CMD_EXPORT(GetNowWeather, Get Weather Infomation.); ``` 硬件调试结果如下图: [attach]14847[/attach]
撰写答案
登录
注册新账号
关注者
0
被浏览
2.2k
关于作者
RT-Thread小喇叭
这家伙很懒,什么也没写!
提问
29
回答
54
被采纳
1
关注TA
发私信
相关问题
推荐文章
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
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部