庆科开发板专区an1056cn micokit基础实验教程_第1页
庆科开发板专区an1056cn micokit基础实验教程_第2页
庆科开发板专区an1056cn micokit基础实验教程_第3页
庆科开发板专区an1056cn micokit基础实验教程_第4页
庆科开发板专区an1056cn micokit基础实验教程_第5页
已阅读5页,还剩113页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

WorkingGroup(MDWG) JackyZhang MXCHIPCo., 悉MiCO的各种API和应用。获取帮助(More 登录MiCO开发者:<>,获取MiCO开发资料。Copyright(c)2016MDWGTrustand sidentifiedas authors.Allrights庆科ShanghaiMXCHIPInformationTechnologyCo.,地址 市普陀区金沙江路2145弄5号楼9楼 Jacky1.初始版 版本记 网络及操作系统相关实 OWORLD实 实验目 实验原 实验内 实验步骤及现 软件流程及关键代码分 相关库函数详细说 MICORTOS实 实验目 实验原 实验内 实验现象软件流程及关键代码分 相关库函数详细说 WLANSTATION实 实验目 实验原 实验内 实验现象软件流程及关键代码分 相关库函数详细说 WLANSOFTAP实 实验目 实验原 实验内 实验现象软件流程及关键代码分 相关库函数详细说 实 实验目 实验原 实验内 实验现象软件流程及关键代 相关库函数详细说 TCPSERVER实 实验目 实验原 实验内 实验现象软件流程及关键代 相关库函数详细说 实验目 实验原 实验内 实验现象软件流程及关键代 相关库函数详细说 实验目 实验原 实验内 实验现象软件流程及关键代 相关库函数详细说 实验目 实验原 实验内 实验现象软件流程及关键代 相关库函数详细说 HTTP客户端实 实验目 实验原 实验内 实验现象软件流程及关键代 相关库函数详细说 实验目 实验原 实验内 实验现象软件流程及关键代 相关库函数详细说 基本外设实 实验目 实验原 实验内 实验步骤及现 软件流程及关键代码分 相关库函数详细说 实验目 实验原 实验内 实验步骤及现 软件流程及关键代码分 相关库函数详细说 看门狗定时器实 实验目 实验原 实验内 实验步骤及现 软件流程及关键代码分 相关库函数详细说 实验目 实验原 实验内 实验步骤及现 软件流程及关键代码分 相关库函数详细说 实验目 实验原 实验内 实验步骤及现 软件流程及关键代码分 相关库函数详细说 ADC实 实验目 实验原 实验内 实验步骤及现 软件流程及关键代码分 相关库函数详细说 实验目 实验原 实验内 实验步骤及现 软件流程及关键代码分 相关库函数详细说 图图1.1MiCOKit开发板外 图1.2SDK内容概 图1.3SecureCRT打印的串口log信 图1.4显示Line行 图 图1.6MiCO体系结 图1.7任务的CPU寄存器和堆栈空间分 图1.8任务的5个状 图1.9通过信号量方法获取使用 图1.10定时器实验log信 图1.11定时器软件流程 图1.12多线程实验串口log信 图1.13多线程软件流程 图1.14WLANStation运行串口log信 图1.15WLLANStation实验软件流 图1.16WLANSoftAP实验串口log信 图1.17WLANSoftAP实验软件流 图1.19客户端和服务器端编程模 图1.20创建TCP 图1.21tcp_实验串口log信 图1.22创建TCP服务器 图1.23TCPServer收发数 图1.24 实验串口log信 图1.25tcp软件流 图1.26tcpserver串口log信 图1.27创建 图1.28连接到 的log信 图1.29 图1.30tcpserver回传数 图1.31收发数据的log信 图1.32tcpserver软件流程 图1.33udpunicast串口log信 图1.34创建udp连接并发送数 图1.35udp单播收发数 图1.36udp单播收发数据log信 图1.37udpbroadcast串口log信 图1.38udp广播客户端接收数 图1.39mdns实验串口log信 图1.40mdns实验APP端内 图1.41http客户端实验串口log信 图1.42json实验串口log信 图2.1LED工作电 图2.2LED闪烁实验软件流 图2.3按键工作电 图2.4按键控制LED软件流 图2.5看门狗定时器实验软件流 图2.6实验接线 图2.7实验软件流 图2.8RTC实验软件流 图2.9ADC实验软件流 图2.10UART实验连线原理 图2.11UART实验连线示意 图2.12PC端查看COM端图2.13UART串口log信 图2.14UART实验软件流 网络及操作系统相关实验oWorld实MiCOIAR7.30.4,oWorld程序是最简单的程序,可以帮助初学者快速了解IAR开发环境以及书写第一个程序。实验目的实验原理MiCOKit-3165实验板介3165使用MiCO开发环境,可以像传统51单片机那样非常方便地进行智能硬件产品开发。开发板配合FogCloud云端服务和“MiCO总动员”APP,可以演示用APP控制开发板上的外设(如RGBLED1.1MiCOKit开发板外MiCOKit开发套件中的硬件资源:一、MiCOKit主板射频:IEEE802.11.b/g/nwlan3、2个工作模式选择开关、2个按钮(包括一个EasyLinkReset5、Arduino标准扩展接口,可外接各种Arduino扩展板二、MiCOKit扩展板MiCO2.4.0SDK开发包介1.2SDK内容概tform:MiCO在不同CPU实验内容熟悉MiCOKit-3165开发板和IAR开发能够连接仿真器、电源到实验板;能够打开工程、文件,熟练进行C程序代码书写和仿真调试,实验步骤及现实验准备工作安装仿真器JLinkV4.90安装secureCRT串口调试工具4)sourceinsight3.55)安装IAR7.30.4开发环境调试过程:选择对工程进行编译,然后选择进行 ,通过将程序 常用的几种代码调试方法口设置为(端口:COMX;波特率:115200;数据位:8位;奇偶:无;停止位:1)1.4Line行软件流程及关键代码分析图 oworld软件流#include/*自定义一个宏,能往调试串口打印出模块名字,时间戳,文件名,行号等信息#defineos_oworld_log(format,...)custom_log("oworld",format,##VA_ARGS//应用程intapplication_start(void{/*打印信息到调试串口/*分配空间char*buf=(char*)malloc(1000);intx=10;intselectResult=-2;/*设置这个变量不满足要求,会跳转*/os_oworld_log("oworld!");要求表达式为真,否则跳到tos_oworld_log("requireok");/*2:要求表达式为真,否则跳到exit,不会打印调试信息*/os_oworld_log("require_quietok"要求表达式为真,否则跳到t调试信息require_string(data,exit,"ERROR:mallocfailed");os_oworld_log("require_stringok");要求表达式为真,否则跳到t给出rrd*/require_actionselectResult1exiterrkFlagErr);/*不满足*/os_oworld_log("require_actionok");if(err!=kNoErr)os_ oworld_log(if(err!=kNoErr)os_ oworld_log("exitwitherr:%d",err); oworld_log("exitnow");return}相关库函数详细说明函数到无函数require_quiet到无函数到无函数require_action(X,LABEL,ACTION到无MiCORTOSCortex-M3Cortex-M4MCU控制器上并满足用户的应用需求。此外,无论商业应用还是个人学习,都无需商业,MiCO是完全免费的操作系统。本章将介绍操作系统的特性。实验目的实验原理MiCO简件开发包等模块,庆科同时提供多种物联网云平台和移动App支持,以及生产测试等一系列解决方案和SDK,助力开发者简化底层的投入,真正实现产品的网络化和智能化并快速量产。MiCO的体系结raeworconnectivityLayer、操作系统抽象层(OSAL+HAL)。1.6MiCO体系结MiCO操作系统的基本概念任CPU完全只属于该程序自己。MiCO操作系统任整个应用的一部分,都被赋予一定的优先级,有自己的一套CPU寄存器和堆栈空间。如图所示:任务切

1.7任务CPU寄存器和堆栈空间分多线程运行的实现实际上是靠CPU在许多线程之间切换和调度。CPU只有一个,轮番服务于一系列线任务切换过程增加了应用程序的额外负荷,CPU的内部寄存器越多,额外负荷就越重。任务切换所需使CPU的利用率达到最高。挂起态(等待某一发生)及被中断态,如图:内

1.8任务5个状互斥条件信号信号量(semaphores)2060EdsgerDijkstra发明的。信号量实际上是一种约定机制,消息队

图1.9通过信号量方法获取使用务先得到的是最先进入消息队列的消息,即先进先出原则(FIFO。实验内容熟悉MiCO定时熟悉MiCO的多任务机制熟悉MiCO多任务互斥机制熟悉MiCO的信号量机制熟悉MiCO的消息队列机制实验现象软件流程及关键代码分析定时器实验1.10定时器实log信定时器软件流程图1.11定时器软件流程定时器关键代码分析函数:application_start(#include#include#defineos_timer_log(M,...)custom_log("OS",M,##VA_ARGSvoidalarm(void*arg);voidalarm(void*arg){int*count=(int*)arg;/*获取传递的地址*/os_timer_log("timeiscoming,valued(*count)if(*count==10{mico_stop_timer(&timer_handle);mico_deinit_timer(&timer_handle);os_timer_log("timerstopanddeinit");}}intapplication_start(void{OSStatuserr=kNoErr;intarg=0;/*初始化一个1秒钟的定时器,并设置触发函数err=mico_init_timer(&timer_handle,1000,alarm,&arg);require_noerr(err,exit);/*开始定时require_noerr(err,exit);/*注意:此定时器例子,application线程不能退出*/mico_thread_sleep(MICO_NEVER_TIMEOUT);returnerr;}多线程实验多线程软件流程图

1.12多线程实验串log信多线程关键代码分析

1.13多线程软件流程#include#include#defineos_thread_log(M,...)custom_log("OS",M,##VA_ARGSvoidthread_1(void{os_thread_log("Thisisthread1");mico_thread_sleep(2);}}voidthread_2(void{os_thread_logThisisthread2,newcreatedmico_thread_sleep(4/*让自己成为终止态,空闲线程会删除线程资源*/}intapplication_start(void{OSStatuserr=mico_thread_tt_handlerNULL;/*线程句柄/*创建线程err=mico_rtos_create_thread(NULL,MICO_APPLICATION_PRIORITY,"Thread1",thread_1,500,NULL);require_noerr_string(err,exit,"ERROR:Unabletostartthethread1.");/*创建新线程,此线程会删除自己并清理资源err=mico_rtos_create_thread(&t_handler,MICO_APPLICATION_PRIORITY,"Thread2",thread_2,500,NULL);require_noerr_string(err,exit,"ERROR:Unabletostartthethread2.");mico_rtos_thread_join&t_handler*清理线程资源}if(err!=kNoErros_thread_log("Threadexitwitherr:%d",errreturnerr;}线程互斥实验: 余票数余票数线程互斥关键代码分析函数#include#include#defineos_mutex_log(M,...)custom_log("OS",M,##VA_ARGS#defineUSE_MUTEX#ifdef#defineMUTEX_LOCK()mico_rtos_lock_mutex(&mutex)#defineMUTEX_UNLOCK()mico_rtos_unlock_mutex(&mutex)#defineMUTEX_LOCK()intg_tickets100;//剩余票数mico_mutex_tmutex=NULL;voidrun(void*arg{char*name=(char*)arg;{if(g_tickets<=0){goto}g_tickets--os_mutex_log("thread%s,remaintickets:%d",name,g_tickets);}os_mutex_log("thread:%sexitnow",name);}intapplication_start(void{OSStatuserr=kNoErr;char*p_name1="t1";char*p_name2="t2";char*p_name3="t3";char*p_name4="t4";/*Createaerr=mico_rtos_init_mutex(&mutex);require_noerr(err,exit);/*/*创建4个卖票线程err=mico_rtos_create_thread(NULL,MICO_APPLICATION_PRIORITY+1,"t1",run,0x800,p_name1);require_noerr(err,exit);err=mico_rtos_create_thread(NULL,MICO_APPLICATION_PRIORITY+1,"t2",run,0x800,p_name2);require_noerr(err,exit);err=mico_rtos_create_thread(NULL,MICO_APPLICATION_PRIORITY+1,"t3",run,0x800,p_name3);require_noerr(err,exit);err=mico_rtos_create_thread(NULL,MICO_APPLICATION_PRIORITY+1,"t4",run,0x800,p_name4);require_noerr(err,exit);returnerr;}消息队列开开线发发送数结消息队列关键代码分析函数#include#include#defineos_queue_log(M,...)custom_log("OS",M,##VA_ARGS//全局变量,在所有线程staticmico_queue_tos_queue=typedefstruct_msg{int}voidreceiver_thread(void{UNUSED_PARAMETER(argOSStatusmsg_treceived0接收缓存{/*阻塞直到消息队列有数据err=mico_rtos_pop_from_queue(&os_queue,&received,MICO_WAIT_FOREVER);require_noerr(err,exit);os_queue_log("Receiveddatafromqueue:value=%d",received.value}mico_rtos_delete_thread(NULL}voidsender_thread(void{UNUSED_PARAMETER(argOSStatuserr=msg_tmy_message0发送缓存{//发送数据到消息队mico_rtos_push_to_queue(&os_queue,&my_message,MICO_WAIT_FOREVER);require_noerr(err,exit);os_queue_log("senddatatoqueue");mico_thread_sleep(1);}mico_rtos_delete_thread(NULL}intapplication_start(void{OSStatusOSStatuserr=//初始化消息队列,分配空间可以存放3err=mico_rtos_init_queue(&os_queue,"queue",sizeof(msg_t),3);require_noerr(err,exit);err=mico_rtos_create_thread(NULL,MICO_APPLICATION_PRIORITY,"receiver",receiver_thread,500,NULL);require_noerr(err,exit);err=mico_rtos_create_thread(NULL,MICO_APPLICATION_PRIORITY,"sender",sender_thread,500,NULL);require_noerr(err,exit);returnerr;}信号信号量软件流程图信号量关键代码分析函数#include#include#defineos_sem_log(M,...)custom_log("OS",M,##VA_ARGSstaticmico_semaphore_tos_sem=NULL;voidrelease_thread(void*arg){UNUSED_PARAMETER(argos_sem_log("releasesemaphore");mico_thread_sleep(3);}}intapplication_start(void{OSStatuserr=os_sem_log(os_sem_log("testbinarysemaphore"//创建一个0/1err=mico_rtos_init_semaphore(&os_sem,1);//0/1binarysemaphore||0/Nsemaphorerequire_noerr(err,exit);err=mico_rtos_create_thread(NULL,MICO_APPLICATION_PRIORITY,"releasesem",release_thread,500,NULL);require_noerr(err,exit);mico_rtos_get_semaphore(&os_sem,MICO_WAIT_FOREVER);//waituntilgetsemaphoreos_sem_log("getsemaphore");}if(os_sem!=NULL)returnerr;}相关库函数详细说明1.函数OSStatusmico_init_timer(mico_timer_t*timer,uint32_ttime_ms,timer_handler_tfunction,void*arg2.函数3.函数4.函数5.函数6.函数OSStatusmico_rtos_create_thread(mico_thread_t*thread,uint8_tpriority,constchar*name,mico_thread_function_tfunction,uint32_tstack_size,void*arg)7.函数8.函数9.函数无10.函数无11.函数OSStatusmico_rtos_init_mutex(mico_mutex_t*mutex12.函数无13.函数无14.函数OSStatusmico_rtos_init_queue(mico_queue_t*queue,constchar*name,uint32_tmessage_size,uint32_tnumber_of_messages)name:消息队列名称15.函数OSStatusmico_rtos_push_to_queue(mico_queue_t*queue,void*message,uint32_ttimeout_ms16.函数OSStatusmico_rtos_pop_from_queue(mico_queue_t*queue,void*message,uint32_ttimeout_ms从消息队列消息17.函数18.函数为19.函数20.函数WLANStationWi-FiWi-Fi经验即可实现快速的开发。Wi-Fi网络处理器子系统特有一个Wi-Fi片上互联网并且包含一个额外的ARMMCU,此MCU可完全免除应用MCU802.11b/g/nMAC256位加实验目的实验原理本实验基于MiCO实时操作系统内核的网络基础实验,在此基础上我们通过开出一个单独的任务AP;实验内容实验现象软件流程及关键代码分析实验现象1.14WLANStation运行串log信软件流程图1.15WLLANStation实验软件流关键代码分析#include#include/*本地路由和keyword信息,指定方式连接char=char*ap_key=#definewifi_station_log(M,...)custom_log("WIFI",M,##VA_ARGSstaticvoidmicoNotify_ConnectFailedHandler(OSStatuserr,void*{wifi_station_log("joinWlanfailedErr:%d",}staticvoidmicoNotify_WifiStatusHandler(WiFiEventevent,void*{switch{case}}intapplication_start(void{OSStatuserr=kNoErr;network_InitTypeDef_adv_stwNetConfigAdv={0};wifi_station_log("wifistationapi");根据1、如果定义了MICO_WLAN_CONNECTION_ENABLE宏i_smnt包括操作系统和射频的初始化,,异步,k按钮等2、如果不定义,全部函数自己手动mico_system_init(mico_system_context_init(0));#ifdefMICO_WLAN_CONNECTION_ENABLE//空代码,easylink配置设备Station模式wifi_station_log("enteringeasylinkmode");//用户函数,当连接状态改变时响err=mico_system_notify_register(mico_notify_WIFI_STATUS_CHANGED,(void*)micoNotify_WifiStatusHandler,NULL);require_noerr(err,exit//用户函数,当无线连接失err=mico_system_notify_register(mico_notify_WIFI_CONNECT_FAILED,(void*)micoNotify_ConnectFailedHandler,NULL);require_noerr(err,exit//初始strcpy((char*)wNetConfigAdv.ap_info.,ap_);//wlan字符串strcpy((char*)wNetConfigAdv.key,ap_key); //wlankey字符串wNetConfigAdv.key_len=strlen(ap_key); //wlankey长度*wNetConfigAdv.ap_info.security=SECURITY_TYPE_AUTO;//wlan安全模式wNetConfigAdv.ap_info.channel=0; //自动选择通道wNetConfigAdv.dhcpMode=DHCP_; //从DHCP服务器中获取IP地址wNetConfigAdv.wifi_retry_interval=100; //开始连接wifi_station_log("connectingto%s...",ap_);{LinkStatusTypeDeflink_status={0};//检查连接是否成if(link_status.is_connected==1)//获取IP状态信IPStatusTypedefip_status={0};wifi_station_log("Alreadyconnectedto%ssuccessful",ap_);wifi_station_log("IPAddress:%s",ip_status.ip);wifi_station_log("Mask:%s",ip_status.mask);wifi_station_log("Gateway:%s",ip_status.gate);wifi_station_log("Broadcast:%s",ip_status.broadcastip);wifi_station_log("DNSServer:%s",ip_status.dns);wifi_station_log("MacAddress:%s",ip_status.mac);switchcasecasecase:caseDHCP_Server:}returnerr;}相关库函数详细说明1.OSStatusmicoWlanStartAdv(network_InitTypeDef_adv_st*networkInitTypeDefadv2.OSStatusmicoWlanGetIPStatus(IPStatusTypedef*outNetpara,WiFi_Interface3.OSStatusmicoWlanGetLinkStatus(LinkStatusTypeDefWLANSoftAP在Flash中。路由器的硬件处理能力使它能够处理比较大量的数据,从而实现高带宽的传输能力。由器的高带宽数据传输功能,但是在物联网的领域,却有一些适合SoftAP的场景。路由器的和输入给家电,家电重启后就能连上该路由器。之前介绍的Easylink的方法更加方便地实验目的实验原理本实验基于MiCO实时操作系统内核的网络基础实验,在此基础上我们通过开出一个单独的任务实验内容8实验现象软件流程及关键代码分析实验现象**Enablewlanconnection,starteasylinkconfigurationifnowlansettingsareexisted//#define1.16WLANSoftAPlog信在WiFi列表中找到 软件流程图1.17WLANSoftAP实验软件流关键代码分#include#include#definewifi_softap_log(M,...)custom_log("WIFI",M,##VA_ARGSstaticchar= staticchar*ap_key=intapplication_start(void{OSStatuserr=kNoErr;err=mico_system_init(mico_system_context_init(0));require_noerr(err,exit);#ifdefwifi_softap_log("pleasecommentmacroMICO_WLAN_CONNECTION_ENABLE");strcpy((char*)wNetConfig.wifi_key,ap_key);wNetConfig.wifi_mode=Soft_AP;wNetConfig.dhcpMode=DHCP_Server;wifi_softap_log(":%skey:%s",ap_,ap_key);returnerr;}相关库函数详细说明1.OSStatusmicoWlanStart(network_InitTypeDef_st* 实TCP/IP(通常它是指传输控制协议/网际协议,TransmissionControlProtocol/InternetProtocol)是发展至TCP/IP,是一组不同层次上的多个协议的组合。TCP/IP通常被认为是一个四层协议系统,如图所示。每一层负责不同的功能:网络层,有时也称作互联网层,处理分组在网络中的活动,例如分组的选路。在TCP/IP协议族IP协议(网际协议),ICMP协议(Internet互联网控制报文协议)IGMP协议(Internet组管理协议)。传输层主要为两台主机上的应用程序提供端到端的通信。在TCP/IP协议族中,有两个互不相同的传输协议:TCP(传输控制协议)和UDP(用户数据报协议)。TCP为两台主机提供高可靠性的数据通可以忽略所有这些细节。而另一方面,UDP则为应用层提供一种非常简单的服务。它只是把称作数据应用层负责处理特定的应用程序细节。几乎各种不同的TCP/IP实现都会提供下面这些通用的应 OSI传输层:在系统之间提供可靠的、透明的数据传送,提供端到端的错误恢复和流控制;表示层:处理被传输数据的表示问题,完成数据转换、格式化和文本压缩;应用层:是直接面对用户的一层,提供0SI用户服务;OSI模型的l~3层提供了网络,4~7层用于支持端到端通信。与0SI参考模型相比,TCP/IP模型较适合,但TCP/IP成为了互联网络协议的市场标准。1.19客户端和服务器端编实验目的实验原理本实验基于MiCO实时操作系统内核的网络基础实验,在此基础上我们通过开出一个单独的任务 实验内容 实验现象软件流程及关键代码实验现象1)PCTCP工具建立一个TCP1.20TCP图1.21tcp_实验串口log信1.22TCP服务1.23TCPServer收发数软件流程图关键代码分析

图1.24 图1.25 #include#include#include#define_log(M,...)custom_log("TCP",M,##VA_ARGS//此处是局域网的实验:服务器的ip和设备的ip必须在同一网staticchartcp_remote_ip[16]="6";/*remoteipaddress*/staticinttcp_remote_port=60000; /*remoteport*//*whenconnectedwlansuccess,createsocket*/voidtcp__thread(void*arg){OSStatusstructsockaddr_taddr;structtimeval_tt;fd_setreadfds;inttcp_fd=-1,len;char*buf=NULL;buf=(char*)malloc(1024require_action(buf,exit,err=kNoMemoryErr//建立TCPtcp_fd=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);require_action(IsValidSocket(tcp_fd),exit,err=kNoResourcesErr);addr.s_ip=inet_addr(tcp_remote_ip);addr.s_port=tcp_remote_port;tcp__log("Connectingtoserver:ip=%sport=%d!",tcp_remote_ip,tcp_remote_port);err=connect(tcp_fd,&addr,sizeof(addr));require_noerr(err,exit);tcp__log("Connectsuccess!");t.tv_sec=t.tv_usec={FD_ZERO(&readfds);FD_SET(tcp_fd,&readfds);require_action(select(tcp_fd+1,&readfds,NULL,NULL,&t)>=0,exit,err=kConnectionErr/*接收wlan数据,echo反射回去*/ifFD_ISSETtcp_fd&readfds{len=recv(tcp_fd,buf,1024,require_action(len>=0,exit,err=kConnectionErrif(len==tcp__log("TCPisdisconnected,fd:%d",tcp_fd);gotoexit;}tcp__log("fd:%d,recvdata%d",tcp_fd,len);len=send(tcp_fd,buf,len,0);tcp__log("fd:%d,senddata%d",tcp_fd,}}if(err!=kNoErr)tcp__log("TCPthreadexitwitherr:%d",err);if(buf!=NULL)(buf);SocketClose(&tcp_fd);}intapplication_start(void{OSStatuserr=//需要进入easylink模#ifndeftcp__log("pleasedefinemacroMICO_WLAN_CONNECTION_ENABLE");gotoexit;/*StartMiCOsystemfunctionsaccordingtoerrerr=mico_system_init(mico_system_context_init(0)require_noerr(err,exit/*检查链路状态{LinkStatusTypeDeflink_status={0};//if(link_status.is_connected==1)/*开启线程err=mico_rtos_create_thread(NULL,MICO_APPLICATION_PRIORITY,",_thread,NULLrequire_noerr_string(err,exit,"ERROR:Unabletostartthe thread."returnerr;}相关库函数详细说明1.intsocket(int,inttype,int4.ssize_tsend(intsockfd,constvoid*buf,size_tlen,int5.ssize_trecv(intsockfd,void*buf,size_tlen,close(intTCPServer实验目的实验原理本实验基于MiCO实时操作系统内核的网络基础实验,在此基础上我们通过开出一个单独的任务(application_start)来实现TCPServer工作模式;ServerServer端提供了多种服务,为多个客户端连接后提供服务,比如登录、、等。实验内容将MiCOKit-3165做为TCPServer,通过电脑上的TCP工具开启 实验现象软件流程及关键代码实验现象1.26tcpserverlog信 图1.27创建 图1.28连接到 的log信图1.29 1.30tcpserver回传数1.31收发数据log信软件流程图1.32tcpserver软件流程关键代码分析#include#include#include#definetcp_server_log(M,...)custom_log("TCP",M,##VA_ARGS#defineSERVER_PORT60000/*setupatcpserver,portatvoid_thread(void{OSStatuserr=intfd=(int)arg;intlen=0;char*buf=structtimeval_trequire_action(buf,exit,err={lenrecvfdbuf10240如果没有数据,此函数会阻塞require_action(len>=0,exit,err=kConnectionErr);if(len==tcp_server_log("TCPisdisconnected,fd:%d",fd);gotoexit;}tcp_server_log("fd:%d,recvdata%dfrom",fd,len);len=send(fd,buf,len,0);tcp_server_log("fd:%d,senddata%dto",fd,}if(err!=kNoErr)tcp_server_log("TCPthreadexitwitherr:%d",err);if(buf!=NULL)(buf);SocketClose(&fd);}/*TCPserver线程voidtcp_server_thread(void*arg{OSStatuserr=structsockaddr_tserver_addr,_addr;socklen_tsockaddr_t_size=sizeof(_addr);char_ip_str[16];inttcp_listen_fd=-1,_fd=-1;fd_setreadfds;tcp_listen_fd=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);require_action(IsValidSocket(tcp_listen_fd),exit,err=kNoResourcesErr);server_addr.s_ip=INADDR_ANY;/*Acceptconenctionrequestonallnetworkinterface*/server_addr.s_port=SERVER_PORT;/*Serverlistenonport:60000*/err=bind(tcp_listen_fd,&server_addr,sizeof(server_addr));require_noerr(err,exit);err=listen(tcp_listen_fd,0);require_noerr(err,exit);{FD_ZERO(&readfdsFD_SET(tcp_listen_fd,&readfdsrequire(select(tcp_listen_fd+1,&readfds,NULL,NULL,NULL)>=0,exit{//只要产生接就开辟一个工作者线_fd=accept(tcp_listen_fd,&_addr,&sockaddr_t_size);if(IsValidSocket(_fd)){inet_ntoa(_ip_str,_addr.s_iptcp_server_log("TCP%s:%dconnected,fd:%d",_ip_str,_addr.s_port,_fd);if(kNoErr!=mico_rtos_create_thread(NULL,MICO_APPLICATION_PRIORITY,"TCPs",tcp__thread,0x800,(void*)_fd))SocketClose(&_fd}}}if(err!=kNoErr)tcp_server_log("Serverlisternerthreadexitwitherr:%d",err);SocketClose(&tcp_listen_fd);}intapplication_start(void{OSStatuserr=IPStatusTypedef//需要进入easylink模#ifndeftcp_server_log("pleasedefinemacroMICO_WLAN_CONNECTION_ENABLE");gotoexit;/*StartMiCOsystemfunctionsaccordingtomico_config.h*/err=mico_system_init(mico_system_context_init(0));require_noerr(err,exit);{LinkStatusTypeDeflink_status={0};//检查连接是否成if(link_status.is_connected==1)//将server的ip和port打印出来,这样客户端就可以根据ip&port连接服务器tcp_server_log("server'sipis%s,portis/*StartTCPserverlistenererr=mico_rtos_create_thread(NULL,MICO_APPLICATION_PRIORITY,"TCP_server",tcp_server_thread,0x800,NULL);require_noerr_string(err,exit,"ERROR:Unabletostartthetcpserverthread."returnerr;}相关库函数详细说明2.intlisten(intsockfd,intUDP单播实UDP是UserDatagramProtocol的简称,中文名是用户数据报协议,是I RFC768是UDP的正式规范。UDP在IP报文的协议号是17。据包进行排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。UDP用来支持那议所掩盖,但是即使是在今天UDP仍然不失为一项非常实用和可行的网络传输层协议。8个字节用来包实验目的 实验原理本实验基于 实验内容实验现象软件流程及关键代码实验现象1.33udpunicastlog信1.34udp连接并发送数1.35udp单播收发数1.36udp单播收发数log信软件流程图无关键代码分析#include#include#defineudp_unicast_log(M,...)custom_log("UDP",M,##VA_ARGS#defineLOCAL_UDP_PORT/*createudpvoidudp_unicast_thread(void{OSStatusstructsockaddr_taddr;fd_setreadfds;socklen_taddrLen=sizeof(addr);intudp_fd=-1,len;charip_address[16];uint8_t*buf=NULL;buf=require_action(buf,exit,err=/*EstablishaUDPporttoreceiveanydatasenttothisport*/udp_fd=socket(AF_INET,SOCK_DGRM,IPPROTO_UDP);require_action(IsValidSocket(udp_fd),exit,err=kNoResourcesErraddr.s_ip=INADDR_ANY;/*localipaddress*/addr.s_port=LOCAL_UDP_PORT;/*20000*/err=bind(udp_fd,&addr,sizeof(addr));require_noerr(err,exit);//A客户端UDPsocketip和port打印出来,这样B客户端就可以根据ip&port发送数据udp_unicast_log("kit'sudpipis%s,portis{require_action(select(udp_fd+1,&readfds,NULL,NULL,NULL)>=0,exit,err=kConnectionErr/*Readdatafromudpandsenddatabackif(FD_ISSET(udp_fd,&readfds{/*注意,此时addr会出B客户端的ip和要求B客户端建立UDP,输入A客户端的IP和端口即len=recvfrom(udp_fd,buf,1024,0,&addr,&addrLen);require_action(len>=0,exit,err=kConnectionErr);inet_ntoa(ip_address,addr.s_ipudp_unicast_log("udprecvfrom%s:%d,len:%d",ip_address,addr.s_port,len);sendto(udp_fd,buf,len,0,&addr,sizeof(structsockaddr_t));}}if(buf!=NULL)(buf);}intapplication_start(void{OSStatuserr=//需要进入easylink模#ifndefudp_unicast_log("pleasedefinemacroMICO_WLAN_CONNECTION_ENABLE");gotoexit;/*StartMiCOsystemfunctionsaccordingtomico_config.h*/err=mico_system_init(mico_system_context_init(0));require_noerr(err,exit);{LinkStatusTypeDef//if(link_status.is_connected==1)err=mico_rtos_create_thread(NULL,MICO_APPLICATION_PRIORITY,"udp_unicast",udp_unicast_thread,0x800,NULL);require_noerr_string(err,exit,"ERROR:UnabletostarttheUDPthread."returnerr;}相关库函数详细说明1.ssize_tsendto(intsockfd,constvoid*buf,size_tlen,intflags,conststructsockaddr_t*dest_addr,socklen_taddrlen)2.ssize_trecvfrom(intsockfd, flags,struct socklen_t*addrlen)UDP广播实实验目的实验原理本实验基于MiCO实时操作系统内核的网络基础实验,在此基础上我们通过开出一个单独的任务(application_start)UDPMiCOMiCO内部的具实验内容实验现象软件流程及关键代码实验现象1.37udpbroadcastlog信1.38udp广播客户端接收数软件流程无关键代码#include#include#defineudp_broadcast_log(M,...)custom_log("UDP",M,##VA_ARGS#defineLOCAL_UDP_PORT#defineREMOTE_UDP_PORT/*createudpvoidudp_broadcast_thread(void{UNUSED_PARAMETER(argOSStatusintudp_fd=-1;UDPsocket,绑定端udp_fd=socket(AF_INET,SOCK_DGRM,IPPROTO_UDPrequire_action(IsValidSocket(udp_fd),exit,err=kNoResourcesErraddr.s_ip=INADDR_ANY;err=bind(udp_fd,&addr,sizeof(addr));require_noerr(err,exit);udp_broadcast_log("StartUDPbroadcastmode,localport:%d,remoteport:%d",LOCAL_UDP_PORT,{char*data="UDPbroadcastdata";udp_broadcast_log("broadcastnow!");addr.s_ip=INADDR_BROADCAST;注意是往别人的端口发送,所以要求接收者建立P且绑定01端口才能收到广播数据比如:对方:2.5525本地端口sendto(udp_fd,data,strlen(data),0,&addr,sizeof(addr)}}intapplication_start(void{OSStatuserr=//需要进入easylink模#ifndeftcp_server_log("pleasedefinemacroMICO_WLAN_CONNECTION_ENABLE");gotoexit;/*StartMiCOsystemfunctionsaccordingtomico_config.h*/err=mico_system_init(mico_system_context_init(0));require_noerr(err,exit);{LinkStatusTypeDeflink_status={0};//检查连接是否成if(link_status.is_connected==1)err=mico_rtos_create_thread(NULL,MICO_APPLICATION_PRIORITY,"udp_broadcast",udp_broadcast_thread,0x800,NULL);require_noerr_string(err,exit,"ERROR:UnabletostarttheUDPthread."returnerr;}相关库函数详细说明UDP组播实实验目的实验原理本实验基于MiCO实时操作系统内核的网络基础实验,在此基础上我们通过开出一个单独的任务(application_start)UDPMiCOMiCO内部的具实验内容实验现象软件流程及关键代码实验现象图1.39mdns实验串口log信 图1.40mdns实验APP端内软件流无#include#include#include #include#definemdns_log(M,...)custom_log("mDNS",M,##VA_ARGS#define#define#define#definevoidmy_bonjour_server(WiFi_Interfaceinterface{char*temp_txt2;IPStatusTypedefmdns_init_tinit.service_name=BONJOUR_SERVICE; name#xxxxxx.local.snprintf(temp_txt,100,"%s#%c%c%c%c%c%c.local.", para.mac[7], para.mac[9],para.mac[10],para.mac[11]init.host_name=(char*) snprintf(temp_txt,100, para.mac[7], para.mac[9],para.mac[10], init.instance_name=(char*)init.service_port=//takesome/*forexample,modifytemp_txt2= sprintf(temp_txt,"MAC=%s.",temp_txt2);temp_txt2= sprintf(temp_txt,"%sFirmwareRev=%s.",temp_txt,temp_txt2);temp_txt2= sprintf(temp_txt,"%sHardwareRev=%s.",temp_txt,temp_txt2);temp_txt2 sprintf(temp_txt,"%sMICOOSRev=%s.",temp_txt,temp_txt2);temp_txt2= sprintf(temp_txt,"%sModel=%s.",temp_txt,temp_txt2);temp_txt2= sprintf(temp_txt,"%sProtocol=%s.",temp_txt,temp_txt2);temp_txt2= sprintf(temp_txt,"%sManufacturer=%s.",temp_txt,temp_txt2);mdns_log("TXTTXTFirmwareHardwareMICOOS Model=MiCOKit-Manufacturer=MXCHIP/*takesomedataintxt_record*/init.txt_record=(char*)strdup(temp_txt);mdns_add_record(init,interface,1500/*memeoy*/}intapplication_start(void{OSStatuserr=//需要进入easylink模#ifndefdns_log("pleasedefinemacroMICO_WLAN_CONNECTION_ENABLE");gotoexit;/*StartMiCOsystemfunctionsaccordingtomico_config.h*/err=mico_system_init(mico_system_context_init(0));require_noerr(err,exit);{LinkStatusTypeDeflink_status={0};//检查连接是否成if(link_status.is_connected==1)/*mDNSrecord*/returnerr;}相关库函数详细说明http客户超文本传输协议(HTTP,HyperTextTransferProtocol)是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论