您的当前位置:首页正文

Arduino客户端与服务器交互数据以JSON格式传输的实现

来源:华佗健康网
ELECTRONICS W0RLD・技术交流 Arduino客户端与服务器交互数据以JSON麓式传输硇实项 马鞍山市第二中学 陈郁欣 【摘要】作为一种数据传输格式,JSON与XML很相似,但是它更加灵巧,具有良好的可读和便于快速编写的特性,借助Js0N可以传输一 个简单的字符、数组或复杂的object对象,可在不同平台之间进行数据交换。本文以一个典型的智能大棚数据传输设计为例,介绍运用第三  ̄Arduinojson库实现Js0n数据格式 ̄Jarduino客户端与服务 ̄HTTP交互方法和设计步骤。本方法对-Y'arduino在物联网等其他方面的应用也有 借鉴之处,可以很好的解决数据传输效率。 【关键词】JSON;Arduino;客户端与服务端数据交互 1.引言 目前物联网发展火热,在人们的生活中扮演着十分重要的角 色,而作为下位机核心控制单元的单片机更是得到了广泛的应用。 Arduino作为一款软硬件开源的单片机,它除了继承AVR系列单片 机速度快、安全性强、价格便宜等优点外,还具有数字接口、模拟 接口丰富,支持SPI,IIC,UART串口通信;能通过众多的传感器感知 环境,通过控制驱动执行装置反馈、影响环境:简便的编程环境, 功能函数化处理、极大的自由度,丰富的第三方资源,与多种电子 元件对接简单等优势,为构建物联网下位机系统提供了良好的软硬 件开发平台。 本文以一个典型的智能大棚数据传输设计为例,介绍基于Json 数据格式的arduino客户端与服务器HTTP交互的实现方法和设计步 骤,本方法对于arduino远程通讯有借鉴之处。 2.系统实现 2.1数据交换格式 在实际应用中,Arduino下位机采集数据往往有多个,为了提 高效率,作为客户端应一次性向远端服务器发送一组采集值,这就 需要我们规划一种数据格式。 JSON(Java Script Object Natation)是一种轻量级的数据交换 格式,它的作用与XML类似,也是基于纯文本的数据格式,但比 XML更为轻巧。JSON将一组数据转换为字符串后,就可以在函数 之间轻松地传递这个字符串,或者在异步应用程序中将字符串从客 户机传递给服务器端程序,因此JSON广泛用于网络消息交换。 法国软件工程师Benoit Blanchon为在Arduino平台上进行JS0N编 码和解码发布了Arduinojson类库。这是一个嵌入式系统的免费JSON 库,Arduino用户可以使用它来连接扩展装置或webfll ̄务。这个库包括 一个强大的解析器,而且有一个非常好的API,所以很容易使用。 2.2实现核心代码设计 2.2.1场景 某智能大棚控制系统主要有下位机与远端服务器两大部分组 ・132・电子tI|,● 成。下位机包括Arduino单片机和采集装置、执行机构。采集装置 有空气温度、空气湿度、光照、土壤温度、CO 浓度传感器。其中 温度和光照传感器有两套,一套检测棚外的温度和光照,一套检测 大会棚内的温度和光照。执行机构包括洒水,遮阳,通风,加热。 工作过程:下位机采集装置利用传感器检测环境,并把检测 到的信息传送 ̄lJArduino,Arduino单片机利用ESP8266或Ethernet通 过互联网把数据上传到远端服务器,服务器对数据进行分析判断并 作出决策,把执行命令发回到下位机,下位机控制相应执行机构动 作,实现智能大棚的远程控制。 2.2.2发 ̄_JSON数据到服务器 传感器采集并向服务器上传数据有:采集站编号(StationlD)、 棚内空气温度(InAirTemp)、棚外空气温度(OutAirTemp)、土壤温度 (SoilTemp)、棚外光照度(Outlllu)、棚内光照度(Inlllu)、空气湿度 (AirHumi)、CO2浓度(co2)、采集更新时间(LastCollect)。 Json格式的字符串形式: char json[]-” stationid StationlD—String,\.ttemp\I|:【lnAirTempVlaue. OutAirTempVlaue,SoilTempVlaue],\’’iiiu\”:【Outlllu Vlaue,Inlllu Vlaue],\”co2\” CO2Vlaue,\”lastcollect\tt:LastCollect}”e 2.2.2.1创建对象,在JSON串中添加采集值等相关数据 StaticJsonBuffer<200>jsonBuffer ̄//分配临时内存池 JsonObject&root=jsonBuffer.createObject0= root[”stationid”]=StationlD String//站点编号 JsonArray&temp:root.createNestedArray(”tcmp”1: temp.add(InAirTemp_Vlaue);//棚内空气温度值 temp.add(OutAirTempVlaue);,/棚外空气温度值 tcmp.add(SoilTemp_Vlaue)://土壤温度值 JsonArray&iiiu=root.createNestedArray(”iiiu”); iiiu.add(OutllIu_Vlaue)://棚外光照度值 iiiu.add(InlIIl0 laue);/lll内光照度 root[”co2”】=CO2_Vlaue;;//CO2浓度值 root[”lastcollect”l=lastcollect—String://数据更新时间 2.2.2.2生成JSON字符串 调用printTo0和目标缓冲区,将字符串转储到一个数组。 StringjsonData:root.printTo(jsonData) ELECTRONICS WrORLD・ 苈 ,当使用Json数据向前端传递的时候,数据中出现引号的时候, 如果不转义,前台就会获取一个错误的Json格式的数据。所以还须  ̄.jsonData转化为符合变量发送的JSON ̄际准格式字符串,即添加必 要的转义符。 2I2-2.3发送JSON数据 当使用浏览器访问网站时,会在浏览器中输入需要访问的 域名,浏览器会先通过DNS服务器连接到域名所对应的网站服 务器,再将主域名后的数据用GET方法发送到服务器上。这里 使用arduino作为一个网页客户端连接到服务器上,服务器响 应地址为https://iot.maeckr..ca/shed/getserverdata.php?apikey= nodyuz2kalxeangl&json=jsondata”。发 ̄HTTP GET请求: eonst char*host=“lot.maeekr.cn”: String geturl-“/shed/getserverdata.php?apikey=nodyuz2kalxeangl”: elienLconnect(host,8o); client..print(Stnng(”GET”) geturl+”&jSOIl=”+”jsondata”+”HTTP/I.1krkn”+ 'Host:”+host+”\r、n”+ 'Connection:cl0se\^n\ 、Il”1: 2.2.3获取服务器Js0N数据 下位机获取服务器数据事件控制开关量有:采集站编号(sta. tionid)、洒水阀控*WJ(water)、遮阳电机控*[J0ight)、通风开关控制 《iwind)、加热温度控制(hot)、更新时间(1ast_update)。 本场景中通过浏览器访问指定网址,出现下列内容,现在我们 通过下位机获取此网页中控制数据。 {“results”:[{“moment”:{“stationid”:”WTUXK27DXNOR”,”watercode”:”0”,”lightcode”:…1,”windcod”: 3,”hotcode”:”2”),”lastupdate”:”D2017-11-05TI 5:40:00+08:00”)】} 首先为Json数!据成员定义一个ContrData结构: StructContrData {char staiD[12];//:控制点编号 inlWater con;,/洒水阀控制 int Lightcon;//:遮阳电机控制 int Wind_con;/,通风开关控制 int Hotcon;//加热控制 charudate timer26]:}//最后更新日期与时间 2.2.3.1发送HTTP GET请求,并跳过HTTP头 客户端向服务器发出请求后,服务器收到请求,即返回对应数 据。服务器会向客户端回送协议的版本号、应答状态码以及关于它 自身的数据及被请求的文档等应答信息。服务器向客户端发送头信 息后,它会发送一个空白行来表示头信息的发送到此为结束。 通过下列程序代码跳过HTTP头,这样使我们在响应的正文的 开头。 char endOfHeaders[]=”krkn ̄r\n"’: clienLsetTimeout(H力Z,IMEOUT): client.ifnd(endOfHeaders); 2.2_3.2获取字符串 (1)读取正文 const sizet MAXContentLength=512;//HTTP请求最大数 charbuffer[];∥接收数据缓冲区 client.readByttes(buffer,MAXContentLength): (2)解析数据并获得数据 StatieJsonBuffer<512>jsonBuffer;//分配临时内存池 JsonObject&root jsonBuffer.parseObject(blbuffer): root.SUCCESS(); strcpy(ContrData->staiD root[”results”][0 moment” stationid”]);;//控制 点编号 ContrData->WaterCon=root[’'results'’][O moment” water_code”】;//水 阀控制值 ContrData->LightCon=root[”'results”】【0 moment” light_code”】;/,遮阳 控制值 ContrData->windCon=root[ 'results”][O moment” wind_code”]:,/通风 控制值 ContrData->HotCon=root[''results'’】[0 moment” hot_code'’1;,/加热控 制值 strcpy(ContrData一>udate_time,root[' results”]【O last_update”1);///数据更新 时间 3.结束语 JSON具有更好地适应不同平台之间进行数据交换的功能。 此外,许多编程语言(如PHP、Python、Ruby、c )都具有解析 JSON数据的相关函数库,非常适合与其他应用程序交换数据,这 些特性使USON成为数据交换语言理想选择。 本文以场景为例完成程序实现方法,开发过程中用到了Benoit Blancho发布的ArduinojsoW类库,使您能够直接在Arduino:端从数据 结构解码、创建、操作和编码JSON。运用Arduinojson库可以很方 便地在Arduino上操作JSON数据,轻松的将JSON对象转化为JSON 字符串,实现数据传输流程中,以文本,即字符串的形式传递,达 到JS0N字符串的信息交换。 参考文献 【1】陈吕洲.Arduino ̄序设计基础【M】.北京航天航空大学出版 社..20141111 248-255. 【2]Benok Blanchon.Arduin@son:c++JSON library for Arduino and IoT[EB/OL】.http://arduinojson.org/AH/. 电子tIlI●・133・ 

因篇幅问题不能全部显示,请点此查看更多更全内容