[讨论] 【LinkIt 7687试用体验】从TCP客户端数据上传到智慧农业【结项】

[复制链接]

技术员

发表于 2017-1-21 22:33:48   1246 查看 2 回复 显示全部楼层 倒序浏览
分享
本帖最后由 smilepeng 于 2017-1-22 20:21 编辑

项目概述
智慧农业就是将物联网技术运用到传统农业中去,运用传感器和软件通过移动平台或者电脑平台对农业生产进行控制,使传统农业更具有“智慧”。除了精准感知、控制与决策管理外,从广泛意义上讲,智慧农业还包括农业电子商务、食品溯源防伪、农业休闲旅游、农业信息服务等方面的内容。智慧农业是农业生产的高级阶段,是集新兴的互联网、移动互联网、云计算和物联网技术为一体,依托部署在农业生产现场的各种传感节点(环境温湿度、土壤水分、二氧化碳、图像等)和无线通信网络实现农业生产环境的智能感知、智能预警、智能决策、智能分析、专家在线指导,为农业生产提供精准化种植、可视化管理、智能化决策。
综上所述,智慧农业我们需要掌握除传感器之外,最重要的就是云平台了,目前物联云平台在市面上还是很多的,譬如说 : OneNET 、yeelink、贝壳物联、机智云等等,本次分享是基于OneNET平台,那么平台选好了,其次就是传感器及硬件方面的稳定性了,本次我们选择LinkIt 7687作为硬件平台上传数据。其中云平台涉及到的协议方面需大家自己去深究。

硬件设计
LinkIt 7687

软件调试
      软件方面是基于官方例程lwip_socket文件夹下的工程文件进行改编的,这里我们需要用到两个调试软件,串口调试助手XCOM V2.0.exe和网络调试助手NetAssist.exe
1.png

    首先我们打开官方例程直奔主函数的任务调度,
xTaskCreate(user_entry,USER_ENTRY_TASK_NAME,USER_ENTRY_TASK_STACKSIZE/sizeof(portSTACK_TYPE), NULL, USER_ENTRY_TASK_PRIO, NULL)
    根据任务调度的函数一步一步向下可看出本次任务分别测试TCP、UDP客户端读写,TCP、UDP服务器读写,看串口助手打印报文。
2.png
    接下来我们需要将本例程改写成我们需要的TCP客户端上传服务器,这需要我们仔细弄明白该例程的每一个函数的作用,下面我将列出注重点在哪。
  1. <font size="1">#define WIFI_SSID                ("CMCC")
  2. #define WIFI_PASSWORD            ("12345678")

  3. #define SOCK_TCP_SRV_PORT        6500
  4. #define SOCK_UDP_SRV_PORT        6600
  5. #define TRX_PACKET_COUNT         3</font>
复制代码

     首先注意这几个宏定义,我们默认初始化7687进入STA模式WIFI_SSID和 WIFI_PASSWORD是我们的路由器用户名和密码。SOCK_TCP_SRV_PORT和SOCK_UDP_SRV_PORT分别是TCP和UDP的通道。

    其次我们进入user_entry函数找到任务调度的下一步,看程序可知我们只需要TCP客户端模式那么我们只需要执行user_entry函数里的
  1. xTaskCreate(client_test_thread,
  2.                               SOCKET_CLINET_EXAMPLE_TASK_NAME,
  3.                               SOCKET_EXAMPLE_TASK_STACKSIZE / sizeof(portSTACK_TYPE),
  4.                               NULL,
  5.                               SOCKET_EXAMPLE_TASK_PRIO,
  6.                               NULL)
复制代码


同样进入client_test_thread函数

  1. static void client_test_thread(void *not_used)
  2. {
  3.     int ret;
  4.     ret = tcp_client_test();
  5.     ret += udp_client_test();
  6.     if (ret == 0) {
  7.         LOG_I(lwip_socket_example, "example project test success.\n");
  8.     }
  9.     //Keep the task alive
  10.     while (1) {
  11.         vTaskDelay(1000 / portTICK_RATE_MS); // release CPU
  12.     }
  13. }
复制代码


有程序可知我们只需要用到TCP客户端模式,那么将udp_client_test函数屏蔽掉,进入下一步tcp_client_test,才真正的进入了TCP客户端测试阶段。
具体怎么更改tcp_client_test函数,看下面代码和注释

  1. static int tcp_client_test(void)
  2. {
  3.     int s;
  4.     int ret;
  5.     struct sockaddr_in addr;
  6.     int count = 0;
  7.     int rcv_len, rlen;
  8.     char rcv_buf[32] = {0};
  9.     struct netif *sta_if = netif_find_by_type(NETIF_TYPE_STA);

  10.     vTaskDelay(5000);
  11.     char send_data[] =
  12. "POST /devices/3169057/datapoints HTTP/1.1\r\n\
  13. api-key:u5AZRkKI=RZFWq3NlM6q=brXDjY=\r\n\
  14. Host:api.heclouds.com\r\n\
  15. Content-Length:59\r\n\r\n\
  16. {\"datastreams\":[{\"id\":\"TEMP\",\"datapoints\":[{\"value\":88}]}]}";

  17.     LOG_I(lwip_socket_example, "tcp_client_test starts");//测试开始

  18.     os_memset(&addr, 0, sizeof(addr));
  19.     addr.sin_len = sizeof(addr);
  20.     addr.sin_family = AF_INET;
  21.     addr.sin_port = lwip_htons(SOCK_TCP_SRV_PORT);//端口
  22.     inet_addr_from_ipaddr(&addr.sin_addr, netif_ip4_addr(sta_if));
  23.                
  24.                 addr.sin_addr.s_addr = 0x6400A8C0; //添加服务端地址 以十六进制倒叙的方式
  25.                                                                                                                                                          //C0:192  A8:168  00:0  66:102  192.168.0.102
  26. //                addr.sin_addr.s_addr = 0x2128E6B7; //183.230.40.33:80
  27. //                LOG_I(common, "DHCP got IP:%s",addr);
  28.                
  29.                 /*一个基本的socket建立顺序是
  30.                         Server端:
  31.                                                         socket()
  32.                                                         bind()
  33.                                                         listen()
  34.                                                         accept()
  35.                                                         recv()
  36.                         Client端:
  37.                                                         socket()
  38.                                                         connect()
  39.                                                         send()*/

  40.     /* Create the socket */
  41.     s = lwip_socket(AF_INET, SOCK_STREAM, 0);//客户端建立标准的socket接口
  42.     if (s < 0) {  //判断建立socket是否成功
  43.         LOG_I(lwip_socket_example, "TCP client create failed");
  44.         goto idle;
  45.     }

  46.     /* Connect */
  47.     ret = lwip_connect(s, (struct sockaddr *)&addr, sizeof(addr));//连接服务器connect()
  48.     if (ret < 0) {  //判断连接是否成功
  49.         lwip_close(s);
  50.         LOG_I(lwip_socket_example, "TCP client connect failed = %d",ret);
  51.         goto idle;
  52.     }

  53.     while (count < TRX_PACKET_COUNT) { //开始发送数据send()
  54.         /* Write something */
  55.         ret = lwip_write(s, send_data, sizeof(send_data));
  56.         LOG_I(lwip_socket_example, "TCP client write:ret = %d", ret);

  57.         LOG_I(lwip_socket_example, "TCP client waiting for data...");
  58.         rcv_len = 0;
  59. //        while (rcv_len < sizeof(send_data)) {  //sonar client
  60.                                        
  61.                                         LOG_I(lwip_socket_example, "WHILE(1)");
  62.             rlen = lwip_recv(s, &rcv_buf[rcv_len], sizeof(rcv_buf) - 1 - rcv_len, 0);
  63.             rcv_len += rlen;
  64. //       }
  65.         LOG_I(lwip_socket_example, "TCP client received data:%s", rcv_buf);

  66.         count++;
  67.         vTaskDelay(2000);
  68.     }

  69.     /* close */
  70.     ret = lwip_close(s);
  71.     LOG_I(lwip_socket_example, "TCP client s close:ret = %d", ret);
  72.     return ret;
  73. idle:
  74.     LOG_I(lwip_socket_example, "TCP client test completed");
  75.     return -1;
  76. }
复制代码


OK,现在TCP客户端模式已经建立好了,我们需要建立一个服务器,需要用到网络调试助手,看图片上的配置
3.png
那么TCP客户端和服务器之间的测试通讯已经完成,下面我们测试数据上传物联平台的服务器。以下操纵需要我们弄明白OneNET平台的部分协议。
OneNET服务器IP183.230.40.33:80我们只需要将报文
4.png
上传至服务器,服务器端回复报文
5.png
既可以将数据value= 52上传至服务器。当然讲了这么多无非就是我们想通过硬件平台采集数据,然后通过协议上传云平台。那么上述步骤完成的话,就可以搞定数据上传一系列问题了。
关于OneNET物联平台在此就忽略了,因为平台上的很多协议需要去深入研究,有兴趣的可以去OneNET官网看一下,还能申请免费开发板。
6.png

视频效果演示

助理工程师

发表于 2017-2-4 17:09:06  
很不错哦!
回复

举报

高级工程师

发表于 2017-2-5 14:23:41  

PCB在线计价下单

板子大小:

cm
X
cm

层数:

2

板子数量:

10

厚度:

1.6
感谢楼主无私分享。。。。。
回复

举报

只有小组成员才能发言,加入小组>>

75个成员聚集在这个小组

加入小组

创建小组步骤

关闭

站长推荐 上一条 /9 下一条

快速回复 返回顶部 返回列表
-

推荐专区

技术干货集中营

专家问答

用户帮助┃咨询与建议┃版主议事

工程师杂谈

工程师创意

工程师职场

论坛电子赛事

社区活动专版

发烧友活动

-

嵌入式论坛

ARM技术论坛

Android论坛

Linux论坛

单片机/MCU论坛

FPGA|CPLD|ASIC论坛

DSP论坛

嵌入式系统论坛

-

电源技术论坛

电源技术论坛

无线充电技术

-

硬件设计论坛

PCB设计论坛

电路设计论坛

电子元器件论坛

控制|传感

总线技术|接口技术

-

测试测量论坛

LabVIEW论坛

Matlab论坛

测试测量技术专区

仪器仪表技术专区

-

EDA设计论坛

multisim论坛

PADS技术论坛

Protel|AD|DXP论坛

Allegro论坛

proteus论坛|仿真论坛

EasyEDA-中国人自已的EDA工具

Orcad论坛

-

综合技术与应用

电机控制

智能电网

光电及显示

参考设计中心

汽车电子技术论坛

医疗电子论坛

-

开源硬件

-

无线通信论坛

无线通信技术专区

天线|RF射频|微波|雷达技术

-

IC设计论坛

芯片测试与失效分析

Mixed Signal/SOC[数模混合芯片设计]

Analog/RF IC设计

设计与制造封装测试

-

厂商专区

TI论坛

TI Deyisupport社区

-

检测技术与质量

电磁兼容(EMC)设计与整改

安规知识论坛

检测与认证

-

消费电子论坛

手机技术论坛

平板电脑/mid论坛

音视/视频/机顶盒论坛

-

电子论坛综合区

聚丰众筹官方社区

新人报道区

聚丰供应链

-

论坛服务区

-

供求信息发布

供需广告

招聘┃求职发布区

电子展览展会专区