tag 标签: w5500

相关博文
  • 热度 28
    2015-12-9 13:53
    1966 次阅读|
    0 个评论
    2015年12月2日,第四届韩合集成电路技术交流会在WESTIN酒店深圳世界之窗店顺利举办。本届交流会与会嘉宾主要是韩合集成电路项目的主要领导、驻在深圳的9家韩合IC企业以及相关企业代表,主要围绕公司产品和2015年取得的技术成果展开技术交流,WIZnet由陈总带队一行四人参加了此次会议。 从本次交流会获悉,中韩IC产业2014年合作贸易规模达350亿美金,有望继续保持增长。会议期间,陈博士向大家介绍了WIZnet公司的基本情况、全硬件TCP/IP协议栈网络芯片的技术优势、应用领域以及在物联网这一新兴领域的应用前景。 除此之外,中兴介绍了以小兴看看为代表的智能硬件领域的成果,Glovance介绍了其数字音频解决方案,MAPS介绍了其磁共振式无线充电技术与无线充电一体化解决方案,Semisens介绍了其触控技术的3大应用领域,包括智能手机及平板电脑、消费类电子、穿戴式设备等,ZINITIX介绍了其触控IC、驱动IC、电源IC等,CHIPSBRAIN介绍了其256bit AES防复制ASIC的项目概况,CLAIRPIXEL介绍了其用于CCTV/BB的全高清CIS研发状况,HiDeep介绍了其触控Sensor技术的应用等等。 另外,我们还借此机会展示了WIZnet最新开发的W5500S2E和W7500S2E项目,以及W7500P和WIZwiki-W7500P开发板,吸引了数位行内人士的驻**流。 更多内容,请登录WIZnet官网 www.iwiznet.cn 或关注微信公众平台:iWIZnet
  • 热度 25
    2015-9-1 14:22
    1630 次阅读|
    0 个评论
    一 实验背景 之前一段时间专门研究了固件升级的方法,主要是通过网页或者上位机软件实现远程固件升级。最近正好在研究TFTP简单文件传输协议,于是我就尝试给设备添加联网功能,通过TFTP实现网络更新固件,而后发现这种升级方式所占设备内存小,可以穿越多数***,并且不需要去设备现场,在办公室通过网络就能将成千上万用户或设备的固件升级,简单高效。 其实现在很多设备都已经具有网络固件升级功能,例如我们经常用到的电视机顶盒、家用无线路由器等设备。很多设备升级内核都是通过TFTP协议上传的,因为TFTP实现非常的简单,比如自己家里用的路由器就可以通过TFTP协议升级。 二 TFTP基础普及 TFTP是TCP/IP协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议,基于UDP协议实现,端口号为69。通过TFTP协议,可以实现网络中两台计算机之间的文件上传与下载,如文件备份,为无盘工作站下载引导文件,下载初始化代码到打印机、集线器和路由器。当然,还有就是我们本次用到的对设备进行固件升级。 TFTP协议是专为小文件传输设计的,提供不复杂、开销不大的文件传输服务,缺乏标准 FTP 协议的许多特征。TFTP 只能从远程服务器上读、写文件(邮件)或者读、写文件传送给远程服务器。它不能列出目录并且当前不提供用户认证。当前 TFTP 有 3 种传输模式: netASCII 模式即 8 位 网络ASCII码 ;octet即八位组模式;邮件模式,这种模式现在已经废止不用了。主机双方也可以自己定义其它模式。 TFTP基于UDP协议实现,而UDP使用IP。因此一个TFTP包中会有如图1所示的以下几段:本地媒介头,IP头,UDP数据报头,TFTP数据报。TFTP在IP头中不指定任何数据,但是它使用UDP中的源和目标端口以及包长度域。由TFTP使用的包标记(TID)在这里被用做端口,因此TID必须介于0到65,535之间。图中显示了5种TFTP报文格式,每个报文格式TFTP报文的头两个字节表示操作码。之后对于不同的报文格式存在差异。 图1 TFTP报文格式 下面分别对每个报文包进行分析: RRQ和WRQ包的报文格式如表1所示。 RRQ/WRQ包 Opcode Filename  0 Mode 0 2 bytes string 1 byte string 1 byte 表1 RRQ和WRQ包的报文格式 RRQ(读请求)报文由客户使用,用来建立一条从服务器读数据的连接。WRQ(写请求)报文由客户使用,用来建立一条把数据写到服务器的连接,它的格式与RRQ相同,RRQ包的操作码为1,WRQ包的操作码为2。Filename(文件名字段)说明客户要读或写的位于服务器上的文件,文件名是NETASCII码字符,以0结束。Mode(模式字段)是一个ASCII码串netascii或octet(大小写可任意组合),同样以0字节结束。netascii表示数据是以成行的ASCII码字符组成,以两个字节—回车字符后跟换行字符(称为CR / LF)作为行结束符。 OCTET模式用于传输文件,这种文件在源机上以8位格式存储。在使用MAIL模式时,用户可以在FILE处使用接收人地址,这个地址可以是用户名或用户名@主机的形式,如果是后一种形式,允许主机使用电子邮件传输此文件。如果使用MAIL类型,包必须以WRQ开始,否则它与NETASCII完全一样。 DATA包的报文格式如表2所示。 DATA包 Opcode Block  0 2 bytes 2 bytes Data 表2 DATA包的报文格式 DATA数据包的opcode为3,它还包括有一个数据块号和数据。数据块号域从1开始编码,每个数据块加1,这样接收方可以确定这个包是新数据还是已经接收过的数据。数据域从0字节到512字节。如果数据域是512字节则它不是最后一个包,如果小于512字节则表示这个包是最后一个包。如果最后一个包正好为512字节,则再发送一个0字节的包用于表示结束。 ACK包的报文格式如表3所示。 ACK包 Opcode Block 2 bytes 2 bytes 表3 ACK包的报文格式 ACK包用于确认数据包已收到。ACK包的操作码为4。当接收方收到一个数据包后,会向发送方发送一个ACK包;而发送方则会在收到一个ACK包后继续发送下一个包。若发送完未能收到ACK包,则会使用超时机制,重新发送刚才的数据包。除了ACK和用于中断的包外,其它的包均需得到确认。发出新的数据包等于确认上次的包。WRQ和DATA包由ACK或ERROR数据包确认,而RRQ数据包由DATA或ERROR数据包确认。 ERROR包的报文格式如表4所示。 继续阅读:http://www.iwiznet.cn/blog/?p=7512    
  • 热度 23
    2015-8-21 18:53
    1209 次阅读|
    0 个评论
    关于此项目 今天,我要用Arch Link为大家做一个物联网的展示,我们可以实现上传数据到dweet.io病能实时查看信息。Arch Link是一个mbed是能的开发板,基于 Nordic nRF51822及WIZnet W5500 以太网接口连接(由SeeedStudio设计)。要准备好使用Arch Link及其他Grove传感器制作编译demo。 演示时你需要获知以下信息: 1. 熟悉mbed开发平台; 2. 精通dweet.io物理网云平台。 现在,让我们开始吧。 关于 DWEET.IO Dweet.io  不需要安装及注册。它是用于物联网的M2M方式。 用于机器,传感器,设备,机器人等都非常容易发布数据并进行订阅。我们称发布数据为”dweets”。事实上,可以把dweet.io用作Twitter。 硬件 按照下图准备就绪。 1)将底板插入到你的Arch Link上,并连接Grove – Temperature 到A0端口; 2)用网线将Arch Link连网 3)用USB线将Arch Link与PC连接 确认你有MBED存储设备,如下图所示。 软件 如果你还没有mbed账号。点击 这里 进行注册。 随后导入 程序 到你的编译器。 在编译器右上角选择Arch Link mbed平台。 随后你就能在下图中看到模拟盒子,选择 Arch Link平台。 编译程序后,会有一个hex文件生成。 将hex文件复制到MBED存储设备,随之MCU就自动重启了。等待几分钟后点击 这里 查看数据信息。   更多内容,请访问: http://www.seeedstudio.com/recipe/301-an-iot-demo-made-with-arch-link-mbed-platform.html
  • 热度 25
    2015-8-10 17:04
    1362 次阅读|
    0 个评论
    转自: http://www.embed-net.com/thread-230-1-1.html 0 前言 最近在学习MQTT,发现MQTT还是挺好用的,于是花了点时间做了一个简单的应用示例,希望能给需要做这方面的人一些参考。 相关背景知识: http://www.embed-net.com/thread-224-1-1.html 具体功能为: 1,STM32F405为主控芯片,它通过传感器采集环境数据,比如温度,湿度,光照度,大气压强等; 2,主控芯片通过W5500模块将测量的数据通过MQTT协议方式发布到MQTT服务器(服务器域名和IP见固件程序); 3,主控订阅LED灯控制的消息,当接收到对应的控制指令后点亮或者熄灭对应的LED灯; 4,安卓手机端订阅传感器数据的消息,当接收到消息后将传感器数据在界面显示; 5,安卓手机可发送点亮或者熄灭LED灯的指令到服务器,然后服务器会将该指令转发给STM32主控,然后STM32主控解析该指令并执行指令。 1 单片机端实现 MQTT协议是基于TCP的协议,所以我们只需要在单片机端实现TCP客户端代码之后就很容易移植MQTT了,STM32F4+W5500实现TCP客户端的代码我们以前已经实现过,代码下载地址为: http://www.embed-net.com/thread-87-1-1.html 当然,如果你想在代码里面直接使用服务器域名方式进行连接,我们还得在TCP客户端代码里面集成DNS的代码,当然在上面这个连接里面也有相关的代码。 MQTT代码源码下载地址: http://www.eclipse.org/paho/ 在STM32这边我们使用的是C/C++ MQTT Embedded clients代码。 硬件连接如下图所示: 1.1 MQTT的移植 MQTT的移植非常简单,将C/C++ MQTT Embedded clients的代码添加到工程中,然后我们只需要再次封装4个函数即可: int transport_sendPacketBuffer(unsigned char* buf, int buflen); int transport_getdata(unsigned char* buf, int count); int transport_open(void); int transport_close(void); transport_sendPacketBuffer:通过网络以TCP的方式发送数据; transport_getdata:TCP方式从服务器端读取数据,该函数目前属于阻塞函数; transport_open:打开一个网络接口,其实就是和服务器建立一个TCP连接; transport_close:关闭网络接口。 如果已经移植好了socket方式的TCP客户端的程序,那么这几个函数的封装也是非常简单的,程序代码如下所示: /** * @brief  通过TCP方式发送数据到TCP服务器 * @param  buf 数据首地址 * @param  buflen 数据长度 * @retval 小于0表示发送失败 */ int transport_sendPacketBuffer(unsigned char* buf, int buflen) { return send(SOCK_TCPS,buf,buflen); } /** * @brief  阻塞方式接收TCP服务器发送的数据 * @param  buf 数据存储首地址 * @param  count 数据缓冲区长度 * @retval 小于0表示接收数据失败 */ int transport_getdata(unsigned char* buf, int count) { return recv(SOCK_TCPS,buf,count); } /** * @brief  打开一个socket并连接到服务器 * @param  无 * @retval 小于0表示打开失败 */ int transport_open(void) { int32_t ret; //新建一个Socket并绑定本地端口5000 ret = socket(SOCK_TCPS,Sn_MR_TCP,5000,0×00); if(ret != SOCK_TCPS){ printf(“%d:Socket Error\r\n”,SOCK_TCPS); while(1); }else{ printf(“%d:Opened\r\n”,SOCK_TCPS); } //连接TCP服务器 ret = connect(SOCK_TCPS,domain_ip,1883);//端口必须为1883 if(ret != SOCK_OK){ printf(“%d:Socket Connect Error\r\n”,SOCK_TCPS); while(1); }else{ printf(“%d:Connected\r\n”,SOCK_TCPS); } return 0; } /** * @brief  关闭socket * @param  无 * @retval 小于0表示关闭失败 */ int transport_close(void) { close(SOCK_TCPS); return 0; } 完成了这几个函数,然后我们就可以根据官方提供的示例代码实现我们自己的代码了,比如我们向代理服务器发送一个消息的代码如下所示: /** * @brief  向代理(服务器)发送一个消息 * @param  pTopic 消息主题 * @param  pMessage 消息内容 * @retval 小于0表示发送失败 */ int mqtt_publish(char *pTopic,char *pMessage) { int32_t len,rc; MQTTPacket_connectData data = MQTTPacket_connectData_initializer; unsigned char buf ; MQTTString topicString = MQTTString_initializer; int msglen = strlen(pMessage); int buflen = sizeof(buf); data.clientID.cstring = “me”; data.keepAliveInterval = 5; data.cleansession = 1; len = MQTTSerialize_connect(buf, buflen, data); /* 1 */ topicString.cstring = pTopic; len += MQTTSerialize_publish(buf + len, buflen – len, 0, 0, 0, 0, topicString, (unsigned char*)pMessage, msglen); /* 2 */ len += MQTTSerialize_disconnect(buf + len, buflen – len); /* 3 */ transport_open(); rc = transport_sendPacketBuffer(buf,len); transport_close(); if (rc == len) printf(“Successfully published\n\r”); else printf(“Publish failed\n\r”); return 0; } 下面我们看下主函数的代码,思路也比较清晰: int main(void) { static char meassage ; int rc; char *led; char led_value; float temperature,humidity,light,pressure; srand(0); //配置LED灯引脚 LED_Config(); //初始化配置网络 network_init(); while(1){ memset(meassage,0,sizeof(meassage)); //订阅消息 rc = mqtt_subscrib(“pyboard_led”,meassage); printf(“rc = %d\n\r”,rc); if(rc = 0){ printf(“meassage = %s\n\r”,meassage); //解析JSON格式字符串并点亮相应的LED灯 cJSON *root = cJSON_Parse(meassage); if(root != NULL){ led = cJSON_GetObjectItem(root,”led”)-valuestring; printf(“led = %s\n\r”,led); led_value = cJSON_GetObjectItem(root,”value”)-valueint; if(!strcmp(led,”red”)){ if(led_value){ LED_On(LED_RED); }else{ LED_Off(LED_RED); } }else if(!strcmp(led,”green”)){ if(led_value){ LED_On(LED_GREEN); }else{ LED_Off(LED_GREEN); } }else if(!strcmp(led,”blue”)){ if(led_value){ LED_On(LED_BLUE); }else{ LED_Off(LED_BLUE); } }else if(!strcmp(led,”yellow”)){ if(led_value){ LED_On(LED_YELLOW); printf(“Yellow On\n\r”); }else{ LED_Off(LED_YELLOW); printf(“Yellow Off\n\r”); } } // 释放内存空间 cJSON_Delete(root); }else{ printf(“Error before: \n\r”,cJSON_GetErrorPtr()); } } delay_ms(500); //获取传感器测量数据,该示例使用随机数 temperature = rand()%50; humidity = rand()%100; light = rand()%1000; pressure = rand()%1000; //将数据合成为JSON格式数据 sprintf(meassage,”{\”temperature\”:%.1f,\”humidity\”:%.1f,\”light\”:%.1f,\”pressure\”:%.1f}”,temperature,humidity,light,pressure); //将数据发送出去 mqtt_publish(“pyboard_value”,meassage); } } 完整工程代码可在后面的附件下载。 2 手机端代码实现 手机端我们也使用官方提供的Java库Java client and utilities,下载地址: http://www.eclipse.org/paho/ 将jar文件添加到工程中即可,程序界面如下所示: 上面4个条目分别显示STM32单片机通过W5500发送到服务器端的传感器测量数据; 下面4个图片分别控制板子上的4个LED灯; 消息发送我们采用线程的方式发送,接收采用回调函数方式接收消息。 2.1 实现消息发送 发送消息的代码如下所示: /** * send message */ class PublishThread extends Thread { String topic; MqttMessage message; int qos = 0; MemoryPersistence persistence = new MemoryPersistence(); PublishThread(String topic,String message){ this.topic = topic; this.message = new MqttMessage(message.getBytes()); } public void sendMessage(String topic,String message){ this.topic = topic; this.message = new MqttMessage(message.getBytes()); run(); } @Override public void run() { try { MqttClient sampleClient = new MqttClient(broker, clientId, persistence); MqttConnectOptions connOpts = new MqttConnectOptions(); connOpts.setCleanSession(true); connOpts.setKeepAliveInterval(1); System.out.println(“Connecting to broker: ” + broker); sampleClient.connect(connOpts); System.out.println(“Connected”); System.out.println(“Publishing message: ” + message.toString()); message.setQos(qos); sampleClient.publish(topic, message); System.out.println(“Message published”); sampleClient.disconnect(); System.out.println(“Disconnected”); }catch(MqttException me) { System.out.println(“reason “+me.getReasonCode()); System.out.println(“msg “+me.getMessage()); System.out.println(“loc “+me.getLocalizedMessage()); System.out.println(“cause “+me.getCause()); System.out.println(“excep “+me); me.printStackTrace(); } } } 2.2 实现消息接收 接收消息的代码如下所示: 继续阅读:http://www.iwiznet.cn/blog/?p=7409
  • 热度 19
    2015-8-5 15:16
    1200 次阅读|
    0 个评论
      已刊登在《无线电》8月刊 在帝都生活的小伙伴们,想必对空气质量一定是不能再敏感,十几米的能见度想想也是醉了。一遇到久违的蓝天,朋友圈就被各种炫蓝天的照片刷屏。既然已经无法奢望室外空气,就在室内空气上下点功夫吧,毕竟一天中的大多数时间还是在室内度过的。于是乎,小熊决定做一个智能空气盒子,实时检测家里的空气是否达标。关爱绳命,从一呼一吸开始… 项目简介 智能空气盒子(Smart AirBox)是空气质量在线检测系统的雏形。该系统可以监测周围的空气质量(VOC、PM2.5、温度、湿度等),并将参数数据通过BLE发送给BLE网关,这样,我们就可以通过PC来查看周围的空气质量情况,或者通过手机的蓝牙BLE直接连接到智能空气盒子获取周围空气数据。图1是PC通过浏览器获取到的空气质量显示页面。 图1 网页显示的空气数据 此系统由空气质量检测节点智能空气盒子(Smart AirBox)和BLE转以太网网关“BLE Gateway”组成,如图2所示:   图2 智能空气盒子及BLE网关 本篇先介绍智能空气盒子的硬件制作步骤,因为程序部分和网关程序的关联比较多,以后有机会再向大家介绍智能空气盒子的程序部分以及本系统的另外一个组件“BLE网关”的制作步骤。 空气质量检测节点“Smart AirBox” 智能空气盒子(Smart AirBox)集成了VOC气体(挥发性有机化合物)和PM2.5(可呼入颗粒数)检测单元、温湿度检测单元、BLE传输单元以及LED显示单元。其中VOC气体和PM2.5检测单元使用的是ZPH-01 ,ZPH-01可以通过串口输出采集到的空气数据,并且每秒更新一次。温湿度检测单元采用的是Maker常用的DHT11传感器,可通过数字接口输出温湿度信息,价格低,性能可靠。 图3 智能空气盒子主要部件 BLE传输单元使用的是TI的CC2541模块,CC2541作为智能空气盒子(Smart AirBox)的MCU,从各检测单元取回数据并将此空气数据发送到BLE Gateway或手机,再按照空气质量等级来驱动发光二极管进行直观显示。如图4所示,从左到右分别代表空气质量的“优-良-中-差”四种情况。 图4 智能空气盒子实际检测变化情况 本次智能空气盒子DIY过程中,传感器检测项目和精度如下: VOC检测单元:甲醛、苯、一氧化碳、氨气、氢气、酒精、香烟、香精等有机挥发气体; 可呼入颗粒数检测单元:检测颗粒大于1μm以上; 温度检测单元:测温精度±2%,测量范围:0~50摄氏度; 湿度检测单元:测湿精度±5%RH,测量范围:20~90%;   设计过程 1, 设计思路 这次设计思路和以往的设计有很大不同。小熊以往的设计都是将全部电路部分放在一块PCB上,或者是两块PCB通过接插件的方式连接在一起,而本次设计从一开始就计划将PCB本身用作壳体,六块PCB合体后是一个完整的正方形的,但是这会面临一个两难的选择:方案1,六面分别是单独设计,每块都是单独的PCB;方案2,六面采用同样的设计,焊接时不同的面焊接不同的器件。方案1的优点自然是设计难度小,缺点是制版成本高;6块PCB的制版成本是(50(样板费)+100(黑色阻焊))x6,六倍与方案2的成本。一番取舍后,最终小熊的屌丝症发作,选择了方案2作为最终实施的方案,事实证明,方案2完全就是一个烧脑的设计…… 2, 硬件架构 确定设计方案后,小熊开始了原理的勾画。前面已经决定要在同一块PCB上实现所有的电路,只是根据需求对某一面板进行特定器件的焊接,这种思路决定了不可能采用常规的原理图设计来处理,整体的电路如图5所示。 图5 硬件架构及原理 整体布局是6个板子,板与板之间不但要有电源供电,还需要进行IO通讯,所以小熊引入另外一组通讯焊盘,这组焊盘要包含上图中所有需要的通讯IO,如图6所示:   图6 通讯焊盘 整体的原理图如下:   图7  Smart AirBox 原理图 3, PCB设计 为了方便说明,我们命名为“底板”、“前面板”、“后面板”、“左侧板”、“右侧板”和“盖板”,大家可以先脑补下它们的相对位置。然而,要在一块板子上集成“Micro USB 接口”、“电源LDO部分”、“LED显示单元”、“CC2541贴片模块”、“VOCPM2.5采集模块”、“DHT11温湿度模块”等,而且为了美观,需要将所有器件布置在PCB盒子的内部面上,PCB盒子的外部面则保持无器件、无走线、无焊盘、无丝印的“四无”状态;所以在PCB设计时小熊定义了几个设计规则和步骤,下文将逐步说明: 步骤1,采用黑色PCB,正方形设计,板厚1.6mm,因为PCB就是壳体,足够的板厚才有足够的结构强度,板子面积:65 x 65 mm。   图8  PCB 65mm x 65mm 步骤2,在每个边上加两个凸起位置用作板与板间的固定,凸起的宽度要和板厚一样为1.6mm,长度是16.25mm, 也就是板边的1/4。为方便插接,在凸起的两边各削除0.1~0.2mm,并做出固定的焊盘。这个焊盘需要大些,以保证各个面板之间固定的稳固性。 图9 固定焊盘设计 步骤3,放置LED显示单元和Micro USB 接口等需要外部开孔的器件,并在适当的位置放置一定数量的通风孔,用来确保空气的流通以保持采集数据的准确性和实时性。   图10 透光口设计 LED显示单元:P1.0~P1.7共8个独立IO控制的发光二极管,还有一个供电指示灯,共9个发光二极管,为了保持外壳面的“光洁”,小熊采用的方式是在贴片二极管的两个焊盘间放置一个1.2mm直径的开孔用来透光,然后贴片二极管采用反向焊接的方式,也就是倒扣着焊接,透光口设计如图10所示; Micro USB 接口:Micro USB接口的外沿要和步骤2中所做凸起的外沿尽量齐平,不然焊接之后会出现USB接口内陷在壳体内部,不好插拔的问题。由于壳体的六面都是同一板子,要考虑到USB接口的开口问题,为了避免每面上都有开口,并避免开口过大造成的美观问题,小熊选择半开孔的方式,如图11所示; 继续阅读:http://www.iwiznet.cn/blog/?p=7370
相关资源